飞道的博客

Neural Network-神经网络算法本质

352人阅读  评论(0)

目录

1. Word2vec~single CBOW算法推导BP 

1.1 Lookup table

1.2 loss function

1.3 梯度下降和BP

1.3.1 BP Essence 

1.3.2 损失函数

 1.3.3 输出层 -> 隐藏层:更新输出权重矩阵W'

1) 先求Error对输出层输出分量uj的偏导数 -> 以便求得误差error。

2) 再求E关于权重矩阵W'的元素w'ij的导数。

3) 使用SGD更新权重w'ij

1.3.4 extension:梯度

 1.3.5 隐藏层 -> 输入层:更新隐藏权重矩阵W: 先求w误差e + 再更新w权重

1) 先求E对隐藏层输出hi的偏导,hi和所有输出神经元j都有连接,故求和计算收集到所有误差。

 2) 再求E对隐藏层权重矩阵W元素wki的偏导,hi和wki (k=1,2,3...V)权重相连。

3) 更新输入词向量​编辑

2. 实现神经网络

2.1 普通实现神经网络

2.2 tensorflow实现神经网络

2.3 pytorch实现神经网络

3. BP优化算法:SGD to Adam

3.1 Background

3.2 本质Essence

3.3 BP optimization algorithms

3.3.1 SGD

3.3.2 SGDM,SGM with Momentum,动量

3.3.3 SGD with Nesterov Acceleration

3.3.4 AdaGrad

3.3.5 AdaDelta/RMSProp

3.3.6 Adam

3.3.7 Nadam 

3.4 Why有人一直黑Adam,而喜欢SGD?

3.5 优化算法常用的tricks


1. Word2vec~single CBOW算法推导BP 

word2vec主要实现方式有:skip-gram和CBOW

  • CBOW的目的是根据上下文contextual words来预测当前中心词的概率,且上下文所有单词对当前中心词出现的概率影响权重是一样的,如在袋子中取词,取出足够数量的词就可以了,与取出词的先后顺序无关。
  • skip-gram是根据中心词来预测上下文语境词概率的。

其实single CBOW模型与单个skip-gram模型本质上是一样的,可以依据single CBOW理解skip-gram算法

1.1 Lookup table

因为one-hot向量只有一个元素i为1,其余为0。所以,one-hot vector与权重矩阵w相乘只是得到了W矩阵的第i行,这也叫查表操作lookup table。

1.2 loss function

对于单个样本(即输出向量的单个分量)而言,我们的目的是最大化输出向量的似然概率,即对于真实上下文词one-hot vector为1的第j个分量。

 最大化上下文单词的输出似然概率p(x) = 最小化 -p(x)

 根据多元交叉熵损失函数 ​​​​​​,yi为真实标签,pi为真实标签的概率。

拟合损失函数:

1.3 梯度下降和BP

1.3.1 BP Essence 

前馈:forward propagation,本质上是加权求和

BP: backward propagation,本质上是loss 对当前w求误差e+更新权重w

  • 误差e是通过损失函数loss function对神经元输出(输出层输出,或隐层输出)求偏导(这也叫梯度下降,梯度就是导数,最终的梯度=最终的导数=误差e),再对权重元素求导得到的。
  • 损失函数是根据前馈条件概率(或称为似然概率)真实向量分量tj得到的,比如,多元交叉熵损失函数-
  • 训练模型的目的是最大化似然概率函数,而最大化似然函数p 等价于 最大化logp 等价于 最小化 -logp 推出 多元交叉熵损失函数

1.3.2 损失函数

xj为输入one-hot向量第j个单元的值,yj为最终输入向量第j个单元的softmax概率值,tj是真实向量第j个元素的值。对于某个真实样本实例,在输出神经元上,只有一个分量tj=1,其余为0,不妨令这个分量为j*

假设输出词是第j*个词(这里可以说成是第j个单词,因为j这个分量对应的不仅是softmax输出向量的概率,还是词汇表索引值为j的单词,这个单词的one-hot向量在j位置为1,那么softmax输出向量第j单元的概率=one-hot向量j分量为1的概率=第j个词的概率),交叉熵损失函数为:

 

 1.3.3 输出层 -> 隐藏层:更新输出权重矩阵W'

