目录
- 注意力评分函数
- 基于rnn的seq2seq模型
- 带注意力机制的基于rnn的seq2seq模型
- 多头注意力
- Transfomer
本文是邱锡鹏教授撰写的《神经网络与深度学习》一书中 第8章:注意力机制与外部记忆 的读书笔记,主要内容是一些本人觉得比较值得记录的内容,中间也会包括一些拓展和思考。
注意力评分函数
以下为注意力机制的流程图,查询 通过注意力评分函数
与键
作用,并通过softmax得到对应
的概率分布值,最后这些概率分布值与值
写成数学公式:
常用的注意力评分函数有 加性注意力 和 点积注意力 两种:
加性注意力:
其中可学习参数
点积注意力
点积评分函数计算效率更高,但是要求
和
具有相同的长度
在实践中,可以考虑批量计算注意力值来提升效率:
其中 表示
个查询,
表示
个键,
表示
基于rnn的seq2seq模型
首先回忆基于循环神经网络的seq2seq模型:
如图所示:
- encoder每一层最后时间步的state会作为decoder对应层state的初始化,因此要求encoder,decoder的层数一样,hidden_size 一样
- 上下文变量
会与decoder上一时间步的输出
Note:在training时,decoder可以直接使用 y_gold 与
拼接作为输入;而在inference时,由于 y_gold 是不可知的,因此使用上一时间步的输出与
这种结构的seq2seq会有一个问题:decoder所有时间步从encoder中获得的信息都是一样的,没有区分。但这与实际情况往往是不相符的,例如对于翻译模型,target language中的某个词往往会与source language的某一两个词具有强相关性,而跟其它的词相关性很弱。而注意力机制恰好就可以解决这样的问题。
带注意力机制的基于rnn的seq2seq模型
带注意力机制的seq2seq模型中,上下文变量 不再简单的采用encoder的输出,而是encoder层隐变量与decoder上一时间步的注意力输出:
其中 是decoder上一时间步的隐层输出,
多头注意力
所谓“多头”,是通过给{查询,键,值}组合施加不同的线性变换来实现的,每个头的定义如下:
其中
之后所有的头需要经过一个线性转换:
其中
对同一 {查询,键,值} 施加不同的线性变换,并将这些结果组合起来,以此让模型学到比简单加权平均值更复杂的表示。
为了能够并行计算多个头,需要设置
Transfomer
论文地址:Attention Is All You Need
正如标题所表达的,Transfomer完全摒弃了循环神经网络的结构:
- encoder层: {多头自注意力 + 前馈网络}
- decoder层: {掩蔽多头自注意力 + encoder-decoder多头自注意力 + 前馈网络}
关于Transformer中注意力机制的详细使用情况,可以参加本人的另一篇博客 Transfomer矩阵维度分析及MultiHead详解