前情回顾
没想到自己已经坚持写到第四篇了,附上之前三篇的链接:
GAN-overview reading note(1)基础概念
GAN-overview reading note(2)Least Squares-GAN
GAN-overview reading note(3)Wasserstein GAN
引言
为了了解GAN下的PixelRNN的具体工作原理,我想先了解下RNN和CNN,毕竟都是经典算法了,随着对RNN的了解,又找到了这篇LSTM的详细解读,今天就花了比较长的时间把这个读了,那今天就整理下LSTM的理解吧。先附上原文链接:Understanding LSTM Networks
RNN原理简介
人在思考的时候总是会联系前因后果,而神经网络却没有这种能力,直至人们提出了RNN(Recurrent Neural Networks)循环神经网络,在其模型中存在一个循环块,由于这个循环块的存在,使得RNN在计算时可以利用历史数据对现在的结果产生影响。
这个循环结构可以理解为是一个展开了的多层结构,如下图所示。
可见
h
t
h_t
ht的输出结果是由
X
0
X_0
X0到
X
t
X_t
Xt共同左右得到的,也就是说
h
t
h_t
ht的得出可以参考之前的输入
X
0
X_0
X0的信息,这一点在很多场合是很重要的。就想作者所举的例子:在语言识别、自然语言理解、翻译等对顺序敏感的场合,RNN模型得到了很广泛的应用。
但是,传统RNN存在一个问题,就是对长期先验知识总结的能力不足,或者用作者的话说,已经在理论层面证明了,RNN不能实现对长期数据信息的参考。
这就引出了今天的主角:LSTMs(Long Short Term Memory networks)
老婆叫我陪她看电视,明天继续写。
好,回到实验室继续写!
LSTMs介绍
LSTMs是专门为了长期记忆而设计的,所以,这就是它的专长领域。下面来看它基于RNN的具体改进点。
LSTMs循环改进
在传统RNN网络中,循环块的结构很简单,通常为一个 t a n h tanh tanh函数。具体如下图所示。
同样的,在LSTMs中,也有类似的循环块。但是,循环块内的神经网络变得复杂了许多,由单层变为4层神经网络,网络层之间也有复杂的运算关系。具体结构图如下图所示。
首先,先介绍一下图中的符号:
图中,黄色方框表示神经网络层,粉色圆圈表示向量计算节点,其他的就是向量传输路径,容易理解,不再赘述。
注: 从这个图我们可以注意到,每个迭代循环块都有三个输入和三个输出口。
总结一下输入:(左侧从上到下依次)
- 上一次迭代得到的 C t − 1 C_{t-1} Ct−1;
- 上一次迭代的结果输出 h t − 1 h_{t-1} ht−1;
- 本次输入数据 X t X_t Xt。
输出:(右侧从上到下依次)
- 本次迭代结果输出 h t h_{t} ht;
- 本次迭代得到的 C t C_{t} Ct;
- 本次迭代结果输出 h t h_{t} ht。
咱们下边只需要弄明白这些输入是哪里来的,这些输出是怎么得到的,问题就解决了。当然,还要考虑,系统构建时,设计者是怎么考虑的。
LSTMs核心思想
首先,如下图所示在循环块顶端的这个直线,直接穿越了整个循环,将上次循环得到的参数
C
t
−
1
C_{t-1}
Ct−1只做了简单的线性变换就传送到下一个环节
C
t
C_t
Ct,我们在这里姑且管这条线叫“贯通线”。这是LSTMs中很重要的一个环节,可以很好的保留下所有的参数信息,并向后传递。
同时,在LSTM中还具备删除或增加信息到
C
t
C_t
Ct中,这依赖于其内部的门结构。
哈哈哈,突然就不想翻译了,这段就是说,这个就是门结构。由一个
s
i
g
m
o
i
d
sigmoid
sigmoid函数构成,来决定参数的通过率,0则不通过,1就全通过,01之间的部分通过,但是$sigmoid$函数特点导致01之间数很少,主要还是0或1的筛选功能。LSTMs中有三个这样的结构。
LSTMs内部机制
我们可以先总览一下LSTMs结构,主要为三个gates。遗忘门,输入门和输出门。
遗忘门
首先看遗忘门,用来计算哪些信息需要忘记,通过sigmoid处理后为0到1的值,1表示全部保留,0表示全部忘记,于是有
f
t
=
σ
(
W
f
⋅
[
h
t
−
1
,
x
t
]
+
b
f
)
f_t=\sigma(W_f⋅[h_{t−1},x_t]+b_f)
ft=σ(Wf⋅[ht−1,xt]+bf)
其中中括号表示两个向量相连合并,
W
f
W_f
Wf是遗忘门的权重矩阵,σ为sigmoid函数,
b
f
b_f
bf为遗忘门的偏置项。设输入层维度为
d
x
dx
dx,隐藏层维度为
d
h
d_h
dh,上面的状态维度为
d
c
d_c
dc,则
W
f
W_f
Wf的维度为
d
c
×
(
d
h
+
d
x
)
d_c×(d_h+d_x)
dc×(dh+dx)。
理解: 本段摘录自大神博客:LSTM神经网络。其中不太理解相连合并的概念,够来根据实际程序看,应该是将两个矩阵直接放在一起构成新矩阵,矩阵间没有进行新的变化,只是矩阵宽度改变了。
输入门(记忆门)
不同人有不同的称呼,总之就是对新来的数据 X t X_t Xt的处理过程。这里主要分为两个步骤:
- 一个遗忘门结构,功能是一样的,就是对新数据和上次迭代结果放在一起进行一次筛选;**注:**这里的筛选参数与遗忘门的筛选参数不共享,是相互独立的。 i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t=\sigma(W_i⋅[h_{t−1},x_t]+b_i) it=σ(Wi⋅[ht−1,xt]+bi)
- 一个
t
a
n
h
tanh
tanh函数,用来将输入数据产生新的信息并添加到单元状态中。
c
t
~
=
tanh
(
W
i
⋅
[
h
t
−
1
,
x
t
]
+
b
i
)
\tilde{c_t}=\tanh(W_i⋅[h_{t−1},x_t]+b_i)
ct~=tanh(Wi⋅[ht−1,xt]+bi)
这两部分计算结果经过乘积后加上遗忘门数据与上次迭代的 C t − 1 C_{t-1} Ct−1乘积结果:
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~
这样就已经解决了对数据的记忆和传递,也就得到了“贯通线”传输至下一个循环的数据参数 C t C_t Ct。下面就是解决另外两个输出 h t h_t ht的来源了。输出门登场!
输出门
本次迭代的输出
h
t
h_t
ht,首先与前两个sigmoid函数一样,这里也有一个sigmoid函数:
o
t
=
σ
(
W
o
⋅
[
h
t
−
1
,
x
t
]
+
b
i
)
o_t=\sigma(W_o⋅[h_{t−1},x_t]+b_i)
ot=σ(Wo⋅[ht−1,xt]+bi)
还有一个tanh函数:输入时经过计算遗忘门和输入门综合结果的本次记忆参数
C
t
C_t
Ct。
h
t
~
=
tanh
(
C
t
)
\tilde{h_t}=\tanh(C_t)
ht~=tanh(Ct)
最后经过线性计算:
h
t
=
o
t
∗
tanh
(
c
t
)
h_t=o_t*\tanh(c_t)
ht=ot∗tanh(ct)
这步之后,由本次得到的记忆参数结合本次数据在这个sigmoid参数下的遗忘系数,计算得到本次输出。
以上就是LSTMs的全过程。
Reference:
先附上原文链接:
PixelRNN的原文链接:https://arxiv.org/pdf/1601.06759.pdf
Google关于PixelRNN的总结文章
中文相关的bolg链接