×

深度学习-常用概念

96
翁支和
2018.01.20 14:16* 字数 4576
常用概念

(1)神经元

神经元将输入数据经过非线性激活函数(logistic sigmoid 函数)转换后进行输出,一般情况下一个神经元会有几个输入连接和几个输出连接


单个神经元

(2)输入层

有多个输入值组成,每个输入必须是线性无关的

(3)隐藏层

区别于输入和输出层。输入值进入隐藏层经过加权计算与及一组非线性函数(大多数时候非线性)转换后,将这些值输出传递给下一层。


神经网络示意图

(4)批标准化

批标准化(Batch Normalization )简称BN算法,是为了克服神经网络层数加深导致难以训练而诞生的一个算法。根据ICS理论,当训练集的样本数据和目标样本集分布不一致的时候,训练得到的模型无法很好的泛化。而在神经网络中,每一层的输入在经过层内操作之后必然会导致与原来对应的输入信号分布不同,,并且前层神经网络的增加会被后面的神经网络不断的累积放大。这个问题的一个解决思路就是根据训练样本与目标样本的比例对训练样本进行一个矫正,而BN算法(批标准化)则可以用来规范化某些层或者所有层的输入,从而固定每层输入信号的均值与方差。

批标准化一般用在非线性映射(激活函数)之前,对y= Wx + b进行规范化,使结果(输出信号的各个维度)的均值都为0,方差为1,让每一层的输入有一个稳定的分布会有利于网络的训练

在神经网络收敛过慢或者梯度爆炸无法训练的情况下都可以尝试

把数据分成小批小批(规模为m的小批量数据 x1 ... m)进行随机梯度下降的计算。在每批数据进行前向传递的时候, 对每一层都进行标准化处理

(5)损失最小化函数、目标最大化函数

  • 最大似然估计(MLE)

    定义:在已知试验结果(即是样本)的情况下,用来估计满足这些样本分布的参数,把可能性最大的那个参数Θ作为真实Θ*的参数估计。

    许多损失函数都是最大似然的变形,例如最小二乘损失函数、交叉熵等。

    给定结果x的参数值(或参数值向量)θ的可能性等于给定那些参数值的观察结果假设的概率(密度),即:


    似然函数的自然对数称为对数似然函数,使用起来更方便,因为对数是一个单调递增的函数,所以函数的对数在函数本身的相同点上达到最大值,因此对数似然性可以代替最大似然估计和其他相关技术中的似然性。

    一般来说,对于一组固定的数据和潜在的统计模型,最大似然法选择使似然函数最大化的模型参数值的集合。直观地说,这使选定模型与观测数据的“一致性”最大化,而对于离散的随机变量,它可以最大化观测数据在所得分布下的概率。最大似然估计给出了一个统一的估计方法,在正态分布和许多其他的问题的中,都可以用这个计算步骤,具体步骤如下:(具体的数学公式此处不进行一一罗列,有兴趣的同学可自行查找)

    1. 写出似然函数;
    2. 对似然函数取对数,并整理;
    3. 求导数 ;
    4. 解似然方程 。
  • 交叉熵(Cross-Entropy)

    交叉熵可以用来定义机器学习和优化中的损失函数。真正的概率pi是正确的标签,给定的分布qi是当前模型的预测值。



    交叉熵误差函数和逻辑回归


  • 逻辑斯蒂(Logistic)

    逻辑斯蒂损失函数被定义为:


  • 二次(Quadratic)

    二次损失函数的使用比较常见,例如所用到的最小二乘法。由于方差的对称性,它通常在数学上比其他损失函数更容易处理:目标上方的误差与目标下方误差的大小是一样的。如果目标是t,那么二次损失函数是:


  • 0-1损失函数

    在统计和决策理论中,常用的损失函数是0-1损失函数


  • 铰链损失函数(Hinge Loss)

    铰链损失是用于训练分类器的损失函数。对于预期输出t =±1和分类器得分y,预测y的铰链损失定义为:


  • 指数

  • Hellinger距离

    它用于量化两个概率分布之间的相似性。这是一种f-散度。



    为了用测度理论来定义Hellinger距离,设P和Q代表关于第三个概率测度λ的绝对连续的两个概率测度。P和Q之间的Hellinger距离的平方被定义为数量

  • 库尔贝克 - 莱布勒尔转移(Kullback-Leibler Divengence)

    衡量一个概率分布如何偏离第二个预期概率分布的度量。应用包括表征信息系统中的相对(香农)熵,连续时间序列中的随机性以及比较推断的统计模型时的信息增益。


    离散型

    连续型
  • 板仓 - 斋藤的距离(Itakura–Saito distance)

    是原始频谱P(ω)与该频谱的近似值P ^(ω)之间的差的量度。虽然这不是一种感性的措施,但它是为了反映感性(不一致)的相似性


