Udacity上deeplearning这门课是google开的,介绍了常见的几种深度神经网络模型,同时还附带了几个练习,并且练习用的工具都是tensorflow,所以既可以学习一下神经网络的知识,又可以学习tensorflow。我写的课后练习的代码都放到了我的githuh上(同时也是第一次用git,所以也学习了git的用法)https://github.com/haolexiao/udacity-deeplearning
L1从机器学习到深度学习
为什么最近几年深度学习/神经网络开始火了:
- 更便宜的GPU
- 更大规模的数据
分类问题是很多问题的基础:
- 检测问题:诸如检测图片中是否有行人,Logo之类的。
- 排序:诸如一个请求,搜索引擎返回跟query相关的网页,则可以设计一个分类器, 分的是成对的:query和网页,输出相关或者不相关。来这样建立分类器。
- 回归
- 强化学习
归一化
因为计算机的精度问题,所以必须要进行归一化
深度神经网络
既然MLP(三层神经网络)已经可以拟合任何函数了, 为什么要用多层神经网络?
- 相较于让神经网络变得更宽,使得神经网络变得更深能够增加较小的参数就能够获得很好的效果
- 深层的神经网络不同层之间往往呈现出层次化的特征,越往后的层,往往呈现出越复杂的特征。这个特征非常不错
为什么最近几年深度学习才火起来呢?
一个原因在于只有数据量足够大的情况下的深度神经网络才能发挥出比较好的效果,而只有在最近几年,学术界才接触到了大规模数据。
另外一方面,最近几年学术界才知道如何更好的用正则化方法训练很大的模型
防止过拟合的方法
- 画出训练模型在验证集合的曲线,当开始出现过拟合的时候,停止训练。这种方法叫早停
- 正则化方法
卷积神经网络
卷积网络提出的思路是基于权重共享的思想,有些东西不需要跟其位置有关,比如图片中人脸的位置,文本中某个特定名词出现的位置(在某些特定任务下)等等。不同位置的输入能够得到相同的信息。
提升卷积网络性能的方式:
POOLING池化,降低卷及网络特种图的空间范围。把几个相邻的卷积再进行合并。典型的一种池化方式就是最大池化Max Pooling,它的好处有
- 没有增加新的参数,所以不会有过拟合的问题
- 常常产生更好的精度
- 减少了计算量
还有平均池化,相当于模糊了图像。
- 1*1卷积。只关注一个单个像素。
- INCEPTION结构。inception非常有效的,就是每一层可以用许多不同类型的卷积,或者池化,最后把他们统一连接起来。
文本和序列的深度学习模型
Word Embedding
tSNE是比较适合用来可视化embedding结果的方式,因为如果用PCA这种传统方法的话,做出来的结果并不好,而tSNE这种方法能够最大限度的保留原空间中的相对距离信息。
RNN
如果说CNN是通过权值共享,来在不同空间来提取图像的模式。而RNN则是在时间序列上的权值共享。
RNN上的梯度下降
因为在时间上权值共享的关系,所以梯度下降算法其实对于RNN来说并不好,因为梯度下降更加偏向于相互之间无关联的参数更新,以保证训练时的稳定性。相关联的更新会使训练中的数学过程变得不稳定——梯度爆炸或者梯度消失,会使网络丢失训练对象。
对于梯度爆炸(Exploding Gradient):
- 可以采用梯度剪裁的方法,即当其增长过大时,缩小步长
对与梯度消失(Vanishing Gradient):
- 比较困难一些,因为梯度消失表明了模型只记住了近期的事件,这就需要LSTM了。用LSTM就是为了让RNN更好地记录过去很久的事情。
LSTM为什么有效
简单来说LSTM能够帮助模型在需要记忆的情况下记忆很久,在需要忘记的情况下,立刻忘记。最终导致消失的问题也被解决了。
L2正则话和Dropout也能用在LSTM中,不过需要用在输入层和输出层,而不是递归连接层