BP神经网络算法(单变量版本)
网络结构定义
输入变量XmXm,其中m=1,2,3,...,Ninputm=1,2,3,...,Ninput
要预测的变量tmtm,其中m=1,2,3,...,Ninputm=1,2,3,...,Ninput
设置三层网络结构,前两层为隐藏层,最后一层为输出层
第一层共有I个神经元,第二层共有J个神经元,第三层共有K个神经元。
前向传播
第一层
WimWim,表示 第一层神经网络第ii个神经元和第m个输入变量之前的权重。
bibi,表示 第一层神经网络第ii个神经元的偏置。
net(1)i=∑Ninputm=1WimXm+bi,其中net(1)ineti(1)表示第一层神经网络中第ii个神经元的输出。
第一层的激活函数设为f(1),则经过激活函数激活后第ii个神经元的输出为
y(1)i=f(1)(net(1)i)
第二层
WjiWji,表示 第二层神经网络第jj个神经元和第i个第一层神经网络的神经元输出之间的权重。
bjbj,表示 第二层神经网络第jj个神经元的偏置。
net(2)j=∑Ii=1Wjiy(1)i+bj,其中net(2)jnetj(2)表示第二层神经网络中第jj个神经元的输出。
第二层的激活函数设为f(2),则经过激活函数激活后第jj个神经元的输出为
y(2)j=f(2)(net(2)j)
第三层(输出层)
WkjWkj,表示 第三层神经网络第kk个神经元和第j个第二层神经网络的神经元输出之间的权重。
bkbk,表示 第三层神经网络第kk个神经元的偏置。
net(3)k=∑Jj=1Wkjy(2)j+bk,其中net(3)knetk(3)表示第三层神经网络中第kk个神经元的输出。
第三层的激活函数设为f(3),则经过激活函数激活后第kk个神经元的输出为
y(3)k=f(3)(net(3)k)
经过前向传播已经可以用来输出结果了。
但是怎么来训练这个神经网络呢?这里就要用到神经网络的反向传播!!
反向传播(Back-Propagation)-求导
要使用反向传播首先需要定义损失函数(loss function)。现在针对不同的领域损失函数的定义有非常多,这里用到最简单的均方差(Mean squared error-MSE)来训练分类任务的神经网络
均方差的定义
1l∑l=1nt(y(3)k−tk)21l∑l=1nt(yk(3)−tk)2
nt表示分类任务最后类别的数目。如果是抛硬币那么nt=2(正面和反面)。
PS:如果是分类问题,需要将这里的t_m进行one-hot编码。并且输出层神经元的个数与nt的大小相同。
输出层推导
根据链式法则(chain-rule),求权重的导数
∂loss∂Wkj=∂loss∂net(3)k⋅∂net(3)k∂Wkj=∂loss∂net(3)k⋅y(2)j∂loss∂Wkj=∂loss∂netk(3)⋅∂netk(3)∂Wkj=∂loss∂netk(3)⋅yj(2)
∂loss∂net(3)k=∂∂net(3)k(1l∑lnt(y(3)k−tk)2)=1l∂∂net(3)k(∑lnt(f(3)(net(3)k)−tk)2)∂loss∂netk(3)=∂∂netk(3)(1l∑lnt(yk(3)−tk)2)=1l∂∂netk(3)(∑lnt(f(3)(netk(3))−tk)2)
=1l∂∂net(3)k((f(3)(net(3)k)−tk)2)=2l(f(3)(net(3)k)−tk)⋅(f(3)′(net(3)k)⋅1)=1l∂∂netk(3)((f(3)(netk(3))−tk)2)=2l(f(3)(netk(3))−tk)⋅(f(3)′(netk(3))⋅1)
其中设∂loss∂net(3)k=δ(3)=2l(f(3)(net(3)k)−tk)⋅(f(3)′(net(3)k)⋅1)∂loss∂netk(3)=δ(3)=2l(f(3)(netk(3))−tk)⋅(f(3)′(netk(3))⋅1)
则
→∂loss∂Wkj=δ(3)⋅y(2)j→∂loss∂Wkj=δ(3)⋅yj(2)
同理可得
∂loss∂bk=∂loss∂net(3)k⋅∂net(3)k∂bk=∂loss∂net(3)k=δ(3)∂loss∂bk=∂loss∂netk(3)⋅∂netk(3)∂bk=∂loss∂netk(3)=δ(3)
这里就求得了最后一层相关权重和偏置的导数了。
第二层隐藏层推导
与输出层的求导非常相似,也是使用链式法则(chain-rule),求第二层隐藏层权重的导数
∂loss∂Wji=∂loss∂net(2)j⋅∂net(2)j∂Wji=∂loss∂net(2)j⋅y(1)i∂loss∂Wji=∂loss∂netj(2)⋅∂netj(2)∂Wji=∂loss∂netj(2)⋅yi(1)
∂loss∂net(2)j=∂∂net(2)j(1l∑lnt(y(3)k−tk)2)=1l∂∂net(2)j(∑lnt(f(3)(net(3)k)−tk)2)∂loss∂netj(2)=∂∂netj(2)(1l∑lnt(yk(3)−tk)2)=1l∂∂netj(2)(∑lnt(f(3)(netk(3))−tk)2)
=1l∂∂net(2)j((f(3)(net(3)k)−tk)2)=1l∂∂net(2)j(f(3)(∑j=1JWkjy(2)j+bk)−tk)2=1l∂∂netj(2)((f(3)(netk(3))−tk)2)=1l∂∂netj(2)(f(3)(∑j=1JWkjyj(2)+bk)−tk)2
=1l∂∂net(2)j(f(3)(∑j=1JWkjf(2)(net(2)j)+bk)−tk)2=1l∂∂netj(2)(f(3)(∑j=1JWkjf(2)(netj(2))+bk)−tk)2
=2l⋅f(3)(∑j=1JWkjf(2)(net(2)j)+bk)−tk)⋅f(3)′(∑j=1JWkjf(2)(net(2)j)+bk)⋅∑j=1JWkjf(2)′(net(2)j)⋅1=2l⋅f(3)(∑j=1JWkjf(2)(netj(2))+bk)−tk)⋅f(3)′(∑j=1JWkjf(2)(netj(2))+bk)⋅∑j=1JWkjf(2)′(netj(2))⋅1
=δ(3)k⋅∑j=1JWkjf(2)′(net(2)j)=∑j=1J(Wkj⋅δ(3)k)⋅f(2)′(net(2)j)=δk(3)⋅∑j=1JWkjf(2)′(netj(2))=∑j=1J(Wkj⋅δk(3))⋅f(2)′(netj(2))
!!!注意δ(3)k⋅∑Jj=1Wkjf(2)′(net(2)j)δk(3)⋅∑j=1JWkjf(2)′(netj(2))这个式子 (************还需要配图说明)
其中设∂loss∂net(2)j=δ(2)=∑Jj=1(Wkj⋅δ(3)k)⋅f(2)′(net(2)j)∂loss∂netj(2)=δ(2)=∑j=1J(Wkj⋅δk(3))⋅f(2)′(netj(2))
则
→∂loss∂Wji=δ(2)⋅y(1)i→∂loss∂Wji=δ(2)⋅yi(1)
同理可得
∂loss∂bj=∂loss∂net(2)j⋅∂net(2)j∂bj=∂loss∂net(2)j=δ(2)∂loss∂bj=∂loss∂netj(2)⋅∂netj(2)∂bj=∂loss∂netj(2)=δ(2)
第一层隐藏层推导
与第二层隐藏层推导一样,也是使用链式法则(chain-rule),求第一层隐藏层权重的导数
∂loss∂Wim=∂loss∂net(1)i⋅∂net(1)i∂Wim=∂loss∂net(1)i⋅Xm∂loss∂Wim=∂loss∂neti(1)⋅∂neti(1)∂Wim=∂loss∂neti(1)⋅Xm
其中设∂loss∂net(1)i=δ(1)=∑Ii=1(Wji⋅δ(2)j)⋅f(1)′(net(1)i)∂loss∂neti(1)=δ(1)=∑i=1I(Wji⋅δj(2))⋅f(1)′(neti(1))
则
→∂loss∂Wim=δ(1)⋅Xm→∂loss∂Wim=δ(1)⋅Xm
同理可得
∂loss∂bi=∂loss∂net(1)i⋅∂net(1)i∂bi=∂loss∂net(1)i=δ(1)∂loss∂bi=∂loss∂neti(1)⋅∂neti(1)∂bi=∂loss∂neti(1)=δ(1)
神经网络中所有需要求解的导数都已经完成。接下来只要进行反向传播更新便可以训练该神经网络了。