Natural Language Processing Lecture07

Natural Language Processing Lecture07

Recurrent Neural Networks

Why sequence models

特征之间相互有联系

如果使用之前的全连接神经网络模型,存在以下两种缺点:

  • 在序列模型中,输入、输出随着不同的序列有所改变,无法确定输入、输出层的神经元个数
  • 并没有考虑序列模型中,各个特征之间的关系

即:

  • Inputs, outputs can be different lengths in different examples
  • Doesn't share features leanrd across positions of test

RNN

新的特征会再下次计算时带入。

按时间点展开的 RNN:

\[a^{(1)}=g(W_{aa}a^{(0)}+W_x^{(1)}+ba) \\ y^{(1)}=g(w_{ya}a^{(1)}+by)\]

\[a^{(2)}=g(W_{aa}a^{(1)}+W_x^{(2)}+ba) \\ y^{(2)}=g(w_{ya}a^{(2)}+by)\]

时序的更新方程:

\[a^{(t)}=b+Wh^{(t-1)}+Ux^{(t)} \\ h^{(t)}=tanh(a^{(t)})\\ o^{(t)}=c+Vh^{(t)}\\ \hat{y}^{(t)}=softmax(o^{(t)}) \\ L_{total} = \sum_tL^{(t)}=-\sum_t log p _{model}(y^{(t)}|{\{x^{(1)},\dots,x^{(t)}}\})\]

Gradient vanishing and exploding

依旧使用上一张时序的图:

在有激活函数时:

\[a^{(t)}=g(W_{aa}a^{(t-1)}+W_x^{(t)}+ba) \\ y^{(t)}=g(w_{ya}a^{(t)}+by)\]

假设无激活函数时:

\[a^{(t)}=W_{aa}a^{(t-1)}+W_x^{(t)}+ba \\ y^{(t)}=w_{ya}a^{(t)}+by\]

逻辑回归的损失函数:

\[L=-y^{(t)}log \hat{y}^{(t)}-(1-y^{(t)})log(1-\hat y^{(t)})\]

这里的梯度就代表着时序长距离之间的关系:

\[\begin{equation} \begin{aligned} \frac{\partial L^{(t)}}{\partial W_{ax}} &= \frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial W_{ax}} = \frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial a^{(t)}} \cdot \frac{\partial a^{(t)}}{\partial W_{ax}} \\ &= \frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial a^{(t)}} \cdot( \frac{\partial a^{(t)}}{\partial a^{(t-1)}} \cdot \frac{\partial a^{(t-1)}}{\partial W_{ax}}+ x^{(t)}) \\ &= \frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial a^{(t)}} \cdot \frac{\partial a^{(t)}}{\partial a^{(t-1)}} \cdot \frac{\partial a^{(t-1)}}{\partial W_{ax}}+ \frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial a^{(t)}} \cdot x^{(t)} \\ &= \frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial a^{(t)}} \cdot \frac{\partial a^{(t)}}{\partial a^{(t-1)}} \cdot( \frac{\partial a^{(t-1)}}{\partial a^{(t-2)}} \cdot \frac{\partial a^{(t-2)}}{\partial W_{ax}} + x^{(t-1)} ) +右边 \end{aligned} \end{equation}\]

\(\frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial a^{(t)}} \cdot x^{(t)}\) 就是从时序 t 到时序 1 的长距离联系,从 \(L^{(t)}\)传到 T=t 这个时间点对 \(W_{ax}\) 的梯度,这个值不影响从 \(L^{(t)}\)传到 \(T=1,2,\dots,t-1\) 的梯度

$ $ 则是相邻时序的距离联系

在 a 的偏分时,有多个乘式,如果在此部分大于1,那么随着层数的增加,求出的梯度的更新将以指数形式增加,发生梯度爆炸。如果此部分小于1,那么随着层数的增加求出的梯度更新的信息会以指数形式衰减,发生梯度消失

Bidirectional RNN and Deep RNN

Bidirectional RNN

BRNN的idea是将传统RNN的状态神经元拆分为两个部分,一个负责positive time direction(forward states),另一个负责negative time direction(backward states)。Forward states的输出并不会连接到Backward states的输入。因此结构如下所示。如果没有backward layer的话就跟传统RNN相同了。

