学习总结:
这一周前面几天都比较忙,然后在今天星期天呆在家里一天,才搞定了十个小时,那就来说说学了什么。
内容主要有两方面:
- 优达学城的P5课程
- 深度学习中的循环神经网络入门
一、P5课程
前面的内容是讲线性代数、统计学知识,而p5的课程终于开始讲了一些机器学习的内容。不过,感觉不连贯,感觉是从机器学习课程的第一部分直接拿过来的,中间有好些内容不知道。
在看的过程中,随便记录了点笔记:
误差
误差的原因:因模型无法表示基本数据的复杂度而造成的偏差;或者因模型对训练它所用的有限数据过度敏感而造成的方差。
- 偏差造成的误差:模型过于简单,无法表示基本的关系。这个时候,不管给多少数据都没有作用,此时这个现象称为欠拟合。
- 方差造成的误差:方差是用来测量预测结果对于任何给定的测试样本会出现多大的变化。出现方差是正常的,但方差过高表示模型无法将其预测结果泛化到更多数据,此时对训练集高度敏感,也称为过拟合,通常出现在模型过于复杂或没有足够的数据支持它时。此时,可以增加更多数据或者限制模型复杂度来进行处理。
学习曲线
机器学习中的学习曲线是一种可视化图像,能根据一系列训练实例中的训练和测试数据比较模型的指标性能。在学习曲线中,当训练曲线和测试曲线达到稳定阶段,并且两者之间的差距不再变化时,则可以确认模型已尽其所能地了解数据。
误差也可以在学习曲线中体现出来,其中:
- 偏差:在训练误差和测试误差收敛,并且误差相当高时,表示模型具有偏差
- 方差:如果训练误差与测试误差之间的差距很大,这实质上表示模型具有高方差。
还有一个概念:
理想的学习曲线:模型的最终目标是,误差小并能很好泛化到未见过的数据。
二、循环神经网络入门
理论方面感觉一带而过,还没怎么明白,就直接进入项目了。不过,项目很棒,是一个小说生成的项目,实现的流程如下:
编码
因为机器无法识别文字,需要将它们转换为数字。这里就将训练的小说中的字符(是一个个字符)全部转成一个数字集合,然后建立一个字符到数字和数字到字符的映射关系,然后将整本小说转换成数字组成的数组。
构建数据集
与图片识别不太一样的是,这里的构建数据集是文字序列,它是通过当前的字符序列推测下一个将要出现的字符。那么,本身我们要训练的小说就包含了x(输入)和y(输出)。
这里举个例子可能会明白点,例如当小说中有一句话“我们走在沙滩上”,当我们的输入是"我们走在"时,那么我们下面预测的一个值应该是”沙“,这样我们的输出就是”我们走在沙“。不过,由于我们的长度固定是4个,所以y的输出为”们走在沙“。
当然,在构建数据集的时候,我们需要构建多个数据生成一个batch使用。有点疑惑的是,这种batch感觉是中间折断了,这会不会影响?
构建模型
这里的模型有三层,分别是输入层、LSTM层、softmax输出层。
1、输入层
这一层比较好理解,就是定义几个placeholder的变量,等训练时,传递值进来。
2、LSTM层
LSTM层算是整个模型的核心了,它主要先构建LSTM的cell,然后再根据LSTM的层数创建多份,最后通过tf.contrib.rnn.MultiRNNCell
放入LSTM单元栈中。
3、输出层
输出层就是定义了W和b,值得注意的是,文章中提到得将它们的定义时放入一个tf.variable_scope
作用域中。然后这里就是使用wx+b
计算logits,最后使用softmax
预测。
损失函数
构建损失函数代码如下
loss = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_reshaped)
loss = tf.reduce_mean(loss)
Optimizer
里面特意提到RNN中的梯度爆炸和梯度消失的问题,而在LSTM中不存在梯度消失,只需要解决梯度爆炸的问题。这里的解决办法,就是给一个最大的临界值,超过这个值,就将其设置为这个临界值。
构建网络
这一步主要是用前面构建好的内容,进行组合,需要注意的是,当我们构建网络时,想要数据经过LSTM单元,需要使用tf.nn.dynamic_rnn方法。
训练
这里就是获取数据,然后丢入我们的网络中训练就行了。
测试应用
这里的应用就是通过一个字,然后预测下面的内容,然后在前五个中随机选择一个。可以看到,随着训练测试越来越多,效果越来越好。
总结
虽然可能还不会写RNN,但是真正了解了写小说整个流程,感觉特别神奇。
网友评论