【人工智能】神经网络常用优化算法概览、一文了解迁移学习经典算法

2018 年 8 月 18 日 产业智能官

作者:Anish S. Walia

你是否曾经思考过该为自己的神经网络模型使用什么样的优化算法?我们应该使用梯度下降还是随机梯度下降还是Adam

什么是优化算法?

优化算法帮助我们最小化(或最大化)一个目标函数(误差函数的另一个名字)E(x),该函数不过是一个取决于模型的内部可学习参数的数学函数,内部可学习参数用来根据一组输入(X)计算预测目标值(Y)。例如,神经网络的权重(W)偏置(b)被我们称为神经网络的内部可学习参数,这些参数用于计算输出值,并在优化方案的方向上学习和更新,即在网络训练过程中最小化损失

模型的内部参数在训练网络产生精确结果的效果和效率方面起着极为重要的作用,它们影响我们模型的学习过程和模型的输出。这正是我们使用多种优化策略和算法来更新、计算这些模型参数的恰当的最优值的原因。

优化算法的类型

优化算法可分为两大类:

  1. 一阶优化算法(First Order Optimization Algorithms)

    这些算法基于损失函数在参数上的梯度值,最小化或最大化损失函数E(x)。使用最广泛的一阶优化算法是梯度下降。一阶导数告诉我们在某一特定点上函数是下降还是上升。基本上,一阶导数提供正切误差平面上一点的一条直线

    什么是函数的梯度?

    梯度不过是一个向量,该向量是导数(dy/dx)的多元推广。导数(dy/dx)则是y相对于x即时变化率。主要的区别在于,梯度用于计算多元函数的导数,通过偏导数计算。另一个主要的区别是,函数的梯度生成向量场

    梯度雅可比矩阵表示——一个包含一阶偏导数(梯度)的矩阵。

    简单来说,导数定义在单元函数上,而梯度定义在多元函数上。我们就不讨论更多关于微积分和物理的内容了。

  2. 二阶优化算法(Second Order Optimization Algorithms)

    二阶方法使用二阶导数最小化或最大化损失函数。二阶方法使用海森矩阵——一个包含二阶偏导数的矩阵。由于计算二阶导数开销较大,二阶方法不如一阶方法常用。二阶导数告诉我们一阶导数是上升还是下降,这提示了函数的曲率。二阶导数提供了一个拟合误差平面曲率的二次平面。

    尽管二阶导数计算起来开销较大,但二阶优化算法的优势在于它没有忽略误差平面的曲率。另外,就每一步的表现而言,二阶优化算法要比一阶优化算法更好。

    了解更多关于二阶优化算法的内容:https://web.stanford.edu/class/msande311/lecture13.pdf

应该使用哪类优化算法?

  1. 目前而言,一阶优化技术更容易计算,花费时间更少,在大型数据集上收敛得相当快。

  2. 仅当二阶导数已知时,二阶技术更快,否则这类方法总是更慢,并且计算的开销更大(无论是时间还是内存)。

不过,有时牛顿二阶优化算法能超过一阶梯度下降,因为二阶技术不会陷入鞍点附近的缓慢收敛路径,而梯度下降有时会陷进去,无法收敛。

知道哪类算法收敛更快的最好办法是自己亲自尝试。

梯度下降

梯度下降是训练和优化智能系统的基础和最重要技术。

哦,梯度下降——找到最小值,控制方差,接着更新模型的参数,最终带领我们走向收敛

θ=θ−η⋅∇J(θ)是参数更新的公式,其中η为学习率,∇J(θ)损失函数J(θ)在参数θ上的梯度

梯度下降是优化神经网络的最流行算法,主要用于更新神经网络模型的权重,也就是以某个方向更新、调整模型参数,以便最小化损失函数

我们都知道训练神经网络基于一种称为反向传播的著名技术。在神经网络的训练中,我们首先进行前向传播,计算输入信号和相应权重的点积,接着应用激活函数,激活函数在将输入信号转换为输出信号的过程中引入了非线性,这对模型而言非常重要,使得模型几乎能够学习任意函数映射。在此之后,我们反向传播网络的误差,基于梯度下降更新权重值,也就是说,我们计算误差函数(E)权重(W)也就是参数上的梯度,然后以损失函数的梯度的相反方向更新参数(这里是权重)。

权重在梯度的反方向上更新

上图中,U型曲线是梯度(坡度)。如你所见,如果权重(W)值过小或过大,那么我们会有较大误差,所以我们想要更新和优化权重使其既不过小又不过大,所以我们沿着梯度的反方向下降,直到找到局部极小值

梯度下降的变体

传统的梯度下降将为整个数据集计算梯度,但仅仅进行一次更新因此它非常慢,而在大到内存放不下的数据集上更是困难重重。更新的大小由学习率η决定,同时保证能够在凸误差平面上收敛到全局最小值,在非凸误差平面上收敛到局部极小值。另外,标准的梯度下降在大型数据集上计算冗余的更新。

以上标准梯度下降的问题在随机梯度下降中得到了修正。

1. 随机梯度下降

随机梯度下降(SGD)则为每一个训练样本进行参数更新。通常它是一个快得多的技术。它每次进行一项更新。

θ=θ−η⋅∇J(θ;x(i);y(i))

