机器学习入门:第十五章 递归神经网络
前言
BP神经网络,训练的时候,给定一组输入和输出,不断的对权值进行训练,使得输出达到稳定。但BP神经网络并不是适合所有的场景,并不真正的体现出某些场景的真正特点。回到经典的概率论问题,抛硬币问题,假设你已经抛了100次的,90次是正面的,10次是反面的,问现在继续在抛一次,出现正面的概率是多少?如果没有前面几次的经验,很正常的会认为再次出现正面的概率是50%,但由于我们之前有对这个进行了实验,即有了经验了,按照贝叶斯定律,出现正面的概率肯定会大于50%。BP神经网络也少了对前面结果的一种反馈。
常见,易懂的受到前位影响的算法,加法算法。十位的结果,所到个位结果的影响,因为可能有进位,同样,百位的结果所到十位的影响。如图
这种受到前位影响的算法非常的常见,而经典BP神经网络并不能很好的反映这种算法的特性,需要就经典的BP神经网络进行优化和改造,也就是引进前位,历史数据对网络的影响,使其具备时序性。通过历史数据的关联来推测后续的事情。
递归神经网络RNN
从前面加法算法的动态图中,对现有的BP神经网络进行改造,也就是加入前位的结果对于后续网络的影响。
这里把BP神经网络设计成上图的形式,很形象的揭示了递归神经网络的特点,前向的结果,作为下一个输入,影响下一个网络的结果。递归神经网络,在很多方向已经取得了很好的成果。而一种特殊的递归神经网络Long Short Term 网络(LSTM),取到的结果最为璀璨,是这个方向的明星。
LSTM结构:
来看看LSTM的实现。关于LSTM可以进一步的参看,http://nicodjimenez.github.io/2014/08/08/lstm.html 和 https://github.com/nicodjimenez/lstm/blob/master/lstm.py,详细的给出了LSTM的求解过程。
算法的迭代过程在:
http://nicodjimenez.github.io/2014/08/08/lstm.html
https://github.com/nicodjimenez/lstm
算法跟BP神经网络没有太大的不同,但要注意的还是各个变量的增量和迭代问题。
使用RNN实现加法过程
在简化一点的方式如下图:
如果去掉layer_1层,那么就是一个最简单的BP神经网络了。这里引入了layer_1层,使得经典的BP神经网络多了一个输入,layer_1层在加法算法中,表示的是前一个输入就可以反映出加法算法的特性,从结构来看,这个LSTM的变形并不是非常的复杂,但现在就重要的就是如何计算出各个层次的增量,然后进行迭代了。
构建一个二进制的网络,输入为两个节点,一个隐层有16个节点,一个中间层有16个节点用来存放进位。
for position in range(binary_dim):# generate input and outputX = np.array([[a[binary_dim - position - 1], b[binary_dim - position - 1]]])y = np.array([[c[binary_dim - position - 1]]]).T# hidden layer (input ~+ prev_hidden)layer_1 = sigmoid(np.dot(X, synapse_0) + np.dot(layer_1_values[-1], synapse_h))# output layer (new binary representation)layer_2 = sigmoid(np.dot(layer_1, synapse_1))# did we miss?... if so by how much?layer_2_error = y - layer_2layer_2_deltas.append((layer_2_error) * sigmoid_output_to_derivative(layer_2))overallError += np.abs(layer_2_error[0])# decode estimate so we can print it outd[binary_dim - position - 1] = np.round(layer_2[0][0])# store hidden layer so we can use it in the next timesteplayer_1_values.append(copy.deepcopy(layer_1))
加数和被加数作为输入,计算隐层和中间层的误差,这是一个加法递归神经网络,可以看成进制放在中间层中,这里要记住这个加法器输入层不是八个节点,而只有两个,也是一种最小加法器。
训练时也是使用误差传播的方式,这里主要需要解决导数问题python的代码实现:
# compute sigmoid nonlinearity
def sigmoid(x):output = 1/(1+np.exp(-x))return output# convert output of sigmoid function to its derivative
def sigmoid_output_to_derivative(output):return output*(1-output)
计算中间结果,可以参看LSTM的过程:
for position in range(binary_dim):X = np.array([[a[position], b[position]]])layer_1 = layer_1_values[-position - 1]prev_layer_1 = layer_1_values[-position - 2]# error at output layerlayer_2_delta = layer_2_deltas[-position - 1]# error at hidden layerlayer_1_delta = (future_layer_1_delta.dot(synapse_h.T) + \layer_2_delta.dot(synapse_1.T)) * sigmoid_output_to_derivative(layer_1)# let's update all our weights so we can try againsynapse_1_update += np.atleast_2d(layer_1).T.dot(layer_2_delta)synapse_h_update += np.atleast_2d(prev_layer_1).T.dot(layer_1_delta)synapse_0_update += X.T.dot(layer_1_delta)future_layer_1_delta = layer_1_delta
变量的更新:
synapse_1_update += np.atleast_2d(layer_1).T.dot(layer_2_delta)
synapse_h_update += np.atleast_2d(prev_layer_1).T.dot(layer_1_delta)
synapse_0_update += X.T.dot(layer_1_delta)
其中 layer_1_delta变量为两个变量的和:
layer_1_delta = (future_layer_1_delta.dot(synapse_h.T) + layer_2_delta.dot(synapse_1.T)) * sigmoid_output_to_derivative(layer_1)
完整的迭代过程在:
https://iamtrask.github.io/2015/11/15/anyone-can-code-lstm/
在递归神经网络中,跟经典的BP神经网络在结构上并没有太多的不同,最关键的点,还是在求解增量,进行迭代。
递归神经网络的应用
递归神经网络跟BP神经网络,最大的不同是引进了时序,可以根据以往的数据来推测未来的事件。这是现在比较热门的一个方向。比较多的应用实在语音和文本的处理上,网上有相当多的关于递归神经网络的应用,比如写出像汪峰一样的歌词,默写唐诗,写冷段子等。但要写出像样的歌词和诗词,还需要做很多的处理,如果把递归神经网络应用在推荐系统里,也会得到不错的效果。
参考
http://blog.csdn.net/zzukun/article/details/49968129
http://www.jianshu.com/p/9dc9f41f0b29
http://nicodjimenez.github.io/2014/08/08/lstm.html
https://github.com/nicodjimenez/lstm
http://blog.csdn.net/longxinchen_ml/article/details/51253526
https://github.com/karpathy/char-rnn
http://blog.csdn.net/v_july_v/article/details/52796239
机器学习入门:第十五章 递归神经网络相关推荐
- (视频+图文)机器学习入门系列-第10章 人工神经网络
机器学习入门系列,黄海广老师主讲.本站将持续更新,ppt.代码.课后习题见文末. 本系列的目录 01.引言 02.回归 03.逻辑回归 04.朴素贝叶斯 05.机器学习实践 06.机器学习库Sciki ...
- 吴恩达《机器学习》第十五章:异常检测
文章目录 十五.异常检测 15.1 问题的动机 15.2 高斯分布 15.3 算法 15.4 开发和评价一个异常检测系统 15.5 异常检测 VS 监督学习 15.6 选择特征 15.7 多元高斯分布 ...
- 机器学习入门-西瓜书总结笔记第十五章
西瓜书第十五章-规则学习 一.基本概念 二.序贯覆盖 三.剪枝优化 四.一阶规则学习 五.归纳逻辑程序设计 1.最小一般泛化 2.逆归结 一.基本概念 机器学习中的 "规则"(ru ...
- 学习笔记----周志华《机器学习》第五章(神经网络)(二)
周志华<机器学习>第五章(神经网络)的学习笔记上篇连接在这里:<上篇>.上篇讲到了神经网络.常用的激活函数.感知机和多层前馈神经网络.局部极小和全局最小,今天继续补上昨天落下得 ...
- 吴恩达机器学习训练秘籍整理三十三到三十五章(五)
第三十三章 为何与人类表现水平进行对比: 许多机器学习系统的设计目的是想要自动化一些人类可以处理得很好的事情,可举的例子有图像识别.语音识别以及垃圾邮件分类等等.此外,有许多理由表明在处理人类擅长的任 ...
- 李弘毅机器学习笔记:第十五章—半监督学习
李弘毅机器学习笔记:第十五章-半监督学习 监督学习和半监督学习 半监督学习的好处 监督生成模型和半监督生成模型 监督生成模型 半监督生成模型 假设一:Low-density Separation Se ...
- 【机器学习-周志华】学习笔记-第十五章
记录第一遍没看懂的 记录觉得有用的 其他章节: 第一章 第三章 第五章 第六章 第七章 第八章 ...
- Visual C++ 2008入门经典 第十五章 在窗口中绘图
/*第十五章 在窗口中绘图 主要内容: 1 Windows为窗口绘图提供的坐标系统 2 设置环境及其必要性 3 程序如何以及在窗口中绘图 4 如何定义鼠标消息的处理程序 5 如何定义自己的形状类 6 ...
- 第十五章 异常检测-机器学习老师板书-斯坦福吴恩达教授
第十五章 异常检测 15.1 问题动机 15.2 高斯分布 15.3 算法 15.4 完善和评估一个异常检测系统 15.5 异常检测 vs 监督学习 15.6 选择使用的特征 15.7 多元高斯分布 ...
最新文章
- BCH与BCE共享比特币之名
- 四则运算计算器的微信小程序_1 界面
- 【Android 内存优化】Bitmap 长图加载 ( BitmapRegionDecoder 简介 | BitmapRegionDecoder 使用流程 | 区域解码加载示例 )
- 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门示例
- MAX3232EUE小知识
- 设计模式[20]-Builder
- 超级直播sop直播源.zip_超级直播app壳 打造自己的直播app
- 总结的比较好的vim命令
- 如何将Apple Mail建议用于事件和联系人
- du命令、df命令用法
- linux命令 sed 有的功能有,Linux命令:sed简介
- uboot将命令结构体单独存放在某个代码段的方法
- mysql主从复制实施流程_MySQL主从复制认识及实施操作
- 小帅小胖智能机器人如何使用_小帅智能教育机器人使用技巧篇(下篇)
- vue 对象继承_JS面向对象—对象的继承
- 在用ganglia时出现You don‘t have permission to access ganglia on this server
- JavaScript删除数组里的某个元素
- jmeter无法启动的解决办法
- 发电机机房设计规范_柴油发电机房设计规范.docx
- 软件工程小组第九次会议记录