补充:
w的更新方向由 决定,而 对所有的w_i是常数,所以实际上w的更新方向由 决定。
如果有一个神经元为:
现在假设
和
的最优解分别是
和
且
,所以我们希望我们希望
适当增大,但希望
适当减小,但在 Sigmoid 函数中,输出值恒为正。这也就是说,如果上一级神经元采用 Sigmoid 函数作为激活函数。它的更新方向始终是相同的,我们只能走Z字型去逼近最优解,减慢了收敛的速度。
batch gradient descent
Stochastic gradient descent
每一个样本执行一次梯度更新
Mini-batch gradient descent
它是上两种方法的折中,选取一部分样本计算梯度,进行参数更新。
Momentum
SGD很难从陡峭的区域上跳出来,Momentum 是一种有助于在相关方向上加速SGD并抑制振荡的方法。
当力(梯度)改变时就会有一段逐渐加速或逐渐减速的过程,我们通过引入动量就可以加速我们的学习过程,可以在鞍点处继续前行,也可以逃离一些较小的局部最优区域。速度v是累积各轮训练参数的梯度。
或者参考以下:
上面的第一个等式就是动量,动量等式由两部分组成,第一项是上一次迭代的动量,乘以“动量系数”
。如果我们将v的初始值设置为0并选择我们的系数为0.9,则后续更新方程式将如下所示。
我们看到,后续的更新保留了之前的梯度,但最近的梯度权重更高。
下面我们来看看动量法如何帮助我们缓解病态曲率的问题。病态曲率就是下图,A的梯度方向更加靠近w1的方向,因为w1的方向梯度下降更大,但是实际上我们要的是穿越山沟。
下图中,梯度大多数发生更新在字形方向上,我们将每次更新分解为W1和W2方向上的两个分量。如果我们分别累加这些梯度的两个分量,那么W1方向上的分量将互相抵消,而W2方向上的分量得到了加强。
AdaGrad
前面的随机梯度和动量随机梯度算法都是使用全局的学习率,所有的参数都是统一步伐的进行更新的,上面的例子中我们是在二维权值的情况,如果扩展到高维,大家可想而知,我么你的优化环境将很复杂,比如你走在崎岖额深山老林林,如果只是快速奔跑向前(动量学习),那我们可能会摔的头破血流,怎么办呢如果可以针对每个参数设置学习率可能会更好,让他根据情况进行调整。
AdaGrad其实很简单,就是将每一维各自的历史梯度的平方叠加起来,然后更新的时候除以这个历史梯度的累加和即可。
定义首先一个量 用于累加梯度的平方,如下: 平方的原因是去除梯度符号的干扰,防止抵消,更新时: 其中 ,防止数值溢出。AdaGrad使的参数在累积的梯度较小时\theta就会放大学习率,使网络训练更加快速。在梯度的累积量较大时 会缩小学习率,延缓网络的训练,简单的来说,网络刚开始时学习率很大,当走完一段距离后小心翼翼,这正是我们需要的。但是这里存在一个致命的问题就是AdaGrad容易受到过去梯度的影响,陷入“过去“无法自拔,因为梯度很容易就会累积到一个很大的值,此时学习率就会被降低的很厉害,因此AdaGrad很容易过分的降低学习率率使其提前停止,怎么解决这个问题呢?RMSProp算法可以很好的解决该问题。
RMSProp
RMSProp算法就在AdaGrad基础上引入了衰减因子,如下式,RMSProp在梯度累积的时候,会对“过去”与“现在”做一个平衡,通过超参数进行调节衰减量,常用的取值为0.9或者0.5。
参数更新阶段,和AdaGrad相同,学习率除以历史梯度总和即可。
超参数ρ一般定为0.9,但你可能需要加以调整。等式2中的ε是为了确保除数不为零,一般定为1E-10。
在我们上面举的例子中,W1的梯度指数平均比W2大得多,所以W1的学习步幅比W2小得多。
Adam
虽然动量加速了我们对最小值方向的搜索,但RMSProp阻碍了我们在振荡方向上的搜索,比如它减小了步伐的大小。Adam通过名字我们就可以看出他是基于动量和RMSProp的微调版本,结合了两者的优点,该方法是目前深度学习中最流行的优化方法。
首先计算当前最小批量数据梯度g ,
和动量学习法一样,计算梯度衰减的累加:
和RMSProp算法类似,计算衰减学习率R:
最后更新参数:
参考:
https://blog.csdn.net/weixin_42398658/article/details/84525917
每一次参数迭代更新后,上一层网络的输出数据经过这一层网络计算后,数据的分布会发生变化,为下一层网络的学习带来困难(神经网络本来就是要学习数据的分布,要是分布一直在变,学习就很难了)
为了减小Internal Covariate Shift,对神经网络的每一层做归一化不就可以了,假设将每一层输出后的数据都归一化到0均值,1方差,满足正太分布,但是,此时有一个问题,每一层的数据分布都是标准正太分布,导致其完全学习不到输入数据的特征,因为,费劲心思学习到的特征分布被归一化了,因此,直接对每一层做归一化显然是不合理的。所以转变为学习参数
和
。同时也能减少x的影响,像梯度弥散问题
,是通过将activation规范为均值和方差一致的手段使得原本会减小的activation的scale变大,减少了值的影响,原来是
,求导后
。
BN并不是适用于所有任务的,在image-to-image这样的任务中,尤其是超分辨率上,图像的绝对差异显得尤为重要,所以batch norm的scale并不适合。
一个batch的维度[N, C, H, W]中,N代表样本数量,C代表channel数量
batch norm就是把每个channel (C)的均值和方差计算出来
layer norm是把每个样本(N)的均值和方差计算出来
阿里暑期来自 https://www.nowcoder.com/discuss/373146?type=2&order=3&pos=7&page=1
https://www.nowcoder.com/discuss/245257?type=2&order=3&pos=30&page=1 19wxg推荐算法
以“小丽是一个女孩,她唱歌很好”为例
和当前输入
,做一个sigmoid非线性映射,用sigmoid是因为它映射到0~1之间,越趋近0就越相当于抛弃了信息。比如我们看到新的主语的时候,会希望忘掉旧主语
2. 输入门:update gate更新门决定什么值我们要更新,tanh层创建一个新的候选值向量作为本细胞的状态
。比如我们希望增加新的主语的性别到细胞状态中。
3. 细胞状态:细胞状态更新,
更新为
。丢弃一部分旧的信息加入新的信息
4. 输出门:一个sigmoid来决定输出什么。此外把细胞状态通过tanh处理得到一个在-1和1之间的值a_t 。比如他看到了一个代词,可能要输出一个动词相关的信息。
参考:
https://blog.csdn.net/loovelj/article/details/80196890 源码 https://www.julyedu.com/question/big/kp_id/26/ques_id/1851 七月在线 RNN到LSTM 很简略
https://www.zhihu.com/question/41949741 LSTM的输入输出是怎么样的
https://www.jianshu.com/p/d6714b732927
http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 外国的简要解释
以前招行问过
1)GRU和LSTM的性能在很多任务上不分伯仲。2)GRU 参数更少因此更容易收敛,但是数据集很大的情况下,LSTM表达性能更好。3)从结构上来说,GRU只有两个门(update和reset),LSTM有三个门(forget,input,output),GRU直接将hidden state 传给下一个单元,而LSTM传递一个memory cell的信息。
https://www.nowcoder.com/ta/review-ml/review?page=182 答案
https://www.jianshu.com/p/591fd8b5bbd0