一.杂论
1.1 训练集,验证集,测试集的区别
- 训练集:利用标签不断的进行网络参数(权重)的更新,但是每次训练都有一定的训练参数(学习率等)
- 验证集:用来选择训练集中最好的训练参数(学习率等)
- 测试集:用来真实的评价模型或者参数的结果
1.2 max函数的梯度:
- 其中一个为零梯度,另一个为正常梯度计算
1.3 卷积维度的计算:
- 卷积输出的维度=(输入维度+增补维度-卷积核维度)/步幅+1
1.4 硬件使用
- CPU
核数较少,但运算很快,操作数很多,并且可以单独运行,适合做通信处理。 - GPU
核数很多,但运算慢,操作有限,不能单独运行,适合进行高度并行的处理(矩阵运算) - FPGA:可编程门阵列.
- ASIC:特定用途集成电路
1.5全连接模块
- 全连接模块会产生大量的参数,可以用池化替代
1.6 跨卷积与反向跨卷积
- 跨卷积:调整卷积核的步幅
- 反向跨卷积:将卷积得到的结果再乘上卷积核,并移动一定的步长(相乘结果)
- 两者可以使用步长比来命名
1.7 目标函数
- 将最终的目标作为目标函数可以更加有效的得到对应的结果
1.8 忽略细节
- 不准确的说,人们往往只知道某项技术可以达到怎样的功能,但是产生这样效果的原因却尚未没解开
1.9 减小模型复杂度
- 剪枝:
(1)降低模型的复杂度
(2)防止过拟合
(3)先训练神经网络,再去除连接,再训练。 - 权值共享:对一些接近的权值,使用一个近似进行表示,学习
- 哈夫曼编码: 对于出现频率高的数字要用简单的表示,反之亦然
- SqueezeNet:在卷积之前,使用一个1*1的卷积核来缩小通道计算开销
- 低秩近似:
(1)把一个卷积核分解成多个
(2)可以提高模型的非线性表示能力 - 二元或三元网络:在训练时保持精准权重,但在测试时仅仅保留尺度因子:-1,1,0
- winograd:
在计算卷积时,被卷积数转换为只有1,0.5,2的特征映射矩阵(移位实现),将卷积核转换为4*4的张量 ,将两个矩阵对应位置的元素相乘,再进行逆变化
1.13 高效算法
- 并行化
(1)数据并行化
同时导入多张照片输入;同时进行多组参数的更新。
(2)模型并行化
将输入分割并行处理(图片分割);将权重分割;
(3)超参数并行化
在不同的机器上调整学习速率和权值衰减 - 混合精度
使用16位和32位混合,32位用于加法,16位用于乘法 - 模型蒸馏
将大型网络计算的得分进行融,让差距变小,但是仍能体现正确性(硬得分转换为软得分)
二.基础算法
1.2 SVM
-
使用线性可分空间进行划分,允许一定范围内不扣分
-
初始阶段的得分
初始的得分损失=类别数-1(初始时,各个分类的得分都很相似) -
损失的计算方法
∑max(0,错误类的得分-正确类的得分+1)【针对某幅图像,在不同的类别上的得分】
1.3 特征提取:将较难表示的特征进行转换
- 颜色直方图:颜色在图像中的占比
- 词袋:稀疏表示,字典(不关注顺序)
- 方向梯度直方图:更倾向于提取边缘信息,对颜色不重视
(1)对图像使用x,y轴梯度算子得到梯度的方向和幅值(如果存在多通道,选择幅值最大的)
(2)将0-180分成若干份,根据方向进行幅值的分配(30°,幅值80,那么20°和40°都要40)
(3)得到直方图
(4)如果要减少光线的影响,那么还需要进行归一化(L2范数)
参考:图像学习之如何理解方向梯度直方图(Histogram Of Gradient)
三.激活、池化、正则化、预处理
3.1 激活作用:增加模型的非线性表示能力
3.2 激活函数主要类别
- sigmoid:
(1)当输入的数据绝对值比较大的时候,图像比较平稳,可能出现梯度消失。
(2)梯度恒为正,可能会导致梯度只能在某个方向上变化(如下,只能沿着一、四象限方向运动) - tanh:主要解决了问题(2)
- ReLU:
(1)解决上述两个问题
(2)收敛的速度更快
(3)当输入小于0时,输出为0
(4)在运行的时候,如果经过0,可能会出现结果的突变
(5)等于0时的梯度为0
ReLU比较贴合神经元的结构,因此往往优先被使用,而考虑到(3)(4)两个问题,因此Leakly ReLU,ELU被构建。
3.3池化作用
- 降低维度,减少计算量并防止过拟合(在训练集上表现的很好,非常准确,但是在测试集上效果很差:原因很多,可能是因为模型学的太强了,把一些不是该类的属性也学进去了,比如模型惊人的发现训练集中所有的野子都是锯齿状的,然后它就认为没有锯齿状的就不是叶子)
- 融合局部的特征
3.4 池化方法
- 最大池化:选择矩阵中的最大值作为矩阵的代表
- 均值池化:将小矩阵的均值作为矩阵的代表
3.5 正则方法
- 全变差正则化:将左右相邻的像素差异转换成上下差异来增加图像的平滑度
- 元素置零
(1)对激活层的部分元素置零
(2)可以看成一种随机置零多网络的集成 - 权重置零
- 层次置零: 跳过其中部分层次
3.7 预处理原则:
尽量少的预处理,预处理可能会丧失原空间的特征和空间结构
2.8 零均值化
- 为了防止函数值始终正负不变导致梯度只能在某个方向上变化,所以要对数据进行0均值化
3.8 批量归一化(Batch Normalization)
将数据转换为单位高斯分布,并通过γ和β控制饱和的程度
四.网络结构
4.1卷积神经网络(CNN)
- 同类图像在全局的特征上可能不太相似,但是局部的特征往往有相似之处。
- 网络结构:CNN就是由一下几个层,有规律,有顺序的组合而成
(1)输入层:将输入图像转换为像素矩阵
(2)卷积层:利用卷积核以一定的步长扫描输入像素矩阵,提取局部的特征,得到feature map(特征图)【整体还是线性的过程】
(3)激活层:使用激活函数,对feature map的每个位置进行激活(提高模型的非线性表示能力)
(4)池化层:使用一些池化的方法对矩阵降维,更加深入的获取信息。(对局部信息的一个小融合)
(5)全连接层:使用和最后的feature map一样大小的卷积核(数量由输出的类别数决定)进行运算,然后使用函数进行归一化(常用softmax) - 经过训练,网络的参数被反向传播所更新(训练),网络知道了怎么样的权重可以得到正确的分类(最小的损失函数)。
4.2 循环神经网络(RNN)
- 应用:
(1)CNN网络在时序方面的能力很弱,人们结合“人的认知是基于过往的经验和回忆”,所以人们研发了RNN,主要用于时序上的推理
(2)CNN对于网络的输入和输出太过严格,因此使用RNN能完成网络输入输出的自由化
![]() |
![]() |
- 网络结构隐层的输入除了原本的输入,还增加了上一次的输出,进而完成时序上的更新,经过重复的训练,网络的参数得到优化,就能进行一些预测。
- 沿时间截断的反向传播:考虑到循环步骤的复杂性可能影响梯度反传,因此往往都是经过几个循环的步骤就进行反向传播,而不会等到所有循环都结束才反传
- 缺点:在迭代的过程中,可能出现梯度爆炸或者梯度消失的状况
4.3 长短期记忆网络网络(LSTM)
- 针对RNN一些问题,LSTM被提出(LSTM是一个被超级广泛运用的网络)
- 网络结构:上一层传递来的隐藏信息 ht-1 和 当前层的输入信息xt串联,并乘上一个很大的权重矩阵,会得到ifog四个门
(1) i:input表示接受多少新输入的信息
(2)f:forget表示遗忘多少以前的信息
(3)o:output表示展现多少信息给下一个单元格的隐藏层
(4)g:表示多少信息写输出中
(5)ht 表示当前层的隐藏信息(会传递) ct表示单元状态(是存储在LSTM中向量,不会完全暴露)
(6)对当前单元格状态的更新取决于以前的单元格状态、遗忘门、输入和g门,而当前层的隐藏状态为输出和当前单元格的状态决定 - 优点:
(1)在反向传播过程中,不断乘以变化的遗忘门,可以避免梯度消失和梯度爆炸的可能
(2)遗忘门使用sigmoid函数,能保证函数值处于0-1之间,使得数值性质更好
(3)遗忘门的矩阵乘法采用的是矩阵元素的乘法,计算量更小
4.4 残差神经网络(ResNet)
- 网络深度的增加会能让网络更好的提取信息(至少不会让网络性能变差【毕竟依靠的是梯度反传】),但在实践中国,人们发现当网络深度增加的时候,网络竟然变差了!!!!所以人们发明了深度残差网络
- 特点
(1)使用残差进行计算,输出层由H(x)变成H(x)-x。【保证了准确率的不断上升】
(2)使用了高速公路/短路操作(允许进行一些跳跃)
(3)当网络维度过大的时候,会使用1*1卷积核作为瓶颈,来缩小维度 - 改进
(1)ResNeXt:在残差模块中使用更多的分支来拓宽深度(使用多个更小的卷积核)
(2)FractalNet:使用分形结构,来实现网络深层和浅层的合并
(3)DenseNet:对于一些区块,每一层都与后面所有层相连接
(4)随机深度网络:将其中一部分的层的权重设置成恒等变化
五.优化
5.1 深度学习之所以能够如此蓬勃的发展,很大程度上归功于反向传播算法的提出,现在主流的深度学习算法的优化都是基于反向传播算法。
5.2 梯度下降的改进
-
随机梯度下降(SGD)
(1)沿着梯度的方向下降,十分考验学习率
(2)可能在不同的方向上的敏感性不一样,以至于在某个方向上飞快变化,另一个方向却走得很慢敏感性脆弱
(3)很容易陷入局部最优解或者鞍点 -
动量+SGD:将梯度加到一个速度(受到上一时刻和摩擦系数的影响)上,越过局部最优解,更倾向于更加平稳的地方(在刚开始的速度一般都是0)
-
Nesterov Momentum:不仅针对速度,还对位移进行了改进
-
AdaGrad:每次都设置变量累加上梯度的平方,并在位移处除以累计值的开方,降低在某个方向上的敏感性
-
RMSProp:在AdaGrad中的变量中加入动量
-
Adam:上述方法的融合(首选)
(1)引入动量,对速度进行控制
(2)引入梯度平方的除法,对敏感性进行控制
5.3 学习率:
- 可以被看成是选择走多少的梯度,如果学习率为1,那么就是直接走到对应的点
- 学习率的改变应该是最后进行考虑的,而且改变的时候需要找到在哪些点要修改(画损失函数图像)
六.研究方向
6.1 图像标注:
- 说明图像的内容
- 用CNN网络提取特征,传入RNN网络,循环迭代
- 改进:带注意力的图像标注
图像的每个特殊位置用向量表示,循环过程中,向量的分布也在不断改变,每个环节除了固有的输出(词汇表上的分布),还有传递给下一个环节的特征向量的分布(图像上的分布),即注意力的不断改变。
6.2 对象识别
- 从图中找出不知数量的对象,并给出bounding box
- 方法
(1)滑动窗口法:利用窗口进行局部的分辨,并将窗口进行滑动
(2)先使用图像寻找网络找到备选区域,再对候选区域分析- R-CNN:利用固定的设定网络对备选区域进行处理,找到对应的候选区域
- Fast-RCNN:通过卷积网络对整幅图像进行处理,并学习,最后针对备选区域的卷积快实现划分同时,处理过程共享卷积层
- YOLO/SSD:将输入像素有规律的分成多个网格,并想象网格中存在一些不同的基本bounding box(横竖长方形),然后利用卷积网络计算真实的偏差。
6.2 语义分割
- 为每个像素产生标签
- 方法1:通过部分图像的中间像素来表示该部分(将该部分传入网络)
改进:通过相邻部分共享权重 - 方法2:利用全连接网络对整张图像进行处理,得到各个点的标签得分
改进:全连接网络会产生巨大的开销,因此先采用下采样(池化,跨卷积)来降维,再采用上采样(去池化,反向跨卷积)来恢复维度。
6.3 物体分割
- 对输入图像中的对象进行标签(类似于语义分割,但是只针对指定对象)
- Mask-RCNN:先进行候选框的寻找,再对其中每个像素求解
6.4 分类与定位
- 要从图像中找出一定数量的对象,并给出bounding box
- 方法:使用卷积网络得到两个输出
(1)对象的得分
(2)bounding box 的位置以及大小的得分
6.5 无监督学习
- 降维:找到对应的最大方差轴,并实现投影。
- 密度估计:估计数据内在分布
- 生成模型:通过已有数据得到的模型再来预估新的数据
(1)自动编码器:将输入利用编码器(神经网络)降维,再利用编码器升高至原来的维度完成重构,并计算对应的损失。(如果对于监督学习,在这一步之后,对比较好的重构x再求出对应的label,与真实label计算损失)
(2)变分编码器:在自动编码器中加入随机因子而获得某种模型,得到生成数据的概率模型。其中z表示某种潜在属性(比如几分的笑,鼻子是怎么样的),z生成了x(根据z的设定要求,利用解码器得到对应的图片x),我们可以假定z服从某种分布,然后使用极大似然估计来计算贴合度
对于输入的数据,通过编码器q得到均值和方差,并根据给定的分布实现对z的采样,这一步就能完成后式的计算,再将z通过解码器p,同样获得均值和方差,最终在给定的分布中实现对x的采样,实现前式的计算,完成前向传播,再反向传播,梯度更新。
在训练完成之后,只要使用解码器网络即可,通过z得到生成的x(所以主要训练解码器)
![]() |
![]() |
6.11可视化
- 人们尝试去解释网络黑盒子的原理
- CNN的第一个特征提取层往往提取图像的边缘以及相反的颜色
- 判断输入图像各部分的重要性:
对各个部分进行阻挡或对图像的像素进行一定的扰动,观察结果 - 怎样的图像才是最贴合模型的图像:
具体方法:将图像初始化为0,或是通过添加高斯噪声作为初始输入来去噪,然后通过3D网络计算,然后反向梯度传播,然后上升。 - 放大神经网络在某层检测到的特征
DeepDream:将输入图像运行到该层,将该层的梯度设置为激活值,反向传播,不断更新 - 图像反演:
将某一层得到的特征进行图像的重构,然后根据给出信息进行梯度上升,完善重构度(保留内容) - 纹理合成:
(1)将小块的纹理合成大块的大块(保留风格)
(2)赋值周围像素,输入CNN网络,得到C个HW的特征图像,从HW中选出2个,取其C个维度,利用函数进行特征映射,得到CC的矩阵,对HW求平均(格莱姆矩阵),再利用梯度上升 - 风格迁移
选择一副内容图像和一副风格图像,然后利用CNN,分别最小化特征重构损失和格莱姆矩阵损失,就能得到该风格下的内容图像。
6.12 强化学习
-
通过对象,环境,奖励,动作之间的关系不断激励模型更加适应与环境
-
Q值函数
(1) 执行某个动作得到的奖励
(2)Q*函数:奖励最多的函数
bellman条件:前面的各个状态都最好,再加上本次最好构成全局最好 -
Q-Learning
(1)利用函数逼近器和网络结构,不断学习的过程
(2)经验重放
考虑到连续性,当前的动作会影响到以后的一系列动作
生成经验重放记忆,每次选择一小批量的动作,状态,奖励等进行反向传递(3)整个过程
- 随机初始化训练网络,重播网络
- 在每次训练中,对图像进行初始化,然后以小概率选择动作,根据贪心原则(选择这一步得分最多的),将这一步骤结果放入记忆重放内存中,并选择一部分进行梯度下降。
-
策略梯度
(1)跳过Q值函数,直接对决策进行选择(针对连续的问题,使用梯度的方法实现计算)
(2)通过梯度上升计算最大的平均奖励对应的策略
(3)方差缩小:上述的估计会有偏差
使用折扣因子来对不同时期的权重分割,越近权重越大
使用基线函数,体现实际奖励与目标奖励的差距1.5 迁移学习
针对数据少而模型复杂的问题,利用其他数据训练的网络参数,对一定数量的最后层进行训练
1.8愚弄图像
- 强行给一个图像错误的标签,并反向进行图片的梯度上升。
来源:CSDN
作者:丶翠釉
链接:https://blog.csdn.net/weixin_43958728/article/details/104342514