目录

  • 注意力评分函数
  • 基于rnn的seq2seq模型
  • 带注意力机制的基于rnn的seq2seq模型
  • 多头注意力
  • Transfomer


本文是邱锡鹏教授撰写的《神经网络与深度学习》一书中 第8章:注意力机制与外部记忆 的读书笔记,主要内容是一些本人觉得比较值得记录的内容,中间也会包括一些拓展和思考。

注意力评分函数

以下为注意力机制的流程图,查询 注意力机制代码python知乎_注意力机制代码python知乎 通过注意力评分函数 注意力机制代码python知乎_深度学习_02 与键 注意力机制代码python知乎_点积_03 作用,并通过softmax得到对应 注意力机制代码python知乎_点积_03 的概率分布值,最后这些概率分布值与值 注意力机制代码python知乎_深度学习_05


注意力机制代码python知乎_深度学习_06

写成数学公式:
注意力机制代码python知乎_概率分布_07

常用的注意力评分函数有 加性注意力点积注意力 两种:

加性注意力
注意力机制代码python知乎_注意力机制代码python知乎_08
其中可学习参数 注意力机制代码python知乎_概率分布_09

点积注意力
注意力机制代码python知乎_概率分布_10

点积评分函数计算效率更高,但是要求 注意力机制代码python知乎_点积_11注意力机制代码python知乎_深度学习_12 具有相同的长度 注意力机制代码python知乎_注意力机制代码python知乎_13

在实践中,可以考虑批量计算注意力值来提升效率:
注意力机制代码python知乎_点积_14

其中 注意力机制代码python知乎_点积_15 表示 注意力机制代码python知乎_点积_16 个查询,注意力机制代码python知乎_点积_17 表示 注意力机制代码python知乎_注意力机制代码python知乎_18 个键,注意力机制代码python知乎_深度学习_19 表示 注意力机制代码python知乎_注意力机制代码python知乎_18


基于rnn的seq2seq模型

首先回忆基于循环神经网络的seq2seq模型:

注意力机制代码python知乎_概率分布_21


如图所示:

  1. encoder每一层最后时间步的state会作为decoder对应层state的初始化,因此要求encoder,decoder的层数一样,hidden_size 一样
  2. 上下文变量 注意力机制代码python知乎_注意力机制代码python知乎_22 会与decoder上一时间步的输出 注意力机制代码python知乎_深度学习_23

Note:在training时,decoder可以直接使用 y_gold 与 注意力机制代码python知乎_深度学习_24 拼接作为输入;而在inference时,由于 y_gold 是不可知的,因此使用上一时间步的输出与注意力机制代码python知乎_深度学习_24

这种结构的seq2seq会有一个问题:decoder所有时间步从encoder中获得的信息都是一样的,没有区分。但这与实际情况往往是不相符的,例如对于翻译模型,target language中的某个词往往会与source language的某一两个词具有强相关性,而跟其它的词相关性很弱。而注意力机制恰好就可以解决这样的问题。


带注意力机制的基于rnn的seq2seq模型

带注意力机制的seq2seq模型中,上下文变量 注意力机制代码python知乎_注意力机制代码python知乎_26 不再简单的采用encoder的输出,而是encoder层隐变量与decoder上一时间步的注意力输出:
注意力机制代码python知乎_概率分布_27

其中 注意力机制代码python知乎_概率分布_28 是decoder上一时间步的隐层输出,注意力机制代码python知乎_注意力机制代码python知乎_29

注意力机制代码python知乎_点积_30


多头注意力

所谓“多头”,是通过给{查询,键,值}组合施加不同的线性变换来实现的,每个头的定义如下:

注意力机制代码python知乎_深度学习_31

其中 注意力机制代码python知乎_点积_32

之后所有的头需要经过一个线性转换:
注意力机制代码python知乎_深度学习_33

其中 注意力机制代码python知乎_点积_34

对同一 {查询,键,值} 施加不同的线性变换,并将这些结果组合起来,以此让模型学到比简单加权平均值更复杂的表示。

为了能够并行计算多个头,需要设置 注意力机制代码python知乎_深度学习_35


Transfomer

论文地址:Attention Is All You Need

正如标题所表达的,Transfomer完全摒弃了循环神经网络的结构:

  1. encoder层: {多头自注意力 + 前馈网络} 注意力机制代码python知乎_注意力机制代码python知乎_36
  2. decoder层: {掩蔽多头自注意力 + encoder-decoder多头自注意力 + 前馈网络} 注意力机制代码python知乎_注意力机制代码python知乎_36

注意力机制代码python知乎_点积_38

关于Transformer中注意力机制的详细使用情况,可以参加本人的另一篇博客 Transfomer矩阵维度分析及MultiHead详解