'); })();

浅谈深度学习基础(上)

编辑时间: 2017-12-26 22:43:24    关键字:

Mini-Batch

  我们上篇文章《浅谈机器学习基础》中,讲过梯度下降算法(batch-GD),讲过随机梯度下降算法(SGD),它们的区别在于,batch-GD单次迭代要使用整个训练集,而SGD单次迭代每次只使用单个样本。那我们就一定要走两个极端吗,要么全部使用,要么只使用一个?我们可以选择只使用一部分,把整个训练集拆成一部分一部分使用,这就叫做mini-batch,我们可以把SGD看做mini-batch的特例,也即batch size = 1,而batch-GD的batch size就等于整个训练集。

  而且还要引入一个epoch的概念,一次参数更新叫做一次迭代,当经历若干次迭代后,全部训练样本都已经被使用过了,这就叫一个epoch。batch-GD一次迭代就是一个epoch,SGD要迭代训练样本数目次,才算是一个epoch。

各类梯度下降算法

各类梯度下降算法

  对于batch-GD,每次迭代的梯度方向计算由所有训练样本共同投票决定,计算损失函数在整个训练集上的梯度方向,沿着该方向搜寻下一个迭代点。”batch“的含义是训练集中所有样本参与每一轮迭代。

  batch GD每一轮迭代需要所有样本参与,对于大规模的机器学习应用,经常有billion级别的训练集,计算复杂度非常高。因此,有学者就提出,反正训练集只是数据分布的一个采样集合,我们能不能在每次迭代只利用部分训练集样本呢?这就是mini-batch算法。

  假设训练集有m个样本,每个mini-batch(训练集的一个子集)有b个样本,那么,整个训练集可以分成m/b个mini-batch。

  SGD就是mini-batch的一个特殊情况,batch size = 1。

  然后是Online GD,随着互联网行业的蓬勃发展,数据变得越来越“廉价”。很多应用有实时的,不间断的训练数据产生。在线学习(Online Learning)算法就是充分利用实时数据的一个训练算法。

  Online GD于mini-batch GD/SGD的区别在于,所有训练数据只用一次,然后丢弃。这样做的好处是可以最终模型的变化趋势。比如搜索广告的点击率(CTR)预估模型,网民的点击行为会随着时间改变。用batch算法(每天更新一次)一方面耗时较长(需要对所有历史数据重新训练);另一方面,无法及时反馈用户的点击行为迁移。而Online Leaning的算法可以实时的最终网民的点击行为迁移。

选择新的激活函数

  这里要先提一个问题,就是神经网络并不一定是层数越多,越深越好,层数多了也会随之产生很多问题,比如梯度消失和梯度爆炸。

  先简单的说一下梯度消失现象,因为前面也讲过BP算法,我们知道,梯度的传播是反向的,从输出层向输入层,如果层数过多,就会导致这样的问题,越靠近输出层的层梯度越大,学习的也越快,而越靠输入层,梯度就越小,参数更新也就越慢,如果整个网络的层数又多,会导致输入层附近的层几乎无法有效更新,梯度几乎为零,这就叫梯度消失。

但是梯度消失的本质是什么?我们前面讲过BP算法的推导:

 

  其中:

  可以看到,除了输出层,计算每一层的梯度都是要乘以上一层梯度的一部分以及层间连接的权重和的,而计算上一层的梯度这部分又要乘以上上层梯度的一部分,是个连乘式,所以层数越多,就是越多的数相乘,如果这些数字都小于1,那么乘的越多,越接近输入层,算出来的梯度就越接近零,如果这些数字都大于1,那么乘的越多,越接近输入层,算出来的梯度就越大。梯度接近零叫做梯度消失,梯度变得过大就叫做梯度爆炸,而且我们发现这个乘数是个累加项,而且这个累加项里面,包含权重wjl,所以如果初始权重过小,那梯度消失的风险就大,如果初始权重过大,那就很可能会梯度爆炸,唯一可能的情况是让这些乘积基本等于1,但这不太可能。

  那我们怎么解决这个梯度消失的问题呢?看资料里面讲,从2006年起,我们通过前面讲过的RBM%20pre-train来解决梯度消失的问题,毕竟RBM%20pre-train靠的是无监督逐层训练,是种最大似然学习,最后的有监督BP,只是用来微调的。但是2015年之后,人们一般采用ReLU激活函数来避免梯度消失/爆炸的问题。

  Rectified%20Linear%20Unit%20(修正线性单元/线性整流函数,ReLU),函数图像如下:

 

线性整流函数图像
 

我们将其与其他常见的Sigmoid激活函数图像作对比:

Sigmoid

Sigmoid

  ReLU函数的表现通常优于其他激活函数,广泛使用于诸如图像识别等计算机视觉人工智能领域,其具有如下几个优点:

  • 计算速度快,因为其由两段线性函数构成,计算起来不知道比Sigmoid快到哪里去
  • ReLU有一定仿生物学原理,ReLU激活函数与人脑中神经元的激活方式最为类似,人脑接受相应刺激后,只有少量相关神经元(1%-4%)被激活,而大多数神经元都处于被抑制的状态,Sigmoid函数在输入为0时就已经是1/2半饱和的稳定状态了,不够符合实际生物学对人工神经网络的期望,而ReLU的表现要好的多,不过一般情况下,使用了ReLU,网络中也大概有50%的神经元会处于激活状态。
  • 采用ReLU可以解决梯度消失/爆炸的问题,前面讲过梯度消失/爆炸的原理,在于复杂多层网络下的梯度连乘,而ReLU的价值就在于抑制相当一部分神经元的激活,实际上是对网络进行了简化,去掉了网络中被抑制的那些神经元。

  ReLU函数还有几种变体,往往是更改了输入小于0时的函数曲线,比如Leaky ReLU、Parametric ReLU等,不详述。

  另外还要说的一点就是Maxout,ReLU其实是Maxout的一种特例。

  那什么是Maxout?

Maxout

Maxout

  我们知道,在人工神经网络中,规定神经元函数只能对输入变量线性组合后的结果进行一次非线性变换。而这次非线性变换,就是激活函数。

  接下来具体讲一下Maxout的算法流程,首先对于每个隐藏层神经元,如果它接受d个输入,那么Maxout隐藏层每个神经元的计算公式如下:

k=2和k=3时的Maxout示例

k=2和k=3时的Maxout示例

  我们可以看到k=2时第一个图像就是ReLU的函数图像。按我的理解,ReLU就是Maxout的k=2,然后在隐隐层放了一个z=0的神经元。

自适应学习速率

  上篇文章讲梯度下降时提到过学习速率η,它对训练效果也起到很重要的影响,如果η过大,那每次更新后,总误差可能并不会缩小;而如果η过小,那训练速度又会变得相当慢。所以我们很自然的有这样的想法,学习速率η不应该是一直不变的,我们希望这个学习速率η能够随着每次epoch而减小。

推荐热图
2010-2016 可思数据版权所有 ICP备案:京ICP备14056871号