这套笔记是跟着七月算法五月深度学习班的学习而记录的,主要记一下我再学习机器学习的时候一些概念比较模糊的地方,具体课程参考七月算法官网:
http://www.julyedu.com/
RNN:利用神经网络处理序列问题
状态和模型
之前,我们处理的模型叫做IID数据;网络用sample A 做一次forward,无论是分类还是回归,接下来用B做一次forward,A和B没有关系。
这类网络学习到的是一个函数,输入x,得到y.
IID:独立同分布。样本与样本之间是独立的。
更多的数据不满足IID
如序列数据:语音,视频,图像,文本等。
序列数据由两种:时间序列:语音,空间序列:图像
序列生成,如语言翻译,自动文本生成
内容提取,如图像描述
序列样本
序列问题可以简单分为五种
第一种:函数问题(不是序列)
第二种:一到多
第三种: 多到一
第四种:间隔多到多
第五种:多到多
RNN不仅能够处理序列的输入,也能得到序列的输出,这里的序列指的是向量序列。
RNN学习出来的是程序(状态机),不是函数
典型应用
https://github.com/karpathy/neuraltalk2
一到多 输入是一张图片,而输出一个文本序列(输入和输出至少由一个是序列)
http://vlg.cs.dartmouth.edu/c3d/
多到一: 输入一个文本,对文本分类(文本是变长的);
视屏中event的检测问题:(在一组视屏中找到投篮的视屏)
间隔多到多: 语言翻译
http://research.microsoft.com/apps/pubs/default.aspx?
id=264836
多到多:视屏的描述,自动给出视屏的解说文字。
序列预测
输入是序列,输出也是序列,output是下一个序列。用于做生成模型。(音乐生成器)
f通常很难建模;为了模拟f,设计g模型,也是依赖以前的输入和以前的状态(引入状态变量)
如何来解释这个问题呢?
序列预测模型
RNN不对样本进行结构化的描述,用神经元的规模和乘数拟合。好处:end to end的问题。
左图:前向:x输入,经过运算(sigmoid)得到h(x),再经过运算得到输出,把前一次的状态(h(t-1))参与到运算中。
最后的输出根据新的联合的结果,做一次全连接得到y;
也可以表示为右图:
h0和x0可以随意定义,预测值可以作为下一次的输入。
RNN训练
每一步定义的损失值相加。(不加权)
可以看到,下图中红框里的式子的求导
使用链式规则,形成连乘的展开,连乘可能会出现一些问题,如果W小于1,则连乘可能会趋近于0,如果W非常大,连乘的结果可能越来越大。
这就是梯度的消失和爆炸
这里的消失和弥散的原因与之前的不同,这里消失和弥散是由与序列展开造成的,而不是因为网络空间上的乘积很多造成的。如果网络由多个隐层,就会加剧消失和弥散。
BPTT算法:解决方案
但是实际中用的很少,因为W的连乘是不可避免的。
同常使用RNN的改进形态:
通过输入输入设一些门限:
应用最为广泛,成功的RNN
一个block由两个输出,加入了新的变量C_cell, cell的state的值有的神经元是长期的,有的是短期的。h是立即用来的到输出的,c一直在step中传递。可能是两步以前的值,也可能是100步以前的值,即c中有的维度是很久以前的状态,有的是很近的状态. 每个A block叫做一层
LSTM: forget / input unit
h(t-1)和x作为两个输入 【】表示相乘再相加。f控制遗忘多少,
LSTM: update cell
ft:控制保留状态的百分比。体现了使用long memory 还是 short memory.
it: 保证Ct可调整。由多少更新。
LSTM: output
ht根据ot更新
整体过程
加入的节点阻断了求导的路径,使得有一些求导的路径断开。
LSTM其他变形
使用LSTM
复杂度高,难以训练
参考资料:
七月算法:http://www.julyedu.com/
图片来自于课程PPT