人工神经网络这几年太火了,普遍用于预测、语音或图像识别。四五年前曾经想学习,但没有找到好的学习资料,一直一知半解的。最近一段时间因为要用 BP 神经网络做需求预测,就重新捡起来了。中文资料大部分的讲解不清晰(符号普遍比较混乱),于是结合维基百科以及查阅的几个英文资料,写下自己对这一算法的理解。
一、 神经网络算法的内涵
神经网络的目标是:找到一个能把一组输入最好地映射到其正确的输出的函数。例如一个简单的分类任务,其中输入是动物的图像,正确的输出将是动物的名称。或者根据历史需求数据,预测未来一期的需求数据。
神经网络的思想(内涵)类似回归分析中经常用到的拟合,都用到了最小二乘的思想:数学意义上的决策目标是:选取一些参数(神经网络中每个输入的权重),使得拟合的输出与期望输出的误差平方和最小。
下面是一个神经网络示意图(输入层有 3个神经元,隐含层有 3个神经元,输出层有 3个神经元),输入信息经过正向传播到输出,计算实际输出与期望输出的误差后,在反向传播误差;重复这个过程,在传播过程中,不断减少误差,直到误差减少到一定程度终止。
误差反向传播,是该神经网络叫做 BP 神经网络的原因。
二、神经元之间信息的传递
每个神经元接受上一层所有神经元传递过来的信息,然后传递到下一层。接受信号时,按一定权重
wij 接受信号。 下图是一个接受信号与传递信号的示意图:
wij 表示从神经元
i 传递到神经元
j 时的权重(每个神经元的阈值
θj 也能放在权重里表示,为了便于推算和理解,下面就不提阈值了),神经元
i 处传来的信息值大小为
oi(若神经元
i 在输入层,则
oi=xi),则每个神经元
j 的激活值 (activation value)
aj 等于:
aj=i∑wijoi(1)
神经元
j 有了激活值后,根据它的激活函数(或叫传递函数)
φ ,计算得到它的信息量大小
oj:
oj=φ(aj)=φ(i∑wijoi)(2)
常用的激活函数
φ 为 Sigmoid 函数,即:
φ(z)=1+e−z1
使用这个函数的一个重要原因是它的一阶导数方便求解,
∂z∂φ=φ(z)(1−φ(z))(3)
三、采用梯度下降法使误差减小
一般来说,神经元
j 产生的误差
E 这样定义:
Ej=21j=1∑m(tj−yj)2(4)
其中
tj 表示输出层的期望输出,
yj 表示输出层的实际输出,假设输出层有
m 个神经元。我们的目标是选取合适的权重
wij,使得
E 最小,BP 神经网络一般采用梯度下降法逐渐更新权重(类似最优化中的最速下降法,参见本人另外一篇博客关于最速下降法的迭代公式:https://blog.csdn.net/robert_chen1988/article/details/53167156)。
因此,计算
E 对
wij 的一阶导数:
∂wij∂Ej=∂yj∂Ej∂wij∂yj
我们同一用
oj 表示
yj(
oj 表示输出的信息值,在最后的输出层,输出的信息值为
yj),则:
∂wij∂Ej=∂oj∂Ej∂wij∂oj
根据公式 (2) 与公式 (3), 输出信息值
oj 又是激活值
aj 的函数,而激活值
aj 才与
wij 有直接联系,因此:
∂wij∂Ej=∂oj∂Ej∂wij∂oj=∂oj∂Ej∂aj∂oj∂wij∂aj(5)
下面分开计算每一项,由公式(1):
∂wij∂aj=∂wij∂(∑iwijoi)=oi(6)
即这项导数是传递它信息的神经元的信息值。由公式 (3):
∂aj∂oj=φ(aj)(1−φ(aj))=oj(1−oj)(7)
而计算
∂oj∂E 则要分两种情况讨论:
- 若
oj 位于最后的输出层,则
oj=yj,根据公式(4)
∂oj∂E=∂yj∂E=yj−tj(8)
根据公式 (5),(6)(7)(8),得到:
∂wij∂Ej=∂oj∂Ej∂aj∂oj∂wij∂aj=∂oj∂Ej∂aj∂ojoi=(yj−tj)yj(1−yj)oi(9)
- 若
oj 位于输入层或隐含层, 神经元
j 输出值
oj 造成的误差等于它输出的所有神经元造成的误差之和 (本人的理解),设神经元
j 输出的神经元的集合为
L,因此得到:
∂oj∂Ej=l∈L∑(∂oj∂El)=l∈L∑∂ol∂El∂al∂ol∂oj∂al=l∈L∑∂ol∂El∂al∂olwjl(10)
这两种情况都满足一下式子:(只不过两种情况的
∂oj∂E 不同)
∂wij∂Ej=∂oj∂Ej∂aj∂oj∂wij∂aj=∂oj∂Ej∂aj∂ojoi(11)
为了方便,令
δj=∂oj∂Ej∂aj∂oj,则权重的一阶导数可以简化成:
∂wij∂Ej=δjoi(11)
其中,
δj 的取值与上面两种情况有关(根据表达式(9),(10)):
δj=⎩⎪⎪⎨⎪⎪⎧(yj−tj)yj(1−yj)(∑l∈L∂ol∂El∂al∂olwjl)oj(1−oj)=(∑l∈Lδlwjl)oj(1−oj)若 j 位于输出层若 j 不位于输出层(12)
于是,表达式(11),(12)就是权重相对于误差的一阶导数取值。BP 神经网络采用梯度下降法使得误差降低。
类似最速下降法的思想,BP 神经网络在迭代时,采用下面的方法更新权重,不断使得误差减小:
wij=wij−η∂wij∂Ej
其中
η 就是梯度下降法的步长,在神经网络算法中称为学习速率,而权重沿负梯度方向更新。
四、BP 神经网络的局限性
- 不能保证得到全局最优解
- 输入的数据不要求标准化,但若标准化,可以提高神经网络的表现。