提示:内容来自沐神的《动手深度学习》
文章目录
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、循环神经网络
1.1 RNN定义
假设在时间步
t
t
t有小批量输入
X
t
∈
R
n
×
d
X_t∈R^{n×d}
Xt∈Rn×d。其中n代表序列样本的小批量,
X
t
X_t
Xt的每一行对应于来自该序列的时间步
t
t
t的一个样本。用
H
t
∈
R
n
×
h
H_t∈R^{n×h}
Ht∈Rn×h表示时间步
t
t
t的隐藏变量(隐藏变量保留了序列到当前时间步的历史信息
),
H
t
−
1
H_{t-1}
Ht−1表示前一个时间步的隐藏变量。我们可以计算得
H
t
=
φ
(
X
t
W
x
h
+
H
t
−
1
W
h
h
+
b
h
)
H_t = φ(X_tW_{xh} + H_{t-1}W_{hh} + b_h)
Ht=φ(XtWxh+Ht−1Whh+bh)其中
H
t
∈
R
n
×
h
、
X
t
∈
R
n
×
d
、
W
x
h
∈
R
d
×
h
、
H
t
−
1
∈
R
n
×
h
、
W
h
h
∈
R
h
×
h
、
b
h
∈
R
1
×
h
H_t∈R^{n×h}、X_t∈R^{n×d}、W_{xh}∈R^{d×h}、H_{t-1}∈R^{n×h}、W_{hh}∈R^{h×h}、b_h∈R^{1×h}
Ht∈Rn×h、Xt∈Rn×d、Wxh∈Rd×h、Ht−1∈Rn×h、Whh∈Rh×h、bh∈R1×h。
注意
在计算
H
t
H_t
Ht时可以将
X
t
X_t
Xt和
H
t
−
1
H_{t-1}
Ht−1按行
拼接变成维度为
R
n
×
(
d
+
h
)
R^{n×(d+h)}
Rn×(d+h)的矩阵,将
W
x
h
W_{xh}
Wxh和
W
h
h
W_{hh}
Whh按列
拼接变成维度为
R
(
d
+
h
)
×
h
R^{(d+h)×h}
R(d+h)×h,再进行矩阵相乘操作,结果保持不变。
输出层计算公式如下:
O
t
=
H
t
W
h
q
+
b
q
O_t = H_tW_{hq} + b_q
Ot=HtWhq+bq其中
O
t
∈
R
n
×
h
、
H
t
∈
R
n
×
h
、
W
h
q
∈
R
h
×
q
、
b
q
∈
R
1
×
q
O_t∈R^{n×h}、H_t∈R^{n×h}、W_{hq}∈R^{h×q}、b_q∈R^{1×q}
Ot∈Rn×h、Ht∈Rn×h、Whq∈Rh×q、bq∈R1×q。
下图展示了循环神经网络在三个相邻时间步的计算逻辑
1.2 困惑度
定义损失函数
解释
1.3 GRU
1.3.1重置门和更新门
重置门(reset gate)允许我们控制“可能还想记住”的过去状态的数量,有助于捕获序列中的短期依赖关系;
更新门(update gate)允许我们控制新状态中有多少个是旧状态的副本,有助于捕获序列中的长期依赖关系。
我们把它们设计成区间
(
0
,
1
)
(0,1)
(0,1)中的向量,使用sigmoid激活函数。
门控循环单元数学表达式
对于给定时间步
t
t
t,假设输入是一个小批量
X
t
∈
R
n
×
d
X_t ∈ R^{n×d}
Xt∈Rn×d(样本个数:
n
n
n,输入特征数:
d
d
d),上一个时间步的隐状态是
H
t
−
1
∈
R
n
×
h
H_{t-1}∈R^{n×h}
Ht−1∈Rn×h(隐藏单元个数:
h
h
h)。那么重置门
R
t
∈
R
d
×
h
R_t∈R^{d×h}
Rt∈Rd×h和更新门
Z
t
∈
R
n
×
h
Z_t∈R^{n×h}
Zt∈Rn×h的计算如下所示:
R
t
=
δ
(
X
t
W
x
r
+
H
t
−
1
W
h
r
+
b
r
)
R_t = δ(X_tW_{xr}+H_{t-1}W_{hr}+b_r)
Rt=δ(XtWxr+Ht−1Whr+br)
Z
t
=
δ
(
X
t
W
x
z
+
H
t
−
1
W
h
z
+
b
z
)
Z_t=δ(X_tW_{xz}+H_{t-1}W_{hz}+b_z)
Zt=δ(XtWxz+Ht−1Whz+bz)其中
W
x
r
,
W
x
z
∈
R
d
×
h
W_{xr}, W_{xz}∈R^{d×h}
Wxr,Wxz∈Rd×h和
W
h
r
,
W
h
z
∈
R
h
×
h
W_{hr}, W_{hz}∈R^{h×h}
Whr,Whz∈Rh×h是权重参数,
b
r
,
b
z
∈
R
1
×
h
b_r, b_z∈R^{1×h}
br,bz∈R1×h是偏置参数。请注意
,在求和过程中会触发广播机制。使用sigmoid函数将输入值转换到区间(0,1)。
1.3.2 候选隐状态
候选隐状态
H
~
\tilde{H}
H~计算公式如下:
H
~
=
t
a
n
h
(
X
t
W
x
h
+
(
R
t
×
H
t
−
1
)
W
h
h
+
b
h
)
\tilde{H}=tanh(X_tW_{xh}+(R_t×H_{t-1})W_{hh}+b_h)
H~=tanh(XtWxh+(Rt×Ht−1)Whh+bh)其中
W
x
h
∈
R
d
×
h
W_{xh}∈R^{d×h}
Wxh∈Rd×h和
W
h
h
∈
R
h
×
h
W_{hh}∈R^{h×h}
Whh∈Rh×h是权重参数,
b
h
∈
R
1
×
h
b_h∈R^{1×h}
bh∈R1×h是偏置项,符号‘×’表示按元素乘积。在这里使用tanh非线性激活函数来确保候选隐状态中的值保持在区间(-1,1)中。
解释
R
t
R_t
Rt和
H
t
−
1
H_{t-1}
Ht−1的元素相乘可以减少以往状态的影响。 每当重置门
R
t
R_t
Rt中的项接近
1
1
1时, 我们恢复一个如 RNN中的普通的循环神经网络。 对于重置门
R
t
R_t
Rt中所有接近
0
0
0的项, 候选隐状态是以
X
t
X_t
Xt作为输入的多层感知机的结果。 因此,任何预先存在的隐状态都会被重置为默认值。
1.3.3 隐状态
隐状态计算公式如下:
H
t
=
Z
t
×
H
t
−
1
+
(
1
−
Z
t
)
×
H
t
~
H_t=Z_t×H_{t-1}+(1-Z_t)×\tilde{H_t}
Ht=Zt×Ht−1+(1−Zt)×Ht~解释
每当更新门
Z
t
Z_t
Zt接近
1
1
1时,模型就倾向只保留旧状态。 此时,来自
X
t
X_t
Xt的信息基本上被忽略, 从而有效地跳过了依赖链条中的时间步
t
t
t。 相反,当
Z
t
Z_t
Zt接近
0
0
0时, 新的隐状态
H
t
H_t
Ht就会接近候选隐状态
H
t
~
\tilde{H_t}
Ht~。 这些设计可以帮助我们处理循环神经网络中的梯度消失问题, 并更好地捕获时间步距离很长的序列的依赖关系。 例如,如果整个子序列的所有时间步的更新门都接近于
1
1
1, 则无论序列的长度如何,在序列起始时间步的旧隐状态都将很容易保留并传递到序列结束。
1.4 LSTM
1.4.1 输入门、遗忘门门和输出门
输入门:决定数据何时读入单元
遗忘门:重置单元内容
输出门:从单元中输出条目
图示如下
数学公式推导
假设有
h
h
h个隐藏单元,批量大小为
n
n
n,输入数为
d
d
d。输入为
X
t
∈
R
n
×
d
X_t∈R^{n×d}
Xt∈Rn×d,前一时间步的隐状态为
H
t
−
1
∈
R
n
×
h
H_{t-1}∈R^{n×h}
Ht−1∈Rn×h。相应地,时间步
t
t
t的门定义如下:输入门
I
t
∈
R
n
×
h
I_t∈R^{n×h}
It∈Rn×h,遗忘门是
F
t
∈
R
n
×
h
F_t∈R^{n×h}
Ft∈Rn×h,输出门是
O
t
∈
R
n
×
h
O_t∈R^{n×h}
Ot∈Rn×h。它们的计算方法如下:
I
t
=
δ
(
X
t
W
x
i
+
H
t
−
1
W
h
i
+
b
i
)
,
F
t
=
δ
(
X
t
W
x
f
+
H
t
−
1
W
h
f
+
b
f
)
,
O
t
=
δ
(
X
t
W
x
o
+
H
t
−
1
W
h
o
+
b
o
)
I_t=δ(X_tW_{xi}+H_{t-1}W_{hi}+b_i),\\ F_t = δ(X_tW_{xf}+H_{t-1}W_{hf}+b_f),\\O_t=δ(X_tW_{xo}+H_{t-1}W_{ho}+b_o)
It=δ(XtWxi+Ht−1Whi+bi),Ft=δ(XtWxf+Ht−1Whf+bf),Ot=δ(XtWxo+Ht−1Who+bo)其中
W
x
i
,
W
x
f
,
W
x
o
∈
R
d
×
h
W_{xi},W_{xf},W_{xo}∈R^{d×h}
Wxi,Wxf,Wxo∈Rd×h和
W
h
i
,
W
h
f
,
W
h
o
∈
R
h
×
h
W_{hi},W_{hf},W_{ho}∈R^{h×h}
Whi,Whf,Who∈Rh×h是权重参数,
b
i
,
b
f
,
b
o
∈
R
1
×
h
b_i,b_f,b_o∈R^{1×h}
bi,bf,bo∈R1×h是偏置参数。注意上述三门都是用sigmoid激活函数,其值都在(0,1)之间
。
1.4.2 候选记忆元
候选记忆元
C
t
~
∈
R
n
×
h
\tilde{C_t}∈R^{n×h}
Ct~∈Rn×h。候选记忆元的计算使用
t
a
n
h
tanh
tanh作为激活函数,函数取值范围为(-1,1)。其在时间步t处的方程为
C
t
~
=
t
a
n
h
(
X
t
W
x
c
+
H
t
−
1
W
h
c
+
b
c
)
\tilde{C_t}=tanh(X_tW_{xc}+H_{t-1}W_{hc}+b_c)
Ct~=tanh(XtWxc+Ht−1Whc+bc)其中
W
x
c
∈
R
d
×
h
W_{xc}∈R^{d×h}
Wxc∈Rd×h和
W
h
c
∈
R
h
×
h
W_{hc}∈R^{h×h}
Whc∈Rh×h是权重参数,
b
c
∈
R
1
×
h
b_c∈R^{1×h}
bc∈R1×h是偏置参数。
图示如下
1.4.3 记忆元
输入门
I
t
I_t
It控制采用多少来自
C
t
~
\tilde{C_t}
Ct~的数据,而遗忘门
F
t
F_t
Ft控制保留多少过去的记忆元
C
t
−
1
∈
R
n
×
h
C_{t-1}∈R^{n×h}
Ct−1∈Rn×h的内容。使用按元素乘法,得出:
C
t
=
F
t
×
C
t
−
1
+
I
t
×
C
t
~
C_t=F_t×C_{t-1}+I_t×\tilde{C_t}
Ct=Ft×Ct−1+It×Ct~解释
如果遗忘门始终为
0
0
0且输入门始终为, 则过去的记忆元
C
t
−
1
C_{t-1}
Ct−1将随时间被保存并传递到当前时间步。 引入这种设计是为了缓解梯度消失问题, 并更好地捕获序列中的长距离依赖关系。
图示如下
1.4.4 隐状态
计算隐状态
H
t
∈
R
n
×
h
H_t∈R^{n×h}
Ht∈Rn×h公式如下:
H
t
=
O
t
×
t
a
n
h
(
C
t
)
H_t=O_t×tanh(C_t)
Ht=Ot×tanh(Ct)解释
只要输出门接近1,我们就能够有效地将所有记忆信息传递给预测部分,而对于输出门接近0,我们只保留记忆元内所有信息,而不需要更新隐状态。
图示如下
1.5 深度循环神经网络
图示如下
数学模型
假设在时间步
t
t
t有一个小批量的输入数据
X
t
∈
R
n
×
d
X_t∈R^{n×d}
Xt∈Rn×d(样本数:
n
n
n,每个样本中的输入数:
d
d
d)。同时,将
l
t
h
l^{th}
lth隐藏层(
l
=
1
,
.
.
.
,
L
l=1,...,L
l=1,...,L)的隐状态为
H
t
(
l
)
∈
R
n
×
h
H_t^{(l)}∈R^{n×h}
Ht(l)∈Rn×h(隐藏单元数:h),输出层变量设为
O
t
∈
R
n
×
q
O_t∈R^{n×q}
Ot∈Rn×q(输出数:
q
q
q)。设置
H
t
(
0
)
=
X
t
H_t^{(0)}=X_t
Ht(0)=Xt,第
l
l
l个隐藏层的隐状态使用激活函数
φ
l
φ_l
φl,则:
H
t
(
l
)
=
φ
l
(
H
t
(
l
−
1
)
W
x
h
(
l
)
+
H
t
−
1
(
l
)
W
h
h
(
l
)
+
b
h
(
l
)
)
H_t^{(l)}=φ_l(H_t^{(l-1)}W_{xh}^{(l)}+H^{(l)}_{t-1}W^{(l)}_{hh}+b^{(l)}_h)
Ht(l)=φl(Ht(l−1)Wxh(l)+Ht−1(l)Whh(l)+bh(l))其中,权重
W
x
h
(
l
)
∈
R
h
×
h
(
注
意
:
W
x
h
(
1
)
∈
R
d
×
h
)
,
W
h
h
(
l
)
∈
R
h
×
h
W_{xh}^{(l)}∈R^{h×h}(注意:W_{xh}^{(1)}∈R^{d×h}),W^{(l)}_{hh}∈R^{h×h}
Wxh(l)∈Rh×h(注意:Wxh(1)∈Rd×h),Whh(l)∈Rh×h和偏置
b
h
(
l
)
∈
R
1
×
h
b^{(l)}_h∈R^{1×h}
bh(l)∈R1×h都是第
l
l
l个隐藏层的模型参数。
最后,输出层的计算仅基于第
l
l
l个隐藏层最终的隐状态:
O
t
=
H
t
(
l
)
W
h
q
+
b
q
O_t=H_t^{(l)}W_{hq}+b_q
Ot=Ht(l)Whq+bq其中,权重
W
h
q
∈
R
h
×
q
W_{hq}∈R^{h×q}
Whq∈Rh×q和偏置
b
q
∈
R
1
×
q
b_q∈R^{1×q}
bq∈R1×q都是输出层的模型参数。
1.6 双向循环网络
图示如下
对于任意时间步
t
t
t,给定一个小批量的输入数据
X
t
∈
R
n
×
d
X_t∈R^{n×d}
Xt∈Rn×d(样本数:n,每个示例中的输入数:d),并且令隐藏层激活函数为
φ
φ
φ。在双向架构中,我们设该时间步的前向和反向隐状态分别为
H
t
→
∈
R
n
×
h
\mathop{H_t}\limits ^{\rightarrow}∈R^{n×h}
Ht→∈Rn×h和
H
t
←
∈
R
n
×
h
\mathop{H_t}\limits ^{\leftarrow}∈R^{n×h}
Ht←∈Rn×h,其中
h
h
h是隐藏单元的数目。前向和反向隐状态的更新如下:
H
t
→
=
φ
(
X
t
W
x
h
(
f
)
+
H
→
t
−
1
W
h
h
(
f
)
+
b
h
(
f
)
)
,
H
t
←
=
φ
(
X
t
W
x
h
(
b
)
+
H
←
t
+
1
W
h
h
(
b
)
+
b
h
(
b
)
)
\mathop{H_t}\limits ^{\rightarrow}=φ(X_tW^{(f)}_{xh}+{\mathop{H}\limits ^{\rightarrow}}_{t-1}W^{(f)}_{hh}+b^{(f)}_h),\\\mathop{H_t}\limits ^{\leftarrow}=φ(X_tW^{(b)}_{xh}+{\mathop{H}\limits ^{\leftarrow}}_{t+1}W^{(b)}_{hh}+b^{(b)}_h)
Ht→=φ(XtWxh(f)+H→t−1Whh(f)+bh(f)),Ht←=φ(XtWxh(b)+H←t+1Whh(b)+bh(b))其中,权重
W
x
h
(
f
)
∈
R
d
×
h
,
W
h
h
(
f
)
∈
R
h
×
h
,
W
x
h
(
b
)
∈
R
d
×
h
,
W
h
h
(
b
)
∈
R
h
×
h
W^{(f)}_{xh}∈R^{d×h},W^{(f)}_{hh}∈R^{h×h},W^{(b)}_{xh}∈R^{d×h},W^{(b)}_{hh}∈R^{h×h}
Wxh(f)∈Rd×h,Whh(f)∈Rh×h,Wxh(b)∈Rd×h,Whh(b)∈Rh×h和偏置
b
h
(
f
)
∈
R
1
×
h
,
b
h
(
b
)
∈
R
1
×
h
b^{(f)}_h∈R^{1×h},b^{(b)}_h∈R^{1×h}
bh(f)∈R1×h,bh(b)∈R1×h都是模型参数。
然后将前向隐状态
H
t
→
\mathop{H_t}\limits ^{\rightarrow}
Ht→和反向隐状态
H
t
←
\mathop{H_t}\limits ^{\leftarrow}
Ht←连接起来,获得输出层的隐状态
H
t
∈
R
n
×
2
h
H_t∈R^{n×2h}
Ht∈Rn×2h。在具有多个隐藏层的深度双向循环神经网络中,该信息作为输入传递到下一个双向层。最后输出层计算得到的输出为
O
t
∈
R
n
×
q
O_t∈R^{n×q}
Ot∈Rn×q(
q
q
q是输出单元的数目):
O
t
=
H
t
W
h
q
+
b
q
O_t = H_tW_{hq}+b_q
Ot=HtWhq+bq这里,权重矩阵
W
h
q
∈
R
2
h
×
q
W_{hq}∈R^{2h×q}
Whq∈R2h×q和偏置
b
q
∈
R
1
×
q
b_q∈R^{1×q}
bq∈R1×q是输出层的模型参数。
注意
双向循环神经网络无法用于预测模型且其计算速度非常慢,在实践中使用较少。常用于命名实体识别、机器翻译等。
二、解码器和编码器架构
编码器:将输入编程成中间表达形式(特征)。它接受一个长度可变的序列作为输入, 并将其转换为具有固定形状的编码状态。
解码器:将中间表示解码输出。它将固定形状的编码状态映射到长度可变的序列。
2.1 Seq2seq
- 编码器是一个RNN,读取输入句子,可以是双向。
- 解码器使用另外一个RNN来输出。
- 编码器是没有输出的RNN
- 编码器
最后时间步的隐状态
==用作解码器的初始隐状态。
下图是训练状态时状态图
- 注意在训练时,由于已经知道目标句子,可以将目标句子作为输入。
下图是推理状态图
- 推理时,由于不知道当前时刻输出,所以使用上一个时刻的输入作为当前时刻输入。
2.2 衡量生成序列的好坏BLUE
- P n P_n Pn是预测中所有n-gram的精度
- 标签序列A B C D E F和预测序列A B B C D,有
P
1
=
4
/
5
,
P
2
=
3
/
4
,
P
3
=
1
/
3
,
P
4
=
0
P_1=4/5, P_2=3/4, P_3=1/3, P_4=0
P1=4/5,P2=3/4,P3=1/3,P4=0
解释
p 1 p_1 p1含义是预测序列中A、B、B、C、D单独成词总共5中可能,并统计这五种可能在标签序列中出现的次数。A在标签序列中出现一次,且预测序列中也出现一次,得分加1;B在标签序列中出现1次,在预测序列中出现2次,只得1分,C和D同理,因此 p 1 = 4 / 5 p_1=4/5 p1=4/5。
P 2 P_2 P2含义是预测序列相邻两词成对,所有AB、BB、BC、CD一共4种可能,其中只有AB、BC、CD均在标签序列和预测序列各出现一次,因此 P 2 = 3 / 4 P_2=3/4 P2=3/4。 P 3 、 P 4 P_3、P_4 P3、P4求法与此类似。
BLUE得分求法