【动手学深度学习v2】注意力机制—3 自注意力&位置编码

1. 自注意力 self-attention

输入序列: x 1 , … , x n \mathbf{x}_1, \ldots, \mathbf{x}_n x1,,xn,任意 x i ∈ R d \mathbf{x}_i \in \mathbb{R}^d xiRd
自注意力池化层:将 x i \mathbf{x}_i xi当作key,value,query对序列抽取特征
输出序列: y 1 , … , y n \mathbf{y}_1, \ldots, \mathbf{y}_n y1,,yn
注意力汇聚函数 f f f
y i = f ( x i , ( x 1 , x 1 ) , … , ( x n , x n ) ) ∈ R d \mathbf{y}_i = f(\mathbf{x}_i, (\mathbf{x}_1, \mathbf{x}_1), \ldots, (\mathbf{x}_n, \mathbf{x}_n)) \in \mathbb{R}^d yi=f(xi,(x1,x1),,(xn,xn))Rd

2. 比较卷积神经网络、循环神经网络和自注意力

目标:将由 n n n个词元组成的序列映射到另一个长度相等的序列,其中的每个输入词元或输出词元都由 d d d维向量表示
在这里插入图片描述

3. 位置编码 Positional Encoding

自注意力因为并行计算而放弃了顺序操作。为了像RNN一样纳入顺序信息,通过在输入表示中添加位置编码(positional encoding)来注入绝对的或相对的位置信息。位置编码可以学习也可以固定得到。

基于正弦函数和余弦函数的固定位置编码

假设输入长度为n的序列是 X ∈ R n × d \mathbf{X} \in \mathbb{R}^{n \times d} XRn×d,用位置编码矩阵 P ∈ R n × d \mathbf{P} \in \mathbb{R}^{n \times d} PRn×d输出 X + P \mathbf{X}+\mathbf{P} X+P, 矩阵第 i i i行、第 2 j 2j 2j列和 2 j + 1 2j+1 2j+1列上的元素为:
p i , 2 j = sin ⁡ ( i 1000 0 2 j / d ) , p i , 2 j + 1 = cos ⁡ ( i 1000 0 2 j / d ) . \begin{split}\begin{aligned} p_{i, 2j} &= \sin\left(\frac{i}{10000^{2j/d}}\right),\\p_{i, 2j+1} &= \cos\left(\frac{i}{10000^{2j/d}}\right).\end{aligned}\end{split} pi,2jpi,2j+1=sin(100002j/di),=cos(100002j/di).
举例如下:
row_position
第六列是sin;
第七列相对于第六列位移 sin变cos;
第6列和第7列的频率高于第8列和第9列

位置矩阵编码可视化

捕捉绝对位置
positon encoding
位置编码通过使用三角函数在编码维度上降低频率。横列对应一个位置,相当于一句话中的一个词,纵列是同一个维度。纵列的值周期性变化,且沿着编码维度,频率单调降低。

相对位置信息

允许模型学习得到输入序列中相对位置信息;
这是因为对于任何确定的位置偏移 δ \delta δ,位置处 i + δ i + \delta i+δ的位置编码可以线性投影位置 i i i处的位置编码来表示。任何一对 ( p i , 2 j , p i , 2 j + 1 ) (p_{i, 2j}, p_{i, 2j+1}) (pi,2j,pi,2j+1)都可以线性投影到 ( p i + δ , 2 j , p i + δ , 2 j + 1 ) (p_{i+\delta, 2j}, p_{i+\delta, 2j+1}) (pi+δ,2j,pi+δ,2j+1)
[ cos ⁡ ( δ ω j ) sin ⁡ ( δ ω j ) − sin ⁡ ( δ ω j ) cos ⁡ ( δ ω j ) ] [ p i , 2 j p i , 2 j + 1 ] = [ cos ⁡ ( δ ω j ) sin ⁡ ( i ω j ) + sin ⁡ ( δ ω j ) cos ⁡ ( i ω j ) − sin ⁡ ( δ ω j ) sin ⁡ ( i ω j ) + cos ⁡ ( δ ω j ) cos ⁡ ( i ω j ) ] = [ sin ⁡ ( ( i + δ ) ω j ) cos ⁡ ( ( i + δ ) ω j ) ] = [ p i + δ , 2 j p i + δ , 2 j + 1 ] , \begin{split}\begin{aligned} &\begin{bmatrix} \cos(\delta \omega_j) & \sin(\delta \omega_j) \\ -\sin(\delta \omega_j) & \cos(\delta \omega_j) \\ \end{bmatrix} \begin{bmatrix} p_{i, 2j} \\ p_{i, 2j+1} \\ \end{bmatrix}\\ =&\begin{bmatrix} \cos(\delta \omega_j) \sin(i \omega_j) + \sin(\delta \omega_j) \cos(i \omega_j) \\ -\sin(\delta \omega_j) \sin(i \omega_j) + \cos(\delta \omega_j) \cos(i \omega_j) \\ \end{bmatrix}\\ =&\begin{bmatrix} \sin\left((i+\delta) \omega_j\right) \\ \cos\left((i+\delta) \omega_j\right) \\ \end{bmatrix}\\ =& \begin{bmatrix} p_{i+\delta, 2j} \\ p_{i+\delta, 2j+1} \\ \end{bmatrix}, \end{aligned}\end{split} ===[cos(δωj)sin(δωj)sin(δωj)cos(δωj)][pi,2jpi,2j+1][cos(δωj)sin(iωj)+sin(δωj)cos(iωj)sin(δωj)sin(iωj)+cos(δωj)cos(iωj)][sin((i+δ)ωj)cos((i+δ)ωj)][pi+δ,2jpi+δ,2j+1],

参考

DIVE INTO DEEP LEARNING> 10 注意力机制 > 10.6. 自注意力和位置编码
67 自注意力【动手学深度学习v2】

系列文章

【动手学深度学习v2】注意力机制—1 注意力评分函数
【动手学深度学习v2】注意力机制—2 使用注意力机制Seq2Seq
【动手学深度学习v2】注意力机制—3 自注意力&位置编码
【动手学深度学习v2】注意力机制—4 Transformer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值