1) 先求Error对输出层输出分量uj的偏导数 -> 以便求得误差error。

要注意这里的uj是U向量的第j个分量,对其进行求偏导,要注意与其他uj'区分开,不要在一块求导。

当j=j*时,tj=1,否则tj=0。(只对j*这一分量求偏导,其他分量作为常量)

 ej表示第j个词的error。

同理,当 j != j*时,tj=0。(此时,是对uj这一分量求导,uj*和其他u1等作为常量

2) 再求E关于权重矩阵W'的元素w'ij的导数

一个输出层权重矩阵元素w'ij只和隐藏层神经元hi、输出层为激活神经元uj相连接。

w'ij中i -> 对应着隐层输出h的i个分量;j -> 对应着输出层第j个神经元。

因为u的第j个单元分量

所以,

​​

uj是由hi乘以w'ij元素得到的。

3) 使用SGD更新权重w'ij

 

 这是一个概率元素一个概率元素的BP

  • 当j对应着j*时,ej<0,w'ij越来越大,即j单词为1的概率越来越大。
  • 当j对应着其他0元素时,ej>0,w'ij越来越小,即j单词为1的概率越来越趋向于0。

如果一次性更新输出神经元j的单词wj的输出词向量,也即w'的第j列(输出神经元j的误差ej传播到和它向量的权重向量)

 

从上式中可以看出,在更新权重参数的过程中,我们需要检查词汇表中的每一个单词,计算出它的激活输出概率yi(源于多分类softmax分母),并与期望输出tj(取值为0或1)进行比较。tj实际上就是真实标签,对于某个样本,若某个输出词为该样本的中心词,则为1,否则为0。 

1.3.4 extension:梯度

 梯度:即导数方向最大的那个导数,可以简单理解为“梯度就是导数”。

 1.3.5 隐藏层 -> 输入层:更新隐藏权重矩阵W先求w误差e + 再更新w权重

1) 先求E对隐藏层输出hi的偏导,hi和所有输出神经元j都有连接,故求和计算收集到所有误差

w'ij中i对应着隐层第i个分量,j对应着第j个输出神经元。

EHi是一个数值。标量EHi合并成一个向量EH,其含义就是输出权重每一列的加权和,而权重是error

EH是一阶N维向量,

 2) 再求E对隐藏层权重矩阵W元素wki的偏导,hi和wki (k=1,2,3...V)权重相连

证明:

,由此得到上式hi。

一个神经元i的权重和Σwx得到一个元素hi(隐藏输出N个)

所以,

隐层权重矩阵W维度V * N,hi对第k个求偏导。

对于某个样本而言,只有一个分量xk=1,其余为0,因此一个样本实际上只更新W的第k行向量。

上式梯度下降过程中,只有输入词Wi那一行的梯度会被更新,其他梯度因为保持不变。

3) 更新输入词向量

对于某个样本而言,上述x1, x2, ...,xv只有一个值为1。那么在 更新中,只有该行非零,其他行全为0。因此,我们只更新输入上下文词WI对应行的词向量。

该梯度更新过程可以使用同样的解释方法,,意味着:权重矩阵W的更新只是EHi的更新。

uj大于0或小于0的误差分解到w'ij的N个分量上

  • 如果过高地估计了某个单词wj(softmax输出概率分量)作为最终输出中心词的概率(即yj>tj),相应e分量ej大于0,则上式Vw更新相当于将输入上下文词向量第j个分量减去输出中心词向量的第j个分量,是的二者远离。
  • 如果过低地估计了某个单词wj(softmax输出概率分量)作为最终输出中心词的概率(即yj<tj),相应e分量ej小于0,则上式Vw更新相当于将输入上下文词向量第j个分量加上输出中心词向量的第j个分量,是的二者接近。

因此,上下文单词WI(contextual word)输入向量的更新取决于词汇表中所有单词预测为中心词的误差e。

2. 实现神经网络

2.1 普通实现神经网络

2.2 tensorflow实现神经网络

2.3 pytorch实现神经网络

3. BP优化算法:SGD to Adam

神经网络BP优化算法发展历程: SGD -> SGDM -> NAG -> AdaGrad -> AdaDelta -> Adam -> Nadam。

3.1 Background

神经网络模型效果不好的原因:

1) 数据问题:特征问题。影响约为80%

