seq2seq+attention的个人理解
RNN
经典的RNN结构:
这是经典的RNN结构,输入向量是:
隐藏层状态向量:
输出向量是:
那么,我们可以计算
\(t\)时刻输入层->\(t\)时刻隐藏层\(h_{t}^{ih}=W_{ih}*x_t+b_{ih}\)
\(t-1\)时刻隐藏层->\(t\)时刻隐藏层\(h_{t}^{hh}=W_{hh}*h_{t-1}+b_{hh}\)
\(t\)时刻输入层 和\(t-1\)时刻隐藏层->\(t\)时刻隐藏层\(h_{t}=tanh(h_{t}^{ih}+h_{t}^{hh})=tanh((W_{ih}*x_t+b_{ih})+(W_{hh}*h_{t-1}+b_{hh}))\)
\(t\)时刻隐藏层->\(t\)时刻输出层\(y_{t}=W_{ho}*h_{t}+b_{ho}\)
在\(t=1\)时刻,如果没有特别指定初始状态,一般都会使用全0的\(h_0\)作为初始状态输入到\(h_1\)中。
值得注意的是,任意时刻\(t\),所有的权值\(W\)和\(b\)都是相等的,这就是RNN的权值共享。
其实RNN可以简单的表示为:
\(y_{t}=RNN(x_t,h_{t-1})
=RNN(x_t,x_{t-1},h_{t-2})
=RNN(x_t,x_{t-1},...,x_2,x_1)\)
Sequence to Sequence模型
seq2seq一般是由Encoder和Decoder组成。
Encoder的output是无意义的,所以一般说Encoder输出都是指Encoder的hidden
由图可知,Encoder中\(h_i\)的最后一个\(h_t\)作为Decoder的初始状态输入\(S_0\)。
基于此,Decoder几乎获取不到Encoder前面隐藏层状态的信息(信息较少,或者说权值低)。所以,加入Attention改进这一情况。
Attention
Attention的计算过程分为三个部分:
1.计算query和key之间的相似性或相关性;
根据score函数(分很多种,通常为点积)计算query和key的权重score
score函数可以分为两种:
(1)加性注意力
\(s(Q,K)=W_{v}^{T}tanh(W_qQ+W_kK)\)
(2)点积注意力
\(s(Q,K) = \frac{Q^TK}{\sqrt{d}},Q\in R^{n\times d},K\in R^{m\times d}\)
2.对权重进行归一化处理;
对权重score进行softmax归一化
3.依据权重对value进行加权求和。
最后再与value进行点积,得到attention value
seq2seq + Attention
由于seq2seq中的Decoder几乎获取不到Encoder前面隐藏层状态的信息。所以可以加入Attention使得Decoder可以轻易地获取Encoder的隐藏层信息。如下图所示:
具体的seq2seq+Attention的结构如下图所示:
这里可以理解为Encoder建立索引,Decoder定位关注点。
1.计算query * Key
Encoder的每一个\(h_i(Key)\)与Decoder的\(S_{t-1}(Query)\)进行score运算,得到\(e_i\)。\(S_{t-1}\)包括Encoder传给Decoder的\(S_0\)和Decoder的\(S_i\)
即\(e_{t,i} = s(S_{t-1},h_i)\)
2.softmax归一化
对\(e_i\)进行softmax归一化
即\(\alpha_i=\frac{exp(e_i)}{\sum {exp(e_i)}}\)
3.与Value加权求和
与\(h_i(Value)\)进行点积,再求和,得到注意力值
即\(c_i=\sum {\alpha_ih_i}\)
4.与Decoder连接
\(c_i\)与Decoder的隐藏层状态\(S_i\)连接
注意:
\(Query->S_{t-1}\)
\(Key->h_i\)
\(Value->h_i\)