机器学习、深度学习、神经网络

介绍机器学习,深度学习,神经网络基础。

基础

概念

AI: Artificial Intelligence 人工智能,它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。
ML: Machine Learning 机器学习,它是人工智能的子集;机器学习从有限的观测数据中学习或猜测出具有一般性的规律,并将这些规律应用到未观测样本上的方法。
DL: Deep Learning 深度学习,它是机器学习的子集;深度学习通过建立具有阶层结构的人工神经网络 ANNs:Artifitial Neural Networks ,在计算系统中实现人工智能。

0114-dl-machine-learning.jpg

监督学习/无监督学习

  • 监督学习 supervised learning
    每个输入数据都有对应标签 Label ,则为监督学习。监督学习中经典算法为分类、回归、统计,常见的为 KNN, SVN 等。常见应用场景有:垃圾邮件识别、图像识别、房价预测等等。
  • 无监督学习 unsupervised learning
    只有输入数据,没有任何标签,则为无监督学习。无监督学习有聚类 Clustering ,主成分分析 PCA 等。常见应用场景有:新闻聚合、内容挖掘等。
  • 半监督学习 semi-supervised learning
    对于半监督学习,其训练数据的一部分是有标签的,另一部分没有标签,而没标签数据的数量常常极大于有标签数据数量(这也是符合现实情况的)。常见应用场景:医疗影像、金融风控。
  • 强化学习 reinforcement learning
    强化学习是指没有任何的标签,但有一系列的奖励和惩罚规则,计算机通过不断尝试,从错误中学习,最后找到规律。常见应用场景有: AlphaGo ,在线广告系统,工业机器人等。

分类和回归

分类和回归的本质是一样的,都是对输入做出预测,其区别在于输出的类型:

  • 分类问题
    输出是离散型变量,如 +1、-1 ,是一种定性输出。例如预测明天天气是阴、晴还是雨。
  • 回归问题
    输出是连续型变量,是一种定量输出。例如预测明天的温度是多少度。

神经网络

人工神经网络 ANNs:Artificial Neural Networks 简称为神经网络 NN ,是神经科学家模仿人脑神经系统设计的数学模型;在机器学习领域,神经网络由很多人工神经元构成的网络结构模型,这些神经元之间的连接是可学习的参数。

0114-dl-machine-learning-nn-neuron.png

一个典型的神经元数学结构示例:

0114-dl-machine-learning-nn-neuron-structure.png

其中:输入为 x1, x2, ... ,权重为 w1, w2, ... ,偏置为 b ,激活函数为 f

前馈神经网络

前馈神经网络 Feedforward Neural Network 简称前馈网络,是人工神经网络的一种。在此种神经网络中,各神经元从输入层开始,接收前一级输入,并输出到下一级,直至输出层。整个网络中无反馈,可用一个有向无环图表示。
前馈神经网络采用一种单向多层结构。其中每一层包含若干个神经元,同一层的神经元之间没有互相连接,层间信息的传送只沿一个方向进行。其中第一层称为输入层。最后一层为输出层.中间为隐含层,简称隐层。隐层可以是一层,也可以是多层。

0114-dl-machine-learning-nn-feedforward-nn.png

神经网络的层数:一般不计入输入层,层数为 n 个隐藏层加上 1 个输出层。前馈神经网络使用数学表达式来表示为:

0114-dl-machine-learning-nn-feedforward-math.png

根据通用近似定理 Universal Approximation Theorem ,对于具有线性输出层和至少一个使用“挤压”性质的激活函数的隐藏层组成的前馈神经网络,只要其隐藏层神经元的数量足够,它可以以任意的精度来近似任何从一个定义在实数空间 Rd 中的有界闭集函数。也就是说,神经网络在某种程度上可以作为一个“万能”函数来使用,可以用来进行复杂的特征转换,或逼近一个复杂的条件分布。

常见激活函数

激活函数 Activation Function 在神经元模型中非常重要,增强了网络的表示能力和学习能力,激活函数具备的几点性质:

  • 连续并可导(允许少数点上不可导)的非线性函数。可导的激活函数可以直接利用数值优化的方法来学习网络参数
  • 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率
  • 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性

常见激活函数有: sigmoid, tanh, relu 等等。

  • Sigmoid 函数
    Sigmoid 型函数是指一类 S 型曲线函数,为两端饱和函数。常用的 Sigmoid 型函数有 Logistic 函数和 Tanh 函数;通常在实际使用中, Sigmoid 会特指为 Logistic 函数。
    对于函数 f(x):若 x → −∞ 时,其导数 f′(x) → 0 ,则称其为左饱和;若 x → +∞ 时,其导数 f′(x) → 0 ,则称其为右饱和。当同时满足左、右饱和时,就称为两端饱和。
    0114-dl-machine-learning-nn-activation-sigmoid.png
  • Tanh 函数
    Tanh 函数也是 Sigmoid 型的一种,其曲线和数学表达式如下:
    0114-dl-machine-learning-nn-activation-tanh.png
  • ReLU 函数
    ReLU: Rectified Linear Unit 修正线性单元,是目前深层神经网络中最常用的激活函数。
    0114-dl-machine-learning-nn-activation-relu.png

