【深度学习】补完计划 和 Q&A

深度学习算法补完计划和Q&A

不知不觉,自己入坑都快两年了,从当初的caffe到PyTorch,感叹世界变得也太快了八,手头上的项目也快差不多结束,是时候该收拾一下,向下个一个阶段迈进了。但是,起航前还是要准备一下的,把走过的坑再好好填一填,把以前的笔记也搬到小破站上面,回顾一下常见的一些疑问。


各种各样的RNN

RNN
本质是像人一样拥有记忆的能力网络,一个单元结构重复使用,就像一个脑子可以一直在用哈哈哈。输出就依赖于当前的输入和记忆。

  • RNN的改进1—双向RNN:把两个预测的结果进行合并

LSTM(Long Short-Term Memory)长短期记忆网络
LSTM是解决循环神经网络RNN结构中存在的“梯度消失”问题而提出的,是一种特殊的循环神经网络,能够利用上下文的信息。在LSTM中,第一阶段是遗忘门,遗忘层决定哪些信息需要从细胞状态中被遗忘,下一阶段是输入门,输入门确定哪些新信息能够被存放到细胞状态中,最后一个阶段是输出门,输出门确定输出什么值。
三个输入:RNN的输入C,新增输出H,新息输入x,两个输出:RNN的输出C
在这里插入图片描述

  • 遗忘门:以上一层的输出H和本层要输入的序列数据作为输入,通过一个激活函数sigmoid,得到融合了的输入与上一部分的RNN的输出C(t-1的状态)相乘,实现遗忘。
  • 输入门:以上一层的输出H和本层要输入的序列数据作为输入,后续包含两个部分,第一部分使用sigmoid激活函数,这一部分可以当成是一个注意力的打分小模块,第二部分使用tanh激活函数,这一部分可视为真正的输入,然后这两部分进行点成,实现对新息打分这一功能。然后与遗忘门的输入相加,得到第一个输出C。
  • 输出门:将输入门的输出先经过一个tanh激活函数,同时上一层的输出H和本层要输入的序列数据作为输入的部分也经过sigmoid激活函数,然后两者相乘,完成新的打分,也得到了最后的新增输出H。
  • 总结:双重打分,同时保证信息的最大化利用。

双向LSTM
双向RNN由两个普通的RNN所组成,一个正向的RNN,利用过去的信息,一个逆序的RNN,利用未来的信息,这样在时刻t,既能够使用t-1时刻的信息,又能够利用到t+1时刻的信息。一般来说,由于双向LSTM能够同时利用过去时刻和未来时刻的信息,会比单向LSTM最终的预测更加准确。下图为双向LSTM的结构。

GRU(Gated Recurrent Unit)
GRU包括两个门,一个重置门和更新门。这两个门的激活函数为sigmoid函数,在[0,1]区间取值。
两个输入:新增输出H,新息输入x,一个输出:RNN的输出C
在这里插入图片描述

  • 更新门: 上一层的输出和当前的数据作concatate一起通过一个sigmoid函数得到0到1的结果,其决定了上一个隐藏状态有多少信息被保留下来,且新的内容有多少需要被添加进memory里(被记忆)。
  • 重置门: 重置门的主要作用就是过去的多少信息需要被遗忘,操作也是上一层的输出和当前的数据作concatate一起通过一个sigmoid函数得到0到1的结果,但是两个门的训练的权重是不一样的。
  • 最后输出:重置门通过重置 ,也就是有多少信息需要被遗忘,然后与当前数据一起送到tanh函数里得到新的记忆内容。最后将更新门的权重赋予新的记忆内容,相应的1-w权重给予上一层的输出,合在一起作为输出。
  • 总结:双重打分,用伯努利分布对新息和旧息做最后打分。

各种各样的CNN

3D_CNN: 可以提高时空特征的利用率,对于视频序列这样的数据,可以达到加强前后帧联系的作用。


各种各样的Block

  • residual bottleneck(残差网络的瓶颈层):主要目的是为了减少参数的数量,从而减少计算量,且在降维之后可以更加有效、直观地进行数据的训练和特征提取(个人理解低维度的特征包含更多的重要信息)。右图是实际计算中使用到的结构,参数数量为(核的大小 x 输入通道数 x 输出通道数)1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。 。在这里插入图片描述
  • ShuffleNet:在瓶颈层中间多了一个通道的shuffle层,在分类当中有提升。
    在这里插入图片描述
  • densenet:前n层所有的结果进行concat,然后再进行非线性转换。 为了保证feature
    map的channel不会太大,而且size要保持统一才能concat,将上述作为一个dense
    block,每个block之间通过池化层相连。在这里插入图片描述

