前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法岗机器学习相关问题整理(深度学习部分)

算法岗机器学习相关问题整理(深度学习部分)

作者头像
曲奇
发布2021-12-15 08:24:45
6090
发布2021-12-15 08:24:45
举报
文章被收录于专栏:曲奇的博客曲奇的博客

深度学习

激活函数的对比

补充:

为什么sigmoid不是关于原点对称是不好的?

[公式]
[公式]

w的更新方向由 决定,而 对所有的w_i是常数,所以实际上w的更新方向由 决定。

如果有一个神经元为:

[公式]
[公式]

现在假设

[公式]
[公式]

[公式]
[公式]

最优解分别是

[公式]
[公式]

[公式]
[公式]

[公式]
[公式]

,所以我们希望我们希望

[公式]
[公式]

适当增大,但希望

[公式]
[公式]

适当减小,但在 Sigmoid 函数中,输出值恒为正。这也就是说,如果上一级神经元采用 Sigmoid 函数作为激活函数。它的更新方向始终是相同的,我们只能走Z字型去逼近最优解,减慢了收敛的速度。

梯度下降方法(优化器区别)

batch gradient descent

  • 优点:批量梯度下降保证收敛到凸函数的全局最小值和非凸函数的局部最小值。
  • 缺点:需要整个数据集执行一次梯度更新,更新速度非常慢。 不能在线更新模型。

Stochastic gradient descent

每一个样本执行一次梯度更新

  • 优点:更新速度快,可以在线学习。
  • 缺点:SGD执行具有高方差的频繁更新,这导致目标函数大幅波动。

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

batch norm

每一次参数迭代更新后,上一层网络的输出数据经过这一层网络计算后,数据的分布会发生变化,为下一层网络的学习带来困难(神经网络本来就是要学习数据的分布,要是分布一直在变,学习就很难了

为了减小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

  • 改为激活函数relu,它导数为1。能够解决sigmoid这类激活函数的问题
  • resnet残差结构,短路径,像跳过一样,可以无损地传播梯度
  • Batch norm对每一层的输出规范为均值和方差一致,减少了值的影响

解决梯度爆炸的方法

虎牙aiops

  • 梯度修剪,如果它大于某个阈值,缩放梯度向量,保证它不会太大
  • batch norm
  • gru和lstm它有记忆门,其实和resnet相似,是可以无损传递梯度的。相当于跳过

LSTM的结构

https://www.nowcoder.com/discuss/245257?type=2&order=3&pos=30&page=1 19wxg推荐算法

以“小丽是一个女孩,她唱歌很好”为例

  1. 忘记门:读取上一个输出
[公式]
[公式]

和当前输入

[公式]
[公式]

,做一个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/ 外国的简要解释

LSTM与GRU的区别

以前招行问过

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

LSTM相比于RNN的优点

  • 可以解决神经网络中长序列依赖问题
  • 一定程度解决梯度消失问题
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 深度学习
  • 激活函数的对比
    • 为什么sigmoid不是关于原点对称是不好的?
    • 梯度下降方法(优化器区别)
    • batch norm
      • 扩展
      • 解决梯度消失的办法
      • 解决梯度爆炸的方法
      • LSTM的结构
      • LSTM与GRU的区别
      • LSTM相比于RNN的优点
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档