ReLU 激活函数的优缺点:

  • 优点
    ReLU 的神经元只需要进行加、乘和比较的操作,计算上更加高效。 Sigmoid 型激活函数会导致一个非稀疏的神经网络,而 ReLU 却具有很好的稀疏性,大约 50% 的神经元会处于激活状态。在优化方面,相比于 Sigmoid 型函数的两端饱和, ReLU 函数为左饱和函数,且在 x>0 时导数为 1 ,在一定程度上缓解了神经网络的梯度消失问题,加速梯度下降的收敛速度。
  • 缺点
    ReLU 函数的输出是非零中心化的,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率。此外在训练时,当输入小于 0 时,输出全部为 0 ,使得梯度为 0 ,这种现象称为死亡 ReLU 问题 Dying ReLU Problem

反向传播

反向传播 BP: BackPropagation 算法在 1970 年代提出,大概 1986 年由 Hinton 等人在神经网络上发扬光大。
给定一个样本 (x, y) ,通过神经网络模型后得到的输出为 ˆy ,假设损失函数为 L(y, ˆy) ,计算损失函数关于每个参数的导数。
对第 l 层中的参数 W(l)b(l) 计算偏导数, ∂L(y,ˆy)/∂W(l) 的计算涉及到矩阵的微分十分繁琐,因为满足 z(l) = W(l)a(l−1) + b(l) ,根据导数的链式法则:

0114-dl-machine-learning-nn-bp-chain.png

计算出每一层的误差项之后,我们就可以得到每一层参数的梯度;因此反向传播算法训练过程为:

  • 前馈计算每一层的净输入 z(l) 和激活值 a(l) ,直到最后一层
  • 反向传播计算每一层的误差项 δ(l)
  • 计算每一层参数的偏导数,并更新参数

使结果误差反向传播从而得出权重 w 调整的梯度。通过不断迭代,对参数矩阵进行不断调整后,使得输出结果的误差值更小,使输出结果与事实更加接近。

常见损失函数

损失函数 loss function ,有时也称为残差函数 error function 或者代价函数 cost function ,就是用来表现预测与实际数据的差距。反向传播算法的目标是将损失函数降到最低。
损失函数的计算有很多方法,常见的有:均方误差 MSE ,平均绝对误差 MAE ,交叉熵 CE 等等。

  • 均方误差 MSE: Mean Square Error
    也称为 L2 损失函数,计算方法:目标值和预测值之差的平方再求平均:
    0114-dl-machine-learning-nn-loss-mse.png
  • 平均绝对误差 MAE: Mean Absolute Error
    也称为 L1 损失函数,计算方法:目标值与预测值之差绝对值的和,表示了预测值的平均误差幅度,而不需要考虑误差的方向:
    0114-dl-machine-learning-nn-loss-mae.png
  • 交叉熵 CE: Cross Entropy
    交叉熵损失函数是一个平滑函数,用于度量两个概率分布间的差异性信息,交叉熵越低,策略越好。
    如下图所示中:C 是类别数(比如猫、狗、其他动物等), n 是总样本, yc,i 是第 i 个样本真实类别 cpc,i 是第 i 个样本预测为类别 c 的概率。
    0114-dl-machine-learning-nn-loss-ce.png

在分类应用中:交叉熵损失函数通常和 Softmax 多分类器或者 Sigmoid 二分类器一起使用。

梯度消失/爆炸

在深度神经网络中的梯度是不稳定的,在靠近输入层的隐藏层中可能会出现梯度消失 Vanishing Gradient Problem 或梯度爆炸 Exploding Gradient Problem。梯度不稳定的原因是,在反向传播过程中,前面层上的梯度是来自后面层上梯度的乘积。当神经网络层数越多时,梯度就会越不稳定。

  • 梯度消失
    前面的网络层比后面的网络层梯度变化更小,故权值变化缓慢,从而引起了梯度消失问题,也称为梯度弥散。
  • 梯度爆炸
    前面的网络层比后面的网络层梯度变化更快,引起了梯度爆炸的问题。

根据导数链式法则,梯度的变化由激活函数决定, Sigmoid 激活函数很容易出现梯度消失现象,所以通常使用 ReLU 激活函数。

优化器

反向传播中,优化器提供了计算损失函数梯度更新的方法,常见优化器有:梯度下降 gradient descentmomentum 优化器, adam 优化器,等等,参考论文:

下图是常见优化器的比较:

0114-dl-machine-learning-nn-bp-descent-sgd-optimization-contours.gif

0114-dl-machine-learning-nn-bp-descent-sgd-optimization-point.gif

神经网络优化

过拟合