由于这些频繁的更新,参数更新具有高方差,从而导致损失函数剧烈波动。这实际上是一件好事,因为它帮助我们发现新的可能更好的局部极小值,而标准随机梯度下降则如前所述,仅仅收敛至盆地(basin)的极小值。

然而,SGD的问题在于,由于频繁的更新和波动,它最终复杂化了收敛过程,因频繁的波动而会不断越过头。

不过,如果我们缓慢降低学习率η,SGD展现出和标准梯度下降一样的收敛模式。

损失函数剧烈波动导致我们可能无法得到最小化损失值的参数

高方差参数更新和不稳定收敛在另一个称为小批量梯度下降(Mini-Batch Gradient Descent)的变体中得到了修正。

2. 小批量梯度下降

想要避免SGD和标准梯度下降的所有问题和短处,可以使用小批量梯度下降,它吸收了两种技术的长处,每次进行批量更新。

使用小批量梯度下降的优势在于:

  1. 降低了参数更新的方差,最终导向更好、更稳定的收敛。

  2. 可以利用当前最先进的深度学习库中常见的高度优化的矩阵操作,极为高效地计算小批量梯度。

  3. 常用的Mini-batch大小为50到256,不过可能因为应用和问题的不同而不同。

  4. 小批量梯度下降是今时今日训练神经网络的典型选择。

P.S. 实际上,很多时候SGD指的就是小批量梯度下降

梯度下降及其变体面临的挑战

  1. 选择合适的学习率可能很难。过的学习率导致慢到让人怀疑人生的收敛,在寻找最小化损失的最优参数值时迈着婴儿般的小步,直接影响总训练时长,使其过于漫长。而过的学习率可能阻碍收敛,导致损失函数在极小值周围波动,甚至走上发散的不归路。

  2. 此外,同样的学习率应用于所有参数更新。如果我们的数据是稀疏的,我们的特征有非常不同的频率,我们可能不想以同等程度更新所有特征,而是想在很少出现的特征上进行较大的更新。

  3. 最小化神经网络中常见的高度非凸误差函数的另一项关键挑战是避免陷入众多的次优局部极小值。事实上,困难不仅在于局部极小值,更在于鞍点,即一个维度的坡度上升,另一个维度的坡度下降的点。这些鞍点通常被误差相等的高原环绕,众所周知,这让SGD难以逃离,因为在所有维度上,梯度都接近零。

优化梯度下降

现在我们将讨论进一步优化梯度下降的多种算法。

动量

SGD的高方差振荡使其难以收敛,所以人们发明了一项称为动量(Momentum)的技术,通过在相关方向上导航并减缓非相关方向上的振荡加速SGD。换句话说,它在当前更新向量中增加了上一步的更新向量,乘以一个系数γ

V(t)=γV(t−1)+η∇J(θ)

最终我们通过θ=θ−V(t)更新参数。

动量项γ通常设为0.9,或与之相似的值。

这里的动量源自经典物理学中的动量概念,当我们沿着一座小山坡向下扔球时,球在沿着山坡向下滚动的过程中收集动量,速度不断增加。

我们的参数更新过程发生了同样的事情:

  1. 它导向更快、更稳定的收敛。

  2. 它减少了振荡。

动量γ在梯度指向同一方向的维度上扩大更新,而在梯度方向改变的维度上缩小更新。这减少了不必要的参数更新,导向更快、更稳定的收敛,减少了振荡。

Nesterov加速梯度

Yurii Nesterov发现了动量的一个问题:

盲目地随着坡度滚下山坡的球是不令人满意的。我们希望能有一个智能一点的球,对所处位置有一定的概念,知道在坡度变得向上前减速。

也就是说,当我们到达极小值,也就是曲线的最低点时,动量相当高,因为高动量的作用,优化算法并不知道在那一点减速,这可能导致优化算法完全错过极小值然后接着向上移动

Yurii Nesterov在1983年发表了一篇论文,解决了动量的这个问题。我们现在将其提出的策略称为Nesterov加速梯度(Nestrov Accelerated Gradient,NAG)

Nesterov提议,我们首先基于先前的动量进行一次大跳跃,接着计算梯度,然后据此作出修正,并根据修正更新参数。预更新可以防止优化算法走得太快错过极小值,使其对变动的反应更灵敏。

NAG是为动量项提供预知能力的一种方法。我们知道,我们在更新参数θ的时候会用到动量项γV(t−1)。因此,计算θ−γV(t−1)能提供参数下一位置的近似值。这样我们就可以通过计算参数未来位置的近似值上的梯度“预见未来”:

V(t)=γV(t−1)+η∇J( θ−γV(t−1) )

接着我们同样通过θ=θ−V(t)更新参数。

关于NAG的更多细节,可以参考cs231n课程。

现在,我们已经能够根据误差函数的斜率调整更新的幅度,并加速SGD过程,我们同样希望能根据不同参数的重要性调整更新的幅度

Adagrad

Adagrad让学习率η可以基于参数调整,为不频繁的参数进行较大的更新,为频繁的参数进行较小的更新。因此,它很适合处理稀疏数据。

Adagrad在每一时步为每个参数θ使用不同的学习率,学习率的大小基于该参数的过往梯度

