机器学习系列 七 Deep Learning

Deep Learning在google 内部的应用,呈指数及成长

DL简史:
1980年代的多层感知机跟2006年的RBM initialization到底有什么区别?
答案是没有区别,唯一的差别就是使用了RBM的就叫做Deep Learning,没使用RBM的就叫做多层感知机。但是得到的效果是一样的......
但是从2009年GUP计算出来之后,对于deep learning的计算速度有了翻天覆地的改变!2011年开始使用在语音识别领域。2012年在图像识别的比赛中去的冠军。

Deep Learning也是跟机器学习一样的三个步骤。



有很多种可以将neural 进行连接的方式:
最常见的是Fully Connect Feedforward Network




如果输入是1和-1


如果输入是0和0


那么就是说一个network, 把参数已经设置上去的话,那么他就是一个function
如上面就是两个function

但如果我们只是设计好的neural,而不知道参数的值,那我们就可以把这个架构当做是function set/也就是model
这个跟我们之前讲的linear function 和 regression function是一样的概念,只是换了种方式决定function set,只是neural network的function set 比较大,比原来做 regression 和linear 包含更多之前没有办法包含的function。








这么深的network当然不是用fully connection了,之后再讲。





每个layer怎么计算的呢?矩阵相乘再相加: (W*x + b)再通过一个sigmod function 得到输出,就是下一层的输入。

那么通过上面一连串的计算后就得到最后的输出

那实际上,每一层算出来都是一个矩阵,得到的矩阵再传给下一层进行计算,就像下面这个式子列出来一样。
这样就把这个问题转化成了对于多个矩阵的乘法和加法的计算,这个正好符合现代GPU阵列的运算架构。


我们就可以把中间hidden layers当做我们之前在Linear 和 Regression中做的特征转换、特征替换等各种特征工程的工作。
得到的给最后一层的输入当做是一个我们做了很多特征工作后的比较好的新特征,而不是直接从input layer 的输入。
这样,一帮我们会把output layer 当做多分类器,那我们通常会在最后一层用Softmax的方法把这些输出进行转化成0-1之间的一个比例数值。

举个例子,手写数字辨识
我们输入的数字其实在计算机看来就是一个vector(向量),加入他是16*16=256像素的一个图片,那么在计算机看来他就是一个256个元素的vector。
另外,输出就是一个1、2、3...0 这十个数字,可能是每一个数字的概率,加入是2的概率为0.7,那就判定是2.


那我们来做这个事情唯一需要的一个function set (model), 就是neural network

那我们就可以定义如下,输入256维,输出10维。

接下来需要做的就是用gradient descent去找一组参数,挑一个最适合拿来做手写辨识的function。
但是在neural network中除了输入和输出层是固定以外,hidden layer的层数设计是没有限制,你必须要自己去设计它,有多少层,每一层有多少个neural。这个设计又决定了输出的效果的好坏。


那问题就变成了如何去找到一个很好的network structure。
很多时候是很困难的。需要经验和方法,Deep Learning 不是一个简单的方法。

根据老师经验,design 语音辨识和图像识别的network可能会比较容易,因为如果让人类来抽一组好的feature来进行语音辨识和影响识别会很难,所以不如design一个network或者尝试各种network让机器自己来找出好的feature会比较容易。

deep learning在NLP中的效果并没有那么好,理解是这样的, 对于NLP这件事,人的处理能力是比较强的。比如让识别一段文字他是正面的情绪还是负面的,可以进行列表,列出一些正面情绪和负面情绪的语句,来看看目标语句的相似度有多少。所以这样deep learning对比NLP传统方法并没有大的进步。


下面来看第二步判断方程的好坏

在neural network中怎么定义一组参数的好怀呢? 就给定一组参数,例如做手写数字辨识
得到一个10维的输出y,计算一下y和y hat之间的交叉熵cross entropy,就得到了target
这就跟我们在multi-class classification的时候是一摸一样的。
然后我们就要去调整network的参数,去让这个cross entropy越小越好。

当然training data有很多,然后就根据算cross entropy得到很多个y hat
然后我们把这些cross entropy加和起来,得到一个total loss L。

然后要做的就是最小化Total Loss
在一个function set 里面找一个function 可以最小化这个L
或者是找一组network的参数θ星号,可以最小化这个L
对于neural network就是要找这个参数集。
那怎么来找呢?
其实就是使用Gradient Descent  。怎么做呢:
1. 首先把这些参数写成一组vector,然后给定这些参数一个初始值,
2. 计算一些他们的gradient,也就是用每个参数对L进行偏微分,这些偏微分集合起来叫做gradient  
3. 有了偏微分之后既可以更新参数,就是把所有的参数减去一个learning rate 这里叫 μ, 写成 μ * 偏微分,就得到一组新的参数

4. 然后反复这个过程,就可以得到下一组参数的更新,继续下去就可以得到一组比较好的参数集了。


以上就是neural network 的一个过程,其实用到的都是学过的,即使是很潮的alpha go也用的是gradient descent 而已。不要想象的太高大上!

其实在现实中,由于neural network的层数过多,这些计算很庞杂,不可能人工手算。有很多的工具可以利用来计算bp。
backpropagation是一个比较有效的计算微分的方式。但是一定要掌握手算微分!要懂得原理


会回头来说是否network 与深层越好?
下面这个结果并没有什么好神奇的。

有一个说法是,任何网络都可以用1维网络来表示,所以多维网络没有意义???后面来验证















阅读更多

没有更多推荐了,返回首页