2) 模型问题:模型设计。

3) 模型优化算法问题。影响约为5%

3.2 本质Essence

BP: 求当前w误差e + 更新权重。

首先定义:待优化参数w,目标函数f(w),初始化学习率α

而后开始进行迭代优化,在每个epoch t:

1) 计算目标函数关于当前参数的梯度:

2) 根据历史梯度计算一阶动量和二阶动量:

3) 计算当前时刻的下降梯度:

 

4) 根据下降梯度进行更新: 

3.3 BP optimization algorithms

3.3.1 SGD

最简单的随机梯度下降:

problem: 下降速度慢,可能会在沟壑两边持续震荡,停留在一个局部最优点。

3.3.2 SGDM,SGM with Momentum,动量

solution:为了抑制SGD震荡,SGDM认为梯度下降过程可以加入惯性

一阶动量:

β1经验值为0.9,这意味着下降方向主要是此前积累的下降方向,并略微偏向当前时刻的下降方向。

3.3.3 SGD with Nesterov Acceleration

在SGD和SGDM基础上,进一步改进困在局部最优沟壑里面的震荡

NAG,Nesterov Accelerated Gradient

NAG不计算当前位置的梯度方向,而是计算如果按照累积动量走了一步,到那个时候的下降方向。

3.3.4 AdaGrad

二阶动量意味着“自适应学习率”优化算法时代的到来

Problem: SGD及其变种以同样的学习率更新每个参数

Idea:深度神经网络包含大量的参数,这些参数并不是总会用得到的(比如大规模embedding)

  • 对于经常更新的参数,我们已经积累了大量关于它的知识,不希望它被单个样本影响太大,希望学习速率慢一些。
  • 对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习率大一些。

二阶动量

 -> 下降速度:,此时学习率由α变成了

优点:这一方法在稀疏数据场景下表现非常好。

Problem:是单调递增的,会使得学习率单调递减至0,可能会使得训练过程提前结束,即便后续还有数据也无法学到必要的知识。

即AdaGrad单调递减的学习率过于激进!

3.3.5 AdaDelta/RMSProp

Solution: 改变二阶动量计算方法,不积累全部历史梯度,而只关注过去一段时间窗口(即Delta)的下降梯度

3.3.6 Adam

 Adam和Nadam是前述方法的集大成者。

  • SGDM在SGD基础上增加了一阶动量。
  • AdaGrad和AdaDelta在SGD基础上增加了二阶动量。

-> 一阶动量+二阶动量 -> Adam, Adaptive + Momentum

SGD的一阶动量:

AdaDelta的二阶动量:

根据经验值,β1=0.9,β2=0.999。

3.3.7 Nadam 

在Adam基础上

3.4 Why有人一直黑Adam,而喜欢SGD?

如果不想做精细的调整,那么Adam显然最便于直接拿来上手。

但这样的傻瓜方式并不一定能够适应所有的场合。

1) Adam可能不收敛。

2) 可能错过全局最优解。在一个维度极高的空间内,非凸的目标函数往往起起伏伏

        solution:前期Adam快速收敛,后期SGD慢慢寻找最优解

        ①when:前期每次迭代完都计算一下SGD的学习率,当SGD学习率基本不变的时候切换。

        ②切换后的学习率:SGD在Adam下降方向上进行正交投影,应该正好等于Adam的下降方向(含步长)。

3.5 优化算法常用的tricks

1)刚入门,用Adam

2)熟悉你的算法

3)了解数据,if稀疏 -> 自适应学习率算法

4)根据需求来选择,先Adam快速收敛,再SGD极致优化。

5)小数据集实验因为SGD收敛速度和数据集大小无关

6)不同算法组合。e.g. Adam + SGD,etc。

7)数据集一定充分打散(shuffle)

8)训练过程中持续监控训练数据集和验证数据集上的目标函数值以及精度,或AUC等指标的变化情况

  • 对训练数据的监控主要是保证模型得到充分的训练 -> 下降方向正确,且学习率足够高。
  • 对验证数据监控主要是为了避免出现过拟合。

9)制定一个合适的学习率衰减策略:定期衰减、AUC指标衰减、测试集指标不变时衰减。


转载:https://blog.csdn.net/qq_33419476/article/details/128234994
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场