林轩田之机器学习课程笔记( distilling hidden features之neural network)(32之28)

欢迎转载,可以关注博客:http://blog.csdn.net/cqy_chen
深度学习书籍推荐:https://item.jd.com/12128543.html
深度学习课程推荐:https://www.coursera.org/learn/neural-networks/home/welcome
TensorFlow:http://www.tensorfly.cn/ http://www.tensorflow.org/
题目可能不全,因为有字数限制,不好意思,可以参考:
https://www.csie.ntu.edu.tw/~htlin/course/ml15fall/

概要

上节讲到了GBDT,通过梯度下降的方式求解,将Adaboost和决策树结合起来,今天将分享神经网络,这是个是很古老的模型。50年代末就开始了。

为何要构造多层神经网络

首先我们看看PLA,可以参考
http://blog.csdn.net/cqy_chen/article/details/78868034

h(x)=sign(wTx),w=[w0,w1......wd]T

就是将我们的特征乘上一组权重,然后相加得到,那么神经网络是啥呢?就是一组PLA,如下图:
这里写图片描述
这里看到当只有一个隐层的时候,首先是构造了一堆的PLA,然后将PLA得到的结果再次做了一次的PLA.
那么这样的模型能做到什么效果呢?如下图:
这里写图片描述
现在得到两个基本模型: g1 g2 。要得到第三个空间,我么可以设置神经网络结构权重如下;
这里写图片描述
这个时候我们看到当 g1=1g2=1 的时候,融合后的模型,得到G(x)=1,而当 g1g2 其中任意一个有-1,那么G(x)=-1.
这样就得到了第三个空间。
所以这样的PLA组合可以做到and操作,当然也可以推理得到not、or操作。
我们得到可以通过一堆线性的PLA的组合构造一个凸集合。如下图:
这里写图片描述
对于目标曲线是一个圆的时候,我们可以用一堆的PLA去拟合,对于任意的凸集合我们都可以构造出来,但是这样会导致一个问题,vc维就会越来越大啊,模型复杂度会增大。
这样的单隐层的神经网络已经很强大了,但是也是有局限的:
这里写图片描述
对于这种XOR的操作,由于最后的目的是要将目标分开,但是这个不是一个线性可分的资料。而我们的网络是一堆PLA的线性组合,这样就导致了这个网络做不到XOR这样的操作。

那么要如何实现XOR呢?
我们回忆下在做SVM的时候,对于不是线性可分的情况我们采用的是kernel进行转换到高维空间。这里我们看到一层就是一个转换,那么我们可以再添加一层。
这里写图片描述
这样可有构造这样的神经网络就可以解决线性不可分的情况:
这里写图片描述
神经网络其实是模仿生物神经网络的构造。在工程上进行实现,但是这里只是模仿,不一定完全和生物神经网络一样。
为什么要构造多层神经网络,因为单层的时候,对于像XOR之类的是没用办法实现的。

神经网络的假设空间

如下图所示,神经网络可以分成两个部分,中间部分就是做特征转换,最后一层做线性的回归或者分类等。
这里写图片描述

这里插播一句,其实在很多比赛中,都是采用模型融合的过程得到最后的结果,这个过程和神经网络类似,如下是拍拍贷金融风控大赛的其中一只队伍的模型框架:
这里写图片描述
是不是感觉有点神经网络的构造,只不过这里面每一层都不熟简单的PLA,而是采用GBDT/XGB等算法。

ok,回归正题,在每一层计算完毕分数之后,我们采用的是sign函数划分了正负号。那么可不可以采用其他的函数呢?
1)采用线性转换或者直接输出,这样的话整个模型 G(x) 都是线性的,那就没必要使用这么多层了,所以一般不采用线性的转换
2)采用sign是不错,但是这个函数导致不好求微分啊
3)所以一般采用类似sign的函数tanh,如下图:
这里写图片描述
tanh其实就是sigmoid函数进行了伸缩和平移操作。

这里采用tanh是可以处处可微,但是会导致一个问题当x在很远的地方,再进行求导,梯度很小,导致基本无法移动。这就是神经网络的梯度消失问题。一般在CNN之类的网络是不会采用tanh的,而是采用relu之类的转换。
关于转换函数可以参考:https://en.wikipedia.org/wiki/Activation_function

