受Attention的启发,当要表示序列中某一时刻的状态时,可以通过该状态与其他时刻状态之间的相关性计算,即所谓的“观其伴,知其意”,这又被称作自注意力机制(Self-Attention)。
self-attention:把Attention用在一个RNN网络上。
- 在提出self-attention的原始论文:Long Short-Term Memory-Networks for Machine Reading中,对LSTM网络使用了Self-Attention。本文为了方便理解,对SimpleRNN使用Self-Attention。
具体流程
- RNN的输入为[ x 1 , x 2 , . . . . . . ] [x_1,x_2,......][x1,x2,......]、初始隐藏状态h 0 = 0 h_0=0h0=0、初始context vectorc 0 = 0 c_0=0c0=0
- 更新h 1 h_1h1h 1 = t a n h ( A ⋅ [ x 1 c 0 ] + b ) h_1=tanh(A \cdot \begin{bmatrix}x_1\\c_0\\ \end{bmatrix}+b)h1=tanh(A⋅[x1c0]+b)
也可以h 1 = t a n h ( A ⋅ [ x 1 c 0 h 0 ] + b ) h_1=tanh(A \cdot \begin{bmatrix}x_1\\c_0\\h_0 \end{bmatrix}+b)h1=tanh(A⋅⎣⎡x1c0h0⎦⎤+b) - 更新context vectorc 1 = h 1 c_1=h_1c1=h1
- 更新h 2 h_2h2h 2 = t a n h ( A ⋅ [ x 2 c 1 ] + b ) h_2=tanh(A \cdot \begin{bmatrix}x_2\\c_1\\ \end{bmatrix}+b)h2=tanh(A⋅[x2c1]+b)
重点更新context vector:c 2 c_2c2- 计算权重:对h 2 h_2h2和h 1 , h 2 h_1,h_2h1,h2(h 0 h_0h0为全0,忽略)α i = a l i g n ( h i , h 2 ) \alpha_i=align(h_i,h_2)αi=align(hi,h2)
- 更新c 2 c_2c2c 2 = α 1 h 1 + α 2 h 2 c_2=\alpha_1h_1+\alpha_2h_2c2=α1h1+α2h2
此后重复以上过程
总结
通过self-attention,可以直接计算两个距离较远的时刻之间的关系。
而在RNN中,由于信息是沿着时刻逐层传递的,因此当两个相关性较大的时刻距离较远时,会产生较大的信息损失。虽然引入了门控机制,如LSTM、GRU等,可以部分解决这种长距离依赖问题,但是治标不治本。
因此,基于自注意力机制的自注意力模型已经逐步取代RNN,成为自然语言处理的标准模型。
参考
版权声明:本文为m0_50896529原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
