以下学习笔记源于Datawhale“水很深的深度学习”课程的循环神经网络
原文链接: https://datawhalechina.github.io/unusual-deep-learning/
RNN
计算图
计算图的引入是为了更方便的表示网络,计算图是描述计算结构的一种图,它的元素包括节点(node)和边(edge),节点表示变量,可以是标量、矢量、张量等,而边表示的是某个操作,即函数。
复合函数:
计算图的求导,有两种情况:
-
情况1
-
情况2
求导举例:
例1:
- a = 3, b = 1 可以得到 c = 4, d = 2, e = 8
- ∂ e ∂ a = ∂ e ∂ c ∂ c ∂ a \frac{∂e}{∂a}=\frac{∂e}{∂c}\frac{∂c}{∂a} ∂a∂e=∂c∂e∂a∂c=d=b+1=2
- ∂ e ∂ b = ∂ e ∂ c ∂ c ∂ b + ∂ e ∂ d ∂ d ∂ b \frac{∂e}{∂b}=\frac{∂e}{∂c}\frac{∂c}{∂b}+\frac{∂e}{∂d}\frac{∂d}{∂b} ∂b∂e=∂c∂e∂b∂c+∂d∂e∂b∂d=d+c=b+1+a+b=6
例2:
∂ Z ∂ X = \frac{∂Z}{∂X}= ∂X∂Z= =αδ+αϵ+αζ+βδ+βϵ+βζ+γδ+γϵ+γζ=(α+β+γ)(δ+ϵ+ζ)
计算图可以很好的表示导数的前向传递和后向传递的过程,在例2中,前向传递
∂
∂
X
\frac{∂}{∂X}
∂X∂,后向传递
∂
∂
Z
\frac{∂}{∂Z}
∂Z∂
循环神经网络
一些常见的序列化结构:
- 文本:字母和词汇的序列
- 语音:音节的序列
- 视频:图像帧的序列
- 时态数据:气象观测数据,股票交易数据、房价数据等
RNN的发展历程:
核心思想:
样本间存在顺序关系,每个样本和它之前的样本存在关联。通过神经网络在时序上的展开,我们能够找到样本之间的序列相关性。
RNN一般结构:
各个符号的表示: x t , s t , o t x_{t},s_{t},o_{t} xt,st,ot分别表示的是t时刻的输入、记忆和输出, U , V , W U,V,W U,V,W是RNN的连接权重, b s , b o b_{s},b_{o} bs,bo是RNN的偏置, σ , φ σ,φ σ,φ是激活函数, σ σ σ通常选tanh或sigmoid, φ φ φ通常选用softmax。
其中 softmax 函数,用于分类问题的概率计算。本质上是将一个K维的任意实数向量压缩 (映射)成另一个K维的实数向量,其中向量中的每个元素取值都介于(0,1)之间。
RNN案例
比如词性标注:
- 我/n,爱/v购物/n
- 我/n在/pre华联/n购物/v
- 中文/nz分词/n是/v文本处理/n不可或缺/l的/uj一步/m!/x
Word Embedding:自然语言处理(NLP)中的 一组语言建模和特征学习技术的统称,其中来自词汇表的单词或短语被映射到实数的向量。比如这里映射到三个向量然后输入:
将神经元的输出存到memory(记忆单元)中,memory中值会作为下一时刻的输入。在最开始时刻,给定 memory初始值,然后逐次更新memory中的值。
RNN一般结构
-
Elman Network
-
Jordan Network
-
各种结构RNN
RNN训练算法-BPTT
BPTT即BP算法加上了时序演化,TT即(Through Time)
定义输出函数:
s
t
=
t
a
n
h
(
U
x
t
+
W
s
t
−
1
)
s_{t}=tanh(Ux_{t}+Ws_{t-1})
st=tanh(Uxt+Wst−1)
y
t
^
=
s
o
f
t
m
a
x
(
V
s
t
)
\hat{y_{t}}=softmax(Vs_{t})
yt^=softmax(Vst)
定义损失函数:
E
t
(
y
t
,
y
t
^
)
=
−
y
t
l
o
g
y
t
^
E_{t}(y_{t},\hat{y_{t}})=-y_{t}log\hat{y_{t}}
Et(yt,yt^)=−ytlogyt^
E
(
y
,
y
^
)
=
∑
t
E
t
(
y
t
,
y
t
^
)
E(y,\hat{y})=\sum_{t}E_{t}(y_{t},\hat{y_{t}})
E(y,y^)=t∑Et(yt,yt^)
=
−
∑
t
y
t
l
o
g
y
t
^
=-\sum_{t}y_{t}log\hat{y_{t}}
=−t∑ytlogyt^
分别求损失函数E对U、V、W的梯度:
∂
E
∂
V
=
∑
t
∂
E
t
∂
V
\frac{∂E}{∂V}=\sum_{t}\frac{∂E_{t}}{∂V}
∂V∂E=t∑∂V∂Et
∂
E
∂
V
=
∑
t
∂
E
t
∂
V
\frac{∂E}{∂V}=\sum_{t}\frac{∂E_{t}}{∂V}
∂V∂E=t∑∂V∂Et
∂
E
∂
V
=
∑
t
∂
E
t
∂
V
\frac{∂E}{∂V}=\sum_{t}\frac{∂E_{t}}{∂V}
∂V∂E=t∑∂V∂Et
- 求E对V的梯度,以
E
3
E_{3}
E3举例,先求
E
3
E_{3}
E3对V的梯度
∂ E 3 ∂ V = ∂ E 3 ∂ y 3 ^ ∂ y 3 ^ ∂ V \frac{∂E_{3}}{∂V}=\frac{∂E_{3}}{∂\hat{y_{3}}}\frac{∂\hat{y_{3}}}{∂V} ∂V∂E3=∂y3^∂E3∂V∂y3^
= ∂ E 3 ∂ y 3 ^ ∂ y 3 ^ ∂ z 3 ∂ z 3 ∂ V =\frac{∂E_{3}}{∂\hat{y_{3}}} \frac{∂\hat{y_{3}}}{∂z_{3}} \frac{∂z_{3}}{∂V} =∂y3^∂E3∂z3∂y3^∂V∂z3
其中 z 3 = V s 3 z_{3}=Vs_{3} z3=Vs3,然后求和即可
- 求E对W的梯度,以
E
3
E_{3}
E3举例,先求
E
3
E_{3}
E3对W的梯度
∂ E 3 ∂ W = ∂ E 3 ∂ y 3 ^ ∂ y 3 ^ ∂ s 3 ∂ s 3 ∂ W \frac{∂E_{3}}{∂W}=\frac{∂E_{3}}{∂\hat{y_{3}}}\frac{∂\hat{y_{3}}}{∂s_{3}}\frac{∂s_{3}}{∂W} ∂W∂E3=∂y3^∂E3∂s3∂y3^∂W∂s3
s 3 = t a n h ( U x 3 + W s 2 ) s_{3}=tanh(Ux_{3}+Ws_{2}) s3=tanh(Ux3+Ws2)
∂ E 3 ∂ W = ∑ k = 0 3 ∂ E 3 ∂ y 3 ^ ∂ y 3 ^ ∂ s 3 ∂ s 3 ∂ s k ∂ s k ∂ W \frac{∂E_{3}}{∂W}=\sum_{k=0}^{3}\frac{∂E_{3}}{∂\hat{y_{3}}}\frac{∂\hat{y_{3}}}{∂s_{3}}\frac{∂s_{3}}{∂s_{k}}\frac{∂s_{k}}{∂W} ∂W∂E3=k=0∑3∂y3^∂E3∂s3∂y3^∂sk∂s3∂W∂sk
∂ E 3 ∂ W = ∑ k = 0 3 ∂ E 3 ∂ y 3 ^ ∂ y 3 ^ ∂ s 3 ( ∏ j = k + 1 3 ∂ s j ∂ s j − 1 ) ∂ s k ∂ W \frac{∂E_{3}}{∂W}=\sum_{k=0}^{3}\frac{∂E_{3}}{∂\hat{y_{3}}}\frac{∂\hat{y_{3}}}{∂s_{3}}(\prod_{j=k+1}^{3}\frac{∂s_{j}}{∂s_{j-1}})\frac{∂s_{k}}{∂W} ∂W∂E3=k=0∑3∂y3^∂E3∂s3∂y3^(j=k+1∏3∂sj−1∂sj)∂W∂sk
其中: s 3 s_{3} s3依赖于 s 2 s_{2} s2,而 s 2 s_{2} s2又依赖于 s 1 s_{1} s1和W,依赖关系一直传递到 t = 0 的时刻。因此,当计算对于 W 的偏导时,不能把 s 2 s_{2} s2看作是常数项。
- 求E对U的梯度,以
E
3
E_{3}
E3举例,先求
E
3
E_{3}
E3对U的梯度
∂ E 3 ∂ U = ∂ E 3 ∂ y 3 ^ ∂ y 3 ^ ∂ s 3 ∂ s 3 ∂ U \frac{∂E_{3}}{∂U}=\frac{∂E_{3}}{∂\hat{y_{3}}}\frac{∂\hat{y_{3}}}{∂s_{3}}\frac{∂s_{3}}{∂U} ∂U∂E3=∂y3^∂E3∂s3∂y3^∂U∂s3
s 3 = t a n h ( U x 3 + W s 2 ) s_{3}=tanh(Ux_{3}+Ws_{2}) s3=tanh(Ux3+Ws2)
∂ E 3 ∂ U = ∑ k = 0 3 ∂ E 3 ∂ y 3 ^ ∂ y 3 ^ ∂ s 3 ∂ s 3 ∂ s k ∂ s k ∂ U \frac{∂E_{3}}{∂U}=\sum_{k=0}^{3}\frac{∂E_{3}}{∂\hat{y_{3}}}\frac{∂\hat{y_{3}}}{∂s_{3}}\frac{∂s_{3}}{∂s_{k}}\frac{∂s_{k}}{∂U} ∂U∂E3=k=0∑3∂y3^∂E3∂s3∂y3^∂sk∂s3∂U∂sk
长短时记忆网络
在RNN中,存在着梯度消失问题,一开始我们不能有效的解决长时依赖问题,其中梯度消失的原因有两个:BPTT算法和激活函数Tanh。
解决方法:
- ReLU函数
- 门控RNN(LSTM)
LSTM
LSTM即长短时记忆网络,是一种用于深度学习领域的人工循环神经网络(RNN)结构。一个LSTM单元由输入门、输出门和遗忘门组成,三个门控制信息进出单元。
- LSTM依靠贯穿隐藏层的细胞状态实现隐藏单元之间的信息传递,其中只有少量的线性操作
- LSTM引入了“门”机制对细胞状态信息进行添加或删除,由此实现长程记忆
- “门”机制由一个Sigmoid激活函数层和一个向量点乘操作组成,Sigmoid层的输出控制了信息传递的比例
遗忘门:LSTM通过遗忘门(forget gate)实现对细胞状态信息遗忘程度的控制,输出当前状态的遗忘权重,取决于 h t − 1 h_{t-1} ht−1和 x t x_{t} xt
f
t
=
σ
(
W
f
⋅
[
h
t
−
1
,
x
t
]
+
b
f
)
f_{t}=σ(W_{f}⋅[h_{t-1,x_{t}}]+b_{f})
ft=σ(Wf⋅[ht−1,xt]+bf)
输入门:LSTM通过输入门(input gate)实现对细胞状态输入接收程度的控制,输出当前输入信息的接受权重,取决于
h
t
−
1
h_{t-1}
ht−1和
x
t
x_{t}
xt
i
t
=
σ
(
W
i
⋅
[
h
t
−
1
,
x
t
]
+
b
i
)
i_{t}=σ(W_{i}⋅[h_{t-1},x_{t}]+b_{i})
it=σ(Wi⋅[ht−1,xt]+bi)
C
~
=
t
a
n
h
(
W
c
⋅
[
h
t
−
1
,
x
t
]
+
b
c
)
\tilde{C}=tanh(W_{c}⋅[h_{t-1},x_{t}]+b_{c})
C~=tanh(Wc⋅[ht−1,xt]+bc)
输出门:LSTM通过输出门(output gate)实现对细胞状态输出认可程度的控制,输出当前输出信息的认可权重,取决于
h
t
−
1
h_{t-1}
ht−1和
x
t
x_{t}
xt
o
t
=
σ
(
W
o
⋅
[
h
t
−
1
,
x
t
]
+
b
o
)
o_{t}=σ(W_{o}⋅[h_{t-1,x_{t}}]+b_{o})
ot=σ(Wo⋅[ht−1,xt]+bo)
状态更新:“门”机制对细胞状态信息进行添加或删除,由此实现长程记忆。
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∗C~t
h
t
=
o
t
∗
t
a
n
h
(
C
t
)
h_{t}=o_{t}*tanh(C_{t})
ht=ot∗tanh(Ct)
一个标准化的RNN的例子:
#构造RNN网络,x的维度5,隐层的维度10,网络的层数2
rnn_seq = nn.RNN(5,10,2)
#构造一个输入序列,长为6,batch是3,特征是5
X =V(torch.randn(6,3,5))
#out,ht = rnn_seq(x,h0) # h0可以指定或者不指定
out,ht = rnn_seq(x)
# q1:这里out、ht的size是多少呢? out:6*3*10, ht:2*3*10
#输入维度50,隐层100维,两层
Lstm_seq = nn.LSTM(50,100,num_layers=2)
#输入序列seq= 10,batch =3,输入维度=50
lstm_input = torch.randn(10,3,50)
out,(h,c) = lstm_seq(lstm_input) #使用默认的全0隐藏状态
其他经典循环神经网络
GRU
GRU可认为是LSTM 的变种,它的细胞状态与隐状态合并,在计算当前时刻新信息的方法和LSTM有 所不同;GRU只包含重置门和更新门;在音乐建模与语音信号建模领域与LSTM具有相似的性能,但是参数更少,只有两个门控。
Peephole LSTM
让门层也接受细胞状态的输入,同时考虑隐层信息的输入。
双向RNN
假设当前t的输出不仅仅和之前的序列有关,并且还与之后的序列有关,例如:完形填空,它由两个RNNs上下叠加在一起组成,输出由这两个RNNs的隐藏层的状态决定。
CTRNN
CTRNN利用常微分方程系统对输入脉冲序列神经元的影响 进行建模。CTRNN被应用到进化机器人中,用于解决视觉、协作和最 小认知行为等问题。
主要应用
-
语言模型:根据之前和当前词预测下一个单词或者字母
-
问答系统:根据问题回答相关的内容
-
自动作曲:自动谱写曲目
-
机器翻译:将一种语言自动翻译成另一种语言
-
自动写作:根据现有资料自动写作,当前主要包括新闻写作和诗歌创作。主要是基于RNN&LSTM的文本生成技术来实现,需要训练大量同 类文本,结合模板技术。
-
图像描述:根据图像形成语言描述