5

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

 2 years ago
source link: https://redspider110.github.io/2019/05/17/0114-dl-machine-learning/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

发表于 2019-05-17

| 分类于 DeepLearning

| 阅读次数

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

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

监督学习/无监督学习

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

分类和回归

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

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

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

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

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

前馈神经网络

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

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

根据通用近似定理 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 ,则称其为右饱和。当同时满足左、右饱和时,就称为两端饱和。
  • Tanh 函数
    Tanh 函数也是 Sigmoid 型的一种,其曲线和数学表达式如下:
  • ReLU 函数
    ReLU: Rectified Linear Unit 修正线性单元,是目前深层神经网络中最常用的激活函数。

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) ,根据导数的链式法则:

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

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

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

常见损失函数

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

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

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

梯度消失/爆炸

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

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

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

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

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

神经网络优化

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

正则化 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 。

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

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

因此选择一个合适的学习率非常重要,但是实际训练中往往并不清楚该超参数设置成什么值,通常动态来设置学习率,即学习率退火 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

滑动平均 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 :模型很好适配训练样本,但在测试集上表现很糟,有一个很大的方差。

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

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK