CS224N Natural Language Processing with Deep Learning Lecture 8
课程主页:https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/
视频地址:https://www.bilibili.com/video/av46216519?from=search&seid=13229282510647565239
这里回顾CS224N Lecture 8的课程内容,这一讲介绍了机器翻译,Seq2Seq以及Attention。
备注:图片均来自课程课件。
机器翻译
机器翻译是使用计算机自动进行翻译的过程,在2014年之前,使用的是统计模型,这种方法较为复杂,在2014年之后主要是用神经机器翻译——即使用神经网络进行机器翻译,这里使用了一个重要模型:Seq2Seq。
Seq2Seq
Seq2Seq是指将序列转换成序列的结构,由两个RNN组成,分别为encoder和decoder,encoder将输入进行编码,decoder将编码后的结果进行解码,生成输出,图示如下:
训练方法为计算输出的交叉熵损失函数,然后进行梯度下降,以机器翻译为例,其损失函数计算方法如下:
注意解码部分会用两个特殊标记表示开始和结束:START表示开始,END表示结束。
解码
使用模型时的重点是进行解码工作,比较好的方法是使用束搜索(Beam Search),假设束的大小为$K$,其思路为每个时间点保留$K$个候选目标:
在更新时,选择如下集合中最好的$K$个目标:
其中
这里的好是指对数概率最大的输出,来来看一个具体例子:
注意如果直接比较对数概率的值,那么会偏好比较短的输出,一个解决方法是比较对数概率的平均值,即
Seq2Seq模型的效果很好,但是由于是序列计算,所以计算效率比较低,一个重大的改进是Attention机制。
Attention
我们有encoder的隐藏状态$h_{1}, \ldots, h_{N} \in \mathbb{R}^{h}$
在时间$t$,我们有decoder的隐藏状态$s_{t} \in \mathbb{R}^{h}$
我们计算当前时间点的attention分数$e^t$:
使用softmax计算attention分布$\alpha^t$:
使用$\alpha^t$计算encoder的加权和,得到attention输出$a_t$
随后将$a_t$和$s_t$拼接,然后用常规的seq2seq方式进行处理:
图示如下:
利用Attention机制,加快了计算速度,也缓解了梯度消失,还增加了可解释性。
上述过程中计算attention分数那步可以使用其他计算方法,例如:
- $e_{i}={s}^{T} {W} {h}_{i}$
- $e_{i}={v}^{T} \tanh \left({W}_{1} {h}_{i}+{W}_{2} {s}\right)$