(6)正则化

  • L1范数

    曼哈顿距离

    L1范数也被称为最小绝对偏差(LAD),最小绝对误差(LAE)。基本上是最小化目标值和估计值之间绝对差值(S)的总和。


  • L2范数

    欧几里德距离

    L2范数也被称为最小二乘。基本上是使目标值和估计值之间的差值(S)的平方和最小化:


  • 提前停止

    提前停止规则提供了在学习者开始过度训练之前可以运行多少次迭代,然后停止算法。

  • Dropout

    是一种正则化技术,通过防止复杂的训练数据的适应性来减少神经网络中的过度拟合。这是用神经网络进行模型平均的一种非常有效的方法。术语“dropout”是指在神经网络中舍弃神经元(包括隐藏的或可见)

  • 列稀疏正则化(Sparse regularizer on columns)

    这个正则化定义了每列的L2范数和所有列的L1范数。这可以通过近端方法来解决。


  • Nuclear norm regularization
  • 均值约束正则化

    这个正则化将每个任务所学习到的功能限制在与所有任务的功能的整体平均值类似。这对于表达每个任务预期与其他任务相似的先验信息是有用的。一个例子是预测一天中不同时间测量的血液中铁的水平,其中每个任务代表不同的人。


  • 聚类均值约束正则化

    这个正则化与平均约束正则化相似,但是强化了同一个集群内任务之间的相似性。这可以捕捉更复杂的先前信息。这种技术已经被运用在Netflix的决策中。


  • 基于图形的相似性

    比上面更普遍的是,任务之间的相似性可以通过函数来定义。正则化支持模型学习类似的功能任务。


(7)激活函数

给定一个输入或一组输入,定义该节点的输出。

各种激活函数

  • ReLU
  • Sigmoid / Logistic
  • Binary(二进制)
  • Tanh(正切)
  • Softplus
  • Softmax
  • Maxout
  • Leaky ReLU, PReLU, RReLU, ELU, SELU, and others.

(8)学习率

神经网络通常通过权重梯度下降来训练。这意味着在每次迭代中,我们使用反向传播计算损失函数相对于每个权重的导数,并从该权重中减去损失函数的导数。

但是,如果你真的尝试这样做,权重会在每次迭代中变化太多,这将使他们“过度纠正”,而损失实际上会增加或偏离。所以在实践中,通常会把每个导数乘以一个称为“学习率”的小数值,再对相应的权重做更新。

学习率使用技巧

  • 最简单的方法:保持固定,并使用相同的所有参数。
  • 更好的是允许学习率降低,如:验证误差停止改进时,减少0.5

    由于理论上的收敛保证,O(1 / t)减少,ε0是超参数,τ和t是迭代次数。

    更好的方法:通过使用AdaGrad,无需手动设置学习率

