图解Attention
seq2seq模型
输入:一个序列;输出:另一个序列
模型细节:seq2seq模型是由encoder和decoder组成,encoder处理输入序列中的每个元素,把这些信息转成一个向量(称为上下文context),整个序列输入完成后,encoder把context发送给decoder,decoder生成输出序列中的元素。在transformer出现之前,encoder和decoder一般用RNN实现。
context向量的长度是基于编码器RNN的隐藏层神经元的数量。RNN在时间步上接受2个输入:1. 输入序列中的一个元素(用word embedding把单词转换到一个向量空间);2.一个hidden state。最后一个hidden state是我们要传递给decoder的context。
Attention讲解
事实证明,上下文context向量是这类模型的瓶颈。这使得模型在处理长文本时面临非常大的挑战。
一个注意力模型不同于经典的序列到序列(seq2seq)模型,主要体现在 2 个方面:
- 编码器会把所有时间步的hidden state传给解码器,而不是只传递最后一个hidden state。
- 解码器在产生输出之前,做了一个额外的处理,给每个hidden state一个分数,高分的hidden state会被放大,低分的则会被缩小。
注意力模型的整个过程:
图解transformer
2017 年,Google 提出了 Transformer 模型,用 Self Attention 的结构,取代了以往 NLP 任务中的 RNN 网络结构。这个模型的其中一个优点,就是使得模型训练过程能够并行计算。Transformer也是由encoder和decoder组成的。
transformer的输入:
使用word embedding algorithm,将每一个词转换成一个词向量,输入的句子是一个向量列表。在实际中,每个句子的长度不一样,我们会取一个适当的值,作为向量列表的长度。如果一个句子达不到这个长度,那么就填充全为 0 的词向量;如果句子超出这个长度,则做截断。句子长度是一个超参数。
Encoder:
每个单词转换成一个向量之后,进入self-attention层,每个位置的单词得到新向量,然后再输入FFN神经网络。
Self-Attention
-
计算query, key, and value向量
-
计算Attention分数
这些分数,是通过计算 “Thinking” 对应的 Query 向量和其他位置的每个词的 Key 向量的点积,而得到的。如果我们计算句子中第一个位置单词的 Attention Score(注意力分数),那么第一个分数就是 q1 和 k1 的内积,第二个分数就是 q1 和 k2 的点积。
-
Normalize + Softmax
-
每个分数分别与每个 Value 向量相乘,得到的向量相加,就得到了 Self Attention 层在这个位置(这里的例子是第一个位置)的输出。
Reference
https://github.com/datawhalechina/Learn-NLP-with-Transformers