批量归一化
1.在每个特征提取层之后,增加批量归一化层
激活函数
整体上,ReLu是一种更加主流的方法
ReLu
1.图像中大于0的部分不存在梯度饱和的现象
2.收敛速度更快,比sigmoid和tanh快接近6倍
3.当x取0时,可以默认函数的梯度为0
4.考虑到当x小于0时,梯度为0,可能产生dead ReLu,所以使用Relu时,可能一开始的结果是好的,但是后面突然变差,以至于不能激活。
ReLu的变体
在这里插入图片描述
其中的α可以在传播的过程中学习。
数据预处理
1.零均值化:为了避免函数值全为正,或者全为负可能产生的梯度只能在某个方向上变化,不能在梯度最小的方向上变化(直线的转动对于分类的影响)
2.在图像上,尽量不使用其他的归一方式,因为原空间存在一定的特征和空间结构值得被学习
3.如果将某一层所有的参数都相同,那么所有神经元学到的东西都是一样的。
4.使用较小的参数初始化会导致后续的激活函数的值过小,进而影响反向传播的梯度过小,
如果初始化参数过大,那么会快速的增长,但是由于激活函数(例如tanh,sigmoid)在值较大时,会出现饱和,同样会产生梯度变化较小的现象(一个是上游梯度变小,一个是下游梯度变小),可以使用Xavier:要求输入的方差等于输出的方差(注意使用ReLU时,考虑到存在一半的神经元失活,可能会导致同样的方差,但是权重很小。可以采用除以2)
Batch Normalization :将数据转换为单位高斯分布,并通过γ和β控制饱和的程度
优化
*–SGD:
1.对于在某个方向上很敏感,但是在其他方向上不太敏感的关系,使用SGD时,可能会在某个方向上飞快的来回跳动,但是在另一个方向上却移动的很慢;
2.SGD可能会陷入局部最优解或者鞍点(在低维中局部最优解的影响比较大,高维中相反)
动量SGD:将梯度加到一个速度(每次都会在上一次的速度上受到摩擦衰减)方向上得到一个新的速度(the begin speed is always zero)
所以在梯度为零的地方,还是会继续滑动
Nesterov Momentum:本次的速度是上次速度的一个衰减,而本次移动则是原来移动之后,速度的一个修正
事实上,这些滑动的梯度算法会自动跳过那些很窄的局部极小值,而倾向于平稳的局部极小值,因为模型的鲁棒性更强
adagrad:不断累加梯度的平方值,并在每一次更新中除以累计值的开方(这个方法能够缓解在某个方向上较灵敏的状况,在梯度较大的方向上除以较大的数,但是这个方法难以越过局部最优解)
RMSProp:类似于梯度法,给梯度的平方加上动量
Adam:将上述的两种方法融合(人为将第二向量初始化为0,那么第一步的步长会非常大)(一般作为首选)
为了避免上述的第一步较大步长,进而选择进行一定的调整(除以无偏估计)
学习率衰减是一个后手选择,需要找到在哪些点使用该策略
除了一阶梯度,还可以使用二阶梯度
学习率可以被看成是选择走多少的梯度,如果学习率为1,那么就是直接走到该点
正则化:减小训练和测试之间的误差
Dropout:对每一个激活层都随机的将部分元素置零
dropout有效的可能原因:1.获取能够防止过拟合2.或许这可以看成是一种集成学习,不同的dropout都对应了一种学习
在测试时,可以采用dropout的概率,乘上对应的结果,并求和,得到一种类似期望的形式。
使用dropout在训练时会需要更多的时间,因为他每次都是更新网络的子网络
dropconnected:随机置零一些权重矩阵
随机深度:在训练的时候,只使用部分层,在测试的时候,使用全部的层
batch normalization
迁移学习:想要用比较复杂的模型,但是数据集比较小,可能会造成过拟合。把在别的比较完整的数据集上训练得到的模型的前面部分参数冻结,对最后的几层进行学习(几层取决于本次的数据集大小),但是学习率不要太大。(两个数据集应该是比较类似的)
CPU和GPU的区别
CPU:核数较少,但运算很快,操作数很多,并且可以单独运行,适合做通信处理。
GPU:核数很多,但运算慢,操作有限,不能单独运行,适合进行高度并行的处理(矩阵运算)
框架
使用框架的好处
1、不用自己写梯度的计算,反向传播更方便
2、能在GPU上运算
ResNet:
使用残差进行计算,更加的方便,因为如果是恒等变化,那么就没有差别。(不过这只是一个假设)
同样会使用到瓶颈层,利用1*1的卷积核来缩小维度
网络对于梯度流有着更高的算法,提供了一条高速公路
imporve:将卷积核的数量进行修改,在单层中使用更多的卷积核来拓宽深度
ResNeXt:在残差模块中使用更多的分支来拓宽深度,但是降低每个分支的大小
随机深度网络:将其中一部分的层的权重设置成恒等变化
FractalNet:使用分形结构,来实现网络深层和浅层的合并
DenseNet:对于一些区块,每一层都与后面所有层相连接
上述的算法很多都是在梯度流上实现了一种恒等的变化
全连接层意味着数量巨大的参数,很多网络使用全剧平均池化来代替,进而完成网络结构的优化。
RNN:用于处理输入和输出大小可变的网络,每次输入都要对上一隐藏层进行更新
考虑到反向传播过程产生的巨大开销,采用沿时间的截断反向传播方法:往前计算一定步数(但不是直接得到最终结果),然后就进行反向传播。
图像标注:先使用CNN网络来提取特征,再将最后的特征矩阵传入RNN网络,作为输入,然后进行循环。
带注意力的图像标注:在图像的每个特殊位置都用一个向量表示,在循环发生的过程中,除了在每一步采样,也会产生特征向量的分布(即模型想要注意图片中的哪里),然后下一个过程就会对该部分特别关注。简而言之:每个环节除了固有的输入,还有上一环节传递的特征向量的分布;每个环节除了固有的输出(词汇表上的分布),还有传递给下一个环节的特征向量的分布(图像上的分布)。
Vanilla RNN(递归神经网络)会造成梯度反向传播的时候出现梯度爆炸和梯度消失,
为了解决该问题,设计了LSTM。
LSTM:
上一层传递来的隐藏信息 ht-1 和 当前层的输入信息xt串联,并乘上一个很大的权重矩阵,会得到ifog四个门,i:input表示接受多少新输入的信息 f:forget表示遗忘多少以前的信息 o:output表示展现多少信息给下一个单元格的隐藏层,g:表示多少信息写输出中取 ,ifo都使用了sigmoid函数而g使用了tanh函数 ht 表示当前层的隐藏信息(会进行传递) ct表示单元状态(是存储在LSTM中向量,不会完全暴露)对当前单元格状态的更新取决于以前的单元格状态、遗忘门、输入和g门,而当前层的隐藏状态为输出和当前单元格的状态决定
优势:1.在反向传播过程中,不断乘以变化的遗忘门,可以避免梯度消失和梯度爆炸的可能;
2.而且遗忘门使用sigmoid函数,能保证函数值处于0-1之间,使得数值性质更好;
3.遗忘门的矩阵乘法采用的是矩阵元素的乘法,计算量更小。
语义分割:为每个像素产生一个标签(但是同类并不区分)
1.可以用图片的小像素部分的中心像素来决定该部分的分类(对这部分图像进行特征提取操作,事实上可以通过相邻部分共享网络权重来实现优化)
2.利用全卷积网络对整张图像进行处理(将网络视为卷积层的堆叠),最终结果是整张图的结果,那么整体可以看成对每个像素的操作,将真值与标记值的交叉熵作为损失函数
3.考虑到建立全卷积网络会造成的巨大开销,因此对该网络进行改进,对原始的图像进行下采样,缩小维度,后续再进行上采样,回复维度,实现较小的数据量。(通常上下采样的操作会对称)
上采样:去池化(将池化展开:比如把周围四个空都设置成一样,或者周围三个空填零–bed of nails)
跨卷积-反向跨卷积:调整卷积核移动的步长,完成跨卷积;将卷积得到的结果(某个数)再乘上卷积核就能得到对应的转置卷积结果,下一个结果需要往下移动一定步长。可以用步长比来命名
分类与定位:提前知道物体是你要找的(对象数已知)
使用卷积网络得到两个输出,一个是对应的分数,另一个是boundingbox的位置以及大小。对结果的两个不同目标最小化,可以加入权重超参数(会影响损失值)。(如果将关注的点作为目标函数,那么就能跳过损失函数,得到更有针对的结果)
希望输出是连续值,那么就使用L2损失之类,如果是离散值,那么就使用交叉熵,softmax之类
对象识别:一开始有几个固定的类,当图像中出现某类时,画出bounding box并给出标签(对象数不知)
滑动窗口法:选择图像的一部分进行判断
候选区域:先利用区域选择网络找到对象可能存在的后续区域,然后使用卷积网络对该区域处理 R-CNN是一种固定的网络,训练固定的选择模型需要大量的算力,而且并不学习参数
fast R-CNN :通过卷积层对整个图像处理(而不是针对部分感兴趣的区域)得到特征映射,考虑备选区域的卷积块(通过一个卷积层能够极大的减小运算量),并利用卷积学习,不是固定的;共享处理过程
在测试的过程中,大量的时间被用于备选区域的选择,因此设计网络用于分离备选区域
YOLO/SSD:将输入的图像分成多个网格,在每个单元里想象一些基本bounding(横竖长方形,正方形),对每个bounding box都要预测与实际对象的偏差,同时也要考虑对象的分类,并进行优化,直接进行卷积网络的计算
物体分割:对输入图像中的对象进行标签,将整个区域划分出来(不是bounding box,是整个区域)
Mask R-CNN:先进行候选框的寻找,然后再对其中的每个像素求解
可视化:人们试图去找到网络黑盒子的原理
1.CNN的第一层往往都是提取图像的边缘以及相反的颜色(即第一层学到的权重)
2.判断输入图像的那部分起到比较大的作用:
1.对图像的一部分进行遮挡,然后判断
2.对图像像素的得分进行一定的扰动,然后观察对结果的影响。
3.如果移除这些关键部分,那么怎样的图像才能起到比较大的作用?:梯度上升
修正网络的权重,在图像的像素上通过梯度上升来实现最大化中间神经元和类的分值(此时不再改变权重,而是尝试改变图像的像素)
具体方法:将图像初始化为0,或是通过添加高斯噪声作为初始输入来去噪,然后通过3D网络计算,然后反向梯度传播,然后上升。
正则化手段(来生成更加可视化,富含意义的图像):惩罚生成图像的L2范数;在处理过程中,定期的使用高斯模糊处理;将一些小梯度的数据转换为0
4.愚弄图像:对一个大象的图片强行让神经网络认为是考拉的图片,然后对该图片进行梯度上升的修改
5.DeepDream:提取输入图像,将神经网络运行到某一层,然后反向传播,并且设置该层的梯度等于激活值,然后传播到图像,不断更新(放大神经网络在该层检测到的特征)
6.图像抖动:不是直接将图像作为输入,而是将图像移动两个像素,并将两个像素包裹
7.特征反演:选择一个图像输入神经网络,在某一层记录其中一个图像的特征值,然后根据特征重构图像,重构图像将给出一定的信息,根据给出信息进行梯度上升得到新的图片尽量靠近原始输入的图片,
8.全变差正则化:将左右相邻的像素的差异转换成上下差异来增加生成图像的平滑度。
9.纹理合成:将小块的纹理合成大块的纹理
1.使用近邻算法合成,对周围的像素进行复制
2.使用格拉姆矩阵,将图像输入CNN得到C个HW的特征图像(C可以理解成维度),那么从HW中选出两个,选取C维,经过特征映射,就能得到CC的二阶同现矩阵,数值大倾向于一起激活,对HW求平均,就能得到全部的C*C格拉姆矩阵,再用梯度上升即可新的合成图片。
风格迁移:如果选择一副画像(比如星空)作为风格图像,再选择一副作为内容图像,并初始化一个噪音图像,然后导入CNN,最小化风格图像的格莱姆矩阵损失和内容图像的特征重构损失,那么就能得到该风格的内容图像。
无监督学习:学习到的是隐含结构(学习的成本更小)
降维:找到对应的最大方差轴,并实现投影。
密度估计:估计数据内在分布
生成式模型:通过已有数据得到的模型再来预估新的数据
RNNs and CNNs:利用极大似然,让估计的图像和实际训练输入的图像相似,训练得到结果之后,在应用时,给出一个像素点,得到整幅图像。
PixelRNN:通过迭代,生成对应点的像素,并最大化似然函数
PixelCNN:通过将周围灰色的像素导入CNN,得到中间黑色像素的结果(faster)
生成模型:
自动编码器:将输入利用编码器(神经网络)降维,再利用编码器升高至原来的维度完成重构,并计算对应的损失。(如果对于监督学习,在这一步之后,对比较好的重构x再求出对应的label,与真实label计算损失)
变分编码器:在自动编码器中加入随机因子而获得某种模型,得到生成数据的概率模型。
其中z表示某种潜在属性(比如几分的笑,鼻子是怎么样的),z生成了x(根据z的设定要求,利用解码器得到对应的图片x),我们可以假定z服从某种分布,然后使用极大似然估计来计算贴合度
考虑到z是连续的变量,对其求积分的难度比较大,求最大值使用导数更是艰难。
p(z)使用高斯分布可以得到,p(x|z)使用神经网络编码器,给定z即可得到。但是积分不现实。
z通过解码器网络p会得到均值和对角协方差矩阵生成x【p(x|z)】,而x通过编码器网络q也会得到一个均值和对角协方差矩阵【p(z|x)】。
编码器网络==识别或推断网络,解码器网络=生成网络
KL散度是用来描述两个分布有多相似的
公式的第一项是由解码器网络生成的,第二项可以看成两个网络高斯分布的KL散度(得到的均值和协方差矩阵),第三项也是两个分布的散度而且大于0,但是其中的p(z|x)不好求,因此我们可以把前两项的和作为下界,那么最大化该项的似然,我们也能得到一个θ和φ的估计,事实上这也是在最好的重构该变量。
对于输入的数据,通过编码器q得到均值和方差,并根据给定的分布实现对z的采样,这一步就能完成后式的计算,再将z通过解码器p,同样获得均值和方差,最终在给定的分布中实现对x的采样,实现前式的计算,完成前向传播,再反向传播,梯度更新。
在训练完成之后,只要使用解码器网络即可,通过z得到生成的x
强化学习
存在一个环境以及对象,环境给对象一个状态,对象采取一定的行动影响环境,环境再回馈一个奖励,不断循环
马尔科夫链
S:所有状态的集合
A:所有动作的集合
R:奖励的分布函数
P:下一个状态转移的概率分布
γ:折扣系数
运行过程:
给出一个初始时刻,然后从初始状态中采样,并将一些初始状态设为0,
然后遍历循环
选择At,然后获得Rt,得到St+1,然后循环
所以任务的目标转换为寻找最好的决策,让奖励之和最高
价值函数:从初始状态到现在的所有奖励的预期累积之和
Q值函数:执行某些动作的奖励
Q*函数:最好的Q值函数
bellman等式:前面的过程都是Q函数,这一次还是Q函数,累加就还是最好
Q-learning:利用函数逼近器,学习Q的过程。
利用一定的输入(输入的数量通常等于动作的选择)和网络结构能够得到对于不同选择的Q值得到的结果
由于整个过程都是相关的,使用连续的值进行计算会导致某个状态下的结果会导致后续所有结果的偏移,会导致不好的反馈循环。
经验重放:保持状态转换的重放记忆表,从回放记忆中拿出一小部分转移样本进行处理。同时这样数据也能被反复利用,效率更高。
整个过程:重播记忆初始化,选择容量,利用随机权重初始化网络Q,进行M次训练,
在每一次训练中:通过游戏每次开始的图像初始化状态,然后以一个小概率选择随机动作,利用贪心原则(利用Q网络计算得到的最大得分),然后得到下一个奖励和状态,然后将这些状态,动作,奖励等都放入到重放内存中,然后从重放内存中取出小批量进行梯度下降,循环一定的操作完成一次训练。
决策梯度:定义一类参数化策略,通过权重θ进行参数化,定义每个策略价值,J就是未来累计奖励的期望。
不使用Q函数,直接针对决策的过程进行分析。对θ*的学习来实现奖励的最大化
使用梯度上升(在给定的θ下,τ和p的梯度)
而这里是对τ进行积分,不易求解,因此转换
得到
再对后式进行求解,最终得到
如果整体的轨迹是好的,则说明动作的选择是好的(平均值),使用无偏估计完成对方差的降低。
方差的降低
1.通过观察产生了多少未来奖励。
2.使用折扣因子来忽略延迟效应(对奖励远近的权重不同,目光相对短浅)。
3.引入基线函数,即我们对该动作的期望(那么就能得到与期望的差值)
基线函数:到目前为止所有奖励的滑动平均等等
Action-Critic Algorithm:评价动作和预期的差值
1.初始化策略参数θ以及评价函数φ
2.在每一次的训练迭代中,使用策略得到一定的轨迹。
3.累计并计算梯度
4.完成更新
循环聚焦模型:对图像周围的部分像素进行观察,然后关注某些部分,实现图像的分类。还能忽略图片中混乱和不相关的信息。
通过RNN结合最优的观察策略,不断的改变观察位置的分布。
深度学习发展带来的困难:
1.不利于在手机等设备上使用
2.训练的开销巨大
3.能源需求大
特殊硬件
1.FPGA:可编程门阵列
2.ASIC:特定用途集成电路
剪枝:先训练神经网络,然后去除一些权重连接,然后重新训练网络
权值共享:对于接近的权重,使用一个数字进行表示
哈夫曼编码:使用较多的数位来表示不常出现的数字
squeezeNet:在卷积之前,使用更少的通道来压缩
低秩近似:将一个卷积核分解成两个(把一个分解成多个)
二元或三元网络:在训练时,保持精确的权重,但在推断时,只使用-1,0,1等权值来表示尺度因子。
winograd:在计算卷积时,被卷积数转换只有1,0.5,2的特征映射矩阵(移位实现),将卷积核转换为4*4的张量 ,将两个矩阵对应位置的元素相乘,再进行逆变化
高效训练算法
并行化
1.数据并行化:同时导入多张照片输入;同时进行多组参数的更新。
2.模型并行化:将输入分割并行处理(图片分割);将权重分割;
3.超参数并行化:在不同的机器上调整学习速率和权值衰减
混合精度:将16位和32位混合使用,加使用32,乘16
模型蒸馏:将优越的大型网络拿来训练小型的网络。
不使用大网络的硬性得分(得分差距很大),而使用多个大网络结合的软得分(差距不大,但是还是分类正确)T可以控制柔和du