查看原文
其他

全面直观认识深度神经网络

石文华 机器学习算法工程师 2019-03-29

作者:石文华

编辑:赵一帆

01

深度学习的精准定义

 一类通过多层非线性变换对高复杂性数据建模算法的集合。它的两个非常重要的特征是多层性和非线性。俗称多层非线性变换。所以深度学习要去线性化。


为什么呢?因为线性模型存在局限性,任意线性模型得到组合仍然还是线性模型。所以只要通过线性变换,任意层的全连接神经网络和单层神经网络模型的表达能力没有任何区别,而且他们都是线性模型,线性模型解决问题的能力是有限的。

02

激活函数实现去线性化

        每个神经元(也就是神经网络上的节点)的输出通过一个非线性函数,那么整个神经网络的模型也就不再是线性的了,这个非线性函数就是激活函数。


tensorflow常见的激活函数有:

tf.nn.relu
tf.sigmoid
tf.tanh

tensorflow 也支持自定义激活函数。


带激活函数的前向传播算法:

a = tf.nn.relu(tf.matmul(x, w1) + biases1)
y = tf.nn.relu(tf.matmul(a, w2) + biases2)


03

单层神经网络解决不了的问题

事实上,一个单极网络可以将平面划分为两部分,用多个单极网络组合在一起,并用其中的一个区综合其他单极网络的结果,就可以构造出一个两极神经网络。

04

组合特征提取

深度神经网络具有组合特征提取的功能,这个特征对于不易提取特征向量的问题(比如图片识别和语音识别等)有很大的帮助。隐藏层的主要作用也就是隐藏层节点可以被认为代表了从输入特征中抽取更高纬度的特征。

05

损失函数

损失函数用于评价模型的效果。分类问题使用最广泛的损失函数是交叉熵


交叉熵

        刻画两个概率分布的距离,也就是说交叉熵越小两个概率分布越接近。


交叉熵的数学定义是:

        其用来衡量在给定真实分布下,使用非真实分布所指定的策略消除系统不确定性所需付出的努力的大小。


神经网络的输出不一定是概率模型,可以使用Softmat回归将神经网络的前向传播的结果变成概率分布。


代码实例:

cross_entropy = -tf.reduce_mean(
y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)


        但是交叉熵一般会和softmax回归一起使用,所以会使用tf.nn.softm

cross_entropy=
tf.nn.softmax_cross_entropy_with_logits(y,y_)

y代表原始神经网络的输出结果,而y_给出了标准答案。


在只有一个正确答案的分类问题中,Tensorflow提供了函数:

tf.nn.sparse_softmax_cross_entropy_with_logits

来加快计算过程。

 

 回归问题常用的损失函数是均方误差均方误差是指各数据偏离真实值的距离平方和的平均数。

06

神经网络的优化算法

梯度下降算法主要用于优化单个参数的取值,而反向传播算法则给出了一个高效的方式在所有参数上使用梯度下降算法,从而使神经网络模型在训练数据集上的损失函数尽可能的小。


反向传播算法是训练神经网络的核心算法。它可以根据定义好的损失函数优化神经网络中参数的取值,从而使神经网络模型在训练数据集上的损失函数达到一个较小的值。


神经网络模型中参数的优化过程直接决定了模型的质量。

07

什么是梯度和学习率

梯度:

由导数的概念,对点x0的导数反应了函数在点x0出的瞬时变化速率,或者叫做点x0出的斜度。推广到多维函数中,就有了梯度的概念,梯度是一个向量的组合,反应了多维图形中变化速率最快的反向。


学习率:

每次参数移动的幅度。

08

神经网络的优化过程

神经网络的优化过程分为两个阶段:

        1、先通过神经网络的前向传播算法计算得到预测值,并将预测值和真实值做对比得出两者之间的差距。

        2、通过反向传播算法计算损失函数对每个参数的梯度,再根据梯度和学习率使用梯度下降算法更新每一个参数。


        梯度下降算法并不能保证被优化的函数达到全局最优解,可能只得到局部最优解,只有损失函数是凸函数才能保证达到全局最优解。


        结合梯度下降算法和随机梯度下降算法的优缺点,这里采用一小部分数据(batch)来进行梯度下降,所以神经网络的训练过程大致如下:

09

学习率的设置

在训练神经网络时,需要设置学习率控制参数更新的速度,学习率决定参数每次更新的幅度,如果幅度过大,可能导致参数在极优值的两侧来回移动,如果幅度过小,虽然能保证收敛性,但是会大大降低优化速度。所以学习率不能过大也不能过小。


