简单RNN(Simple RNN):
x
t
=
tanh
(
A
x
t
−
1
+
B
u
t
)
x_t = \tanh(Ax_{t - 1} + Bu_t)
xt=tanh(Axt−1+But)用于更新内部状态,结合上一时刻状态
x
t
−
1
x_{t - 1}
xt−1和当前输入
u
t
u_t
ut ;
y
^
t
=
g
(
C
x
t
)
\hat{y}_t = g(Cx_t)
y^t=g(Cxt)计算输出,将内部状态转换为模型预测值。
门控循环单元网络(GRU RNN):
x
t
=
z
t
⊙
x
t
−
1
+
(
1
−
z
t
)
⊙
tanh
(
A
x
(
r
t
⊙
x
t
−
1
)
+
B
x
u
t
)
x_t = z_t \odot x_{t - 1} + (1 - z_t) \odot \tanh(A_x(r_t \odot x_{t - 1}) + B_xu_t)
xt=zt⊙xt−1+(1−zt)⊙tanh(Ax(rt⊙xt−1)+Bxut),利用更新门
z
t
z_t
zt和重置门
r
t
r_t
rt,灵活控制信息传递;
y
^
t
=
g
(
C
x
t
)
\hat{y}_t = g(Cx_t)
y^t=g(Cxt)用于输出计算。
长短期记忆网络(LSTM RNN):
s
t
=
f
t
⊙
s
t
−
1
+
i
t
⊙
tanh
(
A
s
x
t
−
1
+
B
s
u
t
)
s_t = f_t \odot s_{t - 1} + i_t \odot \tanh(A_sx_{t - 1} + B_su_t)
st=ft⊙st−1+it⊙tanh(Asxt−1+Bsut)更新记忆单元,由遗忘门
f
t
f_t
ft 、输入门
i
t
i_t
it等控制;
x
t
=
o
t
⊙
tanh
(
s
t
)
x_t = o_t \odot \tanh(s_t)
xt=ot⊙tanh(st)更新内部状态,通过输出门
o
t
o_t
ot ;
y
^
t
=
g
(
C
x
t
)
\hat{y}_t = g(Cx_t)
y^t=g(Cxt)计算最终输出。
独热编码(One hot encoding):将每个整数表示转换为向量形式,向量中只有对应位置为1,其余为0,例如“the”对应的向量是[1, 0, 0, 0, 0, 0] 。
存在问题:若词汇表中包含数千个不同的单词,使用独热编码会导致许多稀疏的输入向量,在计算上效率较低。
词嵌入(word embedding)
词嵌入在自然语言处理中很受欢迎,它能在低维空间中高效表示单词。
原理阐述:词嵌入的思路是对原始词表示进行降维。公式为
z
=
W
x
z = Wx
z=Wx 其中,
x
∈
R
n
x \in \mathbb{R}^n
x∈Rn是单词的独热编码表示;
W
∈
R
d
×
n
W \in \mathbb{R}^{d \times n}
W∈Rd×n是权重矩阵,用于降维,且
d
≪
n
d \ll n
d≪n ;
z
∈
R
d
z \in \mathbb{R}^d
z∈Rd是嵌入后的词表示。
简单来说:权重矩阵的行数等于嵌入维度(左侧竖着的红线),列数等于不同单词的数量(上方横着的红线)。 上方说了,
d
<
<
n
d<
编码器(Encoder):由Encoder RNN构成,公式为
x
t
=
tanh
(
A
x
t
−
1
+
B
u
t
)
x_t = \tanh(Ax_{t - 1} + Bu_t)
xt=tanh(Axt−1+But),其中
x
t
x_t
xt是当前时刻的隐藏状态,
x
t
−
1
x_{t - 1}
xt−1是上一时刻的隐藏状态,
u
t
u_t
ut是当前时刻的输入。编码器的作用是将输入(如“The past few days”)映射为一个上下文向量
c
c
c ,捕捉输入序列的整体信息。
解码器(Decoder):由Decoder RNN构成,公式为
x
t
′
=
tanh
(
A
x
t
−
1
′
+
B
y
^
t
−
1
)
x'_t = \tanh(Ax'_{t - 1} + B\hat{y}_{t - 1})
xt′=tanh(Axt−1′+By^t−1)和
y
^
t
=
g
(
C
x
t
′
)
\hat{y}_t = g(Cx'_t)
y^t=g(Cxt′),其中
x
t
′
x'_t
xt′是解码器当前时刻的隐藏状态,
y
^
t
−
1
\hat{y}_{t - 1}
y^t−1是上一时刻的预测输出。解码器利用编码器生成的上下文向量
c
c
c来解码出翻译结果(如“les derniers jours” )。
正向状态处理:公式为
x
⃗
t
=
tanh
(
A
⃗
x
⃗
t
−
1
+
B
⃗
u
t
)
\vec{x}_t = \tanh(\vec{A}\vec{x}_{t - 1} + \vec{B}u_t)
x
t=tanh(A
x
t−1+B
ut) ,其中
x
⃗
t
\vec{x}_t
x
t表示在时刻
t
t
t的正向隐藏状态,
x
⃗
t
−
1
\vec{x}_{t - 1}
x
t−1是上一时刻的正向隐藏状态,
u
t
u_t
ut是时刻
t
t
t的输入,
A
⃗
\vec{A}
A
和
B
⃗
\vec{B}
B
是相应的权重矩阵。通过该公式,网络按时间顺序从前往后处理输入数据。
反向状态处理:公式为
x
←
t
=
tanh
(
A
←
x
←
t
+
1
+
B
←
u
t
)
\overleftarrow{x}_t = \tanh(\overleftarrow{A}\overleftarrow{x}_{t + 1} + \overleftarrow{B}u_t)
x
t=tanh(A
x
t+1+B
ut) ,这里
x
←
t
\overleftarrow{x}_t
x
t是时刻
t
t
t的反向隐藏状态,
x
←
t
+
1
\overleftarrow{x}_{t + 1}
x
t+1是下一时刻的反向隐藏状态,
A
←
\overleftarrow{A}
A
和
B
←
\overleftarrow{B}
B
是对应的权重矩阵。该公式使网络能逆时间顺序处理数据。
状态整合:最终的状态
x
j
x_j
xj可以通过将正向和反向的状态相加组合得到,即
x
j
=
[
x
⃗
j
T
+
x
←
j
T
]
x_j = [\vec{x}_j^T + \overleftarrow{x}_j^T]
xj=[x
jT+x
jT] ,从而融合了数据前后的信息。
示例 如下是一个从英语到西班牙语的翻译示例,基于编码器 - 解码器结构。
模型结构
编码器(Encoder):采用不带输出层的双向循环网络(Bidirectional Recurrent Network)。它接收英语单词(如“the”“past”“few”“days” )作为输入,通过正向处理公式
x
⃗
t
=
tanh
(
A
⃗
x
⃗
t
−
1
+
B
⃗
u
t
)
\vec{x}_t = \tanh(\vec{A}\vec{x}_{t - 1} + \vec{B}u_t)
x
t=tanh(A
x
t−1+B
ut)和反向处理公式
x
←
t
=
tanh
(
A
←
x
←
t
+
1
+
B
←
u
t
)
\overleftarrow{x}_t = \tanh(\overleftarrow{A}\overleftarrow{x}_{t + 1} + \overleftarrow{B}u_t)
x
t=tanh(A
x
t+1+B
ut) ,将输入序列转换为一个最终状态,这个最终状态会成为上下文向量
c
c
c 。
解码器(Decoder):是一个带有输出层的标准循环网络(Recurrent Network with output layer)。初始状态
x
0
′
x'_0
x0′由编码器的上下文向量
c
c
c初始化,后续状态通过公式
x
t
′
=
tanh
(
A
x
t
−
1
′
+
B
y
^
t
−
1
)
x'_t = \tanh(Ax'_{t - 1} + B\hat{y}_{t - 1})
xt′=tanh(Axt−1′+By^t−1)更新,输出
y
^
t
=
g
(
C
x
t
′
)
\hat{y}_t = g(Cx'_t)
y^t=g(Cxt′) ,生成对应的西班牙语单词(如“los”“últimos”“días” )。
第一个句子:英文句子是“The animal didn’t cross the street because it was too tired.”,对应的法语翻译是“L’animal n’a pas traversé la rue parce que qu’il était trop fatigué.”。这里“it”指代“animal”(动物)。
第二个句子:英文句子是“The animal didn’t cross the street because it was too wide.”,法语翻译是“L’animal n’a pas traversé la rue parce que qu’elle était trop large.”。此处“it”指代“street”(街道)。
上下文向量计算:上下文向量
c
t
=
∑
j
=
1
N
w
t
j
x
j
c_t = \sum_{j = 1}^{N} w_{tj}x_j
ct=j=1∑Nwtjxj 其中
w
t
j
w_{tj}
wtj是注意力权重。
上下文向量(Context vector) 公式
c
t
=
∑
j
=
1
N
w
t
j
x
j
c_t = \sum_{j = 1}^{N} w_{tj}x_j
ct=∑j=1Nwtjxj ,表示在时刻
t
t
t的上下文向量
c
t
c_t
ct是通过对编码器不同状态
x
j
x_j
xj(
j
j
j从1到
N
N
N )进行加权求和得到的,其中
w
t
j
w_{tj}
wtj是对应的注意力权重。这个上下文向量会用于解码器在相应时刻的计算,帮助解码器聚焦输入序列中的相关信息。
注意力权重(Attention weight) 公式
w
t
j
=
softmax
(
w
t
j
′
)
w_{tj} = \text{softmax}(w'_{tj})
wtj=softmax(wtj′) ,注意力权重
w
t
j
w_{tj}
wtj是对
w
t
j
′
w'_{tj}
wtj′使用Softmax函数进行归一化处理得到的。归一化后的权重取值在0到1之间,且所有权重之和为1,用来衡量编码器各个状态在生成当前上下文向量时的重要程度。
对齐模型(Alignment model) 对齐模型是一个前馈神经网络。公式
w
t
j
′
=
a
(
x
t
−
1
′
,
x
j
)
w'_{tj} = a(x'_{t - 1}, x_j)
wtj′=a(xt−1′,xj) 表示
w
t
j
′
w'_{tj}
wtj′是通过一个函数
a
a
a计算得出,该函数的输入是解码器上一时刻的状态
x
t
−
1
′
x'_{t - 1}
xt−1′和编码器在
j
j
j时刻的状态
x
j
x_j
xj 。这个函数
a
a
a的参数是需要通过训练学习得到的,以使得模型能够根据不同输入自适应地调整注意力权重。
编码器:采用双向循环神经网络(Bidirectional RNN Encoder),输入序列为
u
1
,
u
2
,
u
3
,
…
,
u
N
u_1, u_2, u_3, \ldots, u_N
u1,u2,u3,…,uN(如“The past few days” ),输出不同时刻的状态
x
j
x_j
xj ,且
x
j
=
[
x
⃗
j
T
+
x
←
j
T
]
T
x_j = [\vec{x}_j^T + \overleftarrow{x}_j^T]^T
xj=[x
jT+x
jT]T ,即整合正向和反向的隐藏状态。
解码器:由Decoder RNN构成,根据前一时刻的状态和上下文向量
c
t
c_t
ct逐步生成翻译结果(如“les derniers jours” )。
点积注意力
注意力机制可以高效的“点积”形式实现,这种形式基于向量之间的相关性,且无需学习复杂的模型。
点积注意力模型介绍
上下文向量:与Bahdanau注意力模型类似,点积注意力模型中时刻
t
t
t的上下文向量
c
t
=
∑
j
=
1
N
w
t
j
x
j
c_t = \sum_{j = 1}^{N} w_{tj}x_j
ct=∑j=1Nwtjxj ,通过对编码器状态
x
j
x_j
xj加权求和得到。
注意力权重:计算方式为
w
t
j
=
softmax
(
w
t
j
′
)
w_{tj} = \text{softmax}(w'_{tj})
wtj=softmax(wtj′) ,对
w
t
j
′
w'_{tj}
wtj′进行Softmax归一化处理。
点积注意力计算:独特之处在于
w
t
j
′
=
x
t
−
1
′
T
x
j
w'_{tj} = x'^{T}_{t - 1}x_j
wtj′=xt−1′Txj ,即通过解码器上一时刻的状态
x
t
−
1
′
x'_{t - 1}
xt−1′与编码器状态
x
j
x_j
xj做点积来计算,点积值越大表明相关性越强,反之则越弱。
与Bahdanau注意力模型对比 右侧列出Bahdanau注意力模型的关键公式,与之相比,点积注意力无需像Bahdanau模型那样通过前馈神经网络(对齐模型)来学习
w
t
j
′
w'_{tj}
wtj′ 。此外,点积注意力是Transformer架构的基础,其在现代自然语言处理模型中有着重要地位。
(编码器 - 解码器循环模型)Sutskever, I., Vinyals, O., & Le, Q. V. (2014). Sequence to sequence learning with neural networks. Advances in Neural Information Processing Systems, 27.
(循环神经网络缺乏注意力机制)Cho, K., Gulcehre, B. V. M. C., Bahdanau, D., Schwenk, F. B. H., & Bengio, Y. Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation. Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP), pages 1724–1734
(Bahdanau注意力机制)Bahdanau, D., Cho, K., & Bengio, Y. (2014). Neural machine translation by jointly learning to align and translate. arXiv preprint arXiv:1409.0473.
(点积注意力)Luong, et al. (2015). Effective approaches to attention-based neural machine translation. In Proc 2015 Empirical Methods in Natural Language Processing, pages 1412–1421
(谷歌机械翻译系统)Wu, Y., Schuster, M., Chen, Z., Le, Q. V., Norouzi, M., Macherey, W., … & Dean, J. (2016). Google’s neural machine translation system: Bridging the gap between human and machine translation. arXivpreprint arXiv:1609.08144.