之前,我们为所有参数θ一下子进行更新,因为每个参数θ(i)使用相同的学习率η。由于Adagrad在每个时步t为每个参数θ(i)使用不同的学习率,我们首先计算Adagrad在每个参数上的更新,接着将其向量化。设gi,t为参数θ(i)在时步t损失函数的梯度,则Adagrad的公式为:

上式中,ϵ为平滑因子,避免除数为零。

从上式中,我们可以看到:

  1. 某方向上的Gi,t较小,则相应的学习率较大,也就是说,为不频繁出现的参数做较大的更新。

  2. 随着时间的推移,Gi,t越来越大,从而使学习率越来越小。因此,我们无需手动调整学习率。大多数Adagrad的实现中,η均使用默认值0.01. 这是Adagrad的一大优势。

  3. 由于Gi,t为平方和,每一项都是正值。因此,随着训练过程的进行,Gi,t会持续不断地增长。这意味着,学习率会持续不断地下降,模型收敛越来越慢,训练需要漫长的时间,甚至最终学习率小到模型完全停止学习。这是Adagrad的主要缺陷。

另一个算法AdaDelta修正了Adagrad的学习率衰减问题。

AdaDelta

AdaDelta试图解决Adagrad的学习率衰减问题。不像Adagrad累加所有过往平方梯度,Adadelta对累加的范围作了限制,只累计固定大小w的窗口内的过往梯度。  为了提升效率,Adadelta也没有存储w个平方梯度,而是过往平方梯度的均值。这样,时步t的动态均值就只取决于先前的均值和当前梯度。

其中,γ的取值和动量方法类似,在0.9左右。

类似Adagrad,Adadelta的公式为:

由于分母部分恰好符合梯度的均方误差的定义:

这其实也是RMSprop的公式。RMSprop是由Geoffrey Hinton提出的,未以论文形式发表,见其csc321课程。

Adadelta和RMSProp是在差不多同时相互独立地开发的,都是为了解决Adagrad的学习率衰减问题。

另外,标准的Adadelta算法中,和分母对称,分子的η也可以用RMS[Δθ]t-1替换:

这就消去了η!也就是说,我们无需指定η的值了。

目前为止我们所做的改进

  1. 为每个参数计算不同的学习率

  2. 同时计算动量

  3. 防止学习率衰减

还有什么可以改进的?

既然我们已经为每个参数分别计算学习率,为什么不为每个参数分别计算动量变动呢?基于这一想法,人们提出了Adam优化算法。

Adam

Adam表示自适应动量估计(Adaptive Moment Estimation)

开门见山,让我们直接查看Adam的公式:

有没有一种似曾相识的感觉?你的感觉没错,这很像RMSProp或者Adadelta的公式:

所以,问题来了,这vt和mt到底是什么玩意?莫急,我们马上给出两者的定义。

先来瞧瞧vt

哟!这不就是Adadelta或者RMSProp里面的过往平方梯度均值嘛!只不过换了几个字母,把γ换成了β2,把E[g2]换成了v

再来看看mt的定义:

咦?这个好像和动量的定义有点像呀?

V(t)=γV(t−1)+η∇J(θ)

γ换成了β1∇J(θ)gt都是梯度。当然还有一个系数不一样,只是有点像,不是一回事。

从这个角度来说,Adam算法有点博采众家之长的意思。事实上,RMSProp或者Adadelta可以看成是Adam算法不带动量的特殊情形。

当然,其实我们上面有一个地方漏了没说。细心的读者可能已经发现,实际上Adam的公式里vt和mt是戴帽的,这顶帽子意义何在?

这是因为,作者发现,由于vt和mt刚开始初始化为全零向量,会导致这两个量的估计向零倾斜,特别是在刚开始的几个时步里,以及衰减率很小的情况下(即β取值接近1)。因此需要额外加上校正步骤:

Adam作者建议,β1取0.9,β2取0.999,ϵ取10-8

在实践中,Adam的表现非常出色,收敛迅速,也修正了之前一些优化算法的问题,比如学习率衰减、收敛缓慢、损失函数振荡。通常而言,Adam是自适应学习率算法的较优选择。

AMSGrad

在ICLR 2018上,Google的Reddi等提交了一篇关于Adam收敛性的论文,指出了Adam算法收敛性证明中的一个错误。并构造了一个简单的凸优化问题作为反例,证明Adam在其上无法收敛。另外,Reddi等提出了Adam算法的一个变体,AMSGRad,其主要改动为:

  1. 基于算法的简单性考量,去除了Adam的偏置纠正步骤。

  2. 仅当当前vt大于vt-1时,才应用vt。也就是说,应用两种中较大的那个。这有助于避免收敛至次优解时,某些提供较大、有用梯度的罕见mini-batch的作用可能被过往平方梯度均值大为削弱,导致难以收敛的问题。

Reddi等在小型网络(MNIST上的单层MLP、CIFAR-10上的小型卷积网络)上展示了AMSGrad在训练损失和测试损失方面相对Adam的优势。然而,有人在较大模型上进行了试验,发现两者并无显著差异(顺便,Adam和AMSGrad的偏置纠正是否开启,影响也不大)。

可视化优化算法

下面让我们来看两张动图,希望它们有助于直观地理解网络的训练过程。

