机器学习课的作业,由于latex的公式编辑我很不熟悉,很多公式都没有编辑好,不过先发出来算了。后续我可能还会更新基于卷积神经网络的反向传播算法推导。
定义如下记号描述网络:
L L L:神经网络的层数
n l n^{l} nl:表示第 l l l层神经元的个数
f l ( ) f_{l}() fl(): 第 l l l层神经元激活函数
W ( l ) ∈ R n l × n l − 1 W^{\left( l \right)} \in R^{n^{l} \times n^{l - 1}} W(l)∈Rnl×nl−1:表示第 l − 1 l - 1 l−1层到第 l l l层的权重矩阵
b ( l ) ∈ R n l b^{(l)} \in R^{n^{l}} b(l)∈Rnl:表示第 l − 1 l - 1 l−1层到第 l l l层的偏置
z ( l ) ∈ R n l z^{(l)} \in R^{n^{l}} z(l)∈Rnl:表示第 l l l层的神经元状态
a ( l ) ∈ R n l a^{(l)} \in R^{n^{l}} a(l)∈Rnl:表示第 l l l层的神经元活性值
前馈神经网络通过下面公式进行信息传播:
z ( l ) = W ( l ) ∙ a ( l − 1 ) + b ( l ) z^{\left( l \right)} = W^{\left( l \right)} \bullet a^{\left( l - 1 \right)} + b^{\left( l \right)} z(l)=W(l)∙a(l−1)+b(l)
a ( l ) = f l ( z ( l ) ) a^{\left( l \right)} = f_{l}\left( z^{\left( l \right)} \right) a(l)=fl(z(l))
公式也可以写成:
z ( l ) = W ( l ) ⋅ f l ( z ( l − 1 ) ) + b ( l ) z^{\left( l \right)} = W^{\left( l \right)} \cdot f_{l}\left( z^{\left( l - 1 \right)} \right) + b^{\left( l \right)} z(l)=W(l)⋅fl(z(l−1))+b(l)
给定一组样本 ( X ( i ) , y ( i ) ) , 1 ≤ i ≤ N (X(i),y(i)),1 \leq i \leq N (X(i),y(i)),1≤i≤N,前馈神经网络的输出 f ( X ∣ W , b ) f(X|W,b) f(X∣W,b)目标函数为:
J ( W , b ) = ∑ i = 1 N L ( y ( i ) , f ( X ( i ) ∣ W , b ) ) + 1 2 λ ∣ ∣ W ∣ ∣ F 2 = ∑ i = 1 N ( W , b ; X ( i ) , y ( i ) ) + 1 2 λ ∣ ∣ W ∣ ∣ F 2 \begin{matrix} J(W,b) & = \sum_{i = 1}^{N}{L(y^{(i)},f(X^{(i)}|W,b)) + \frac{1}{2}\lambda||W||_{F}^{2}} \\ & = \sum_{i = 1}^{N}{(W,b;X(i),y^{\left( i \right)}) + \frac{1}{2}\lambda||W||_{F}^{2}} \\ \end{matrix} J(W,b)=∑i=1NL(y(i),f(X(i)∣W,b))+21λ∣∣W∣∣F2=∑i=1N(W,b;X(i),y(i))+21λ∣∣W∣∣F2
这里的 W W W和 b b b包含了每一层的权重矩阵和偏置向量, ∣ ∣ W ∣ ∣ F 2 = ∑ l = 1 L ∑ j = 1 n l + 1 ∑ i = 1 n l W ij ( l ) ||W||_{F}^{2} = \sum_{l = 1}^{L}{\sum_{j = 1}^{n^{l + 1}}{\sum_{i = 1}^{n^{l}}W_{\text{ij}}^{\left( l \right)}}} ∣∣W∣∣F2=∑l=1L∑j=1nl+1∑i=1nlWij(l)
如果使用梯度下降来最小化目标函数,使用如下方法更新参数:
W ( l ) = W ( l ) − α ∂ J ( W , b ) ∂ W ( l ) , = W ( l ) − α ∑ i = 1 N ( J ( W , b ; X ( i ) , y ( i ) ) ∂ W ( l ) ) − λ W b ( l ) = b ( l ) − α ∂ J ( W , b ) ∂ b ( l ) , = b ( l ) − α ∑ i = 1 N ( J ( W , b ; X ( i ) , y ( i ) ) ∂ b ( l ) ) \begin{matrix} W^{(l)} & = W^{(l)} - \alpha\frac{\partial J(W,b)}{\partial W^{(l)}}, \\ & = W^{(l)} - \alpha\sum_{i = 1}^{N}{(\frac{J(W,b;X^{(i)},y^{(i)})}{\partial W^{(l)}}) - \lambda W} \\ b^{(l)} & = b^{(l)} - \alpha\frac{\partial J(W,b)}{\partial b^{(l)}}, \\ & = b^{(l)} - \alpha\sum_{i = 1}^{N}{(\frac{J(W,b;X^{(i)},y^{(i)})}{\partial b^{(l)}})} \\ \end{matrix} W(l)b(l)=W(l)−α∂W(l)∂J(W,b),=W(l)−α∑i=1N(∂W(l)J(W,b;X(i),y(i)))−λW=b(l)−α∂b(l)∂J(W,b),=b(l)−α∑i=1N(∂b(l)J(W,b;X(i),y(i)))
其中 λ \lambda λ是参数更新率。
∂ J ( W , b ; X , y ) ∂ W ij ( l ) = t r ( ( J ( W , b ; X , y ) ∂ z ( l ) ) T ∂ z ( l ) ∂ W ij ( l ) ) \frac{\partial J\left( W,b;X,y \right)}{\partial W_{\text{ij}}^{\left( l \right)}} = tr((\frac{J\left( W,b;X,y \right)}{\partial z^{\left( l \right)}})^{T}\frac{\partial z^{\left( l \right)}}{\partial W_{\text{ij}}^{\left( l \right)}}) ∂Wij(l)∂J(W,b;X,y)=tr((∂z(l)J(W,b;X,y))T∂Wij(l)∂z(l))
对于第 l l l层,定义一个误差项 δ ( l ) = J ( W , b ; X , y ) ∂ z ( l ) ∈ R n ( l ) \delta^{(l)} = \frac{J(W,b;X,y)}{\partial z^{(l)}} \in R^{n^{(l)}} δ(l)=∂z(l)J(W,b;X,y)∈Rn(l)是目前目标函数关于第l层的神经元 z ( l ) z^{(l)} z(l)的偏导数。 δ ( l ) \delta^{(l)} δ(l)也反映了最终的输出对第l层神经元对最终误差的敏感程度。
∂ J ( W , b ; X , y ) ∂ W ( l ) = δ i ( l ) ( a j ( l − 1 ) ) T ∂ J ( W , b ; X , y ) ∂ b ( l ) = δ i ( l ) \begin{matrix} \frac{\partial J\left( W,b;X,y \right)}{\partial W^{\left( l \right)}} & = \delta_{i}^{\left( l \right)}(a_{j}^{\left( l - 1 \right)})^{T} \\ \frac{\partial J\left( W,b;X,y \right)}{\partial b^{\left( l \right)}} & = \delta_{i}^{\left( l \right)} \\ \end{matrix} ∂W(l)∂J(W,b;X,y)∂b(l)∂J(W,b;X,y)=δi(l)(aj(l−1))T=δi(l)
现在来看第l层的误差项 δ ( l ) \delta^{(l)} δ(l)
δ ( l ) ≜ J ( W , b ; X , y ) ∂ z ( l ) = ∂ a ( l ) ∂ z ( l ) ⋅ ∂ z ( l + 1 ) ∂ a ( l ) ⋅ J ( W , b ; X , y ) ∂ z ( l + 1 ) = d i a g ( f l ′ ( z ( l ) ) ) ⋅ ( W ( l + 1 ) ) T ⋅ δ ( l + 1 ) = f l ′ ( z ( l ) ) ⊙ ( ( W ( l + 1 ) ) T δ ( l + 1 ) ) \begin{matrix} \delta^{(l)} & \triangleq \frac{J(W,b;X,y)}{\partial z^{(l)}} \\ & = \frac{\partial a^{(l)}}{\partial z^{(l)}} \cdot \frac{\partial z^{(l + 1)}}{\partial a^{(l)}} \cdot \frac{J(W,b;X,y)}{\partial z^{(l + 1)}} \\ & = diag(f_{l}^{'}(z^{(l)})) \cdot (W^{(l + 1)})^{T} \cdot \delta^{(l + 1)} \\ & = f_{l}^{'}(z^{(l)}) \odot ((W^{(l + 1)})^{T}\delta^{(l + 1)}) \\ \end{matrix} δ(l)≜∂z(l)J(W,b;X,y)=∂z(l)∂a(l)⋅∂a(l)∂z(l+1)⋅∂z(l+1)J(W,b;X,y)=diag(fl′(z(l)))⋅(W(l+1))T⋅δ(l+1)=fl′(z(l))⊙((W(l+1))Tδ(l+1))
⊙ \odot ⊙是向量点积运算符,表示每个元素相乘。
因此,前馈神经网络的训练过程可以分为以下步骤:
Forward pass中计算每一层的状态和激活值,直到最后一层,
Backward pass中计算每一层的误差,计算每一层参数的偏导数,并更新参数。
本篇博客绝大部分参考了这个博客,大家可以去他的原博客看,十分感谢这位博主。