人工智能入门-深度学习前向传播与反向传播理论公式剖析与实战代码案例详解,从公式到代码实战
前向传播,反向传播和神经网络初始化
1.向前传播
前向传播(forward propagation或forward pass) 指的是:按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。
假设输入样本是 x∈Rd, 并且我们的隐藏层不包括偏置项。 这里的中间变量是:
z=W(1)x,
\mathbf{z}= \mathbf{W}^{(1)} \mathbf{x},
z=W(1)x,
其中W(1)∈Rh×d 是隐藏层的权重参数。 将中间变量z∈Rh通过激活函数ϕ后, 我们得到长度为h的隐藏激活向量:
h=ϕ(z).
\mathbf{h}= \phi (\mathbf{z}).
h=ϕ(z).
隐藏变量h也是一个中间变量。 假设输出层的参数只有权重W(2)∈Rq×h, 我们可以得到输出层变量,它是一个长度为q的向量
o=W(2)h.
\mathbf{o}= \mathbf{W}^{(2)} \mathbf{h}.
o=W(2)h.
假设损失函数为l,样本标签为y,我们可以计算单个数据样本的损失项,
L=l(o,y).
L = l(\mathbf{o}, y).
L=l(o,y).
根据L2正则化的定义,给定超参数λ,正则化项为
s=λ2(∥W(1)∥F2+∥W(2)∥F2),
s = \frac{\lambda}{2} \left(\|\mathbf{W}^{(1)}\|_F^2 + \|\mathbf{W}^{(2)}\|_F^2\right),
s=2λ(∥W(1)∥F2+∥W(2)∥F2),
其中矩阵的Frobenius范数是将矩阵展平为向量后应用的L2范数。 最后,模型在给定数据样本上的正则化损失为:
J=L+s.
J = L + s.
J=L+s.
将J称为目标函数(objective function)。

2.反向传播
简单网络的参数是 W(1)和W(2)。 反向传播的目的是计算梯度∂J/∂W(1)和 ∂J/∂W(2)。 为此,我们应用链式法则,依次计算每个中间变量和参数的梯度。 计算的顺序与前向传播中执行的顺序相反,因为我们需要从计算图的结果开始,并朝着参数的方向努力。第一步是计算目标函数J=L+s相对于损失项L和正则项s的梯度。
J 是目标函数,由损失函数 L 和正则化项 s 组成。因为 s 不直接依赖于 o,所以 J 对 o 的梯度就是 L 对 o 的梯度。
∂J∂o=prod(∂J∂L,∂L∂o)=∂L∂o∈Rq.
\frac{\partial J}{\partial \mathbf{o}}
= \text{prod}\left(\frac{\partial J}{\partial L}, \frac{\partial L}{\partial \mathbf{o}}\right)
= \frac{\partial L}{\partial \mathbf{o}}
\in \mathbb{R}^q.
∂o∂J=prod(∂L∂J,∂o∂L)=∂o∂L∈Rq.
计算正则化项对参数的梯度:
∂s∂W(1)=λW(1) and ∂s∂W(2)=λW(2).
\frac{\partial s}{\partial \mathbf{W}^{(1)}} = \lambda \mathbf{W}^{(1)}
\; \text{and} \;
\frac{\partial s}{\partial \mathbf{W}^{(2)}} = \lambda \mathbf{W}^{(2)}.
∂W(1)∂s=λW(1)and∂W(2)∂s=λW(2).
计算 J 对输出层参数 w(2) 的梯度:
∂J∂W(2)=prod(∂J∂o,∂o∂W(2))+prod(∂J∂s,∂s∂W(2))=∂J∂oh⊤+λW(2).
\frac{\partial J}{\partial \mathbf{W}^{(2)}}= \text{prod}\left(\frac{\partial J}{\partial \mathbf{o}}, \frac{\partial \mathbf{o}}{\partial \mathbf{W}^{(2)}}\right) + \text{prod}\left(\frac{\partial J}{\partial s}, \frac{\partial s}{\partial \mathbf{W}^{(2)}}\right)= \frac{\partial J}{\partial \mathbf{o}} \mathbf{h}^\top + \lambda \mathbf{W}^{(2)}.
∂W(2)∂J=prod(∂o∂J,∂W(2)∂o)+prod(∂s∂J,∂W(2)∂s)=∂o∂Jh⊤+λW(2).
计算j 对隐藏层激活 h的梯度:
∂J∂h=prod(∂J∂o,∂o∂h)=W(2)⊤∂J∂o.
\frac{\partial J}{\partial \mathbf{h}}
= \text{prod}\left(\frac{\partial J}{\partial \mathbf{o}}, \frac{\partial \mathbf{o}}{\partial \mathbf{h}}\right)
= {\mathbf{W}^{(2)}}^\top \frac{\partial J}{\partial \mathbf{o}}.
∂h∂J=prod(∂o∂J,∂h∂o)=W(2)⊤∂o∂J.
计算J对隐藏层变量z 的梯度,h=ϕ(z),激活函数 ϕ 是逐元素应用的,所以 ∂z∂h=ϕ′(z)。因此,J 对 z 的梯度是 ∂h∂J⊙ϕ′(z)。
∂J∂z=prod(∂J∂h,∂h∂z)=∂J∂h⊙ϕ′(z).
\frac{\partial J}{\partial \mathbf{z}}
= \text{prod}\left(\frac{\partial J}{\partial \mathbf{h}}, \frac{\partial \mathbf{h}}{\partial \mathbf{z}}\right)
= \frac{\partial J}{\partial \mathbf{h}} \odot \phi'\left(\mathbf{z}\right).
∂z∂J=prod(∂h∂J,∂z∂h)=∂h∂J⊙ϕ′(z).
计算 \J对隐藏层参数W(1) 的梯度:
∂J∂W(1)=prod(∂J∂z,∂z∂W(1))+prod(∂J∂s,∂s∂W(1))=∂J∂zx⊤+λW(1).
\frac{\partial J}{\partial \mathbf{W}^{(1)}}
= \text{prod}\left(\frac{\partial J}{\partial \mathbf{z}}, \frac{\partial \mathbf{z}}{\partial \mathbf{W}^{(1)}}\right) + \text{prod}\left(\frac{\partial J}{\partial s}, \frac{\partial s}{\partial \mathbf{W}^{(1)}}\right)
= \frac{\partial J}{\partial \mathbf{z}} \mathbf{x}^\top + \lambda \mathbf{W}^{(1)}.
∂W(1)∂J=prod(∂z∂J,∂W(1)∂z)+prod(∂s∂J,∂W(1)∂s)=∂z∂Jx⊤+λW(1).
更多推荐




所有评论(0)