本节就以tanh作为转换函数,为了优化方法首先做了如下设定:
这里写图片描述
那么这个神经网络到底在干什么呢?
我们可以看做每层转换如下图:
这里写图片描述
就是在做每层的X和权重做内积求和。可以看做在提取X的某种模式特征,就相当于在做特征提取。

神经网络的学习算法

当确定好了一个神经网络的结构以及权重,我们可以给定一个数据,依次的计算最后得到预测的结果,这个过程叫做前向计算。那么如何在确定了网络结构之后计算这些权重呢?
还是以上面的网络结构图为例。假设最后是一个回归问题,机器学习算法的目的是使得预测结果尽可能的接近实际结果:
每个节点的错误衡量: en=(ynNNet(xn))2
现在的目的就是怎么调整网络权重使得 en 最小。回想以前逻辑回归的,可以采用梯度下降的方法。
几乎所有的神经网络,包括深度学习现在都是使用梯度下降进行优化,至少目前是

要求解每个权重相对于错误的梯度,秘密武器就是求导链式法则。
对于每个权重采用的是从后往前计算。
这里只有一个的输出节点那么,最后一层的权重和错误的关系:

en=(ynNNet(xn))2=(ynsl1)2=(yni=0dl1wli1xl1i)2

于是乎我们可以求得最后一层错误衡量对于每个权重的导数。
(en)wli1=2(ysl1)(xl1i)

同理对于有多个节点输出的时候,最后一层的权重导数如下;
(en)wlij=(en)sljsljwlij=δlj(xl1i)δlj=(en)slj

所以其实误差对于任意一层的导数都可以通过两个数据表示,所以如何求 δlj
这里写图片描述
整个前向的过程就是上面的样子。
那么:
δlj=enslj=k=1dl+1ensl+1ksl+1kxljxljslj=k=1dl+1(δl+1k)(wl+1jk)(tanh(slj))

所以我们得到了 δlj δl+1k 之间的关系。这就是上一层和下一层之间的关系。
我们可以通过递归的方式是求解。

但是一般情况下我们是通过动态规划的实现,从后面一层一层的计算直到第一层为止。动态规划的思想也应用在在HMM(马尔科夫链)的计算概率中

这种计算导数从后往前,而计算结果从前往后,这样计算称之为:BP神经网络,计算如下图:
这里写图片描述
一般情况下是第二步和第三步并行处理一些点,然后在根据这些变动一起修改权重。这样的方法称之mini-bath。

优化以及正则化

我们大致描述下神经网络的损失函数:

Ein(w)=1Nn=1Nerr(yn,(......tanh(idlwljktanh(......))))

由于是经过多层的转换,这个不是一个凸函数,导致没有全局最优解。
所以一般使用SGD或者GD优化得到局部最优解。虽然是局部最优解,但是进行初始化的时候,权重不要设置的太高,不然会有梯度消失的危险。
对于这种对初始化敏感的算法,可以设置多个初始值,然后通过blending的方式融合结果。

神经网络的vc维呢?
这里写图片描述
这里只是说明神经网络的vc维是:

dvc=O(VD);V:D

所以神经网络的VC维可以很大,扩展性很强。这样就容易过拟合。
要避免过拟合,可以想象正则化操作,比如在线性回归或者逻辑回归中,采用L2之类的正则化,在这里可行么?

权重消减法

L2正则化:权重系数不是稀疏的,VC维基本还是差不多,相当于权重做了等比例的缩小操作。
L1正则化:部分权重会归0,是一个稀疏的,但是在部分点不可微分。
所以能不能又是稀疏的,还是可以微分的。这里采用的是权重消减的正则化:

i=1dl(wlij)21+(wlij)2

早停法

由于在神经网络中采用SGD或者GD的算法,都是走走看看,走走看看。就像个酒鬼每次都是在一个小范围内转,那么如果我们走的步数比较少,那么就相当于更新的权重少,达到减少VC维的效果。
这个方法用的挺多的。
这里写图片描述

dropout

现在还用的多是dropout方法,随机的使一些节点失效。如下图:
这里写图片描述

欢迎转载,可以关注博客:http://blog.csdn.net/cqy_chen

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值