cs231n-整理

谁说胖子不能爱 提交于 2020-03-04 04:07:21

一.杂论


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能完成网络输入输出的自由化
RNN更新函数 多输入-多输出的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(所以主要训练解码器)
RNN更新函数 多输入-多输出的RNN
p(z)使用高斯分布可以得到,p(x|z)使用神经网络编码器,给定z即可得到。但是积分不现实。z通过解码器网络p会得到均值和对角协方差矩阵生成x【p(x|z)】,而x通过编码器网络q也会得到一个均值和对角协方差矩阵【p(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愚弄图像

  • 强行给一个图像错误的标签,并反向进行图片的梯度上升。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!