目录

CS224N Lecture 3: Backpropagation, Neural Network

x(Wx+b)=W \frac{\partial}{\partial{\textbf{x}}}(\textbf{Wx+b})=\textbf{W} b(Wx+b)=I \frac{\partial}{\partial{\textbf{b}}}(\textbf{Wx+b})=\textbf{I} u(uTh)=hT \frac{\partial}{\partial{\textbf{u}}}(\textbf{u}^Th)=\textbf{h}^T \[ \textbf{h}=f(\textbf{z}) \\ h_i=f(z_i) 且 \textbf{h} ,\textbf{z} \in R^n \]

可以得到:

(hz)ij=hizj=f(zi)zj={f(zi),  if  i=j0,  if  otherwisehz=(f(z1)00f(zn))=diag(f(z)) (\frac{\partial{h}}{\partial{z}})_{ij}=\frac{\partial{h_i}}{\partial{z_j}}=\frac{\partial{f(z_i)}}{\partial{z_j}}= \begin{cases} f'(z_i),\;if\;i=j\\ 0,\;if\;otherwise \end{cases} \\ \frac{\partial h}{\partial z} = \begin{pmatrix} f'(z_1) & & 0 \\ & \ddots & \\ 0 & & f'(z_n) \end{pmatrix} = \operatorname{diag}(f'(z))

  • 前向传播就是单纯的计算
  • 反向传播是根据梯度进行学习

单输入单输出的情况下,下游梯度就是局部梯度与上游梯度的乘积。

sz=hz×sh \frac{\partial{s}}{\partial{z}}=\frac{\partial{h}}{\partial{z}} \times \frac{\partial{s}}{\partial{h}}

多输入的情况下仍然遵循链式法则。


如图是一种错误的计算反向传播的方式,如果依次计算$\frac{\partial{s}}{\partial{W}}$和$\frac{\partial{s}}{\partial{b}}$,那么会有一部分计算是重复的,就导致反向传播的效率下降。正确的方式应该是先计算公共部分,然后再计算单独的部分,这可以通过拓扑排序来实现。

class multiplyGate():
    def forward(x, y):
        self.x = x
        self.y = y
        return x*y
    def backward(dz):
        dx = self.y * dz  # dz/dx * dL/dz
        dy = self.x * dz
        return [dx, dy]

相关内容