深度学习

线性模型与非线性模型

线性模型的图像是一条直线,非线性模型是曲线。

神经元

一个神经元的结构就是对所有输入参数再加上一个偏置求和,再经过一个激活函数输出。

单层神经网络

只有一个计算层而没有隐藏层的网络就是单层神经网络,也是感知机(Perceptron)。

感知机只有一个神经元,不管它会经过什么非线性的激活函数,x都只被一个W参数影响,因此它是线性模型。

感知机可以做线性分类任务,但不能解决非线性分类问题,尤其对XOR(异或)这样的简单分类任务都无法解决。

异或

input0
input1
result

0

0

0

0

1

1

1

0

1

1

1

0

层数与节点数

两层神经网络,也就是有1个隐藏层的神经网络,也是多层感知机

输入的x参数会受到输入层到隐藏层的W0参数和隐藏层到输出层的W1参数的影响,因此它可以拟合非线性数据。

使用类似于异或分布的数据集,使用单个神经元,可以看到,无法使用一条线来分割。

增加到两个神经元,可以看到有了两条线,中间部分的数据分类还是分错了。

增加到四个神经元,可以看到已经正确的分类了。

把4个神经元拆成2层,每层2个,多层神经网络也就是深度学习,可以学习到更深入的特征,可以看到这个网络识别出了矩形区域,参考使用的工具

激活函数

以 relu 激活函数为例,会把输入数据中小于 0 的部分全部变成 0,大于 0 的输入值还是输出原来的值。

sigmoid 激活函数,会把小于 0 的输入值压缩到 0.0-0.5之间,大于 0 的输入值压缩到 0.5-1.0之间。

为什么要用激活函数

神经元只是在做求和,如果不用激活函数,无论神经网络有多少层,输出都是输入的线性组合。

一个前馈神经网络如果满足

  1. 有足够的深度

  2. 至少一层具有任何一种‘挤压’ 性质的非线性激活函数的隐藏层

这两个条件就可以拟合任何函数

在分类的应用场景中也需要激活函数,比如二分类的应用,用 sigmoid 把输出结果压缩到 0 和 1 之间;在多分类的应用中用 softmax 作为激活函数,把概率最大的那个类别判定为该样本的类别;其他场景一般选用 relu 作为激活函数。

激活函数引出新的问题

以 sigmoid 和 tanh 激活函数为例,当输入值很大或者很小,那么函数的斜率就会接近 0,对应在神经网络中就是多元函数的梯度接近 0,这样就会引起梯度消失问题。

梯度消失

在神经网络中,当前面隐藏层的学习速率低于后面隐藏层的学习速率,即随着隐藏层数目的增加,分类准确率反而下降了。这种现象叫做消失的梯度问题,参考

产生原因

sigmoid 函数导数的图像:

sigmoid导数

该导数在σ′(0) = 1/4时达到最高。如果我们使用标准方法来初始化网络中的权重,那么会使用一个均值为0 标准差为1 的高斯分布。因此所有的权重通常会满足|wj|<1。从而有wjσ′(zj) < 1/4。这就是消失的梯度出现的本质原因。

根本的问题其实并非是消失的梯度问题或者激增的梯度问题,而是在前面的层上的梯度是来自后面的层上项的乘积。所以神经网络非常不稳定。唯一可能的情况是以上的连续乘积刚好平衡大约等于1,但是这种几率非常小。

梯度消失的解决方案

批标准化(Batch Normalization)

梯度剪切

梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。

正则化(regularization)

relu、elu等激活函数

relu

Relu:如果激活函数的导数为1,那么就不存在梯度消失的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。

relu的主要贡献在于:

  1. 解决了梯度消失、爆炸的问题 -- 计算方便,计算速度快 。

  2. 加速了网络的训练

同时也存在一些缺点:

  1. 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)

  2. 输出不是以0为中心的。

elu

elu激活函数是为了解决relu的0区间带来的影响。

学习率(Learning rate)

学习率作为监督学习以及深度学习中重要的超参数,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值。合适的学习率能够使目标函数在合适的时间内收敛到局部最小值。

学习率对深度网络的影响?

学习率如果过小,损失函数的变化速度很慢,会大大增加网络的收敛复杂度,并且很容易被困在局部最小值或者鞍点。

学习率如果过大,可能会使损失函数直接越过全局最优点,此时表现为loss过大或者为nan。

深度学习的三个步骤

定义网络模型

定义损失函数确定模型训练的方向

使损失函数的输出最小化。

定义优化器提升训练的速度

损失函数收敛的慢怎么办呢?优化器是解决方法之一。

梯度下降法

随机梯度下降法(stochastic gradient descent, SGD)

反向传播

数据集的预处理

批标准化(Batch Normalization)

过拟合

通常在数据量比较小而神经元比较多的时候,几乎可以精准的拟合到每一个样本数据,从而引起过拟合。

过拟合的解决方案

正则化(regularization)

Dropout

随机丢弃输入数据

批标准化(Batch Normalization)

Batch Normalization 总结

数据经过归一化和标准化后可以加快梯度下降的求解速度,它使得可以使用更大的学习率更稳定地进行梯度传播,甚至增加网络的泛化能力,参考

Batch Normalization 是什么?

Normalization是一个统计学中的概念,我们可以叫它归一化或者规范化,它并不是一个完全定义好的数学操作(如加减乘除)。它通过将数据进行偏移和尺度缩放调整,在数据预处理和网络中间层都频繁的被使用。

为什么可以这么做呢?

可以更容易发现数据之间的规律,比如把灰度图的 0-255 的像素值处理成 0、1 两种值。

再比如,在数字图像处理领域的线性对比度拉伸操作用以实现增强对比度的效果:

Batch Normalization 有哪些作用?

  • 加速模型训练

  • 解决梯度消失

  • 解决过拟合

网络的优化

模型

  • 用 ReLU 作为激活函数

  • 分类时用交叉熵作为损失函数

  • Batch Normalization

优化模型训练速度

  • SDG+mini-batch(动态学习率、Adam算法优先)

  • 每次迭代都重新随机排序

  • 数据预处理(标准归一化)

  • 参数初始化

正则化

  • L1, L2正则化

  • 权重衰减

  • 提前停止

  • 丢弃法

  • 数据增强

  • 标签平滑

Last updated

Was this helpful?