学习率

是指导我们该如何通过损失函数的梯度调整网络权重的超参数。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保我们不会错过任何局部极小值,但也意味着我们将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。

优化算法

推荐阅读传送门

Normalization方法

Batch Normalization(BN,2015年)、Layer Normalization(LN,2016年)、Instance Normalization(IN,2017年)、Group Normalization(GN,2018年)。它们都是从激活函数的输入来考虑、做文章的,以不同的方式对激活函数的输入进行 Norm 的。传送门

  1. BN是在batch上,对N、H、W做归一化,而保留通道 C 的维度。BN对较小的batch size效果不好。BN适用于固定深度的前向神经网络,如CNN,不适用于RNN。(抓住BN作者的启发点,白化)传送门来解释
  2. LN在通道方向上,对C、H、W归一化,主要对RNN效果明显;
  3. IN在图像像素上,对H、W做归一化,用在风格化迁移;
  4. GN将channel分组,然后再做归一化(G/C)。
    在这里插入图片描述

Skill for Network_train

  • 损失函数:计算的是一个样本的误差
    代价函数:是整个训练集上所有样本误差的平均
    目标函数:代价函数 + 正则化项

  • 梯度裁剪: 一般用于解决 梯度爆炸(gradient explosion) 问题。具体的操作就是把较大的梯度投影到较小的范围上,把所有梯度接成一个向量g,设置阈值参数,使得投影后较小得新向量不会超过这个阈值限定的范围。当梯度小于/大于阈值时,更新的梯度为阈值。
    在这里插入图片描述
    梯度爆炸问题在训练 RNN 过程中出现得尤为频繁,所以训练 RNN 基本都需要带上这个参数(在RNN中,相同的权重参数 W 会在各个时间步复用,最终 W 的梯度 g = g1 + g2 + … + gT,即各个时间步的梯度之和,即梯度往往不会消失,而在不加入梯度剪裁的情况下往往会存在梯度爆炸的;而反过来说消失问题可以通过 gradient scaling 来解决,没人这么做的原因是这么做太麻烦了,而且我们现在已经有了更好的方案(自适应学习率、LSTM/GRU)。)

  • one-hot 独热编码 又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。 One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。
    作用: 在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。而我们使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。比如使用这样的特征进行描述:[“足球”,“篮球”,“羽毛球”,“乒乓球”],就可以对其使用独热编码:足球 => 1000 | 篮球 => 0100 | 羽毛球 => 0010 | 乒乓球 => 0001
    不使用的情况: 将离散型特征进行one-hot编码的作用,是为了让距离计算更合理,但如果特征是离散的,并且不用one-hot编码就可以很合理的计算出距离,那么就没必要进行one-hot编码。比如,该离散特征共有1000个取值,我们分成两组,分别是400和600,两个小组之间的距离有合适的定义,组内的距离也有合适的定义,那就没必要用one-hot 编码。


神经网络——Train

随机种子 https://blog.csdn.net/weixin_41013470/article/details/82956178

各种各样的损失函数

  • 交叉熵损失函数(给予惩罚性,最终使得判断的概率趋向1)
    https://blog.csdn.net/red_stone1/article/details/80735068
  • 回归损失函数 https://www.jiqizhixin.com/articles/2018-06-21-3

优化器(Optimizer)
优化器详解:https://blog.csdn.net/weixin_41417982/article/details/81561210
优化器是为了使得分批训练的速度加快的同时,使得模型可以达到稳定,loss趋向真正的最小值,而不是陷于鞍点。
优化器对比 https://www.cnblogs.com/guoyaohua/p/8542554.html

  • 循环学习率:设置最小最大的学习值 https://blog.csdn.net/weixin_43896398/article/details/84762886
    cycle: 学习率从下界学习率(base_lr)到上界学习率(max_lr)再到下界学习率(base_lr),所经历的迭代次数iterations。
    stepsize: cycle迭代次数的一半。

权重初始化
因为训练网络是一个要找到全局最优解的过程,好比你在山上不同的位置下山,如果你把所有权重设置为一样的数,每个单元得到的信号等于输入(和输出)之和激活函数(sum(inputs))),就是好比你身处一个平地上,漫无目的地寻找那个最低的地方,很难也很久都找不到那个最优解。不同的初始化函数对于不同的模型有不同的效果,这个需要结合具体的模型和初始化函数来说。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章