- 如果我们现在要做个中英文翻译,比如我是中国人翻译成 ‘i am Chinese’.这时候我们会发现输入有 5个中文字,而输出只有三个英文单词. 也就是输入长度并不等于输出长度.这时候我们会引入一种 编码器-解码器的模型也就是 (Encoder-Decoder).首先我们通过编码器 对输入 ‘我是中国人’ 进行信息编码, 之后将生成的编码数据输入 decoder 进行解码.一般编码器和解码器 都会使用循环神经网络.
- 当然为了使机器知道句子的结束我们会在每个句子后面增加 一个 表示 句子的结束.使得电脑可以进行识别.在训练的时候 我们也一般会在解码器的第一个输入阶段加上 表示预测的开始.
- 同时为了使每个句子保持相同长度,我们 会人为预先规定句子长度,若句子没有达到长度,那么我们会对句子进行填充,使得其长度达到规定长度.
- 作为编码器的输入 我们一般使用 C = q(h1, h2…ht)作为第一个隐藏层输入,一般的我们也可以直接使用c = ht,不用包含之前所有的隐藏层信息。
- 在训练的时候我们一般会使用强制教学,也就是 不把y_hat1的预测数据当做编码器的第二个输入, 而是直接用标签数据的y1当做输入。
- 当我们使用贪心算法再对y进行softmax的时候,我们对每个输出的y进行当前最优的选择。可能会达到全局最优的情况
如下图所示 --引用自 动手学深度学习
- 这当然这时候我们可以通过穷举法解决这个问题,遍历所有的候选词,然而这个开销过大。这时候我们该用 束搜索(Beam Search) 策略.也就是每次都选取当前时间步 条件概率最大的前k个选项。列出所有集合 如下图所示
这里由于不同候选序列的长度不一致,所以我们添加了一个Lα进行对长度的惩罚。
注意力机制
实际上在encoder句子中每个词对decoder的影响不同,然而在seq2seq模型中,并没有体现出来,都是用 C = q(h1, h2…ht)作为第一个隐藏层输入.
我们举个例子就是 tom chase jerry. 翻译出来就是 汤姆抓杰瑞。 对于 杰瑞这个词的翻译 我们可以理解为 Jerry 对这个词翻译贡献最大,而 tom 和 chase这两次对 杰瑞的翻译贡献比较少。而在seq2seq模型中每次翻译的输入权重都是一样的
所以聪明的研究者,发明出了注意力机制,在翻译中加入了每个单词对于要预测词的权重系数。
这里我们引入 query与 key-value.query =
, key=value=encoder中的隐藏层状态。就是每次在预测下一个输出的时候,我们先通过 query与每个key生成一个权重系数, 在通过 权重系数乘以value得出 注意力内容。
需要注意的是一般在NLP钟我们的key玉value是相等的。
最终 由当前是时间t的注意力内容与 在decoder中上一个隐藏层状态的
生成本层隐藏层状态进行预测。
在transform模型中我们,引入了self-attention 也就是 自注意力层