(9)优化- 推荐文章

  • 梯度下降

    是求一个函数最小值的一阶迭代优化算法。为了使用梯度下降找到函数的局部最小值,可以采取与当前点的函数的梯度(或近似梯度)的负值成比例的步骤。如果取而代之的是与梯度正相关的步骤,则接近该函数的局部最大值,称该过程为梯度上升。

  • 批量梯度下降

    每次使用全量的训练集样本来更新模型参数,即: θ=θ−η⋅∇θJ(θ)

    批量梯度下降每次学习都使用整个训练集,因此其优点在于每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点(凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点),但是其缺点在于每次学习时间过长,并且如果训练集很大以至于需要消耗大量的内存,并且全量梯度下降不能进行在线模型参数更新。

  • 随机梯度下降(SGD)

    随机梯度下降算法每次从训练集中随机选择一个样本来进行学习,即: θ=θ−η⋅∇θJ(θ;xi;yi)

    批量梯度下降算法每次都会使用全部训练样本,因此这些计算是冗余的,因为每次都使用完全相同的样本集。而随机梯度下降算法每次只随机选择一个样本来更新模型参数,因此每次的学习是非常快速的,并且可以进行在线更新。

    随机梯度下降最大的缺点在于每次更新可能并不会按照正确的方向进行,因此可以带来优化波动(扰动)

  • 小批量随机梯度下降(SGD)

    Mini-batch 梯度下降综合了 batch 梯度下降与 stochastic 梯度下降,在每次更新速度与更新次数中间取得一个平衡,其每次更新从训练集中随机选择 m,m<n 个样本进行学习,即:θ=θ−η⋅∇θJ(θ;xi:i+m;yi:i+m)

    相对于随机梯度下降,Mini-batch梯度下降降低了收敛波动性,即降低了参数更新的方差,使得更新更加稳定。相对于全量梯度下降,其提高了每次学习的速度。并且其不用担心内存瓶颈从而可以利用矩阵运算进行高效计算。一般而言每次更新随机选择[50,256]个样本进行学习,但是也要根据具体问题而选择,实践中可以进行多次试验,选择一个更新速度与更次次数都较适合的样本数。mini-batch梯度下降可以保证收敛性,常用于神经网络中。

  • 动量

    动量是一种基于梯度的优化算法,将以前更新的一小部分添加到当前的更新。当渐变保持指向相同的方向时,这将增加朝向最小的步骤的尺寸。

  • NAG

    涅斯捷罗夫梯度加速(NAG),不仅增加了动量项,并且在计算参数的梯度时,在损失函数中减去了动量项,即计算∇θJ(θ−γνt−1),这种方式预估了下一次参数所在的位置。即:νt=γνt−1+η⋅∇θJ(θ−γνt−1),θ=θ−νt


    详细介绍可以参见Ilya Sutskever的PhD论文[9]。假设动量因子参数γ=0.9,首先计算当前梯度项,如上图小蓝色向量,然后加上动量项,这样便得到了大的跳跃,如上图大蓝色的向量。这便是只包含动量项的更新。而NAG首先来一个大的跳跃(动量项),然后加上一个小的使用了动量计算的当前梯度(上图红色向量)进行修正得到上图绿色的向量。这样可以阻止过快更新来提高响应性,如在RNNs中。

    通过上面的动量与NAG两种方法,可以做到每次学习过程中能够根据损失函数的斜率做到自适应更新来加速SGD的收敛。下一步便需要对每个参数根据参数的重要性进行各自自适应更新。

  • Adagrad

    每个参数的自适应学习速率

    Adagrad也是一种基于梯度的优化算法,它能够对每个参数自适应不同的学习速率,对稀疏特征,得到大的学习更新,对非稀疏特征,得到较小的学习更新,因此该优化算法适合处理稀疏特征数据。Dean等发现Adagrad能够很好的提高SGD的鲁棒性,google便用起来训练大规模神经网络(看片识猫:recognize cats in Youtube videos)。Pennington等在GloVe中便使用Adagrad来训练得到词向量(Word Embeddings), 频繁出现的单词赋予较小的更新,不经常出现的单词则赋予较大的更新。

    Adagrad主要优势在于它能够为每个参数自适应不同的学习速率,而一般的人工都是设定为0.01。同时其缺点在于需要计算参数梯度序列平方和,并且学习速率趋势是不断衰减最终达到一个非常小的值。下文中的Adadelta便是用来解决该问题的。

  • Adam

    也是一种不同参数自适应不同学习速率方法,与Adadelta与RMSprop区别在于,它计算历史梯度衰减方式不同,不使用历史平方衰减,其衰减方式类似动量,如下:
    mt=β1mt−1+(1−β1)gt
    vt=β2vt−1+(1−beta2)g2t

    mt与vt分别是梯度的带权平均和带权有偏方差,初始为0向量,Adam的作者发现他们倾向于0向量(接近于0向量),特别是在衰减因子(衰减率)β1,β2接近于1时。为了改进这个问题,
    对mt与vt进行偏差修正(bias-corrected):
    mt^=mt1−betat1
    vt^=vt1−betat2

    最终,Adam的更新方程为:
    θt+1=θt−ηvt−−√+ϵmt

(10)权重初始化

  • 全零初始化

    这么做不大符合要求,因为如果网络中的每个神经元计算相同的输出,那么它们也将在反向传播期间计算相同的梯度并且经历完全相同的参数更新。换句话说,如果它们的权重被初始化为相同,那么神经元之间不存在不对称的数据来源。

  • 用小随机数进行初始化

    因此,你仍然希望权重非常接近于零而不是完全相同的零。通过小随机数初始化的方式,你可以将这些神经元随机分配到非常接近零的小数字,并起到了对称性破坏的目的,这使得神经元在开始时都是随机的和独特的,所以他们将拥有差异的更新,并将自己整合成完整网络的不同部分。

    权重的初始化可以简单地从零均值和单位标准差的正态分布中绘制值。也可以使用统一分布的小数字,但这种方法在实践中最终表现的效果似乎相对差一些。

  • 方差调整- 推荐文章

    上述方法的一个问题是随机初始化神经元的输出的分布会随输入数量增长而变化。事实证明,你可以通过缩放其权重向量的扇入的平方根(即其输入的数量)来将每个神经元的输出的方差标准化为1,这确保了网络中的所有神经元最初具有近似相同的输出分布,并且提高了收敛速度。

其他参考文章

深度学习思维导图

深度学习
Web note ad 1