上图为误差平面的等值线图。从图中我们可以看到,自适应学习率方法干净利落地完成了收敛。而SGD、动量法、NAG收敛十分缓慢。其中,动量法和NAG在动量的作用下,欢快地朝着一个方向狂奔,相比之下,NAG更快反应过来。SGD倒是没有冲过头,可惜最后没能收敛到最优值。

上图演示了不同优化算法在鞍点的表现。我们看到,自适应学习率方法毫不拖泥带水地摆脱了鞍点,动量法、NAG在鞍点徘徊良久后终于逃出生天,而SGD最终陷在鞍点无法自拔。

以上两幅动图均由Alec Radford制作。

应该使用哪种优化算法?

不幸的是,这一问题目前还没有明确的答案。这里仅能提供一些建议:

  1. 目前而言,用的比较多的优化算法是SGD、动量、RMSProp、AdaDelta、Adam。

  2. 在稀疏数据上,一般建议使用自适应学习率算法。

  3. 在高度复杂的模型上,推荐使用自适应学习率算法,通常它们收敛起来比较快。

  4. 在其他问题中,使用自适应学习率算法通常也能取得较优的表现。同时它也额外带来了一项福利:你不用操心学习率设定问题。

  5. 总体而言,在自适应学习率算法中,Adam是一个比较流行的选择。

  6. 考虑到超参数调整的便利性,优化算法的选择还取决于你对不同算法的熟悉程度。

  7. Adam在不同超参数下的鲁棒性较好,不过有时你可能需要调整下η值。

参考链接

  • An overview of gradient descent optimization algorithms(arXiv:1609.04747)

  • On the momentum term in gradient descent learning algorithms(doi:10.1.1.57.5612)

  • Adam: A Method for Stochastic Optimization(arXiv:1412.6980)

  • Learning rate schedules for faster stochastic gradient search(doi:10.1109/NNSP.1992.253713)



激活函数核心知识点,请务必掌握!

红色石头 AI有道

我们知道,神经网络模型中,各隐藏层、包括输出层都需要激活函数(Activation Function)。我们比较熟悉的、常用的激活函数也有 ReLU、Sigmoid 等等。但是,对于各个激活函数的选取方法、区别特点还有几点需要特别注意的地方。今天红色石头就和大家一起来总结一下常用激活函数 Sigmoid、tanh、ReLU、Leaky ReLU、ELU、Maxout 的关键知识点。



1

为什么需要激活函数



神经网络单个神经元的基本结构由线性输出 Z 和非线性输出 A 两部分组成。如下图所示:



其中,f(x) 即为线性输出 Z,g(x) 即为非线性输出,g() 表示激活函数。通俗来说,激活函数一般是非线性函数,其作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。


举个简单的例子,二分类问题,如果不使用激活函数,例如使用简单的逻辑回归,只能作简单的线性划分,如下图所示:



如果使用激活函数,则可以实现非线性划分,如下图所示:



可见,激活函数能够帮助我们引入非线性因素,使得神经网络能够更好地解决更加复杂的问题。


有个问题,为什么激活函数一般都是非线性的,而不能是线性的呢?从反面来说,如果所有的激活函数都是线性的,则激活函数 g(z)=z,即 a=z。那么,以两层神经网络为例,最终的输出为:



经过推导我们发现网络输出仍是 X 的线性组合。这表明,使用神经网络与直接使用线性模型的效果并没有什么两样。即便是包含多层隐藏层的神经网络,如果使用线性函数作为激活函数,最终的输出仍然是线性模型。这样的话神经网络就没有任何作用了。因此,隐藏层的激活函数必须要是非线性的。


值得一提的是,如果所有的隐藏层全部使用线性激活函数,只有输出层使用非线性激活函数,那么整个神经网络的结构就类似于一个简单的逻辑回归模型,效果与单个神经元无异。另外,如果是拟合问题而不是分类问题,输出层的激活函数可以使用线性函数。



2

Sigmoid



激活函数 Sigmoid 的图形表达式如下所示:




Sigmoid 函数的取值范围在 (0,1) 之间,单调连续,求导容易,一般用于二分类神经网络的输出层。


下面重点谈一下 Sigmoid 函数的缺点。


首先,Sigmoid 函数饱和区范围广,容易造成梯度消失。饱和区如下图所示:



上图中红色椭圆标注的饱和区曲线平缓,梯度的值很小,近似为零。而且 Sigmoid 函数的饱和区范围很广,例如除了 [-5,5],其余区域都近似饱和区。这种情况很容易造成梯度消失,梯度消失会增大神经网络训练难度,影响神经网络模型的性能。


其次,Sigmoid 函数输出是非零对称的,即输出恒大于零。这会产生什么影响呢?我们来看,假如 Sigmoid 函数的输出为 σ(Wx+b),且满足 0<σ(Wx+b)<1。在反向求导过程中,令损失函数 J 对 σ(Wx+b) 的求导为 dσ,现在计算 J 对 W 的偏导数:



其中,σ(Wx+b)>0,1-σ(Wx+b)>0。


若神经元的输入 x>0,则无论 dσ 正负如何,总能得到 dW 恒为正或者恒为负。也就是说参数矩阵 W 的每个元素都会朝着同一个方向变化,同为正或同为负。这对于神经网络训练是不利的,所有的 W 都朝着同一符号方向变化会减小训练速度,增加模型训练时间。就好比我们下楼梯的所需的时间总比直接滑梯下来的时间要长得多,如下图所示:



