赞
踩
首先来想想循环神经网络的结构是什么样的。
a. 它是由几十个甚至上百的神经元连接而成,这些神经元都是串行连接的。
b. 当计算完损失函数之后,需要逆向去更新神经网络中的权重。而且是从神经网络的尾部向前去更新,而rnn中输出值转隐层的激活函数一般使用的双曲正切函数tanc。其实在一般的rnn网络结构当中存在着3个权重参数,输出转隐层的参数w,隐层转隐层的参数的参数u,隐层转输出层的参数v。其实像v这种不依赖之前状态的参数,可以直接求导得到梯度。而像w,u这种依赖之前状态的参数需要连续求导得到。而像tanc和sigmoid函数的导函数都是要小于1的,而小于1的数如果连乘太多的话就会越来越趋近0。
下面是tanc的函数和导函数的图:
有人说是否可以使用relu函数代替tanc函数作为激活函数。这也是不行的,因为relu函数大于0时,函数的导数值是1。如果很多w的系数大于1,连乘之后就会产生梯度爆炸的结果。
relu函数如图所示
那么lstm又是如何解决梯度消失问题的呢?
这个问题在我看过很多的文章之后依然是非常模糊。如果想通过求导的方式去证明太麻烦了,非常难理解。但又有很多人说什么lstm的机构天然就是可以防止梯度消失的情况。
下面的解释可以稍微让人理解一下,什么lstm是怎样防止梯度消失和控制梯度下降。
但是在其他路径上,LSTM 的梯度流和普通 RNN 没有太大区别,依然会爆炸或者消失。由于总的远距离梯度 = 各条路径的远距离梯度之和,即便其他远距离路径梯度消失了,只要保证有一条远距离路径(就是上面说的那条高速公路)梯度不消失,总的远距离梯度就不会消失(正常梯度 + 消失梯度 = 正常梯度)。因此 LSTM 通过改善一条路径上的梯度问题拯救了总体的远距离梯度。
同样,因为总的远距离梯度 = 各条路径的远距离梯度之和,高速公路上梯度流比较稳定,但其他路径上梯度有可能爆炸,此时总的远距离梯度 = 正常梯度 + 爆炸梯度 = 爆炸梯度,因此 LSTM 仍然有可能发生梯度爆炸。不过,由于 LSTM 的其他路径非常崎岖,和普通 RNN 相比多经过了很多次激活函数(导数都小于 1),因此 LSTM 发生梯度爆炸的频率要低得多。实践中梯度爆炸一般通过梯度裁剪来解决。
总结:
1. 为什么rnn会发生梯度消失的情况?当神经元构成的链太长,当使用梯度下降的方式来更新,神经元链中靠前面部分的神经元参数时,因为隐层之间的信息传递,必定会通过一个tanc函数处理,而tanc函数的导数是[0,1]之间的数,如果有很多个这样的数相乘的话,就会使得梯度趋近于0.
2.为什么LSTM可以解决梯度消失的问题?首先要知道梯度消失会导致什么问题,它导致的问题其实是权重w几乎不更新,这样就很难找到一个合适的权重w,去映射输入值与输出值之间的关系。lstm能够解决这个问题的巧妙之处在出(相对rnn而言),神经元之间的连接不仅仅有h, 还有信息C, h在神经元之间的传递会经过sigmoid函数处理,但是C不会。所以与C相关的权重W的更新不会因为神经元链过长而产生梯度消失的现象(指的是,遗忘门,信息增益门的权重w)。但是输出门的权重w,是可能会出现梯度消失的。所以可以说是高速通道C,掩盖了通道h的梯度消失的现象,所以从整体上看是没有梯度消失现象的。
首先交叉熵损失函数如下所示:
交叉熵损失函数可以用在二分类算法中的损失函数。其实由上述的公式可以知道不管是正例还是反例,当预测正确的可能性越高产生的损失就越低。它经常会和sigmoid函数一起使用。
除了输入和输出层外,使其它层的神经元的个数暂时性的减少,以达到一致过拟合的一种方法。
在介绍gbdt算法前,有必要先简单介绍一下boosting算法,它每步会产生一个弱预测模型,最后会将所有的弱预测模型累加汇总得到一个总模型,每个弱预测模型的生成都会依赖损失函数梯度递减的方式生成的,boosting被称为提升学习。
gdbt和adaboost都是boosting提升学习中的方法,不同的adaboost可以采用的弱分类器可以有很多。但是gbdt只能采用决策树(CART)作为弱分类器。GBDT采用的损失函数依然是最小二乘的损失函数。
xgboost本身就是GBDT算法,它是在gbdt算法的基础上进行了一系列的优化,从而使算法拥有了更好的性能。
下面简单总结一下,GBDT算法和xgboost之间的不同点:
除了算法上与传统的GBDT有一些不同外,XGBoost还在工程实现上做了大量的优化。总的来说,两者之间的区别和联系可以总结成以下几个方面。
在了解随机森林算法前,我们先来了解一下bagging算法。bagging算法是集成算法下面的一个分支,与boosting方法合称为集成学习算法下面的两大分支。bagging它综合多个弱分类器形成一个强分类器,弱分类器之间没有联系,它的多样性体现在分类器的选择和样本的选择上。而随机森林算法,它是在bagging的算法基础上做了改动,引入了特征的随机选择。相对于bagging而言,它的效率和准确率都会更高。
boosting集成学习,由多个相关联的决策树联合决策,什么叫相关联,举个例子,有一个样本[数据->标签]是[(2,4,5)-> 4],第一棵决策树用这个样本训练得预测为3.3,那么第二棵决策树训练时的输入,这个样本就变成了[(2,4,5)-> 0.7],也就是说,下一棵决策树输入样本会与前面决策树的训练和预测相关。
与之对比的是random foreast(随机森林)算法,各个决策树是独立的、每个决策树在样本堆里随机选一批样本,随机选一批特征进行独立训练,各个决策树之间没有啥毛线关系。
word2vec也叫做词嵌入表示,它能用密集矩阵表示一个词,相对于独热编码用稀疏矩阵表示词而言,他能大大的减少内存的使用量和运算的复杂度。
CBOW ,连续词袋法,它是word2vec方法中的一种。它的核心思想是利用它周边的词来预测该词。
skip-gram,的核心思想正好相反,它是利用一个词去预测它周边的词。
那么word2vec是如何做到减少矩阵维度的呢?
如上图所示,这i种场景是利用一个单词来预测一个单词的情况,它是利用了神经网络结构中隐层的性质,隐层可以不受输入层和输出层的影响自由控制大小。这里的隐层就是word2vec最终的矩阵表示。而利用多个单词来预测一个单词的情况如下图所示,他其实是将所以隐层的参数相加得到的。
word2vec这里还有一个知识点就是,它使用的损失函数是nec函数。在训练词嵌入矩阵的时候,它使用2分类问题去代替n分类问题。nec损失函数会随机从词库选取一些单词作为负例,其他的单词作为正例。我认为之所以这样做可行是因为,我们现在要做的事情是想用一个矩阵去表示单词而已,并不是真正做预测。所以这个简单的二分类可以满足我们的要求。
AdaGrad算法介绍
表示第i个参数的梯度,对于经典的SGD优化方法,参数θth的更新为:
再来看AdaGrad算法表示为:
其中,r为梯度累积变量,r的初始值为0。ε为全局学习率,需要自己设置。δ为小常数,为了数值稳定大约设置为。
AdaGrad算法分析
(1)从AdaGrad算法中可以看出,随着算法不断迭代,r会越来越大,整体的学习率会越来越小。所以,一般来说AdaGrad算法一开始是激励收敛,到了后面就慢慢变成惩罚收敛,速度越来越慢。
(2)在SGD中,随着梯度的增大,我们的学习步长应该是增大的。但是在AdaGrad中,随着梯度g的增大,我们的r也在逐渐的增大,且在梯度更新时r在分母上,也就是整个学习率是减少的,这是为什么呢?
这是因为随着更新次数的增大,我们希望学习率越来越慢。因为我们认为在学习率的最初阶段,我们距离损失函数最优解还很远,随着更新次数的增加,越来越接近最优解,所以学习率也随之变慢。
(3)经验上已经发现,对于训练深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习率过早和过量的减小。AdaGrade在某些深度学习模型上效果不错,但不是全部。
sgd是随机梯度下降,使用一个样本来求梯度,很省内存,但
是不稳定。
gd是梯度下降,使用所有的样本来求梯度。
bgd是小批量梯度的下降,使用一部分样本来求梯度,普遍采用bgd比较多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。