Attention is all you need论文归纳

2021-09-09  本文已影响0人  李耕_嘿嘿嘿黑龙江哈哈哈哈尔滨

这个nlp领域的大作应该不需要多说了, 也是google的, 团队主要是google brain和 google reseach.

鉴于最近在考虑meta-learning算法的提升, 想参考一下attention机制所以研究了一下.


nlp领域的序列数据处理方式和元学习下的few-shot 分类任务存在差别. nlp这边序列处理会考虑auto-regressive 也就是当前输出会参考前序输出.

attention机制并不难, 核心机制就是一个匹配过程, 把合适value值加权求和, 而权重就是相似的程度.

一般来说, 通过全连接层从输入向量中提取Q, K, V三组向量, 然后利用QK点积计算相似性权重, 再用权重把对应的value加权求和. 详细过程可以看原文比较简单也很详细. 


比较重点的是利用attention构成的transformer整体模型逻辑

原生的transformer应用场景也是序列数据. 输入序列, 输出序列. 典型任务为机器翻译.

传统机器翻译由RNN等模型来完成, 基本框架为将输入向量encode为中间向量再decode为结果向量.

通过word2vec等将单词(word)embedding为输入向量. 最后再用宽神经网络将最终结果向量转化为词库的概率分布.

transformer也分为encode和decode过程:

encode过程将一个序列完整的输入到模型中, 比如"I am a student"则将四个单词全部转化为向量再一起输入到encode过程中, encode则由多个multi-head attention构成(一个multi-head attention就是多个attention叠加, 和cnn里同时有多个kernel一样原理), 按照attention机制, 最后会输出加权求和的value向量.

decode过程则是一步一步迭代的, 如果没有nlp背景或对rnn不了解在读原文时可能会读不懂decoder到底是如何执行的, 因为原文Attention is all you need 默认读者有nlp领域背景的, 所以根本没有明确地对这一部分进行描述. 

具体而言, transformer在做decode时是一次输出一个词语的, 例如"I am a student"翻译成中文, decode一次输出一个字:"我", "是", "一", "个"...

而decode部分有两个输入, 一个是encode输出的value向量, 另一个则是由前面decode过程已经得到的翻译结果所构成的矩阵(多个向量叠加), 例如在翻译"一"字时, 我们已经得到了"我", "是"两个翻译结果, 所以将他们的vector叠加成矩阵输入. 最后综合这两部分的输入得到当前词语的输出.

这里没有列出encode或decode的具体实现细节, 因为attention原文其实描述的很清楚.


原文忽略的另一部分是, 具体的训练过程. 我们知道模型的训练一定是要loss函数, 并对之求梯度进行反向传播的. 但是loss函数的形式没有在原文中提到, 实际上这也是因为loss函数较之前面rnn+attention等工作也并未发生变化. 实际上就是把模型输出的每个位置的概率分布与对应的正确结果概率分布求交叉熵等.


attention机制的核心在于, 针对任何一个位置上的encode后中间值或decode后的值, 都可以和其他位置上的encode或decode值建立联系实现信息共享, 这种联系是通过attention匹配机制直接建立的而不像rnn是一层一层传递的, 传递的则会面临损失, 距离越远越难相互传递等问题. 所以transformer在语境关联上做的比其他模型更好一些. 

上一篇下一篇

猜你喜欢

热点阅读