过拟合 overfit :神经网络模型在训练数据集上的准确率较高,但在新的数据进行预测或分类时准确率较低,说明模型的泛华能力差。

0114-dl-machine-learning-nn-overfit.png

正则化

正则化 Regularization :用于增加训练误差为代价来减少测试集上的误差的策略或技术;常见的技术有:

  • 数据集增强 Data Agumentation
  • 提前终止 Early Stopping
  • 参数范数惩罚 Parameter Norm Penalties
  • Dropout

参数范数惩罚:在损失函数中添加一个惩罚项,约束模型的学习能力;即给每个参数权重 w 进行惩罚,引入模型复杂度指标,从而抑制模型噪声,减小过拟合。常见的有 L1, L2 正则化,其中 L1 正则化惩罚的是权重 w 的绝对值,在损失函数求导数时,意味着如果 w 为正数时, w 减小趋于 0 ;如果 w 为负数时, w 增加趋于 0 ; L1 的思路就是把权重往 0 靠,从而降低网络复杂度。通常在需要压缩模型时使用 L1 ,其他情况使用 L2 。其中 λ 是正则化超参数,通常设为 0.001 。

0114-dl-machine-learning-nn-regularizer.png

Dropout 通过改变神经网络的结构来增强网络的泛化能力。在用前向传播算法和反向传播算法训练模型时,随机的从全连接 DNN 网络中去掉一部分隐含层的神经元; Dropout 可以看作是模型组合,每次生成的网络结构都不一样,通过组合多个模型来减少过拟合。

0114-dl-machine-learning-nn-dropout.gif

学习率

学习率 Learning rate :是一个超参数。在训练过程中,参数的更新向着损失函数梯度下降的方向,学习率决定了参数每次更新的幅度。当学习率选择过大时会出现震荡不收敛;选择过小时会出现收敛速度慢的情况。

0114-dl-machine-learning-nn-learning.png

因此选择一个合适的学习率非常重要,但是实际训练中往往并不清楚该超参数设置成什么值,通常动态来设置学习率,即学习率退火 learning rate annealing :先从比较高的学习率开始,然后在训练中慢慢降低学习率。常有两种实现方法:

  • 线性衰减
    每经过 n 轮训练后,将学习率减少一半。
  • 指数衰减
    每经过 n 轮训练后,学习率指数改变。这里有一个 tensorflow 中提供的计算公式:
    decayed_learning_rate = learning_rate*decay_rate^(global_step/decay_steps) ,其中 learning_rate, decay_rate 是两个超参数,分别表示初始学习率和底数; global_step 表示当前训练的轮数, decay_steps 表示多少轮更新一次学习率。
    初始学习率和底数通常设置为 learning_rate=0.001, decay_rate=0.99
    0114-dl-machine-learning-nn-learning-exponential-decay.png

滑动平均

滑动平均 ema:exponential moving average 或者叫做指数加权平均 exponentially weighted moving average ,可以用来估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关。滑动平均记录了一段时间内模型中所有参数 wb 各自的平均值,利用滑动平均值可以增强模型的泛化能力。
滑动平均对每一个变量会维护一个影子变量 shadow variable ,这个影子变量的初始值就是相应变量的初始值,而每次运行变量更新时,影子变量的值会被更新;滑动平均影子计算公式:
shadow_variable = decay * shadow_variable + (1 - decay) * variable ,其中 decay 是超参数,表示衰减率,决定了影子变量的更新速度; decay 越大影子变量越趋于稳定。在实际运用中,decay 一般会设成非常接近 1 的数,比如 0.99 , 0.999 等等。

tensorflow 中为了使得影子变量在训练前期可以更新更快,滑动平均还提供了 num_updates 参数动态设置 decay 的大小。衰减率计算公式:
decay=min(decay, (1 + num_updates) / (10 + num_updates))num_updates 表示多少轮更新一次。

偏差和方差

偏差 Bias :度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。
方差 Variance :度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。
欠拟合 underfit :模型不能适配训练样本,有一个很大的偏差。
过拟合 overfit :模型很好适配训练样本,但在测试集上表现很糟,有一个很大的方差。

下图很好的说明的偏差和方差和模型选择的关系:

0114-dl-machine-bias-variance.jpg

模型越复杂,拥有更好的数据拟合能力,获得更低的偏差,但是会导致过拟合而出现方差过大。
在模型评估中,根据偏差和方差结果绘制出的图形可以看出,针对偏差和方差过大解决方法如下:

  • 偏差过大,即欠拟合
    • 寻找更好的特征(具有代表性)
    • 用更多的特征(增大输入向量的维度,增加模型复杂度)
  • 方差过大,即过拟合
    • 增大数据集合,使用更多的数据,噪声点比减少(减少数据扰动所造成的影响)
    • 减少数据特征,减少数据维度,高维空间密度小(减少模型复杂度)
    • 正则化方法
    • 交叉验证法

偏差和方差用来描述模型的好坏,以及模型需要优化的方向。

参考文档

0%