反向传播算法

本节课是对反向传播算法的详细介绍,使用勒四种方法来介绍反向传播。

在很多情况下,反向传播将只是一个抽象的概念,只需要调包就能实现功能。但是在实际操作过程中可能会遇到问题,如果没用真正理解反向传播,就不知道产生问题的原因。

第一种解释

1549701680672

上图是一个含有两个隐藏层的神经网络模型,最后的score的计算方法与上一节课相同。 $$ \begin{align} s &= U^Tf(W^{(2)}f(W^{(1)}x+b^{(1)})+b^{(2)})
&= U^Tf(W^{(2)}a^{(2)}+b^{(2)})
&= U^Ta^{(3)} \end{align} $$ 由之前的推导$\frac{\partial s}{\partial W_{ij}}=U_if’(z_i)x_j=\delta_ix_j$

可得类似的梯度 $$ \frac{\partial s}{\partial W_{ij}^{(2)}}=U_if’(z_i^{(3)})a_j^{(2)}=\delta_i^{(3)}a_j^{(2)} $$ 在整个矩阵的维度 $$ \frac{\partial s}{\partial W^{(2)}}=\delta^{(3)}a^{(2)^T} $$

$$ \text{where} \quad \delta^{(3)}=U\otimes f’(z^{(3)}) $$

继续推导 $$ \frac{\partial s}{\partial W^{(1)}}=\delta^{(2)}x^T $$

$$ \text{where} \quad \delta^{(2)}=(W^{(2)^T}\delta^{(3)})\otimes f’(z^{(2)}) $$

我们可以得到对任意层l的梯度推导 $$ \frac{\partial}{\partial W^{(l)}}E_R=\delta^{(l+1)}(a^{(l)})^T+\lambda W^{(l)} $$

$$ \text{where} \quad \delta^{(l)}=\Bigl((w^{(l)})^T\delta^{(l+1)}\Bigr)\otimes f’(z^{(l)}) $$

顶层和底层也可以用这个公式,只不过误差$\delta$ 更简单

第二种解释

第二种解释没有涉及到神经网络。

函数$f(x,y,z)=(x+y)z$可以用下图表示:

1549983647465

我们定义$q=x+y,\quad f=qz$,根据链式法则计算各个导数。

以计算$\frac{\partial f}{\partial x}$为例,先计算$\frac{\partial f}{\partial q}$再计算$\frac{\partial q}{\partial x}$,用下一层节点的值乘以上一层节点的值。

1549984142279

如上图,这种方法把所有的函数都看做路线。计算时首先前向传播计算函数的值(如通过x和y计算z的值),然后反向传播计算梯度。在反向传播的过程中,从更高层的节点得到梯度信号($\frac{\partial L}{\partial z}$),再根据链式法则计算低层的梯度($\frac{\partial L}{\partial x}=\frac{\partial L}{\partial z}\frac{\partial z}{\partial x}$),并向后传播。

另一个例子 $$ f(w,x)=\frac{1}{1+e^{-(w_0x_0+w_1x_1+w_2)}} $$ 画成路线图如下图所示:

1550048049534

首先前向计算函数的值,然后反向计算各个节点的梯度值。

第一个节点的梯度值为$\frac{\partial f}{\partial f} = 1$

第二个节点的梯度值为$1*\frac{-1}{1.37^2}=-0.53$

依次向后类推,计算得到梯度值如下:

1550048608519

也可以将sigmoid函数的操作合并起来作为路线上的一个节点 $$ \sigma(x)=\frac{1}{1+e^{-x}} $$

$$ \frac{d\sigma(x)}{dx}=(1-\sigma(x))\sigma(x) $$

#####第三种解释

流动图

1551453818626

1551453883633

前向计算每个结点的值,再反向计算每个结点的梯度。

第四种解释

第四种解释把前面的综合了起来,还是以一开始的神经网络为例。

1551455247103

假设有误差信号$\delta ^{(3)}$,穿过$w^{(2)}$之后,得到对$a^{(2)}$的导数。

1551455591793

然后穿过$\sigma $到达$W^{(1)}$,得到导数如上图。

fastText

Bag of Tricks for Eficient Text Classification

介绍了一种叫 fastText 的线性文本分类模型,模型结构如下:

1551456437884

损失函数为:

1551456476688

使用了层级的Softmax

1551456526723

将大的分类再划分成小的分类,可把复杂度由 O(kh) 降低到 O(h logk)。

这种方法比神经网络快了很多,并且效果也不差。

项目建议

接下来讲了一些和课程大作业有关的事情,不再赘述。

评价指标:F1,BLEU,ROUGE等