从哪里开始

研究卷积神经网络也有一段时间了,因为其相对简单易学,实现也容易,所以偷懒就没有去深究其他的网络类型,但是处理一个语音信号处理相关的任务,循环神经网络有优势,那就是对过去(未来)状态的记忆,正如人脑思考的上下文一样,RNN能联系起来时间序列的记忆,以及由过去对未来的期许,最终目的是准确滴解决当下的问题

参考

Understanding LSTM NetworksRNN详解(Recurrent Neural Network)关于序列建模,是时候抛弃RNN和LSTM了Sequences in CaffeThe Unreasonable Effectiveness of Recurrent Neural Networks

从CNN到RNN

CNN的思想是每一层的卷积核,将原始数据线性变换到不同类型的高维度空间,进而通过层数的堆叠,让信息彻底进入人类无法理解的异次元,然后经过训练,实现分类或者回归拟合的任务。RNN又是什么?卷积核没有了,也无法像CNN一样去理解所谓的Deep learning。孤立宏观的看RNN像一个旋转的陀螺,每次抽打(输入RNN和transformer 为什么使用RNN rnn的优势_卷积核),这个陀螺都会根据自己之前的状态和被抽打的样子,旋转出新的姿势来。为了分析方便,结合了参考【1】和【4】两张图,来认识一下最简单的RNN,上下两个图的拓扑结构还是有差别的,上图用了一层激活函数,而下图用了两层激活函数,显然下层的权重矩阵也多了一级。

RNN和transformer 为什么使用RNN rnn的优势_权重_02

RNN的进阶-LSTM

因为简单Rnn容易引起梯度灾难,难于训练,在Long Short-Term Memory论文中引入了Rnn的革新,从外观黑盒子来看,相对于每次输出又迭代进入下一次的输入(短期记忆),就是加入了所谓了长期记忆,还是用caffe里的图来表示,而且解决掉梯度灾难,内部逻辑增加了门控方式,gate掉有梯度风险的计算单元。

RNN和transformer 为什么使用RNN rnn的优势_权重_03


很多博主有引用Christopher Olah介绍RNN的Understanding LSTM Networks博文里的图,分别阐述了遗忘门、输入门和输出门的工作机制。下图就是介绍了longterm memory的引入:

RNN和transformer 为什么使用RNN rnn的优势_激活函数_04

遗忘门是根据短期记忆和输入数据的关系,决定哪些长期记忆的运算节点被遗忘,等到经过输入门,这些节点其实就是短期记忆了。而不被遗忘节点将于输入门的结果融合。

RNN和transformer 为什么使用RNN rnn的优势_权重_05

下图是输入门参与下,经过计算,得出跟新后的长期记忆:

RNN和transformer 为什么使用RNN rnn的优势_卷积核_06

最后输出门控制本次计算的输出结果,这个结果也作为下一次计算的短期记忆输入:

RNN和transformer 为什么使用RNN rnn的优势_权重_07

实践-网络参数量

光说不练花把势,这一节用一个小栗子学习了解一下Lstm参数量的计算:

RNN和transformer 为什么使用RNN rnn的优势_权重_08

上图中其实只是有一个RNN和transformer 为什么使用RNN rnn的优势_卷积核_09权重矩阵,bias没有介绍。我们用这个图结合tensorflow的一个小栗子来看看参数量如何计算。这个简单的keras模型如下:

model = keras.Sequential()
# Add an Embedding layer expecting input vocab of size 1000, and
# output embedding dimension of size 64.
model.add(layers.Embedding(input_dim=1000, output_dim=64))

# Add a LSTM layer with 128 internal units.
model.add(layers.LSTM(128))

# Add a Dense layer with 10 units.
model.add(layers.Dense(10))

model.summary()

keras打印出来的summary如下:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding (Embedding)        (None, None, 64)          64000     
_________________________________________________________________
lstm (LSTM)                  (None, 128)               98816     
_________________________________________________________________
dense (Dense)                (None, 10)                1290      
=================================================================
Total params: 164,106
Trainable params: 164,106
Non-trainable params: 0
_________________________________________________________________

这里lstm层的参数98816个是怎么来的,请注意lstm输入64维,和上次输出(短记忆)128维拼成192维向量。输出是128维,权重矩阵的参数量:RNN和transformer 为什么使用RNN rnn的优势_激活函数_10,bias还有128,如图有四组公式,最后的参数量:
RNN和transformer 为什么使用RNN rnn的优势_卷积核_11
和上图的公式基本对应,等价于4个全连接层的参数量。

结尾

几张图对比下来,对RNN/Lstm有了直观的认识,这么看,lstm的变化小,比CNN更加容易理解。但还是对其权重值能否收敛,如何收敛,为什么能收敛无法理解,有一篇The Unreasonable Effectiveness of Recurrent Neural Networks,要感性上接受,还是需要多训练,多使用,多体会。