图中,红色折线是上文讨论的情况,蓝色斜线是 W 不全朝同一方向变化的情况。


值得一提的是,针对 Sigmoid 函数的这一问题,神经元的输入 x 常会做预处理,即将均值归一化到零值。这样也能有效避免 dW 恒为正或者恒为负。


最后还有一点,Sigmoid 函数包含 exp 指数运算,运算成本也比较大。



3

tanh



激活函数 tanh 的图形表达式如下所示:




tanh 函数的取值范围在 (-1,1) 之间,单调连续,求导容易。


相比于 Sigmoid 函数,tanh 函数的优点主要有两个:其一,收敛速度更快,如下图所示,tanh 函数线性区斜率较 Sigmoid 更大一些。在此区域内训练速度会更快。其二,tanh 函数输出均值为零,也就不存在 Sigmoid 函数中 dW 恒为正或者恒为负,从而影响训练速度的问题。



但是,tanh 函数与 Sigmoid 函数一样,也存在饱和区梯度消失问题。其饱和区甚至比 Sigmoid 还要大一些,但不明显。



4

ReLU



激活函数 ReLU 的全称是 Rectified Linear Unit,其图形表达式如下所示:




ReLU 函数是最近几年比较火热的激活函数之一。相比 Sigmoid 和 tanh 函数,其主要优点包括以下几个方面:


  • 没有饱和区,不存在梯度消失问题。

  • 没有复杂的指数运算,计算简单、效率提高。

  • 实际收敛速度较快,大约是 Sigmoid/tanh 的 6 倍。

  • 比 Sigmoid 更符合生物学神经激活机制。


下面这张图对比了 ReLU 与 tanh 的收敛速度差异性。数据集是 CIFAR 10,模型是四层的卷积神经网络。图中,实线代表 ReLU,虚线代表 tanh,ReLU 比 tanh 更快地到达了错误率 0.25 处。(引自论文《ImageNet Classification with Deep Convolutional Neural Networks》)



但是,ReLU 函数的缺点也比较明显。首先,ReLU 的输出仍然是非零对称的,可能出现 dW 恒为正或者恒为负,从而影响训练速度。


其次,也是最为重要的,当 x<0 时,ReLU 输出总为零。该神经元输出为零,则反向传播时,权重、参数的梯度横为零,造成权重、参数永远不会更新,即造成神经元失效,形成了“死神经元”。所以,针对这一问题,有时候会将 ReLU 神经元初始化为正偏值,例如 0.01。



5

Leaky ReLU



Leaky ReLU 对 ReLU 进行了改进,其图形表达式如下所示:




Leaky ReLU 的优点与 ReLU 类似:


  • 没有饱和区,不存在梯度消失问题。

  • 没有复杂的指数运算,计算简单、效率提高。

  • 实际收敛速度较快,大约是 Sigmoid/tanh 的 6 倍。

  • 不会造成神经元失效,形成了“死神经元”。


当然,0.01 的系数是可调的,一般不会太大。



6

ELU



ELU(Exponential Linear Units)也是 ReLU 的一个变种,其图形表达式如下所示:




ELU 继承了 Leaky ReLU 的所有优点:


  • 没有饱和区,不存在梯度消失问题。

  • 没有复杂的指数运算,计算简单、效率提高。

  • 实际收敛速度较快,大约是 Sigmoid/tanh 的 6 倍。

  • 不会造成神经元失效,形成了“死神经元”。

  • 输出均值为零

  • 负饱和区的存在使得 ELU 比 Leaky ReLU 更加健壮,抗噪声能力更强。


但是,ELU 包含了指数运算,存在运算量较大的问题。



7

Maxout



Maxout 最早出现在 ICML2013 上,由 Goodfellow 提出。其表达式如下所示:



Maxout 的拟合能力是非常强的,它可以拟合任意的的凸函数。最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合,而 Maxout 又是取 k 个隐藏层节点的最大值,这些”隐藏层"节点也是线性的,所以在不同的取值范围下,最大值也可以看做是分段线性的(上面的公式中 k = 2)。



上图引自论文《Maxout Networks.  Ian J. Goodfellow, David Warde-Farley, Mehdi Mirza, Aaron Courville, Yoshua Bengio》,可以说,Maxout 可以拟合任意凸函数,k 值越大,分段越多,拟合效果也就越好。


Maxout 保证了始终是线性区域,没有饱和区,训练速度快,而且不会出现坏死神经元。



8

如何选择合适的激活函数



1)首选 ReLU,速度快,但是要注意学习速率的调整,

2)如果 ReLU 效果欠佳,尝试使用 Leaky ReLU、ELU 或 Maxout 等变种。

3)可以尝试使用 tanh。

4)Sigmoid 和 tanh 在 RNN(LSTM、注意力机制等)结构中有所应用,作为门控或者概率值。其它情况下,减少 Sigmoid 的使用。

5)在浅层神经网络中,选择使用哪种激励函数影响不大。




一文了解迁移学习经典算法



来源 | linolzhang的CSDN博客

作者 | linolzhang


一. 了解迁移学习


迁移学习(Transfer Learning)目标是将从一个环境中学到的知识用来帮助新环境中的学习任务。 


> The ability of a system to recognize and apply knowledge and skills learned in previous tasks to novel tasks。


