seq2seq+attention的个人理解

RNN

经典的RNN结构:
image
这是经典的RNN结构,输入向量是:
image
隐藏层状态向量:
image

输出向量是:
image

那么,我们可以计算
\(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
image
由图可知,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
image
image

seq2seq + Attention

由于seq2seq中的Decoder几乎获取不到Encoder前面隐藏层状态的信息。所以可以加入Attention使得Decoder可以轻易地获取Encoder的隐藏层信息。如下图所示:
image

具体的seq2seq+Attention的结构如下图所示:
image

这里可以理解为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\)

参考资料:https://zhuanlan.zhihu.com/p/51383402

posted @ 2023-07-14 17:09  我好想睡觉啊  阅读(14)  评论(0编辑  收藏  举报