遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步!
需掌握的前提知识: Seq2seq、编码器&解码器神经网络
本文参考:【官方双语】一个视频理解神经网络注意力机制,详细阐释!
在基本的编码器-解码器中,展开的 LSTM 会将整个输入句子压缩成单个上下文向量,这对于短句子是可行的,但是对于有数千个词的大量输入,前面的输入信息会被稀释。
比如当输入一个长句子 Don't take the cookies I just bought from the table
,一开始的单词 Don't
可能被遗忘,这样一来句子就变成了 take the cookies I just bought from the table
,这和原来的句子意思完全相反!
因此,有时候记住前面的信息是非常重要的。那么怎么来解决这个问题呢?
让我们先来回想一下基本的循环神经网络,这个模型在处理长期记忆时会有问题,即前面的信息很难被记住,因此它们时通过单一路径来运行长期记忆和短期记忆的。而 LSTM 通过提供分离的路径来解决长期记忆的问题。
但即使有了分离的路径,如果我们有大量的数据,两条路径必须携带大量的信息,这意味着句子开头的单词也可能丢失。而注意力机制的主要思想是添加一堆新路径。
注意力机制通过在编码器每个输入模块上引出一条路径到解码器,从而使解码器的每一步都可以直接访问到每个输入模块上的输入值。
假设我们要将 Let's go
翻译为法语。
现在我们初始化编码器中 LSTM 的长期记忆和短期记忆(即单元状态和隐藏状态)为 0。
此时,所有输入都被压缩进了这组上下文向量中。我们再用这组上下文向量来初始化解码器中的一组单独的 LSTM 单元。
我们将 EOS
输入到嵌入层。接着我们加入注意力机制。
第一步:计算相似分数,计算解码器 LSTMs 的输出向量(短期记忆或隐藏状态)与编码器 LSTMs 中每一步的输出向量的相似分数
其中一个计算相似分数的方法是余弦相似性(Cosine Similarity)
即两向量内积后再除以两向量的模长,函数值处于
[
−
1
,
1
]
[-1,1]
[−1,1] 之间。
相似度越大,意味着两者更为相似。大的负值意味着两者的相反意义强。
如下图所示,令
A
A
A 表示编码器某一步的输出向量,
B
B
B 表示解码器某一步的输出向量
则
A
A
A 和
B
B
B 的余弦相似度为:
不过注意力机制中计算相似性更常见的做法是只计算余弦相似度的分子部分,即只进行点积运算,这样可以节省一些额外的计算量。
将所有相似度计算出来后,我们得到:
第二步:使用相似度分配成分,从上图我们可以看到,go
与 <EOS>
的相似度为
0.01
0.01
0.01,比 let's
与 <EOS>
的相似度
−
0.41
-0.41
−0.41 高,因此我们希望 go
的编码对解码器输出的第一个单词有更大影响。
为此,我们将这些分数通过 SoftMax 函数进行运算,运算结果表示单词被编码后使用的百分比。在下图这种情况下,我们使用
40
%
40\%
40% let's
被编码后的信息和
60
%
60\%
60% go
被编码后的信息来确定第一个翻译出的词。
因此,我们将 let's
被编码后的向量乘
0.4
0.4
0.4,将 go
被编码后的向量乘
0.6
0.6
0.6,再将这两者相加,得到 <EOS>
的注意力值。
第三步:预测,使用注意力输出和解码器的隐藏状态进行拼接,再通过 SoftMax 函数进行运算来进行选择
现在由于输出是 vamos
,而不是 <EOS>
,我们需要将 vamos
输入到解码器下一步的嵌入层中,然后重复上面的计算过程,之后解码器的第二个输出是 <EOS>
,到此我们完成了解码过程。
总结一下,当我们将注意力机制添加到基本的编码器-解码器模型时,编码器工作基本保持不变,但在解码器的每一步都可以访问每个输入单词的单独编码,我们利用相似度分数和 SoftMax 函数来确定每个编码后的输入单词应该以多大百分比用于预测下一个输出单词。
标签:编码,编码器,解码器,向量,相似,机制,注意力,输入 From: https://blog.csdn.net/si_ying/article/details/139712336