入门推荐一篇公认的比较好的 【Survey】: A Survey on Transfer Learning,Sinno JialinPan, Qiang Yang,IEEE Trans

http://www.cse.ust.hk/faculty/qyang/Docs/2009/tkde_transfer_learning.pdf


另外,戴文渊的硕士学位论文也可以看一下:基于实例和特征的迁移学习算法研究

https://download.csdn.net/download/linolzhang/9872535


Survey 作者归纳了 Transfer Learning 相关的知识域,有必要了解一下这些名词:


● Learning学习 - learning to learn

● 终身学习 - life-long learning

● 知识转移 - knowledge transfer

● 归纳迁移 - inductive transfer

● 多任务学习 - multi-task learning

● 知识的巩固 - knowledge consolidation

● 上下文相关学习 - context sensitive learning

● 基于知识的归纳偏差 - knowledge-based inductive bias

● 元学习 - meta learning

● 增量学习 - and incremental/cumulative learning


另外,进展及 Open Source Toolkit 可以参考:

http://www.cse.ust.hk/TL/index.html


二. 迁移学习分类


迁移学习(Transfer Learning)根据 领域 和 任务的相似性,可以这样划分: 



我们根据 源Domain和目前Domain 之间的关系,源Task 和 目标Task之间的关系,以及任务方法更详细的整理为下表:



实际上,归纳式迁移学习 是应用最广泛的一种方法,从这点上看,迁移学习更适合 有标签的应用域。


根据技术方法,我们将迁移学习的方法划分为:



迁移学习方法虽然在学术有很多研究工作,实际上在应用领域并不算成熟,这本身就是一个很大的命题,关于迁移学习的条件 和 本质也并未形成一套正统的体系来引领研究方向,更多的也是在实验摸索。


迁移学习 目前面临如下几个问题:


1. 哪种情况适合做迁移学习? - What


这里先给个自己的理解:分类和回归问题是比较适合做迁移学习的场景,有标签的源数据是最好的辅助。


2. 该选择哪种方法? - Which


简单而行之有效的方法是首选,领域在快速发展,也不必拘泥算法本身,改善结果才是硬道理。


3. 如何避免负迁移? - How


迁移学习的目标是改善目标域的 Task效果,这里面 负迁移(Negative Transfer)是很多研究者面临的一个问题,如何得到行之有效的改进,避免负迁移是需要大家去评估和权衡的。


三. 经典算法 TrAdaBoost


TrAdaBoost 算法是基于 样本迁移的 开山之作,由 戴文渊 提出,有着足够的影响力放在第一位来进行讲解。


论文下载:Boosting for Transfer Learning

http://home.cse.ust.hk/~qyang/Docs/2007/tradaboost.pdf


算法的基本思想是 从源 Domain 数据中筛选有效数据,过滤掉与目标 Domain 不match的数据,通过 Boosting方法建立一种权重调整机制,增加有效数据权重,降低无效数据权重,下图是 TrAdaBoost 算法的示意图(截图来自于  庄福振 - 迁移学习研究进展):



TrAdaBoost 算法比较简单,用一句话概括就是 从过期数据里面 找出和目标数据最接近的样本数据。


来看 TrAdaBoost 的算法步骤:

   


这里需要说明的一点就是 权重的更新方式,对于辅助样本来讲,预测值和标签越接近,权重越大;而对于目标数据则是相反,预测值和标签差异越大,权重越大。这种策略狠容易理解,我们想找到辅助样本中 和 目标数据分布最接近的样本,同时放大目标样本Loss的影响,那么理想的结果就是:


目标样本预测值与标签尽量匹配(不放过一个没匹配好的数据),辅助样本在前面的基础上筛选出最 match(权重大的) 的部分。


作者在后面给出了理论证明,这里有两个公式(来证明算法收敛):



因篇幅问题,这里就不再展开了(和作者说的一样),有兴趣可以参考原Paper,看下实验结果:



实验发现,当 同分布数据(目标数据)占比当低于0.1时,算法效果明显,当比例超过 0.1时,TrBoost 退化为 SVM 的效果。


这又是一个显而易见的结论,我们认为大于0.1时,仅仅依靠 目前数据就足够完成样本训练,这种情况下,辅助样本的贡献可以忽略。


另外,当 目标数据 和 辅助数据 差别比较大时,该方法是不 Work的,印证了最初的假设,这里不再展开证明。


最后,给出网友提供的C代码:【下载地址】

https://download.csdn.net/download/linolzhang/9880438


四. 多任务学习


多任务学习(Multi-Task Learning, MTL)是一种同时学习多个任务的机器学习方法,该方法由来已久,和深度学习没什么关系。


如果非要把它 和深度学习加上一个 link,我们可以这样来表示:



       input1 -> Hidden1-> H1-> Out1                          input1                                       -> Out1

       input2 -> Hidden2-> H2-> Out2         ==>          input2 -> Hidden123 -> H123   -> Out2

       input3 -> Hidden3-> H3-> Out3                         input3                                        -> Out3



也比较好理解,相当于把多个 Task网络进行合并,同时训练多个任务,这种情况并不鲜见,比如以下2个方向:


1)目标检测 - 复合多任务


目标检测是 分类问题+回归问题的组合,这是一个典型的 Multi-Task,比如:


Detection=Classification+Location

