文章目录
神经翻译笔记3. 神经网络语言模型与词向量
本文主要参考了如下教程
- Koehn2017 : 第2、3节,第4节前半部分
- Neubig2017 : 第5章
- StanfordCS224n : 第2、3、4讲
- Goldberg NNMNLP : 第3、4、5、8、9、10、11章
其中主要会以[Neubig2017]和[StanfordCS224n]的内容为主
神经网络
关于神经网络的一些基本细节,例如基本概念、反向传播的思想等等,在博客的其它文章里(如林轩田老师的机器学习技法、Hinton的Coursera课程)有过介绍,这里就不赘述了。这里想就着斯坦福大学CS224n第四讲的内容从矩阵的层面上给出反向传播梯度的计算方法
一个示例结构
上图给出了一个示例神经网络,各层参数与输入、输出及其它记号如下
- 输入向量 x ∈ R 3 × 1 \boldsymbol{x} \in \mathbb{R}^{3 \times 1} x∈R3×1
- 输入层到隐藏层的权重 W ∈ R 2 × 3 \boldsymbol{W} \in \mathbb{R}^{2 \times 3} W∈R2×3,同时还包括一个偏置向量 b ∈ R 2 × 1 \boldsymbol{b} \in \mathbb{R}^{2 \times 1} b∈R2×1
- 隐藏层向量在激活前是 z ∈ R 2 × 1 \boldsymbol{z}\in \mathbb{R}^{2 \times 1} z∈R2×1,激活函数是 f f f,向量激活后为 a ∈ R 2 × 1 \boldsymbol{a} \in \mathbb{R}^{2 \times 1} a∈R2×1
- 隐藏层到输出层的权重 U ∈ R 2 × 1 \boldsymbol{U} \in \mathbb{R}^{2 \times 1} U∈R2×1 (按照约定的记法,向量用小写粗体,矩阵用大写粗体,这里应该写为 u \boldsymbol{u} u。不过为了与原课件对应,这里没有这样做)
- 神经网络的输出结果为一个标量 s s s
按照如上约定, s s s 的计算过程向量化表示如下
s = U T a = U T f ( z ) = U T f ( W x + b ) \begin{aligned} s &= \boldsymbol{U}^\mathsf{T}\boldsymbol{a} \\ &= \boldsymbol{U}^\mathsf{T}f(\boldsymbol{z}) \\ &= \boldsymbol{U}^\mathsf{T}f(\boldsymbol{Wx}+\boldsymbol{b}) \end{aligned} s=UTa=UTf(z)=UTf(Wx+b)
或者分变量写出,成为如下形式
s = U T a a = f ( z ) z = W x + b \begin{aligned} s &= \boldsymbol{U}^\mathsf{T}\boldsymbol{a} \\ \boldsymbol{a} &= f(\boldsymbol{z}) \\ \boldsymbol{z} &= \boldsymbol{Wx} + \boldsymbol{b} \end{aligned} saz=UTa=f(z)=Wx+b
按照梯度下降的原理,训练模型时需要得到损失函数 J J J对每个参数的梯度。例如,对于参数 W \boldsymbol{W} W,需要计算 ∂ J ∂ W \frac{\partial J}{\partial \boldsymbol{W}} ∂W∂J。根据反向传播算法和导数的链式法则,有
∂ J ∂ W = ∂ J ∂ s ⋅ ∂ s ∂ W \frac{\partial J}{\partial \boldsymbol{W}} = \frac{\partial J}{\partial s}\cdot \frac{\partial s}{\partial \boldsymbol{W}} ∂W∂J=∂s∂J⋅∂W∂s
其中,第一项 ∂ J ∂ s \frac{\partial J}{\partial s} ∂s∂J如何计算应该视具体的损失函数计算方法而定,与参数本身无关。因此对任意参数,只需要关注网络输出 s s s对该参数的偏导即可
从矩阵元素看如何计算梯度
(这一部分讲得比较详细但是也很繁琐,不感兴趣的可以跳过)
要计算 ∂ s ∂ W \frac{\partial s}{\partial \boldsymbol{W}} ∂W∂s,可以首先考虑如何计算 ∂ s ∂ W i j \frac{\partial s}{\partial W_{ij}} ∂Wij∂s 。由 s s s 的计算方法,有
∂ s ∂ W i j = ∂ ∂ W i j U T a \frac{\partial s}{\partial W_{ij}} = \frac{\partial}{\partial W_{ij}}\boldsymbol{U}^\mathsf{T}\boldsymbol{a} ∂Wij∂s=∂Wij∂UTa
由前图,每个 W i ⋅ \boldsymbol{W}_{i\cdot} Wi⋅只与 a i a_i ai 相关, a i a_i ai又只与 U i a i U_ia_i Uiai相关,因此
∂ ∂ W i j U T a = ∂ ∂ W i j U i a i \frac{\partial}{\partial W_{ij}}\boldsymbol{U}^\mathsf{T}\boldsymbol{a} = \frac{\partial }{\partial W_{ij}}U_ia_i ∂Wij∂UTa=∂Wij∂Uiai
由于 U i U_i Ui与 W i j W_{ij} Wij无关,因此可以提出来。代入其它变量定义,并将 f f f的导数记作 f ′ f' f′(因为可选的激活函数有很多种),可以得到
∂ ∂ W i j U i a i = U i ∂ ∂ W i j a i = U i ∂ a i ∂ z i ∂ z i ∂ W i j = U i ∂ f ( z i ) ∂ z i ∂ z i ∂ W i j = U i f ′ ( z i ) ∂ z i ∂ W i j = U i f ′ ( z i ) ∂ ( W i ⋅ x + b i ) ∂ W i j = U i f ′ ( z i ) ∂ ∂ W i j ∑ k W i k x k = U i f ′ ( z i ) x j \begin{aligned} \frac{\partial}{\partial W_{ij}}U_ia_i &= U_i \frac{\partial}{\partial W_{ij}}a_i \\ &= U_i \frac{\partial a_i}{\partial z_i} \frac{\partial z_i}{\partial W_{ij}} \\ &= U_i \frac{\partial f(z_i)}{\partial z_i}\frac{\partial z_i}{\partial W_{ij}} \\ &= U_i f'(z_i)\frac{\partial z_i}{\partial W_{ij}} \\ &= U_i f'(z_i)\frac{\partial (\boldsymbol{W}_{i\cdot}\boldsymbol{x} + b_i)}{\partial W_{ij}} \\ &= U_i f'(z_i) \frac{\partial }{\partial W_{ij}}\sum_kW_{ik}x_k \\ &= U_i f'(z_i) x_j \end{aligned} ∂Wij∂Uiai=Ui∂Wij∂ai=Ui∂zi∂ai∂Wij∂zi=Ui∂zi∂f(zi)∂Wij∂zi=Uif′(zi)∂Wij∂zi=Uif′(zi)∂Wij∂(Wi⋅x+bi)=Uif′(zi)∂Wij∂k∑Wikxk=Uif′(zi)xj
如果将 U i f ′ ( z i ) U_if'(z_i) Uif′(zi)看做一个整体,记作 δ i \delta_i δi,那么有
∂ s ∂ W i j = δ i x j \frac{\partial s}{\partial W_{ij}} = \delta_ix_j ∂Wij∂s=δixj
由于标量 y y y对矩阵 X ∈ R m × n \boldsymbol{X} \in \mathbb{R}^{m \times n} X∈Rm×n的求导法则为
∂ y ∂ X = [ ∂ y ∂ X 11 ⋯ ∂ y ∂ X 1 n ⋮ ⋱ ⋮ ∂ y ∂ X m 1 ⋯ ∂ y ∂ X m n ] \frac{\partial y}{\partial \boldsymbol{X}} = \left[\begin{matrix}\frac{\partial y}{\partial X_{11}} & \cdots & \frac{\partial y}{\partial X_{1n}} \\ \vdots & \ddots & \vdots \\ \frac{\partial y}{\partial X_{m1}} & \cdots &\frac{\partial y}{\partial X_{mn}}\end{matrix}\right] ∂X∂y=⎣⎢⎡∂X11∂y⋮∂Xm1∂y⋯⋱⋯∂X1n∂y⋮∂Xmn∂y⎦⎥⎤
因此
∂ s ∂ W = [ ∂ s ∂ W 11 ∂ s ∂ W 12 ∂ s ∂ W 13 ∂ s ∂ W 21 ∂ s ∂ W 22 ∂ s ∂ W 23 ] = [ δ 1 x 1 δ 1 x 2 δ 1 x 3 δ 2 x 1 δ 2 x 2 δ 2 x 3 ] = δ x T \begin{aligned} \frac{\partial s}{\partial \boldsymbol{W}} &= \left[\begin{matrix}\frac{\partial s}{\partial W_{11}} & \frac{\partial s}{\partial W_{12}} & \frac{\partial s}{\partial W_{13}} \\ \frac{\partial s}{\partial W_{21}} & \frac{\partial s}{\partial W_{22}} & \frac{\partial s}{\partial W_{23}}\end{matrix}\right] \\ &= \left[\begin{matrix} \delta_1x_1 & \delta_1x_2 & \delta_1x_3 \\ \delta_2x_1 & \delta_2x_2 & \delta_2x_3\end{matrix}\right] \\ &= \boldsymbol{\delta}\boldsymbol{x}^\mathsf{T} \end{aligned} ∂W∂s=[∂W11