这个结构提供给输出层输入序列中每一个点的完整的过去和未来的上下文信息。下图展示的是一个沿着时间展开的双向循环神经网络。六个独特的权值在每一个时步被重复的利用,六个权值分别对应:输入到向前和向后隐含层(w1, w3),隐含层到隐含层自己(w2, w5),向前和向后隐含层到输出层(w4, w6)。值得注意的是:向前和向后隐含层之间没有信息流,这保证了展开图是非循环的。

Deep RNN

与全连接神经网络,通过增加层数,希望学到更深层次的特征。

通常最多有三层。

Some RNN Variations

LSTM

长短期记忆(Long short-term memory, LSTM)是一种特殊的 RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的 RNN,LSTM 能够在更长的序列中有更好的表现。

首先使用 LSTM 的当前输入 \(x^t\) 和上一个状态下来的 \(h^{t-1}\) 拼接得到的四个状态。

其中 \(z^i, z^o, z^t\) 是拼接向量乘以权重矩阵后,通过 sigmoid 函数转换成 0~1 之间的数值,作为一种门控状态。而 z 是将结果通过一个 tanh 激活函数 转换成 -1~1 之间的值。

LSTM 内部主要有三个阶段:

  • 忘记阶段。这个阶段主要是对上一个节点传进来的输入进行选择性忘记。简单来说就是会 “忘记不重要的,记住重要的”。 通过计算 \(z^{forget}\) 来作为忘记门控,来控制上一个状态的 \(c^{t-1}\) 哪些需要留那些需要忘。
  • 选择记忆阶段。这个阶段将这个阶段的输入有选择性地进行“记忆”。主要是会对输入 \(x^t\) 进行选择记忆。哪些重要则着重记录下来,哪些不重要,则少记一些。当前的输入内容由前面计算得到的 z 表示。而选择的门控信号则是由 \(z^i\) 来进行控制。
  • 输出阶段。这个阶段将决定哪些将会被当成当前状态的输出。主要是通过 \(z^o\) 来进行控制的。并且还对上一阶段得到的 \(c^o\) 进行了缩放。

Gated Recurrent Unit (GRU)

GRU(Gate Recurrent Unit)是循环神经网络(Recurrent Neural Network, RNN)的一种。和LSTM(Long-Short Term Memory)一样,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。

GRU 的实验效果与 LSTM 相似,但是更易于计算。

\(x^t\) 是当前的输入,上一个节点传递下来的隐状态 \(h^{t-1}\),这个隐状态包含了之前节点的相关信息,输出当前隐藏节点的输出 \(y^t\) 和传递给下一个节点的隐状态 \(h^t\)

通过 \(h^{t-1}\)\(x^t\) 来获取两个门控状态。其中 r 为控制重置的门控(reset gate), z 为控制更新的门控(update gate)。

得到门控信号之后,首先使用重置门控来得到“重置”之后的数据 \(h^{t-1'}=h^{t-1}\odot r\),再将 \(h^{t-1'}\) 与输入 \(x^t\) 进行拼接,通过 tanh 函数缩放

这里的 \(h'\) 主要是包含了当前输入的 \(x^t\) 数据,有针对性地对 \(h'\) 添加到当前的隐藏状态,相当于“记忆了当前时刻的状态”。

GRU 的内部结构如下:

更新表达式:\(h'=z\odot h^{t-1}+(1-z)\odot h'\)

门控信号 z 的范围是 0~1,越接近 1,记忆下来的数据越多,反之遗忘的越多。

  • \(z\odot h^{t-1}\) 表示对原本隐藏状态的遗忘
  • \((1-z)\odot h'\) 表示对当前结点信息的选择性记忆
  • 则更新表达式就是忘记传递下来的某些维度信息,记忆当前节点输入的某些维度信息

Transfer Learning

Why transfer learning

已经用一种神经网络学会了一种任务,随后用这个网络的参数去学习新的任务。

将任务 A 学习好的部分连接层 Part 1 直接用到任务B 的网络中,即任务 B 有 Part 1 (A 的) 和 Part 2。

当训练数据很少的时候。借鉴别人在大数据上训练好的网络的一部分链接上自定义的网络。

承认:某些任务的网络在底层学习的特征是相似的。

An example of transfer learning in NLP

word embedding 可以看作是迁移学习的 part1.

# NLP

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×