前记
基本上深度学习和nlp的几个阶段性成果大家都认为是NNLM、word2vec、bert
word2vec
NNLM就不说了,算是初创作品,神经网络语言模型的始祖,建模方式不复杂,但是是完整的语言模型,we只是其中一个副产物,计算量太大,实际不好应用。
word2vec专门用来做embedding的训练,做了很多优化,包括模型结构,包括负采样和层次softmax,极大的提升了效率,而且效果也很不错。
但是,解决不了多义词问题是硬伤,忽略了上下文环境。
Bert
经过GPT、ELMO等模型的演进之后终于到了Bert,目前的STOA。它采用首先是语言模型预训练,在预训练阶段采用了类似ELMO的双向语言模型;其次是使用Fine-Tuning模式解决下游任务。结构中核心的部件是采用Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行。并且Transformer可以增加到非常深的深度,充分发掘DNN模型的特性,提升模型准确率。Bert采用了Transformer中encoder的双向结构。在输入端除了有token embedding,position embedding之外,还加上了segment embedding。这主要是为了处理双句任务,比如判断两个句子之间的关系,以及Question Answering等,通过segment embedding来区分前后句子。
下面先讲讲《Attention is All You Need》
随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。希望关注语义上相关的单词,并弱化不相关的单词。
- 计算自注意力的第一步就是从每个编码器的输入向量(每个单词的词向量)中生成三个向量。也就是说对于每个单词,我们创造一个查询向量、一个键向量和一个值向量。这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。这些新向量在维度上比词嵌入向量更低。
- 我们需要拿输入句子中的每个单词对“Thinking”打分。这些分数决定了在编码单词“Thinking”的过程中有多重视句子的其它部分。这些分数是通过打分单词(所有输入句子的单词)的键向量与“Thinking”的查询向量相点积来计算的。
-
第三步和第四步是将分数除以8(8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。这里也可以使用其它值,8只是默认值),然后通过softmax传递结果。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。
通过矩阵运算实现自注意力机制以便算得更快。
通过增加一种叫做“多头”注意力(“multi-headed” attention)的机制,论文进一步完善了自注意力层。
image.png
将位置向量添加到词嵌入中使得它们在接下来的运算中,能够更好地表达的词与词之间的距离。
在每个编码器中的每个子层(自注意力、前馈网络)的周围都有一个残差连接,并且都跟随着一个“层-归一化”步骤。
参考资料
从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史
Hulu背后的故事:NLP在Hulu的研究与实践
BERT大火却不懂Transformer?读这一篇就够了
放弃幻想,全面拥抱Transformer
网友评论