06-Transformer

首先回顾经典神经网络的问题,例如使用神经网络进行一个翻译任务,先用词嵌入的方式将每个词转换为一个词向量:

1753608410187

如果直接将每个词直接输入一个全连接神经网络中,那么每个词都没有上下文信息,且长度只能一一对应:

1753608465828

如果使用循环神经网络RNN,又面临串行计算效率低和长期依赖困难的问题:

1753608537130

Transformer的提出解决了上述问题,它使用自注意力机制,将每个词的上下文信息都考虑进去,并且并行计算,效率更高:

首先给每个词一个位置编码,表示这个词出现在整个句子中的位置,把这个向量加入到原来的词向量中,这样每个词就都有了位置信息:

1753609591285

但此时,每个词都还没有其他词的位置信息,也就是注意不到其他词的存在。这时,使用一组权重矩阵WqW_qWkW_kWvW_v,分别与词向量相乘,得到一组维度不变的新向量qqkkvv(实际计算机在计算的时候是将词向量拼接成一个大的词向量矩阵,得到的直接就是加权后的向量矩阵):

1753609731890

前面的操作,让每个词向量经过线性变换,得到了一组新的维度不变的向量。接下来,让q1q_1k2k_2做点积,这表示在第一个词的视角里,第一个词和第二个词的相似度是多少。以此类推,得到第一个词与所有词的相似度(包括自身):

1753610156457

在得到这些相似度系数后,将它分别与各自的vv向量相乘再相加,得到一个向量,此时这个向量就表示:在第一个词的视角下,按照和它相似度大小、按权重把每个词的词向量都加到了一起。这就把全部的上下文信息都包含到第一个词当中了,而且是以第一个词的视角:

1753610446120

同理,对其他词也做同样的运算,那么此时,每个词都把其他词的词向量按照和自己的相似度权重,加到了自己的词向量中

1753610470271

从全局的视角来看,现在就是把原始的输入词向量,经过一番处理,变成了一组新的词向量。不一样的是,这组新的词向量中,每一个都是包含了位置信息和其他词上下文信息的一组新的词向量。而这,就是**注意力机制(Attention)**做的事情:

1753610591652

进一步优化,有的时候,一个词和另一个词的关系,可能从不同的视角下看是不一样的。对于注意力机制来说,如果只计算一次相关性,灵活性就会大大降低。之前,每个词向量经过一组矩阵变成一组qqkkvv,现在,让其再经过两组权重矩阵,变成两组qqkkvv,给每个词两次学习机会,学习到不同的要计算相似度的qqkkvv,来增加语言的灵活性。这里的每组qqkkvv称为一个头(Head)

1753610907879

接下来,每个头进行前文的注意力运算得到aa向量,然后把两个向量拼接起来,就得到了跟刚刚一样的结构,称为多头注意力(Multi-Head Attention)

1753611136383 1753611190827 1753611274099

1753611534601