DL课程:MLP、DNN、Wide&deep model及相关案例代码

以下是我的学习笔记,以及总结,如有错误之处请不吝赐教。

线性分类和逻辑回归两种简单的模型大家应该都知道:(ml课程:线性回归、逻辑回归入门(含代码实现)

机器学习中,分类和回归常用损失函数大家也都熟悉:(ml课程:机器学习算法串讲及相关常见问题总结

神经网络:

一般神经网络结构主要包括:输入层、隐层、输出层。

逻辑回归也可以表示为单层的神经元“感知器”:

单个的神经元可以完成“逻辑与”和“逻辑或”,因此多个神经元的组合就可以完成对空间的非线性切分:

  • 理论上说单隐层神经网络可以逼近任何连续函数(只要隐层的神经元个数足够多);
  • 虽然从数学上看表达能力一致,但是多隐层的神经网络比单隐层的神经网络工程效果好很多;
  • 对于一些分类数据,3层优于2层神经网络,但是如果在把成熟增加,对最后结果帮助就没有太大的跳变;
  • 提升隐层层数或者隐层神经元个数,神经网络“容量”会变大,空间表达力会变强。
  • 过多的隐层和神经元节点会带来过拟合问题。
  • 不要试图通过降低神经网络参数数量来缓解过拟合,用正则化或者dropout。

传递函数(激活函数):在神经网络中,每一层输出的都是上一层输入的线性函数,所以无论网络结构怎么搭,输出都是输入的线性组合。因为线性模型的表达能力不够,所以引入激活函数是为了添加非线性因素,主要有以下几种:

  • Sigmoid 函数:是常用的非线性的激活函数,大家都比较熟悉,它的数学形式如下:

    优点:能够把输入的连续实值“压缩”到0和1之间, 特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。
    缺点:①在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。首先来看Sigmoid函数的导数,如下图所示:

    ②Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如果数据进入神经元的时候是正的(e.g. elementwise in ),那么计算出的梯度也会始终都是正的。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。 
    ③其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
     
  • tanh函数解析式:

    有相比 sigmoid 函数,tanh 激活函数非线性且输出在某一范围,tanh 是0均值的。但是它也有跟 sigmoid 一样的缺点。从数学表达式就可以看出来,它也有梯度消失的问题,以及也需要进行开销巨大的指数运算。
  • ReLU: 从数学表达式来看,运算十分高效。对于某一输入,当它小于 0 时,输出为 0,否则不变。 ReLU 的函数表达式为:Relu(z) = max(0,z)

    优点:① 解决了gradient vanishing问题 (在正区间); ②计算速度非常快,只需要判断输入是否大于0 ;③收敛速度远快于sigmoid和tanh
    缺点:①ReLU的输出不是zero-centered ;②Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
     
  • Leaky ReLU:就是用来解决这个 “dying ReLU” 的问题的。与 ReLU 不同的是:

    这里的 α 是一个很小的常数, 而非0,通常α=0.01。这样即修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失另外一种直观的想法是基于参数的方法,即ParametricReLU:f(x)=max(αx,x)其中α可由方向传播算法学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

  • ELU (Exponential Linear Units) 函数​​​表达式: 


    函数及其导数的图像如下图所示: 

    优点:①ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及不会有Dead ReLU问题;②输出的均值接近0,zero-centered;
    缺点:计算量稍大,类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。

  • MaxOut函数:计算公式如下: 

    其中Z为:

    可以注意到,ReLU 和 Leaky ReLU 都是它的一个变形(比如,w1,b1=0 的时候,就是 ReLU).Maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。
    优点:①计算简单,不会 saturation;②同时又没有 ReLU 的一些缺点 (如:容易 go die)。
    缺点:参数double,计算量增大。

  • 如何选择激活函数:

    1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。 
    2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout. 
    3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.

  • 其他参考:参考一参考二

Forward propagation前向传播:前向传播指的是信息从第一层逐渐地向高层进行传递的过程。具体参考:参考一

Back propagation反向传播:BP算法,也叫δ算法,简单说就是利用复合函数求导,进行梯度计算,具体参考:参考一

优化方法:前面通过BP算法求得了梯度,下面就需要用优化算法对损失进行优化,主要的优化方法主要有:

  • 基本优化算法:SGD、Momentum(动量)、Nesterov(牛顿动量)
  • 自适应优化算法:AdaGrad、RmsProp、Adam
  • 二阶近似优化算法:牛顿法、共轭梯度法、BFGS、L-BFGS
  • 具体参考:参考一参考二

正则化与Drop:神经⽹网络学习能⼒力强可能会过拟合,通常使用Dropout(随机失活)正则化:

  • 一种理解方式:别让你的神经网络记住那么多东西,学习的过程中保持泛化能力:

  • 另一种理解方式:每次都关掉一部分感知器,得到一个新模型,最后做融合,不至于听一家之言:

    更多参考:2014, Hinton, etc《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》、2013, Stefan Wager, etc 《Dropout Training as Adaptive Regularization》

MLP多层感知机

Multi-Layer Perceptron即人工神经网络(ANN,Artificial Neural Network),除了输入输出层,它中间可以有多个隐层,最简单的MLP只含一个隐层,即三层的结构,如下图:

 

具体参考:PLA感知机多层感知机

Wide & Deep model:

是TensorFlow 在 2016 年 6 月左右发布的一类用于分类和回归的模型,并应用到了 Google Play 的应用推荐中。wide and deep 模型的核心思想是结合线性模型的记忆能力(memorization)和 DNN 模型的泛化能力(generalization),在训练过程中同时优化 2 个模型的参数,从而达到整体模型的预测能力最优。参考:参考一

案例代码:我的github


To be continue......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章