终其一生,我们只不过在寻找自己

0%

CS224n-8 机器翻译,seq2seq,Attention

这一节:机器翻译,seq2seq(翻译的本质),attention(提升seq2seq)


统计机器翻译

1990s-2010s: Statistical Machine Translation
统计翻译是传统方法,可以大概了解一下背景。
task:输入语言x的语句,输出语言y的语句。
需要得到一个y,让概率最大化:

$P(x|y)$是翻译模型,评价x和y的匹配程度;P(y) 是语言模型第6讲的时候已经讲过,就是评价语句是否通顺。

除了满足匹配程度语句通顺两个条件,alignment(一一对应)程度也可以考虑,模型就变成了

对应度是很复杂的一个东西,举例说明:



所以,统计模型的翻译缺点显而易见:

  • 太多的人工规则
  • 数据稀疏没解决
  • 需要大量的语料对应
  • 特征工程较为复杂

神经网络翻译模型

2014年google通过Neural Machine Translation (NMT) 也就是seq2seq实现了机器翻译,效果显著。

模型结构


左边通过RNN Encoding了输入语句(也就是转成了向量), 右边通过另一个RNN decoding了语句(通过向量转成了另一种语言)。 语言和语言直接,通过隐藏层的向量传递意思。

训练过程

训练与RNN的训练类似,区别在于decoder 传递梯度到encoder的过程。

这里注意,我们只需要考虑输入x和预测y与真实y的差距,所以是end2end。

decoding贪婪算法的缺点

假如我们decode的过程中,只一个词一个词往后生成,选择当前最优解,如果前面出错,会导致整体输出的语句概率变小,不是全局最优解。

对于任何一个可能的输出y,需要最大化概率:

所以简单方法是暴力枚举出所有可能出现的情况y,然后选出概率最大的那个;当然暴力方法太昂贵,所以可以使用Beam Search。

何时结束:把句子结尾当成一个符号,加入训练

Beam search decoding

核心思想:每一步寻找k个可能的候选项,然后再对着k个进行下一步探索,直到句子结束。(k一般是5-10)

这里一般用score=log(P(y|x)),这样就分数越大越好

  • Beam search 也不能100%保证全局最优,k越大,越能保证
  • 但是Beam search的效率大大增加
  • 举一个例子,当K=2:
  • 何时停止:

设定阈值,步长阈值:比如超过30个单词就停止;候选项阈值:比如有5句候选就停止。

  • 长度不公平的问题:

按照上面的计算,句子越短,分数越长,这个标准更倾向于选择短句子。
解决也很简单,对于分数socre 规范化(Normalize) 除以句子的长度,就得到了这个句子每个单词的得分。

神经网络翻译模型的优点

  • 表现好:速度快,更流畅(语言模型更好),对于短语翻译好
  • 端对端:不需要考虑内部的问题
  • 不需要人工干预:没有特征工程,模型可以应用到不同语言之间

神经网络翻译模型的缺点

  • 难解释:不好debug
  • 难以控制:模型的输出不好控制,所以有时候需要模型之后加入规则干预

如何评价翻译模型

其实评价翻译好不好,最简单就是让人去读,但是总得有一个自动打分的小工具,于是有了BLEU。
BLEU (Bilingual Evaluation Understudy)

  • Bleu通过对比机器翻译和真人翻译的数据集,通过计算n-Gram,以及句子长度(防止太啰嗦)来评价

  • BLEU也不太完美,因为翻译其实有很多种正确表达,这样对于预测集的依赖太大。

    机器翻译解决了吗?

    机器翻译虽然取得了很大进展,但是仍然不完美。

    • 比如没办法读懂新词
    • 依赖语料库的来源,不同语料库风格不一样,eg : 聊天语料 vs 百科语料
    • 没有读懂上下文。比如小说中,有时候需要理解剧情才能更好的翻译。
    • 必须要有大量数据集训练。成本很高。

Seq2Seq的其他用途

其实有很多test都需要用到Seq2Seq:
• Summarization (long text → short text) 总结
• Dialogue (previous utterances → next utterance) 对话
• Parsing (input text → output parse as sequence) 语法分析
• Code generation (natural language → Python code) 写代码

Attention

  • Seq2Seq的问题在于,一个向量代表整句话就很容易损失太多信息;而且encoding是从结尾出去的,容易丢失开头的信息。

  • 核心想法就是: decoder的每一步,通过和encoder 直接连接,只着重于当前的这个位置。

从图理解

对于decoder的每一步,把RNN的输出和encoder的RNN输出进行点乘,通过softmax进行规范,得到一个概率值。这个概率值说明,现在在预测哪个位置。


然后就这样做完了。

公式解释

这里,更朴素的思想是每次decoder的时候,把之前的encoder的对应向量拿过来,拼接;但是位置太难找了,所有就用了概率位置来寻找位置。

Attention的优点

  • 提升了表现
  • 解决了seq2seq的瓶颈
  • 解决了梯度消失问题(类似与上一讲的highway)
  • 给了一点可解释性(有了概率的对应关系alignment)

Attention的其他用途

Attention不仅仅可以用在翻译上,还可以用在任何seq2seq的任务。
朴素定义attention:
• Given a set of vector values, and a vector query, attention is a technique to compute a weighted sum of the values, dependent on the query.
(给一组向量,和一个待查询的向量,Attention可以计算出那组向量的权重)

再理解Attention:

  • 求和权重的过程就是选择的过程,决定了那个输入值更重要
  • Attention是一种获取依赖于其他表示形式(查询)的任意组表示形式(值)的固定大小表示形式的方法。

Attention的变种

Attention 一定程度上和LSTM思想相似,就是通过额外的线路,去注意前面的信息。
妙啊!!!

-------------    你的留言  是我更新的动力😊    -------------