指数衰减法设置学习率:

tf.train.exponential_decay()


实现了指数衰减学习率,通过这个函数,可以先使用较大的学习率快速得到一个比较优的解,然后随着迭代的继续逐步减小学习率,使得模型训练后期更加稳定。实例代码:

上述代码设定了初始的学习率为0.1,因为指定了staircase=True,所以每次训练100轮后学习率乘以0.96。

10

过拟合问题

举几个例子:

        1、过拟合就是你想多了,欠拟合就是你太天真。


        2、中国著名计算机科学家,中国机器学习之父,被业内尊称为中国图灵的鲁迅先生曾经描述过一个名为「中国人」的机器学习算法,在图像识别上严重的过拟合问题。其原文如下:

        一见短袖子,立刻想到白臂膊,立刻想到全裸体,立刻想到生殖器,立刻想到性交,立刻想到杂交,立刻想到私生子。中国人的想像惟在这一层能够如此跃进。《而已集·小杂感》


        3、遇到几个渣男就得出结论“男人没一个好东西”。


        4、举个物理学上的段子(转自他人博文),费米的话就是一个非常直观的理解:

        1953年春天,戴森和自己的学生利用赝标介子理论计算了介子与质子的散射截面,得到了与费米的实验观测值十分相符的结果。然而该理论需要4个自由参数,费米很不屑,讲了一句日后很著名的话:“我记得我的朋友约翰·冯·诺依曼(John von Neumann)曾经说过,用四个参数我可以拟合出一头大象,而用五个参数我可以让它的鼻子摆动。”

        有趣的是,2010年6月,尤根·迈尔(Jurgen Mayer)等三位德国分子生物学家在《美国物理学期刊》(American Journal of Physics)发表了题为“用四个复参数画出一头大象”的论文。他们发现,利用四个复参数可以大致勾勒出大象的形态,再引入一个复参数则可以让大象的鼻子摆动起来。


        5、直观图:

过拟合:

        当一个模型过为复杂之后,它可以很好的“记忆”每一个训练集上的随机噪声的部分而忘记要去“学习”训练数据中通用的趋势。

过拟合主要有两个原因造成:数据太少+模型太复杂


奥斯姆剃刀:

        这个原理称为“如无必要,勿增实体”,即“简单有效原理”。正如他在《箴言书注》2卷15题说“切勿浪费较多东西去做,用较少的东西,同样可以做好的事情。”


解决过拟合问题:

        增加数据,减少特征(特征提取),交叉验证,正则化。


正则化:

        避免过拟合问题最常用的方法,它的思想是在损失函数中加入刻画模型复杂度的指标。


        一般来说模型的复杂度由权重w决定,刻画模型复杂度的函数R(w)有两种,L1正则化和L2正则化。

        L1:R(w)=∑∣Wi∣;L2:R(w)=∑(∣Wi∣*∣Wi∣)


L1和L2正则化的差别很大:

        L1正则化会让参数变得更加稀疏,达到类似特征提取的功能,以及不可导,但是L2则相反。

11

滑动平均模型

        在采用随机梯度下降算法训练神经网络时,使用 tf.train.ExponentialMovingAverage 滑动平均操作的意义在于提高模型在测试数据上的健壮性(robustness)。


tf.train.ExponentialMovingAverage需要提供一个衰减率(decay)。该衰减率用于控制模型更新的速度。该衰减率用于控制模型更新的速度。


        ExponentialMovingAverage 对每一个(待更新训练学习的)变量(variable)都会维护一个影子变量(shadow variable)。影子变量的初始值就是这个变量的初始值。


shadow_variable=

    decay×shadow_variable+(1−decay)×variable


        由上述公式可知, decay 控制着模型更新的速度,越大越趋于稳定。实际运用中,decay 一般会设置为十分接近 1 的常数(0.99或0.999)。所有需要计算滑动平均的变量必须是实数型。


代码示例:




往期精彩文章(单击就可查看):

支持向量机原理篇之手撕线性SVM 

章神的私房菜之数据预处理 

深入浅出--基于密度的聚类方法 

贝叶斯系列-贝叶斯与其它统计流派的区别和联系




扫描燕哥微信号,

拉你进机器学习大牛群。

福利满满,名额已不多…

80%的AI从业者已关注我们微信公众号

       

       



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存