赞
踩
seq2seq 中使用编码器对时序数据进行编码,然后将编码信息传递给解码器。此时,编码器的输出是固定长度的向量。实际上,这个“固定长度”存在很大问题。
无论多长的文本,当前的编码器都会将其转换为固定长度的向量。但是,这样做早晚会遇到瓶颈。就像最终西服会从衣柜中掉出来一样,有用的信息也会从向量中溢出。
上图,使用各个时刻(各个单词)的隐藏状态向量,可以获得和输入的单词数相同数量的向量。输入了 5 个单词,此时编码器输出 5 个向量。这样一来,编码器就摆脱了“一个固定长度的向量”的制约。
通过这个小改动,编码器可以根据输入语句的长度,成比例地编码信息。
上图,我们新增一个进行“某种计算”的层。这个“某种计算”接收(解码器)各个时刻的 LSTM 层的隐藏状态和编码器的 hs。然后,从中选出必要的信息,并输出到 Affine 层。与之前一样,编码器的最后的隐藏状态向量传递给解码器最初的 LSTM 层。
这个“某种计算”所做的工作是提取单词对齐信息。具体来说,就是从 hs 中选出与各个时刻解码器输出的单词有对应关系的单词向量。比如,当解码器输出“I”时,从 hs 中选出“吾輩”的对应向量。
可否将“选择”这一操作换成可微分的运算呢?
我们另行计算表示各个单词重要度(贡献值)的权重。这里使用了表示各个单词重要度的权重(记为 a)。此时,a 像概率分布一样,各元素是 0.0 ~ 1.0 的标量,总和是 1。然后,计算这个表示各个单词重要度的权重和单词向量 hs 的加权和,可以获得目标向量。
下面我们来看一下各个单词的权重 a 的求解方法。
用 h 表示解码器的 LSTM 层的隐藏状态向量。此时,我们的目标是用数值表示这个 h 在多大程度上和 hs 的各个单词向量“相似”。有几种方法可以做到这一点,这里我们使用最简单的向量内积。其含义是两个向量在多大程度上指向同一方向。
通过向量内积算出 h 和 hs 的各个单词向量之间的相似度,并将其结果表示为 s。经过Softmax函数后的到 a。
解码器的改进①和②已经分为 Weight Sum 层和 Attention Weight 层进行了实现。这里进行的计算是:Attention Weight 层关注编码器输出的各个单词向量 hs,并计算各个单词的权重 a;然后,Weight Sum 层计算 a 和 hs 的加权和,并输出上下文向量 c。
我们将进行这一系列计算的层称为 Attention 层。
单词“猫”的对应向量编码了“吾輩”“は”“猫”这 3 个单词的信息。如果考虑整体的平衡性,我们希望向量能更均衡地包含单词“猫”周围的信息。为此,可以让 LSTM 从两个方向进行处理,这就是名为双向 LSTM 的技术。
双向 LSTM 在之前的 LSTM 层上添加了一个反方向处理的 LSTM 层。然后,拼接各个时刻的两个 LSTM 层的隐藏状态,将其作为最后的隐藏状态向量(除了拼接之外,也可以“求和”或者“取平均”等)。
双向 LSTM 的实现非常简单。一种实现方式是准备两个 LSTM 层,并调整输入各个层的单词的排列。具体而言,其中一个层的输入语句与之前相同,这相当于从左向右处理输入语句的常规的LSTM 层。而另一个 LSTM 层的输入语句则按照从右到左的顺序输入。如果原文是“A B C D”,就改为“D C B A”。通过输入改变了顺序的输入语句,另一个 LSTM 层从右向左处理输入语句。之后,只需要拼接这两个LSTM 层的输出,就可以创建双向 LSTM 层。
继续阅读:
《深度学习进阶:自然语言处理(第1章)》-读书笔记
《深度学习进阶:自然语言处理(第2章)》-读书笔记
《深度学习进阶:自然语言处理(第3章)》-读书笔记
《深度学习进阶:自然语言处理(第4章)》-读书笔记
《深度学习进阶:自然语言处理(第5章)》-读书笔记
《深度学习进阶:自然语言处理(第6章)》-读书笔记
《深度学习进阶:自然语言处理(第7章)》-读书笔记
《深度学习进阶:自然语言处理(第8章)》-读书笔记
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。