1 Attention的结构
基于
Attention
机制,
seq2seq
可以像我们人类一样,将“注意力”集中在必要的信息上。
1.1 seq2seq存在问题
1.2 编码器的改进
编码器的输出的长度应该根据输入文本的长度相应地改变
在图
8
-
2
的例子中,输入了
5
个单词,此时编码器输出 5
个向量。
![](https://img-blog.csdnimg.cn/direct/a0c8e182a6b143848e9a36e8789bb364.png)
这里我们所做的改进只是将编码器的全部时刻的隐藏状态取出来而已。通过这个小改动,编码器可以根据输入语句的长度,成比例地编码信息。
1.3 解码器的改进①
在上一章的最简单的
seq2seq
中,仅将编码器最后的隐藏状态向量传递给了解码器。
![](https://img-blog.csdnimg.cn/direct/b79f30b198ea41ed82a120f2c2b36f12.png)
![](https://img-blog.csdnimg.cn/direct/098a66cde93f4661bec7702dfe61444c.png)
![](https://img-blog.csdnimg.cn/direct/65200151166148a2a0a78b3c5572b8b7.png)
![](https://img-blog.csdnimg.cn/direct/09acdac42de54cf384d0a9fffae0c644.png)
![](https://img-blog.csdnimg.cn/direct/8e248e2ea45f453bbccbb6ff3254dd1a.png)
![](https://img-blog.csdnimg.cn/direct/fcd7aa9e3b984fd687655700a786ea36.png)
![](https://img-blog.csdnimg.cn/direct/310476fae4974181b2342212161e963d.png)
![](https://img-blog.csdnimg.cn/direct/972a996f909844538ac05623fd394ba1.png)
这里重述一下要点:“
Repeat
的反向传播是
Sum
”“
Sum
的反向传播是 Repeat
”。
将图
8
-
11
的计算图实现为层
![](https://img-blog.csdnimg.cn/direct/183511c797bf41a88626b398407e6c60.png)
![](https://img-blog.csdnimg.cn/direct/68355c964b774b93b58b8e5d0d8f0570.png)
1.4 解码器的改进②
下面我们来看一下各个单词的权重
a
的求解方法。
![](https://img-blog.csdnimg.cn/direct/e339fe333f7b40f2a05aeca567d0e0ca.png)
![](https://img-blog.csdnimg.cn/direct/2e984d83f9b14dcc9b28760c6ef78fb4.png)
![](https://img-blog.csdnimg.cn/direct/ac5d8e4a82e74c59ac74e6f74f8c2575.png)
![](https://img-blog.csdnimg.cn/direct/20392eb98b6149e7a260e11773b740b9.png)
![](https://img-blog.csdnimg.cn/direct/3919f97fb8974f5ab9da1830ecbcd51d.png)
![](https://img-blog.csdnimg.cn/direct/8cd40134ce134e1bacc9cd7707e6c2e4.png)
1.5 解码器的改进③
这里进行的计算是:Attention Weight
层关注编码器输出的各个单词向量
hs
,并计算各个单词的权重 a
;然后,
Weight Sum
层计算
a
和
hs
的加权和,并输出上下文向量 c
。我们将进行这一系列计算的层称为
Attention
层。
![](https://img-blog.csdnimg.cn/direct/5be658a951fa4e88a722e879b60588f0.png)
![](https://img-blog.csdnimg.cn/direct/b607079878d544d8992adeb1a5cf6232.png)
为了以后可以访问各个单词的权重,这里设定成员变量
attention_weight
![](https://img-blog.csdnimg.cn/direct/d915aa72941a4afba6a940dfac6400bf.png)
![](https://img-blog.csdnimg.cn/direct/ccb952f1f8eb4467b5dcef3610de07bc.png)
![](https://img-blog.csdnimg.cn/direct/1147a1c8469e4671911a4ccd659b3bd9.png)
![](https://img-blog.csdnimg.cn/direct/34390d115462463998b62012c4915ef2.png)
![](https://img-blog.csdnimg.cn/direct/e5cf37a2e793496795c17da02010f27b.png)
![](https://img-blog.csdnimg.cn/direct/1eb6516ce8f64fd1ac1532d8b15d38b5.png)
2 带Attention的seq2seq的实现
2.1 编码器的实现
首先实现
AttentionEncoder
类。这个类和上一章实现的
Encoder
类几乎一样,唯一的区别是,Encoder
类的
forward()
方法仅返回
LSTM
层的最后的隐藏状态向量,而AttentionEncoder
类则返回所有的隐藏状态向量。
![](https://img-blog.csdnimg.cn/direct/1f80d03ae6f84c59983e02aeefb7d2d2.png)
2.2 解码器的实现
Softmax
层(更确切地说,是 Time Softmax with Loss
层)之前的层都作为解码器。
![](https://img-blog.csdnimg.cn/direct/d744ab98e98d44f9ab939d0e42174849.png)
这里的实现除使用了新的
Time Attention
层之外,和上一章的
Decoder
类没有什么太大的不同。需要注意的是,forward()
方法中拼接了
Time Attention层的输出和 LSTM
层的输出。在上面的代码中,使用
np.concatenate()
方法进行拼接。
2.3 seq2seq的实现
3 Attention的评价
3.1 日期格式转换问题
代码p349
3.2 Attention的可视化
在进行时序转换时,实际观察Attention 在注意哪个元素。
因为在
Attention
层中,各个时刻的
Attention权重均保存到了成员变量中,所以我们可以轻松地进行可视化。
![](https://img-blog.csdnimg.cn/direct/d6aeeda30ffc481eaa67b7f817f8111b.png)
![](https://img-blog.csdnimg.cn/direct/5d9d01b94b5d409aa04b8da28cef9c28.png)
![](https://img-blog.csdnimg.cn/direct/c43dc1276a944f5f87e701687ea42df3.png)
4 关于Attention的其它话题
4.1 双向RNN
4.2 Attention层的使用方法
在图
8
-
32
中,
Attention
层的输出(上下文向量)被连接到了下一时刻的 LSTM
层的输入处。通过这种结构,
LSTM
层得以使用上下文向量的信息。相对地,我们实现的模型则是 Affine
层使用了上下文向量。
![](https://img-blog.csdnimg.cn/direct/0a25d775ebbd44b4904278c63e1e2bbd.png)
4.3 seq2seq的深层化和 skip connection
通过加深层,可以创建表现力更强的模型,带 Attention
的
seq2seq
也是如此。
![](https://img-blog.csdnimg.cn/direct/da44f7c5386448c3a069277191285afe.png)
在图
8
-
33
的模型中,编码器和解码器使用了
3
层
LSTM
层。
在加深层时使用到的另一个重要技巧是
残差连接。
![](https://img-blog.csdnimg.cn/direct/5cfa20a46b7a46fb85f43d37231718ec.png)
如图
8
-
34
所示,所谓残差连接,就是指“跨层连接”。此时,在残差连接的连接处,有两个输出被相加。
5 Attention的应用
5.1 GNMT
谷歌神经机器翻译系统
![](https://img-blog.csdnimg.cn/direct/fa5ae07df18d487abbbb1c3379922c56.png)
![](https://img-blog.csdnimg.cn/direct/8582578adc964828be77c839e52c2226.png)
![](https://img-blog.csdnimg.cn/direct/2949b55961fb446fa3161da273beeed5.png)
5.2 Transformer
RNN
需要基于上一个时刻的计算结果逐步进行计算,因此(基本)不可能在时间方向上并行计算 RNN
。
Transformer
不用
RNN
,而用
Attention
进行处理。
![](https://img-blog.csdnimg.cn/direct/d67504b2087f44f6b7fda03e03d5e3f3.png)
![](https://img-blog.csdnimg.cn/direct/b414bc68b29648c6818c5db855927ee5.png)
如图
8
-
37
的右图所示,
Self-Attention
的两个输入中输入的是同一个时序数据。像这样,可以求得一个时序数据内各个元素之间的对应关系。
![](https://img-blog.csdnimg.cn/direct/e3801fbb36c0488c9e21f91aab8561af.png)
Transformer
中用
Attention
代替了
RNN
。
使用
Transformer
可以控制计算量,充分利用
GPU
并行计算带来的好处。其结果是,与 GNMT
相比,
Transformer
的学习时间得以大幅减少。
![](https://img-blog.csdnimg.cn/direct/b66a6642ebc642debc6bb9bd5fb491f1.png)
5.3 NTM
基于外部存储装置的扩展
在
RNN
的外部配置一个存储信息的存储装置,并使用
Attention向这个存储装置读写必要的信息。
![](https://img-blog.csdnimg.cn/direct/e80c0e571cf54d91b5abaca42045fe71.png)
![](https://img-blog.csdnimg.cn/direct/be3d81c78ef540c38786a5efb55234d9.png)
![](https://img-blog.csdnimg.cn/direct/6e0d304b4e544d79a161601542e4d783.png)
![](https://img-blog.csdnimg.cn/direct/dcf1f379a309482dabb332de276fd6cb.png)
如此,
NTM
借助外部存储装置获得了学习算法的能力,其中
Attention作为一项重要技术而得到了应用。
6 总结
使用
Attention
实现了 seq2seq,进行了简单实验,
从结果可知,具有
Attention
的模型以与人类相同的方式将注意力放在了必要的信息上。Attention的应用还有很多,在接下来的学习中还会派上大用场。