66 使用注意力机制的seq2seq【动手学深度学习v2】
深度学习学习笔记
学习视频:https://www.bilibili.com/video/BV1v44y1C7Tg/?spm_id_from=…top_right_bar_window_history.content.click&vd_source=75dce036dc8244310435eaf03de4e330
在机器翻译时,每个生成的词可能源自句子中的不同词,将所有东西压在一起,翻译时可能不清楚来自哪一块的内容,seq2seq只用了最后一层隐藏层的输出,看不到前面的内容,还原不出对应词的位置。想要翻译对应词时找到原句子中的对应位置,于是加入注意力机制。
加入注意力
在解码器RNN输入时,(先前讲的使用最后一个时刻的隐藏层输出作为上下文+输入的embedding concat作为解码器的输出)应该根据现在要预测值的不一样选择不是最后一个时刻的词而可能是前面几个时刻的对应的隐藏状态作为输入。
attention将编码器对应每个词的输出作为key-value,key-value 是 第 i 个词的RNN的输出。
key-value放入attention中。query是解码器的RNN在对上一个词的预测输出作为query,去attention中match下一个词需要的key-value。
于是将上下文的向量合并embedding一起进去解码器的RNN。
Seq2Seq的改进就是之前进入解码器的RNN只拿到的是最后一个时刻的隐藏层输出,现在的是允许拿出所有的词做一个加权平均,一开始用前面的那些输出,越到后面用后面那些输出。
QA:
- attention搜索是在当前句子搜索。
- BERT是在encoder中加入注意力机制,bert没有decoder
- enc_valid_lens 为原句子的长度,在RNN时会把每个词都padding为一样长度,enc_valid_lens就是给出原始长度,不要padding的长度
- 图像attention:抠很多子图,一个子图就是一个key-value