神经元接收来自n个其它神经元传递的输入信号,也就是图中的x1,x2,...,每一个输入都对应了一个权重w1,w2,...,神经元将接收到的总输入值和阈值进行比较,再通过“激活函数”处理产生神经元的输出。
理想的激活函数是阶跃函数,如下图,1对应神经元兴奋,0对应神经元抑制,但它的缺点是不连续不光滑。
因此在实际的处理中我们一般使用Sigmoid函数,有时候也称"挤压函数"。
下图是两个输入神经元的感知机网络结构示意图:
两个输入神经元的感知机可以解决简单的与或非运算,但是对于非线性可分的问题,我们就需要考虑使用多层神经元。这里以"异或"问题为例,我们在原感知机的基础上,在输入层与输出层之间加一层神经元,也就是我们常说的隐层或隐藏层,和输出层一样,隐层的神经元也是具有激活函数的功能神经元。
我们比较熟悉的全连接神经网络和多层感知机都属于前馈神经网络。
前馈网络结构很好理解,它的各个神经元都分别属于不同的层,层内没有连接;相邻两层之间的神经元全部两两连接;整个网络中无反馈,信号从输入层向输出层单向传播,可用一个有向无环图表示。
前馈网络进行信息传播与计算公式如下:
神经网络的学习过程呢,就是通过训练数据来调整神经元之间的"连接权"(也就是上面公式里的w)和每个功能神经元的阈值,然后达到你的学习目的。
前面我们看到,多层网络的学习能力比单层感知机强得多,但是简单感知机的学习规则不足以训练多层网络,那就需要一个更为强大的学习算法。一个比较杰出的代办就是误差逆传播算法,简称BP算法。
公式中y上面加个小帽子表示的是预测值,y表示真实值,所以这个均方误差就很好理解。比较有难度的可能是BP算法的一个推导(需要一点点数学功底吧),它是基于梯度下降的策略,以目标为负梯度方向对参数进行调整。
如果公式实在太难理解,知道BP算法的工作流程也好。假设现在有一个训练集D(为了更清楚我就分行来写BP算法的操作):
1.将数据集提供给输入层神经元,逐层向前传递信号直到产生输出层的结果
2.计算输出层的误差,然后将误差逆向传播到隐层神经元
3.根据隐层神经元的误差对连接权和阈值进行调整
上述1.2.3的迭代步骤是循环进行的,我们可以设定一个停止条件,比如说当误差到了一个很小的值就结束循环。
这里有一点比较需要注意,就是BP算法最终的目标是最小化训练集D上的累计误差:
我们上面说的是一个标准BP算法,每次都仅针对一个训练样例去更新连接权和阈值,所以在这其中往往需要进行多次的迭代。
累计BP算法相较于标准BP算法,直接针对累积误差最小化,将整个训练集D读取一遍后再更新参数,减少了参数更新的频率,但是它也有缺点,在一些任务中累计误差下降到一定程度后,进一步的下降会非常缓慢,这个时候用标准BP算法往往能够得到更好的解,这一点在训练集D越大时越明显。
我们知道对于机器学习而言,过拟合是一个较大的难题,BP神经网络减少过拟合的策略主要有早停和正则化两种。
早停就是说把数据分成训练集和测试集,用训练集计算梯度、更新连接权和阈值,用验证集估计误差,当训练集误差降低而验证集误差升高时停止训练,同时返回具有最小验证集误差的连接权和阈值。
正则化的基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,比如连接权和阈值的平方和。
如何计算梯度?
神经网络是一个复杂的复合函数,因此在计算梯度时我们往往会用到链式法则
我们前面提到的反向传播算法,是根据前馈网络的特点而设计的高效方法,除此之外还有一个更为常用的算法--自动微分(Automatic Differentiation,AD),不过在这里我就不多赘述了。
那梯度下降具体是怎么样的一个过程呢?如下:
假设用E表示神经网络在训练集上的误差,则它实质上是关于连接权重w和阈值θ的函数,那我们对神经网络的训练就可以看作是一个寻找最优参数的过程,即找到一组参数使得E取最小值。
但这里就存在一个局部最小和全局最小的问题,就有点像是我们数学中说的极值点和最值点,最值一定是极值但极值不一定是最值,同样的,全局最小一定是局部最小,但局部最小不一定是我们要寻找的全局最小点。
想要跳出局部最小有三个比较常用的方法(此处划重点)
1. 以多组不同参数初始化多个网络,选择最接近全局最小的解
2. 模拟退火,次优解跳出局部极小
3. 随机梯度下降,计算梯度时加入随机因素,使局部极小点梯度不等于0,跳出局部极小继续搜索
ART网络是竞争性学习的重要代表。先来说一说什么是竞争性学习。
竞争性学习是神经网络中常用的一种无监督学习策略,网络的输出神经元相互竞争,每一时刻仅有一个竞争胜利的神经元被激活,其它神经元的状态被抑制,这种机制也被称作winner-take-all原则。
最简单的方式就是去计算输入向量和每个识别层神经元所对应的模式类的代表向量之间的距离,距离最小的获胜,获胜的神经元再向其它识别层神经元发送信号,抑制其激活。如果输入向量和获胜神经元所对应的代表向量之间的相似度大于识别阈值,当前的输入样本就被归类到该向量所属的类别,同时,网络更新连接权重,使得该神经元有更大的获胜可能性;如果相似度小于识别阈值,则重置模块将在识别层增设一个新的神经元,新神经元的代表向量就是当前的输入向量。
ART网络能够缓解竞争性学习中的“可塑性-稳定性窘境”(这里可塑性指的是学习新知识的能力,稳定性指神经网络在学习新知识时要保持对旧知识的记忆)--因此ART网络的一大优势就是可以进行增量学习或在线学习。
SOM(self-organizing map)网络也是一种竞争型的无监督学习的网络,它能将高维的输入数据映射到低维空间(通常映射到二维),同时保持输入数据在高维空间的拓扑结构,就是把高维空间中相似的样本点映射到网络输出层中的邻近神经元。
SOM训练的过程也很简单:
1.接收训练样本
2.每个输出层神经元计算该样本与自身携带的权向量之间的距离,选取距离最近的神经元成为竞争获胜者,称为最佳匹配单元
3.调整最佳匹配单元及其邻近神经元的权向量,使其与当前输入样本的距离缩小
4.不断迭代上过程直至收敛
如图,SOM网络的输出层神经元排列在二维空间中,每个神经元都拥有一个权向量,网络在接收输入向量后确定输出层获胜神经元,而获胜的神经元决定了该输入向量在低维空间中的位置。SOM网络的训练目的就是为每个输出层神经元找到合适的权向量,以达到保持拓扑结构的目的。
结构自适应网络和一般神经网络模型最大的区别就在于它的网络结构不是事先固定的,除连接权和阈值之外,网络结构也是结构自适应网络的学习目标之一,学习目的包括了在训练中找到最符合数据特点的网络结构。
级联相关网络是结构自适应网络的重要代表,其中"级联"指的是建立层次连接的层级结构,在开始训练时网络只有输入层和输出层,处于最小拓扑结构,而随着训练的进行,新的隐层神经元加入,建立起层级结构。新的隐层神经元在加入时输入端连接权值是冻结固定的,而"相关"指的就是通过最大化神经元的输出与网络误差之间的相关性来训练相关的参数。
和一般的前馈神经网络相比,级联相关网络不需要设置网络层数或隐层神经元数目,且训练的速度较快。缺点是它在数据较小的时候容易陷入过拟合。
递归神经网络允许网络中存在环形结构,从而让一些神经元的输出反馈回来作为输入信号,因此网络在t时刻的输出状态不仅与t时刻的输入有关,还和t-1时刻的网络状态有关,从而能处理与时间有关的动态变化。
ELman是最常用的递归神经网络之一,它的结构和多层前馈网络相似,不同的在于隐层神经元的输出被反馈回来,与下一时刻输入神经元提供的信号一起作为隐层神经元在下一时刻的输入。隐层神经元通常采用Sigmoid激活函数,网络的训练通常采用BP算法进行。
Boltzmann机是一种"基于能量的模型",什么意思呢,就是神经网络里面有一类模型是为网络状态定义一个"能量",能量最小化时网络达到理想状态,网络的训练就是在最小化这个能量函数。
Boltzmann机的神经元分为两层:显层和隐层。显层用于表示数据的输入和输出,隐层则被理解为数据的内在表达。其中神经元的状态只有0-1两种,状态1表示激活,0表示抑制。
Boltzman机的训练过程就是把每个训练样本当作一个状态向量,使其出现的概率尽可能大。标准的Boltzmann机时一个全连接图,训练网络复杂度很高,所以现实解决问题的时候常采用的是受限Boltzmann机。
卷积神经网络,也叫convnet,是计算机视觉应用几乎都在使用的一种深度学习模型。
密集连接层和卷积层的根本区别在于,Dense 层从输入特征空间中学到的是全局模式,而卷积层学到的是局部模式(对于图像来说,学到的就是在输入图像的二维小窗口中发现的模式)
卷积神经网络学到的模式具有平移不变性,可以学到模式的空间层次结构。
第一个卷积层学习较小的局部模式(比如边缘),第二个卷积层学习由第一层特征组成的更大的模式卷积神经网络,如此叠加可以有效地学习越来越复杂、越抽象的视觉概念(因为视觉世界从根本上具有空间层次结构)。
卷积神经网络与其他神经网络的区别在于其在图像、语音或音频信号输入方面的卓越性能。它们有三种主要类型的层,它们是:
卷积层
池化层
全连接 (FC) 层
卷积层是卷积网络的第一层。虽然卷积层之后可以有额外的卷积层或池化层,但全连接层是最后一层。每一层,CNN的复杂性都会增加,识别图像的更大部分。较早的图层侧重于简单要素,例如颜色和边缘。随着图像数据通过CNN的层,它开始识别物体的较大元素或形状,直到最终识别出预期的物体。
卷积层是CNN的核心构建块,也是大多数计算发生的地方。它需要一些组件,即输入数据、筛选器和特征图。假设输入将是彩色图像,它由 3D 像素矩阵组成。这意味着输入将具有三个维度(高度、宽度和深度),对应于图像中的 RGB。我们还有一个特征检测器,也称为内核或过滤器,它将在图像的感受野上移动,检查特征是否存在。此过程称为卷积。
特征检测器是一个二维 (2-D) 权重数组,表示图像的一部分。虽然它们的大小可能不同,但滤波器大小通常为 3x3 矩阵;这也决定了感受野的大小。然后将滤镜应用于图像的某个区域,并在输入像素和滤镜之间计算点积。然后将该点积馈入输出数组。之后,过滤器以大步移动,重复该过程,直到内核扫过整个图像。来自输入和滤波器的一系列点积的最终输出称为特征图、激活图或卷积特征。
每次卷积操作后,CNN 都会对特征图应用整流线性单元 (ReLU) 变换,从而为模型引入非线性。
正如我们前面提到的,另一个卷积层可以遵循初始卷积层。当这种情况发生时,CNN的结构可能会变得分层,因为后面的层可以看到前几层的感受野内的像素。例如,假设我们正在尝试确定图像是否包含自行车,那我们就可以将自行车视为零件的总和,它由车架、车把、车轮、踏板等组成。自行车的每个单独部分在神经网络中构成一个较低级别的模式,其部分的组合代表一个更高级别的模式,在CNN内创建一个特征层次结构。
池化层(也称为缩减采样)执行降维,减少输入中的参数数量。与卷积层类似,池化操作在整个输入中扫描滤波器,但不同之处在于该滤波器没有任何权重。相反,内核将聚合函数应用于接收字段中的值,填充输出数组。池化主要有两种类型:
最大池化:当滤波器在输入上移动时,它会选择要发送到输出数组的具有最大值的像素。顺便说一句,与平均池化相比,这种方法往往更常用。
平均池化:当滤波器在输入端移动时,它会计算要发送到输出数组的感受野内的平均值。
虽然在池化层中丢失了很多信息,但它对CNN也有很多好处。它们有助于降低复杂性、提高效率并限制过度拟合的风险。
全连接层的名称恰如其分地描述了自己。如前所述,输入图像的像素值不会直接连接到部分连接层中的输出层。但是,在全连接层中,输出层中的每个节点都直接连接到前一层中的节点。
该图层根据通过前几层及其不同过滤器提取的要素执行分类任务。虽然卷积层和池化层倾向于使用 ReLu 函数,但 FC 层通常利用 softmax 激活函数对输入进行适当分类,产生从 0 到 1 的概率。