Mask RCNN = Classification+Location+Segmentation


检测问题前面描述的比较多了,这里就不再贴图了。


2)特征提取 


多任务特征提取,多个输出,这一类问题代表就是 数据结构化,特征识别。


下图是香港中文大学汤晓鸥组发表的TCDCN(Facial Landmark Detection by Deep Multi-task Learning),很多讲 Multi-Task的软文都拿出来说,我们也借用一下。


在这里 Multi-Task 被同时用作 人脸关键点定位、姿态估计和属性预测(比如性别、年龄、人种、微笑?戴眼镜?)



多任务学习适用于这样的情况:


1)多个任务之间存在关联,比如行人和车辆检测,对于深度网络也可以理解为有部分共同的网络结构;

2)每个独立任务的训练数据比较少,单独训练无法有效收敛;

3)多个任务之间存在相关性信息,单独训练时无法有效挖掘;


可以看一下这篇 Tutorial:

www.public.asu.edu/~jye02/Software/MALSAR/MTL-SDM12.pdf


关于多任务学习的应用,比如分类任务下的二级分类、人脸识别等,大家可以更进一步了解。


原文地址:

  • https://blog.csdn.net/linolzhang/article/details/73358219




为什么有的机器学习应用公司必将失败?



作者 | Cassie Kozyrkov

编译 | Leo

出品 | 人工智能头条


告诉大家一个秘密:当人们说起“ 机器学习 ”时,听起来好像只是在谈论一门学科,但其实是两门。如果企业不了解其中的差异,那么就可能招惹来满世界的麻烦。



两个关于机器学习的故事


在机器学习方面,企业经常犯的错误类似于:请一位厨师来制造烤箱或请一位电气工程师去烘烤面包。


假设你是一家面包店的店主,你需要聘请的是一位经验丰富的面包师,他需要精通的是制作各种美味面包和糕点的技艺,而不是制造烤箱的方法。虽然烤箱是制作面包的一个重要工具,但我敢打赌没有一个老板会强求自家的面包师知道烤箱是如何制造的。


但到了机器学习这里,很多企业却经常犯上面的错误。企业需要先思考清楚自己究竟是做“面包”的还是做“烤箱”的?


这些是不同的业务!不幸的是,太多的机器学习项目失败了,因为团队不知道他们该建造的是烤箱、配方还是面包


机器学习研究


现在有很多的机器学习课程和教科书,但它们都是关于如何从零开始制造烤箱(以及微波炉、搅拌机、烤面包机、水壶、厨房水槽……),而不是如何烹饪和创新配方。


如果你是搞机器学习算法的,那你应该聚焦在如何做出让人们喜欢用的通用工具(就像厨房用具,如果你喜欢这样类比的话)。这项业务被称为机器学习研究,通常由学术界或科技巨头的研究院来完成。


从事这项工作需要受到长期的教育,因为这方面的研究已经积累了很多年。一些流行的算法已经存在了几个世纪,例如,最小二乘法在1805年就已首次发表。相信我,人类200年来走过了漫长的道路。


还拿烤箱举个例子,今天已经有很多非常棒的烤箱了,如果你不知道它们是如何制作的,那你就不可能做出更好的烤箱。所以成为一名科研人员需要数年的沉浸式学习。


机器学习应用


大多数的企业其实需要的只是烹饪——解决他们的业务问题。


他们对卖烤箱并没有兴趣,但经常犯下从头开始制造烤箱的错误。当然这也不能怪他们,要怪就怪现在的炒作和教育方式都是围绕着研究领域而不是应用领域。


如果你是致力于创新食谱的,那么请不要重复造轮子。烤箱已经存在,你甚至可以从很多地方免费得到它们。


如果你觉得建立自己的机器学习厨房很麻烦,其实很多平台提供商已经有现成的产品、工具、配料和食谱可供选择了。


对于大多数机器学习应用而言,你的团队是不需要了解神经网络反向传播算法中的数学知识的,就像厨师不必知道烤箱的制作原理一样。


但是,如果你需要搭建一个工业级规模的厨房,那么你就需要面面俱到地了解从食材策划到菜肴上桌的每个过程。


你的企业销售以上哪些产品?你的答案决定了你雇佣什么团队


崩溃与燃烧


不幸的是,我发现许多企业未能从机器学习中获得价值,因为他们没有意识到机器学习的应用和算法研究是截然不同的学科。


公司领导总是试图通过雇佣一些一直从事制作烤箱零部件的人,来制作面包和糕点。这种大多数都不会有好结果的,如果有例外的话,说明你很幸运,碰巧遇到了一个很会烹饪的工程师。


但这种运气并不常见,人生有涯而学而无涯,如果你花费很多时间去学习如何制作烤箱,多半已经没有时间投入到面包和糕点制作中了。所以你招聘到的AI博士研究员是没有时间和精力再去获得机器学习应用所需要的技能了。如果你认为人才就应该是这两种专家的混合体,难怪你会抱怨人才短缺!

如果你要新开一家餐厅,却雇佣了一些致力于做烤箱零件但从未烹饪过的人,可能会出现什么问题?


你应该雇用谁?就像在工业级厨房中一样,你需要一个具有领导能力的跨学科团队来理解这个领域。否则,项目不会走的太远。


雇用合适的团队进行工作


