系列文章目录及链接
上篇:机器学习(五) -- 无监督学习(2) --降维2
下篇:
前言
tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被“
文章内容”删除线标记的,也可以自行跳过。“!!!”一般需要特别注意或者容易出错的地方。
本系列文章是作者边学习边总结的,内容有不对的地方还请多多指正,同时本系列文章会不断完善,每篇文章不定时会有修改。
由于作者时间不算富裕,有些内容的《算法实现》部分暂未完善,以后有时间再来补充。见谅!
文中为方便理解,会将接口在用到的时候才导入,实际中应在文件开始统一导入。
一、通俗理解及定义
1、神经网络的定义
人工神经网络(artificial neural network,ANN),简称神经网络(neural network,NN)或类神经网络,是机器学习的子集,也是深度学习算法的支柱。是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。
神经网络的最基本的构成单元是神经元(Neuron)。生物中,人的大脑中有上亿个神经元构成神经网络,生物神经网络中各个神经元之间相互连接,通过神经递质相互传递信息。如果某个神经元接收了足够多的神经递质(乙酰胆碱),那么其点位变会积累地足够高,从而超过某个阈值(Threshold)。超过这个阈值之后,这个神经元变会被激活,达到兴奋的状态,而后发送神经递质给其他的神经元。
人工神经网络是受人脑生物神经网络结构和功能启发的计算模型,它由互连的节点(或称为“神经元”)组成,它们被组织成层,通过对输入进行加权,计算总和以及应用非线性激活函数,将输入数据转换为不同的表示形式,直到产生输出。
(虽然人工神经网络模型类似生物神经网络,但人工神经网络的本质是函数拟合)
2、神经网络的结构
神经网络主要由:输入层,隐藏层,输出层构成,每层由若干神经元组成。当隐藏层只有一层时,该网络为两层神经网络,由于输入层未做任何变换,可以不看做单独的一层(即两层神经网络为隐藏层+输出层,一般不包括输入层)。实际中,输入层的每个神经元代表了一个特征,输出层个数代表了分类标签的个数(在做二分类时,如果采用sigmoid分类器,输出层的神经元个数为1个,如果采用softmax分类器,输出层神经元个数为2个;如果是多分类问题,即输出类别>=3时,输出层神经元为类别个数),而隐藏层层数以及隐藏层神经元是由人工设定。一个基本的两层神经网络如下图:
设计一个神经网络时,输入层与输出层的节点数往往是固定的,中间层则可以自由指定;
结构图里的关键不是圆圈(代表“神经元”),而是连接线(代表“神经元”之间的连接)。每个连接线对应一个不同的权重(其值称为权值),这是需要训练得到的。
3、神经网络的训练过程
神经网络的训练过程主要包括前向传播(forward propagation),损失计算(loss calculation),反向传播(backpropagation)和参数更新(parameter update);这些步骤共同作用,使得神经网络能够从数据中学习并逐步提高其性能。
- 神经元模型:模拟生物神经元的信息处理过程
- 基本结构
- 输入层:接收来自外部的输入信号
- 隐藏层:对输入信号进行加工和处理
- 输出层:输出处理后的结果
- 神经元之间的连接:通过权重表示神经元之间的相互作用
- 激活函数:将神经元的输出转换为非线性的输出信号
- 前向传播:输入层数据从前向后,数据逐步传递至输出层
- 反向传播:损失函数开始从后向前,梯度逐步传递至第一层,用于权重更新,使网络输出更接近标签(反向传播原理:微积分中的链式求导法则)
- 损失函数(损失计算):衡量神经网络的输出与实际结果之间的差异
- 优化算法(参数更新):调整神经网络的参数以最小化损失函数
二、神经网络基础
1、神经元模型
1.1、生物神经元
一个神经元通常具有多个树突,主要用来接受传入信息;一条轴突,轴突尾端有许多轴突末梢可以给其他多个神经元传递信息。轴突末梢跟其他神经元的树突产生连接,从而传递信号。这个连接的位置在生物学上叫做“突触”。
1.2、人工神经元
1.2.1、M-P模型
神经元是构成神经网络的最基本单元(构件),因此,首要任务是构造人工神经元模型。
神经元模型是一个包含输入,输出与计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核
从生物神经元结构中抽象的神经元模型--M-P神经元模型(阈值加权和模型,即麦卡洛克-皮特斯模型(McCulloch-Pitts model),简称为M-P模型)
神经元接收来自n个其他神经元传递过来的输入信号x(下图中x_1~x_n),这些信号通过带权重w(下图中w_1~w_n)的连接(connection)进行传递,神经元将接收到的输入值按照权重叠加起来,并与当前神经元的阈值 θ (也叫偏置 b )进行比较,然后通过“激活函数f()(activation function)”向外表达输出,如下图所示。
M-P模型工作原理:当所有的输入与对应的连接权重的乘积大于阈值时,y输出为1,否则输出为0(理想状态,激活函数为阶跃函数)。即当,;否则 需要注意的是, 也只能是0或1的值,而权重和则根据需要自行设置。
1.2.2、M-P数学表达式
神经元数学计算模型
数学上讲,可以将神经元写成如下形式:
1.2.3、神经元的连接
下图是一个典型的神经元模型:包含有3个输入,1个输出,以及2个计算功能。
注意中间的箭头线。这些线称为“连接”。每个上有一个“权值”。(先忽略偏置)
连接是神经元中最重要的东西。每一个连接上都有一个权重。一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测效果最好。
使用 x 表示输入,用 w 表示权值。连接的有向箭头表示:x 大小的信号 ,经过 w 加权后,信号的大小就变成了 x*w。
这就是神经元模型中,每个有向箭头表示的是值的加权传递。
将神经元图中的所有变量用符号表示,其输出的计算公式如图右下:
神经元计算
Y是在输入和权值的线性加权和叠加了一个激活函数g的值。在MP模型里,函数g是sgn函数。
将sum函数与sgn函数合并到一个圆圈里,代表神经元的内部计算。一个神经元可以引出多个代表输出的有向箭头,但值都是一样的。
神经元可以看作一个计算与存储单元。计算是神经元对其的输入进行计算功能。存储是神经元会暂存计算结果,并传递到下一层。
也就是如下所示的效果:
2、感知机(单层神经网络)
感知机(Perceptron)是由两层神经元(输入层、输出层)所构成,是最简单的神经网络(单层神经网络,不算输入层)。输入层接收信号传递给输出层,输出层是M-P神经元。感知机也叫“阈值逻辑单元(threshold logic unit,TLU)”
(QvQ:其实就是M-P神经元,将原本的输入x换成了另一个神经元节点,而这个神经元不做计算)
或者这样
为体现到两个输出神经元权重的联系,改用如下下标,那么Y_1和Y_2的公式如图右下:
Y_1和Y_2的计算公式是线性代数方程组。因此可以用矩阵乘法来表达这两个公式,即:
g(x*w)=Y
这就是神经网络中从前一层计算后一层的矩阵运算。
2.1、感知机实现逻辑运算
M-P神经元模型表达式为,假设激活函数为阶跃函数sgn(x),则逻辑运算实现如下:
“与”(x_1∧x_2):令w_1=w_2=1,b=-2,则y=f(1·x_1+1·x_2-2),仅在x_1=x_2=1时,y=1。
x_1 | x_2 | 令w_1=w_2=1,b=-2, 则y=sgn(1·x_1+1·x_2-2) | y |
0 | 0 | y=sgn(-2) | 0 |
0 | 1 | y=sgn(1-2)=sgn(-1) | 0 |
1 | 0 | y=sgn(1-2)=sgn(-1) | 0 |
1 | 1 | y=sgn(1+1-2)=sgn(0) | 1 |
“或”(x_1∨x_2):令w_1=w_2=1,b=-0.5,则y=f(1·x_1+1·x_2-0.5),仅在x_1=1或x_2=1时,y=1。
x_1 | x_2 | 令w_1=w_2=1,b=-0.5, 则y=sgn(1·x_1+1·x_2-0.5) | y |
0 | 0 | y=sgn(-0.5) | 0 |
0 | 1 | y=sgn(1-0.5)=sgn(-1) | 1 |
1 | 0 | y=sgn(1-0.5)=sgn(-1) | 1 |
1 | 1 | y=sgn(1+1-0.5)=sgn(1.5) | 1 |
“非”(﹁x_1):令w_1=-1,w_2=0,b=0.5,则y=f(-1·x_1+0·x_2+0.5),仅在x_1=1时,y=0,x_1=0时,y=1。
x_1 | x_2 | 令w_1=-1,w_2=0,b=0.5, 则y=sgn(-1·x_1+0·x_2+0.5)=y=sgn(-1·x_1+0.5) | y |
0 | 0 | y=sgn(0.5) | 1 |
0 | 1 | y=sgn(0.5) | 1 |
1 | 0 | y=sgn(-0.5) | 0 |
1 | 1 | y=sgn(-0.5) | 0 |
2.2、权重和阈值的学习
可看机器学习(五) -- 监督学习(6) --逻辑回归中的感知机部分。
通过确定权重和阈值得到了可以进行逻辑运算的感知机,如果给定训练数据集,权重 w 和阈值θ(b也是一样的) 可通过学习得到。我们将 阈值 θ 可以看做是一个固定输入为 -1(或 1) 对应连接权重ω_0的“哑结点”(dummy node)。这样,可以将权重和阈值的学习简化为权重的学习。如下图所示:( j 表示第 j 个输出神经元,单个模型中可忽略)
感知机的学习规则很简单,对于训练样本(x,y),若感知机当前的输出为y',则感知机的权重调整如下:
其中,η∈(0,1)为学习率(learning rate)。若感知机对样本的预测正确的话,即y'=y,则感知机不发生任何变化。若其预测错误,则根据错误的程度进行相应权重的调整。
感知机中,只有输出层神经元进行激活函数的处理,即感知机只有一层功能神经元(Functional Neuron),其学习能力非常有限。实际上,感知机实现的逻辑运算都是线性可分问题。若两类模式是线性可分的,那么存在一个线性超平面能将其分开(如下图a-c所示),则感知机的学习过程一定会收敛从而得到合适的权向量;否则,感知机在学习的过程中会产生震荡,从而无法得到稳定的权向量,使得感知机无法求解。感知机无法解决像是“异或XOR”这样的非线性问题。(如下图d所示):
感知器类似一个逻辑回归模型,可以用于解决如下线性分类问题:
3、多层神经网络(多层感知机)
多层神经网络(多层感知机,MLP, Multi-Layer Perceptron),要解决非线性可分问题,需考虑使用多层功能神经元,如下,输出层和输入层之间还含有多层隐藏层(隐含层,hidden layer),隐藏层和输出层的神经元都是拥有激活函数的功能神经元。
3.1、结构
输入层:接收输入信号的层
输出层:产生输出信号的层
隐藏层:不直接与外部环境打交道(隐藏层的层数可从零到若干层)
3.1.1、输入层
接收来自外部的数据并将其传递到网络的下一层,输入层本身并不进行任何计算或变换,它只是简单地将输入数据传递给隐藏层的每个神经元;输入层的每个节点(或称为神经元)代表一个输入特征,在输入层中,这些特征通常被表示为一个向量。
每个输入特征 x_i 都会连接到隐藏层中的每个神经元,这些连接被称为权重(weights),用 w_i,j 表示,其中 i 表示输入特征的索引,j 表示隐藏层神经元的索引。
在输入层和隐藏层之间的连接中,每个输入特征 x_i 都会乘以一个权重 w_i,j,然后将所有乘积相加,再加上一个偏置项 b_j ,这个过程可以用以下公式表示:
输入层的设计和配置在很大程度上取决于具体的应用场景和数据类型(例如,在处理图像数据时,输入层的节点数通常等于图像的像素数;在处理文本数据时,输入层的节点数可能等于词汇表的大小或词向量的维度。),输入层本身不进行复杂的计算,但它的设计和配置对整个神经网络的性能和效果有着重要的影响;通过合理地选择和预处理输入特征,可以显著提高神经网络的学习能力和泛化能力。
3.1.2、隐藏层
隐藏层通过一系列的权重和偏置参数,将输入特征进行非线性变换,从而提取出更高层次的特征;这些特征能够更好地表示输入数据的复杂模式和结构,每个隐藏层的节点(或称为神经元)接收来自前一层的输入,通过加权求和和激活函数的作用,生成新的输出,这些输出将作为下一层的输入,继续进行处理。
隐藏层常见的激活函数包括Sigmoid函数,Tanh函数和ReLU函数等;激活函数的选择会影响网络的训练效果和收敛速度,隐藏层的输出可以表示为:
其中,W^[1] 是隐藏层的权重矩阵,b^[1] 是偏置向量,g 是激活函数,X 是输入特征矩阵。通过这种方式,隐藏层将输入特征进行非线性变换,生成新的特征表示。
在一个典型的神经网络中,隐藏层的数量和每层中的神经元数量是设计网络结构时需要考虑的重要参数;隐藏层的数量和每层神经元的数量越多,网络的表达能力越强,但同时也增加了计算复杂度和过拟合的风险;因此,在设计神经网络时,需要在表达能力和计算复杂度之间找到一个平衡点。
隐藏层通过复杂的非线性变换,提取出输入数据的深层次特征,从而使得神经网络能够处理复杂的任务,如图像识别,自然语言处理等;在实际应用中,合理设计隐藏层的结构和参数,是构建高效神经网络的关键。
3.1.3、输出层
主要功能是生成最终的预测值;输出层的节点数量取决于具体的任务类型(如,二分类问题中,输出层通常只有一个节点,该节点的输出值可以通过一个阈值来决定分类结果;在多分类问题中,输出层可能包含多个节点,每个节点对应一个类别,最终的分类结果由输出值最大的节点决定;此外,在回归问题中,输出层的节点数量也可能是一个,输出的值直接作为预测结果。)。
输出层的激活函数选择也是一个关键因素。常见的激活函数包括Sigmoid函数,Softmax函数和线性激活函数等;对于二分类问题,Sigmoid函数是一个常见的选择,因为它可以将输出值压缩到0到1之间,方便进行概率解释;而对于多分类问题,Softmax函数则更为适用,它可以将多个输出节点的值转换为概率分布,使得每个节点的输出值都在0到1之间,并且所有节点的输出值之和为1;对于回归问题,线性激活函数通常是首选,因为它可以输出任意实数值。
输出层的设计还包括如何处理输出值与真实值之间的误差;在训练过程中,输出层的输出值会与真实值进行比较,计算出误差(也称为损失);常见的损失函数包括均方误差(MSE),交叉熵损失等;损失函数的选择取决于具体的任务类型和输出层的激活函数(如,回归问题,均方误差是一个常见的选择;对于分类问题,交叉熵损失则更为适用)。
在误差计算完成后,神经网络会通过反向传播算法(Backpropagation)将误差传递回去,调整网络中的权重和偏置,以减少误差,提高模型的准确性;反向传播算法的核心思想是利用梯度下降法,通过计算损失函数对每个参数的偏导数,逐步调整参数,使得损失函数值逐渐减小。
输出层不仅负责生成最终的预测结果,还在训练过程中通过误差反馈机制帮助网络不断优化参数,提高模型的性能。
tips:
- 神经网络又叫多层感知器(MLP,Multi-Layer Perceptron),虽然叫“多层”,但MLP一般都指的是两层(带一个隐藏层的)神经网络。
- 损失函数(loss function) = 残差函数(error function) = 代价函数(cost function);都是优化问题所需要求解的方程(可以暂时这样理解,损失和代价有一点点差别,后面会说)。
- 参数(parameter)、权重(weight)和偏置(bias):一般将训练得到的参数称之为权重(其他机器学习方法直接称为参数),更一般的说法非偏置节点连接上的值称之为权重,而偏置节点上的值称之为偏置,两者统一起来称之为参数。
- 激活函数(active function) = 转移函数(transfer function);都是叠加的非线性函数的意思。
3.3、前向传播(计算方式)
两层神经网络中权值矩阵增加到了两个,用上标来区分不同层次之间的变量,同时记得加入偏置(阈值),将其定义为输入值默认为 1 ,权重为 b 的节点(即x_0=1,w_1,0=b)来表示,如下图所示,,同时给出计算公式如图右下:
使用矩阵运算来表达整个计算公式如下:
g(W^(1) * x^(1)) = x^(2);
g(W^(2) * x^(2)) = Y;
如下为详细解释:
基本的两层神经网络
其中为输入层的值, 表示第 k 层中,第 i 个神经元的激活值(该神经元的输出), 表示第 k 层的神经元个数。当 k=1时即为输入层,即 ,而 为偏置项。
为了求最后的输出值 ,我们需要计算隐藏层中每个神经元的激活值 。而隐藏层/输出层的每一个神经元,都是由上一层神经元经过类似逻辑回归计算而来。我们可以使用下图进行理解:
我们使用 来表示第 k 层的参数(边权),其中下标 j 表示第 k+1 层的第 j 个神经元,i 表示第 k 层的第 i 个神经元。于是我们可以计算出隐藏层的三个激活值:
再将隐藏层的三个激活值以及偏置项 用来计算出输出层神经元的激活值即为该神经网络的输出:
其中 g(z) 为非线性变换函数(激活函数)。
3.4、效果解析
与单层神经网络不同。理论证明,两层神经网络可以无限逼近任意连续函数(复杂度由单元数确定)。
输出层的决策分界仍然是直线。从输入层到隐藏层时,数据发生了空间变换。也就是说,两层神经网络中,隐藏层对原始的数据进行了一个空间变换,使其可以被线性分类,然后输出层的决策分界划出了一个线性分类分界线,对其进行分类。
这样就导出了两层神经网络可以做非线性分类的关键--隐藏层。联想到我们一开始推导出的矩阵公式,我们知道,矩阵和向量相乘,本质上就是对向量的坐标空间进行一个变换。因此,隐藏层的参数矩阵的作用就是使得数据的原始坐标空间从线性不可分,转换成了线性可分。
两层神经网络通过两层的线性模型模拟了数据内真实的非线性函数。因此,多层的神经网络的本质就是复杂函数拟合。
在设计一个神经网络时,输入层的节点数需要与特征的维度匹配,输出层的节点数要与目标的维度匹配。而中间层的节点数,却是由设计者指定的。因此,“自由”把握在设计者的手中。但是,节点数设置的多少,却会影响到整个模型的效果。如何决定这个自由层的节点数呢?目前业界没有完善的理论来指导这个决策。一般是根据经验来设置。较好的方法就是预先设定几个可选值,通过切换这几个值来看整个模型的预测效果,选择效果最好的值作为最终选择。这种方法又叫做Grid Search(网格搜索)。
神经网络发展阶段:
神经网络表现力不断增强:
神经网络发展地外在因素:
旧梦可以重温,且看:机器学习(五) -- 无监督学习(2) --降维2
欲知后事如何,且看: