本文由 沈庆阳 所有,转载请与作者取得联系!
损失函数
在神经网络训练的时候往往要确定目标函数,也就是损失函数。在训练的时候,损失函数的选择有很多种,最常用的则是均方误差(mean-square error, MSE)。
假定一个多分类问题,其输出的类别有N个类别,我们希望每个输出都是以概率的形式进行输出。则在所有输出中得分最高的也就是最有可能的类别,因此则需要在输出层使用Softmax函数。
假设我们有一个数组,Vi表示数组中中的第i个元素,那么该元素的Softmax值就是:
也就是说,Softmax值就是该元素的指数,与所有元素指数和的比值。
理解了Softmax的定义之后,我们的输出用Softmax函数来表示就是:
用Softmax表示的输出
通过Softmax表示的输出之后,输出就被转换成了概率值。对于以Softmax作为输出层的神经网络模型来说,使用交叉熵(Cross-entropy)作为损失函数最为合适。
交叉熵损失函数
逆误差传播
在训练多层神经网络的时候,简单感知机的训练方法不再适用,从而需要更加强大的算法——逆误差传播算法(Error BackPropagation,BP)。BP算法在神经网络的训练中被广泛使用,其不仅适用于多层前馈网络,同样也适用于如递归神经网络等各种其他类型的神经网络。BP网络即使用BP算法训练的多层前馈神经网络。
逆误差传播算法的推导
假设训练集D={(x1,y1),(x2,y2)....(xm,ym)}。且定义如下形式的多层前馈网络:
其中,输入层的权重用ν表示,隐含层到输出层的权重用ω表示。
则,第h个隐藏层神经元的输入为:
第h个隐藏层神经元的输入
则,第j个输出神经元的输入为:
第j个输出神经元的输入
假定隐藏层和输出层的神经元都使用S函数。
则上述神经网络对于训练(xk,yk)的输出为:
训练样本(xk,yk)的输出
其在训练例的均方误差为:
均方误差
在上述网络中,一共有d个输入层,q个隐藏层和l个输出层。则,输入层到隐藏层之间有d * q个权值待定,隐藏层到输出层有q * l个权值待定,隐藏层有q个阈值待定,输出层有l个阈值待定。因此,该神经网络中一共有(d+l+1) * q + l个需要确定的参数。 由于逆误差传播是一个迭代的学习算法,因此在每轮迭代的过程中使用广义的感知机学习规则来更新参数。对于参数ν,其更新的公式为:
参数更新公式
逆误差传播算法使用梯度下降策略,其参数调整方向为目标的负梯度方向。对于误差Ek、学习速率η,有:
逆误差传播,顾名思义,其ωhj线影响到了第j个输出层的神经元的输入值βj,而后再传播影响到输出值,最后再影响到其误差Ek。
由于:
将上式带入:
得:
类似可以推导出其他待定的参数。
逆误差传播算法的描述
让我们先来看一下逆误差传播算法的描述:
算法输入:训练集D;学习速率η
算法过程:
1:在(0,1)区间内随机初始化网络中的所有连接权值和阈值
2:repeat
3: for all (xk,yk) ∈ D do
4: 根据当前参数和公式计算输出
5: 计算输出层神经元的梯度项gj
6: 计算隐藏层神经元的梯度项eh
7: 计算和更新连接权值ωhj、νih和阈值θj γh
8: end for
9:until 达到停止训练的条件
算法输出:连接权值与阈值确定的多层前馈神经网络
逆误差传播算法中,对于每一个训练样本,其算法先初始化随机的权值和阈值参数,然后将相关的输入示例提供给输入层神经元,并一层一层将信号向前传递(输入层->隐藏层->输出层),直到输出层产生输出值。再根据输出值计算输出等的误差,而后将误差逆向传播到隐藏层的神经元,最终根据隐藏层神经元计算得来的误差来调整连接的权值和神经元的阈值。BP算法不断地迭代循环执行上述步骤,直到达到训练停止的条件。对于上述算法的描述,我们回到前面的网络图上去查看会更加直观。
BP算法的相关问题
BP算法的目标是最小化训练集上的累积误差。由于每次迭代仅根据一个输入样本更新,因此上述BP算法也被称为“标准BP算法”。如果推导出的基于累计误差最小化的更新规则便是“累积误差逆传播算法(Accumulated Error Backpropagation)”,又称累积BP算法。
与累积BP算法相比,标准BP算法每次更新只针对单个样本,由此导致模型的参数更新十分频繁,从而对不同的样例处理的时候可能会导致不同的更新相互抵消的情况。标准BP算法为了达到最小的累计误差则需要更多次数的迭代。
而累积BP算法不是针对单个样本,而是直接针对累计误差最小化,从而在算法对整个数据集进行遍历之后再进行一次参数的更新,由此算法更新参数的频率更小。
但我们并不能片面的评价标准BP算法与累积BP算法孰优孰劣。因为在累计误差下降到一定地步的时候,进一步降低累计误差将会很慢。此时累积BP算法的计算速度就远不如标准BP算法的计算速度了。这种情况在数据集庞大的时候更为突出。
事实证明,神经网络算法的表示能力十分强大。只要包含足够多的神经元的隐藏层,多层前馈网络就可以以任意精度逼近任意复杂度的连续函数。但是足够多的隐藏层的个数具体为多少,仍不可通过计算得到,在实践的过程中只能通过不断试验来调整。
这里提供一个可以供大家通过调整隐藏层来找到合适参数的地方,Tensorflow Playground可以让我们选择学习速率,激活函数,正则化方法,λ等参数。在浏览器中实时构建自己的神经网络,并且对指定的数据集进行训练,观察训练的结果。
通过在TensorFlow Playground中玩耍,我们会加深对深度学习的相关概念的理解。
PS. Tensorflow Playground使用TensorFlow.JS搭建。
http://playground.tensorflow.org
上文提到,多层前馈网络具有很强的表示能力。也正是由此,其强大的表示能力会造成神经网络的过拟合。对于解决过拟合的策略,同样可以使用早停法和正则化。
添加了正则化之后的误差目标函数表示如下:
添加正则化后误差目标函数
全局最小与局部极小
神经网络的训练过程其实质上就是在参数空间内,寻找最优解的过程,也就是找到合适的参数使得误差E最小。
对于权值ω* 和阈值θ*,若存在ε>0使:
有E(ω;θ)≥E(ω* ;θ*)成立,则(ω* ;θ*)为局部极小解。若对任意(ω;θ)均有E(ω;θ)≥E(ω* ;θ*)成立,则(ω* ;θ*)为全局最小。
从上图中,我们可以看出,全局最小和局部极小均属于参数空间内梯度为0的点,其与函数的极小值和最小值的定义类似,全局最小一定是局部极小。使用梯度下降法来寻找最优参数的方法就是寻找全局最小的过程。
在寻找全局最小的过程中,如果沿着负梯度的方向,找到了梯度为0的点,并且只找到了一个这样的点。那么便称这个点为全局最小。但是如果我们在误差函数上找到了多个局部极小,并且不能保证找到了全局最小,那么便称参数寻优的过程陷入了局部极小。
对于解决陷入局部极小,有如下几种方式:
1、使用多组不同的数值初始化多个神经网络,在对神经网络训练之后,取其中误差最小的作为最优解。
2、使用随机梯度下降算法。
3、使用遗传算法来训练神经网络,从而更好地逼近最优解。
觉得写的不错的朋友可以点一个 喜欢♥ ~
谢谢你的支持!
网友评论