如果你销售的是尖端设备,请聘请研究人员。


如果你想大规模地卖出具有创新性的食物,你就需要那些知道什么食物值得做的人(产品经理和决策者),懂得消费者和供应链的人(领域专家和社会科学家),能够大规模处理配料的人(数据工程师和分析师),能快速尝试不同配料组合以生成潜在配方的人(机器学习应用工程师),检查配方是否合乎人们口味的人(统计学家),将有效配方批量生产的人(软件工程师),让跨学科团队正常运转的人(项目经理),保证菜肴质量稳定的人,即使送货卡车错将你订购的大米送成了土豆(可靠性工程师)。


虽然这些并不代表一个岗位非得有一个专人来做,但要确保团队中有人承担这些角色。


如果你的团队在尝试了所有现有的工具后,还不能制定出符合商业目标的配方,那么考虑增加懂得制作烤箱的技术人员(研究人员)是有意义的。无论是长期雇佣还是外包给经验丰富的算法公司,取决于你的业务规模和成熟度。


还有一种情况有必要和研究人员建立联系,那就是你期望你的产品在定制化的设备上取得了很好的大规模运行效果,而这得是多么宏大的问题啊!


原文链接:https://hackernoon.com/why-businesses-fail-at-machine-learning-fbff41c4d5db




工业互联网




产业智能官  AI-CPS


通过工业互联网操作系统(云计算+大数据+物联网+区块链+人工智能),场景中构建:状态感知-实时分析-自主决策-精准执行-学习提升的机器智能认知系统;实现产业转型升级、DT驱动业务、价值创新创造的产业互联生态链





版权声明产业智能官(ID:AI-CPS推荐的文章,除非确实无法确认,我们都会注明作者和来源。涉权烦请联系协商解决。联系、投稿邮箱:erp_vip@hotmail.com




登录查看更多
13

相关内容

优化算法是一种根据概率按照固定步骤寻求问题的最优解的过程。与常见的排序算法、寻路算法不同的是,优化算法不具备等幂性,是一种概率算法
最新《自动微分手册》77页pdf
专知会员服务
97+阅读 · 2020年6月6日
专知会员服务
44+阅读 · 2020年3月6日
《深度学习》圣经花书的数学推导、原理与Python代码实现
《迁移学习简明手册》,93页pdf
专知会员服务
131+阅读 · 2019年12月9日
从动力学角度看优化算法:自适应学习率算法
PaperWeekly
8+阅读 · 2018年12月27日
谷歌官方:反向传播算法图解
新智元
9+阅读 · 2018年6月29日
激活函数初学者指南
论智
6+阅读 · 2018年5月15日
已删除
将门创投
10+阅读 · 2018年5月2日
干货|深度神经网络(DNN)反向传播算法(BP)
全球人工智能
7+阅读 · 2018年1月12日
推荐系统机器学习算法概览
论智
7+阅读 · 2017年12月14日
最近流行的激活函数
计算机视觉战队
6+阅读 · 2017年11月27日
入门 | 一文概览深度学习中的激活函数
深度学习世界
4+阅读 · 2017年11月3日
干货|浅谈神经网络中激活函数的设计
机器学习研究会
5+阅读 · 2017年10月28日
精品公开课 | 随机梯度下降算法综述
七月在线实验室
13+阅读 · 2017年7月11日
Meta-Learning with Implicit Gradients
Arxiv
13+阅读 · 2019年9月10日
Arxiv
8+阅读 · 2019年5月20日
Deep Anomaly Detection with Outlier Exposure
Arxiv
17+阅读 · 2018年12月21日
Arxiv
53+阅读 · 2018年12月11日
Deep Learning for Generic Object Detection: A Survey
Arxiv
13+阅读 · 2018年9月6日
Arxiv
3+阅读 · 2018年3月27日
VIP会员
相关资讯
从动力学角度看优化算法:自适应学习率算法
PaperWeekly
8+阅读 · 2018年12月27日
谷歌官方:反向传播算法图解
新智元
9+阅读 · 2018年6月29日
激活函数初学者指南
论智
6+阅读 · 2018年5月15日
已删除
将门创投
10+阅读 · 2018年5月2日
干货|深度神经网络(DNN)反向传播算法(BP)
全球人工智能
7+阅读 · 2018年1月12日
推荐系统机器学习算法概览
论智
7+阅读 · 2017年12月14日
最近流行的激活函数
计算机视觉战队
6+阅读 · 2017年11月27日
入门 | 一文概览深度学习中的激活函数
深度学习世界
4+阅读 · 2017年11月3日
干货|浅谈神经网络中激活函数的设计
机器学习研究会
5+阅读 · 2017年10月28日
精品公开课 | 随机梯度下降算法综述
七月在线实验室
13+阅读 · 2017年7月11日
相关论文
Meta-Learning with Implicit Gradients
Arxiv
13+阅读 · 2019年9月10日
Arxiv
8+阅读 · 2019年5月20日
Deep Anomaly Detection with Outlier Exposure
Arxiv
17+阅读 · 2018年12月21日
Arxiv
53+阅读 · 2018年12月11日
Deep Learning for Generic Object Detection: A Survey
Arxiv
13+阅读 · 2018年9月6日
Arxiv
3+阅读 · 2018年3月27日
Top
微信扫码咨询专知VIP会员