1. 神经网络
在之前写过的一篇文章中也有神经网络的简要概述。轻松看懂机器学习十大常用算法
Neural Networks 适合一个input可能落入至少两个类别里
NN 由若干层神经元,和它们之间的联系组成
第一层是 input 层,最后一层是 output 层
在 hidden 层 和 output 层都有自己的 classifier
![](http://upload-images.jianshu.io/upload_images/1667471-c2dc1c4a227e4d2a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/362/format/webp)
input 输入到网络中,被激活,计算的分数被传递到下一层,激活后面的神经层,最后output 层的节点上的分数代表属于各类的分数,下图例子得到分类结果为 class 1
同样的 input 被传输到不同的节点上,之所以会得到不同的结果是因为各自节点有不同的weights 和 bias
模型通过比较预测和实际的误差,并不断地调整 weights 和 bias,进而使得预测与实际的误差越来越小,预测效果越来越好,这个过程叫做 training。
![](http://upload-images.jianshu.io/upload_images/1667471-2986364007a03d48.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/393/format/webp)
2. 为什么需要神经网络?
上面说到,神经网络是由好多个分类器构成的网络,那一个分类器也可以分类,为什么需要一个网络的分类器呢?
就是为了对付复杂的模式。相比简单的分类器如 SVM,神经网络就是可以识别出复杂的模式。
当数据中的模式越来越复杂,每一层需要的 node 会呈指数级增长。
随着数据复杂度的增加,可以采用相应的模型。
![](http://upload-images.jianshu.io/upload_images/1667471-6f9a8a4aa1ffa5f6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/332/format/webp)
为什么深度神经网络可以识别复杂的模式呢?
就是因为它可以把一个复杂的模式,分解为很多个简单的模式。
例如要识别人脸,可以先把眼镜,鼻子,嘴识别出来,再组合成一个脸。
![](http://upload-images.jianshu.io/upload_images/1667471-c21bb3dfc9c4a373.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/733/format/webp)
3. 什么问题选择什么神经网络呢?
对于非监督学习问题,主要使用 RBM,Autoencoders。
![](http://upload-images.jianshu.io/upload_images/1667471-a3e4d66eb5cc0fed.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/652/format/webp)
对于监督学习问题,例如文字处理,图像识别,物体识别,语音识别,主要使用下图相应的模型。
![](http://upload-images.jianshu.io/upload_images/1667471-41ac86e3c1588ad0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/290/format/webp)
时间序列问题可以用 Recurrent 网络。
![](http://upload-images.jianshu.io/upload_images/1667471-c1efa17988be7878.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/643/format/webp)
4. 为什么神经网络最近几年才特别火?
神经网络现在可以做很复杂的问题如人脸识别,但是在2006年以前甚至都无法解决一个简单的问题,原因就是 vanishing gradient(梯度消失)。
当梯度很大的时候,下滑速度就快,相反如果这个坡很平缓,那移动的速度也就慢。
![](http://upload-images.jianshu.io/upload_images/1667471-c072cdf68fc3414f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/327/format/webp)
在下图神经网络中,可以看到越靠前的层次,梯度越小,越靠后,梯度越大,所以前面几层不容易训练。
前面几层是用来识别一些基础的重要的简单的pattern的,到后面的层次中重组,如果前面出错了,后面也会出错。
![](http://upload-images.jianshu.io/upload_images/1667471-a531701c8439f38b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/336/format/webp)
在用 Back Propagation 训练神经网络的时候,其中一个节点的梯度误差来源于后面的所有点,如果多个小于1的数相乘,这个数会越来越小,所以会造成梯度向量越来越小。
![](http://upload-images.jianshu.io/upload_images/1667471-309756e04e4660e4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/487/format/webp)
在2006-2007年,由Hinton,Lecun,Benjio发表的一些关于 Restricted Boltzmann Machines 的论文开始,使这个问题得到了改善。
5. Restricted Boltzmann Machines 是什么?
Geoff Hinton 发表了 RBM 的论文,这个贡献也使他被称为深度学习之父。
RBM 是 Feature Extractor Neural Nets 家族即 Autoencoders 的一员,可以通过重建 inputs 来自动学习数据中的 pattern。
RBM 有两层,有个限制条件是,同一层的node不可以有联系。它将 inputs 编码成数字集,在回溯的时候,又把数字解码成 inputs 的原来状态。而且RBM不需要训练的数据是labeled。
![](http://upload-images.jianshu.io/upload_images/1667471-10c640bf5c261fee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/245/format/webp)
weights 和 bias 在 forward 和 backward 的时候都很重要,它使得网络知道哪些 feature 对于识别模式起到更重要的作用。
forward 的时候,在 hidden 层可以决定哪些需要被激活,哪些不需要。
backward 的时候,在 visible 层,回溯的结果会和实际的input比较来评价模型。
![](http://upload-images.jianshu.io/upload_images/1667471-d71fd36bdd9db305.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/361/format/webp)
6.为什么RBM可以改善梯度消失的问题呢?
是怎么避免 vanishing gradient 的问题的呢,就是不用 Back propagation,而是用 Deep Belief Nets 替代。
DBN 的网络是典型的多层神经网络,但是 training 的时候很不同。
一个 DBN 可以被看成是一个 RBM 栈,RBM 的一个 hidden 层就是下一个 RBM 的 visiable 层。
第一个 RBM 就是要尽可能准确地重建 inputs。
![](http://upload-images.jianshu.io/upload_images/1667471-27a4ec47c25ff9ad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/367/format/webp)
第一个 RBM 的 hidden 层作为下一个 RBM 的 visiable 层,第二个是用第一个的 output 作为训练数据,直到所有层都走一遍。
![](http://upload-images.jianshu.io/upload_images/1667471-6746d682485c2d75.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/352/format/webp)
很重要的一点,每一个 RBM 层都会学习整个 inputs。而不是像图像识别时,每一层负责一部分 feature,最后几层再组装起来。
通过这一步初始的训练之后,RBM 就可以识别出数据中固有的 pattern。
但是却不知道这些 pattern 是什么,所以需要监督式学习和一些有标签的数据来给 pattern 命名,不过这些数据不需要特别多。