李宏毅机器学习笔记5--RNN

其实感觉课程中关于RNN这部分讲的不是很细,很多都是泛泛而谈大体的框架,有点晕……

RNN引入

Recurrent Neural Network搭建的目的是为了使神经网络有一定记忆,可以储存之前的输入,这对对话系统、机器翻译等等有很大帮助。

见下图RNN神经元工作示意图:
李宏毅机器学习笔记5--RNN_第1张图片
一个RNN神经元在第一个word输入后除去输出相应值,还会将隐藏层信息(Elman)或者输出层信息(Jordan)储存起来等待下次输入。这样就可以保证,在上下文语境不同的时候,即使有相同输入,输出也是不同的,这符合日常对话等的常识。
李宏毅机器学习笔记5--RNN_第2张图片
上图所示的神经元从工作原理便可以发现其对上文具有一定记忆能力,但是对于下文是没有记忆能力的,但是实际上像文章阅读、翻译等还是需要对于下文的记忆。
故为使神经元具有记忆上下文的能力,引入了Ridirectional RNN,见下图示意:
李宏毅机器学习笔记5--RNN_第3张图片

RNN 梯度

事实上,RNN的训练是比较困难的,见梯度示意图:
李宏毅机器学习笔记5--RNN_第4张图片
其梯度会出现突然的下降或者上升,导致在训练中整个程序可能会崩掉。正如上图所示,解决方法之一就是对梯度进行clipping,对于大于阈值的梯度进行修剪可以从程序上避免这一点。
那,为什么会出现这种情况呢?
李宏毅机器学习笔记5--RNN_第5张图片
正如上图所示,因为RNN神经元的参数w会在多个时间序列中不断重复使用,存在一些邻接点在经过多次迭代后会产生突变,这在梯度上的表现就是梯度“悬崖”的存在。

LSTM引入

RNN因为有以上缺点,所以在现在使用不是很多,RNN中现在使用普遍的是LSTM(Long Short-term Memory)。

LSTM可以控制memory的储存、input的输入以及output的输出,更像神经元:
李宏毅机器学习笔记5--RNN_第6张图片
具体来看,LSTM结构为:
李宏毅机器学习笔记5--RNN_第7张图片
语言描述如下:

  1. 输入 z z z 经过一个Sigmoid激活函数然后会和由 z i z_i zi 控制的Input Gate相乘,得到 f ( z i ) g ( z ) f(z_i)g(z) f(zi)g(z)
  2. 然后该值 f ( z i ) g ( z ) f(z_i)g(z) f(zi)g(z) 会和memory相加,注意memory c c c 相加前要经过Forget Gate筛选,及 c f ( z f ) cf(z_f) cf(zf),则此刻有 f ( z i ) g ( z ) + c f ( z f ) f(z_i)g(z) + cf(z_f) f(zi)g(z)+cf(zf),这也是神经元下一时刻的memory c ′ c' c
  3. 在经过激活函数后,将由Output Gate控制是否生成输出,及 f ( z o ) h ( c ′ ) f(z_o)h(c') f(zo)h(c)

在实际使用中, z i , z f , z o z_i,z_f,z_o zi,zf,zo的生成和此刻的输入和记忆以及上一时刻的输出都是有关的:
李宏毅机器学习笔记5--RNN_第8张图片
一个小问题是为什么LSTM可以一定程度上避免RNN的梯度问题呢?

课程中讲的自己有些不太理解,便自己瞎说几句。

以RNN中的Elman network为例:
在这里插入图片描述
上述公式中和LSTM最大的不同在于哪里呢?
在于LSTM对于memory和input的调节参数并不是固定值,在不同时间时会根据上下文以及输入调整memory和input的参数,这样不会使得参数在较长时间序列迭代中产生指数次的explode或者vanish;
与之相反的是RNN中Memory和Input的参数在训练后都是定值,在不断迭代过程中参数的微小差距可能被极端放大,这也使得训练较为棘手。

LSTM训练

BPTT……待施工

你可能感兴趣的:(#,李宏毅课程笔记,神经网络,深度学习,机器学习)