课程视频链接
1960s-1980s: 目标识别(object recognition)
1970s: 如何识别和表现物体
将物体的复杂结构简化成有更简单形状和几何结构的集合体
1990-2010:目标分割(object segmentation)
目标识别太难,则先将像素分组成不同的具有意义的区域
1.面部识别
2.基于特征的识别
3.解构人体并识别
4.目标识别(摄像机和图像的发展)
选读教材
Deep Learning by Goodfellow, Bengio, and Courville
比较 | 1近邻算法(1-nearest neighbors) | K近邻算法(K-nearest neighbors) |
---|---|---|
方法 | 获取所有的图像数据和标签,给图像打上与它最相似的训练图像的标签。训练快,预测慢 | 不只是寻找最近的点,而是根据距离函数,找到最近的k个点,在这些相邻点中进行投票,选择票数多的近邻点作为预测结果(take a majority vote) |
距离函数 | L1 distance(曼哈顿距离) | L2 distance(欧氏距离) |
L1 distance:像素之间绝对值的总和。L1的结果取决于坐标系。 如果数据的vector的每一维有特定的含义,可以尝试;否则L2更好
KNN中的超参
超参是算法中需要我们设置而不是学来的参数,与具体问题有关
实际中,使用KNN进行图像分类不常见,原因如下:
训练集VS验证集:算法知道训练集的标签,但不知道验证集的。验证集的标签只是用来检测算法的效果
#3:用不同的参数在训练集上进行训练并在验证集上进行评估,最后选择在验证集上表现最好的参数,在测试集上跑出最终结果
#4:交叉验证
使用n折交叉验证,对每个k,对算法进行n次测试,观察算法在不同验证集上的方差,量化算法的好坏。画图得出算法的好坏与超参的关系,选择出使效果最好的超参。小数据集中用得较多,深度学习中不多,因为训练比较耗时
参数化的方法(Parametric approach)
KNN与参数化方法的比较
从图像观点来看,线性分类也可以作为点和高维空间的概念
一句话概括
在损失函数数据项之后增加一个正则项,目的是减轻模型的复杂度而不是试图取拟合数据,鼓励损失函数选择更简单的W,从而避免过拟合
常见正则化类型
试图找到W,最小化了最终的损失函数
方法
梯度
梯度下降
初始化W矩阵,计算损失和梯度,向梯度相反方向更新权重值。梯度指函数最大增加方向,故梯度减小指的是函数下降的方向。每次行动的步长:学习率
softmax 分类器(多项逻辑回归)
对比
特征表示
计算图像中的特征向量,合在一起成为图像的特征表示,代替原始像素传入分类器
颜色直方图
获取每个像素对应的光谱,映射到柱状中,计算每个柱中像素点出现的频次。从全局上显示图像中有哪些颜色
方向梯度直方图
将图像分为8*8像素的区域,在每个区域中计算每个像素值的边缘方向。将这些边缘方向量化到几个组,在每个区域内,计算不同的边缘方向从而得到直方图
词袋
获得一堆图像,采样小的随机块,用k均值等方法使其聚合成簇,得到不同的簇中心,代表视觉单词的不同类型
以前是先提取图像特征,输入线性分类器之后,训练时这些特征不再改变,仅仅改变分类器
现在不提前记录特征,而是直接从数据中学习特征
计算图
表示任何函数。节点表示要执行的每一步计算
保全输入的空间结构,卷积核可成为这个神经元的感知野
输入图像input,保持三维形状->使用多个卷积核(每个卷积核的权重是一样的)作为权重矩阵,从图像左上角开始,在图像像素矩阵上滑动,计算点积->输出激活映射
多个卷积层依次堆叠,用激活函数对其进行逐一处理,一层的输出作为下一层的输入
多个卷积层作用在图像的同一区域,但是有不同的作用,代表从简单到复杂的特征序列。前面几层一般代表低阶的图像特征,如边缘;中间层更加复杂,如边角、斑点等。这与对视觉神经细胞的研究结果一致,大脑对看到的东西的感知也是从简单到复杂的神经元
可以用0填充原始像素矩阵来保持输入图像的尺寸
Q:填充0是否意味着在边角添加了新的特征?
A:我们还是尽力处理图像范围之内的东西,检测这个区域内的模板的某些部分,零填充只是其中一种方式,处理实际问题时这是一种合理的方法
卷积后的形状由输入维度N,卷积核大小F,步长stride,零填充的维度P决定。最后得到的形状为outsizeoutsize卷积核数量
output size= (N-F+2p)/stride+1
参考 https://www.cnblogs.com/guoyaohua/p/8724433.html
让激活数据在训练开始前通过一个网络,网络处理数据使其服从标准高斯分布。在神经网络训练过程中使得每一层的输入保持相同分布
批量归一化可以理解为在网络的每一层之前都做预处理,只是这种操作以另一种方式与网络集成在了一起。通常位于全连接层或卷积层之后,激活函数之前。
本质思想:
因为深层神经网络在做非线性变换前的激活输入值(就是那个WX+b)随着网络深度加深或者在训练过程中之所以收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近,导致反向传播时低层神经网络的梯度消失。
而BN通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,使得激活输入值落在激活函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,让梯度变大,避免梯度消失问题产生。梯度变大意味着学习收敛速度快,能大大加快训练速度。
BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift)
用一个常量γ进行缩放,再用β进行平移,这样就恢复了恒等函数,就像没有进行BN一样。BN的作用在于将数据转化为单位高斯数据,但不总是最好的选择,进行缩放和平移可以增加灵活性。
网络可以学习到γ=标准差,β=均值
对每个batch计算均值,方差->归一化->缩放平移,从而改进了整个网络的梯度流,增强了鲁棒性,能在更广范围的学习率和不同初始值下工作
强制输入符合高斯分布,会损失结构吗?不会,只是缩放到适合操作的区域
Q:损失没有什么变化,准确率却快速提高?
A:分布依然很分散,但都在朝正确的方向轻微移动,因为正在选择最大的准确率,因此准确率会得到很大提升
粗细粒交叉搜索(coarse to fine search)
SGD的问题:
SGD+Momentun动量
保持一个不随时间变化的速度,将梯度估计加在速度上。在这个速度的方向上前进,用摩擦系数进行衰减,之后加到梯度上。即使到了局部极小点或鞍点,因为有速度所以仍然可以越过这样的点继续下降,更平稳地接近最小点
Nesterov Momentum
进行换元之后可以同时计算损失和梯度。
因为有校正因子,与常规方法相比,该方法不会非常剧烈地越过局部极小值点
AdaGrad
优化过程中,需要保持一个训练过程中的每一步梯度的平方和的持续估计。训练时不断将当前梯度平方累加到这个梯度平方项,更新参数时会除以梯度平方的实际值。
这样的放缩对矩阵中条件数(condition number)很大的情形有什么改进?假设有两个坐标轴,一个轴方向有很大的梯度,另一个方向却有很小的梯度,随着累加很小梯度的平方,我们会在最后更新参数时除以一个很小的数字,从而加速在小梯度维度上的学习速度,相应的在另一个轴方向上会变慢,也就是在每个维度上进行大致相同的优化
当时间增加时,步长会变得越来越小。因为是随着时间累加梯度平方的估计,这个估计值随时间单调递增。当优化函数为凸函数时效果很好,接近极值点时会慢下来逐渐收敛,但在非凸函数时,会困住
Adam
如何减少训练和测试之间的误差?
GPU的核数多,但每个核没办法独立操作,需要共同协作,并行处理能力强
Q:3*3卷积核,步长为1的卷积层的有效接受范围?
A:[7x7]
Q:为什么使用很小的卷积核?
A:与7*7卷积核有相同的感知野,但网络更深,有更多非线性,可以得到较小的参数量
Q:当不断在不带残差功能的卷积网络上堆叠越来越多层时会发生什么?
A:更深的网络不能表现更好。在训练数据上也没有过拟合。这个问题是优化问题,更深的模型更难优化
解决方案:将浅层模型通过恒等映射,拷贝到剩下的深层中。这样深层模型至少跟浅层模型一样好
用模型去拟合残差H(x)-X,而不是直接拟合H(x)。相当于对输入的一个修正
-ImageNet:3.57%
左图:按算法性能顺序排序。Inception V4是表现最好的模型
右图:x轴表示操作,越大表示尝试了更多的可能性,花费更多算力;Y轴表示最高精度,越高越好;圆圈大小表示使用的内存大小。GoogleNet效率很高,空间占用量在算法训练过程中一路下降,只使用了很小的内存空间
vanilla卷积层+MLP卷积层。在每个卷积层中,只要在标准卷积上叠加一个完全连接的MLP层,就能为局部图像块计算更多的抽象特征
ResNet:合理地管理梯度流
RNN:处理大小可变的有序数据
解决梯度爆炸的方法:梯度截断。梯度超过阈值时进行除法
解决梯度消失的方法:换更复杂的RNN结构,如LSTM
语义分割:在图像上每个像素都标注标签,但是不区分类别
分类+定位:在物体周围绘制方框。知道要寻找的类别的数量
目标检测:在物体周围绘制方框并分类,不知道要寻找的类别的数量
实例分割:图像分割+目标检测。检测所需类别的实例,标记每个实例的像素
语义分割
对输入图像中每个像素做分类。不区分同类物体
法1:滑动窗口,每次对图像中的一个小块进行分类。X计算量巨大
法2:全连接卷积网络,不光是从图像中提取各个图像块并分类,可以把网络当成很多卷积层堆叠在一起,一次性完成所有像素的计算。X计算量大,耗内存
损失函数:对每个像素进行分析。有一个真值表匹配输出的像素,计算输出的像素与真值像素之间的交叉熵损失
法3:在图像内做下采样,再对特征做上采样,而不是基于整个图像的维度做卷积,仅对一部分卷积层做原清晰度处理。
跨卷积(stride conv),池化也能用于减小图像尺寸
上采样:
1.去池化。增加网络特征映射的尺寸
2.卷积转置(transpose conv)/去卷积(deconv)/小步长卷积(strided conv)/反向跨卷积(backwards strided conv)。不仅进行上采样,还学习到了一些描述如何上采样的权重。取输入的特征映射的值,乘以卷积核,在区域内复制这些值作为输出
分类和定位
输入图像->巨大的卷积网络->2个全连接层,一个得到分类得分,一个得到标定边界的参数(高度,宽度,边界的xy坐标)->两组损失,图像分类上的softmax,衡量预测坐标和实际值之间差异的L2损失
多重任务损失:对损失函数进行加权求和。更好的做法是用关心的其他性能指标组成矩阵来取代原本的损失值,最终是在用性能指标矩阵在做交叉验证,而不是盯着损失值来选择参数
人体姿态估计human pose estimation
神经网络输出14个参数,给出14个关节的坐标,用回归损失评估14个点的预测表现
目标检测object detection
基于候选框的模型
根据输入的图像,每当图像中出现其中一类对象时,围绕对象划定一个框,并判定类别。对每张图像,分类数量是不固定的
法1:滑动窗口(sliding window)
将图像切成小块,使用CNN进行分类
问题:图块选择困难。物体可以出现在任何地方,拥有任何尺寸,任何比例;计算复杂度高
候选区域(region proposal)
候选区域网络找到物体可能存在的备选区域,CNN对区域进行分类
例:R-CNN,固定算法找到候选区域框+分类+校正区域框
问题:对每个候选区域进行独立训练,会将所有特征存入磁盘,计算复杂,消耗资源;使用固定选择模型找到候选区域,并不学习参数;测试阶段的inference也很慢
基于候选区域的模型更容易得到更高的精度,但是速度慢;SSD更快但是准确度没那么高
实例分割(instance segmentation)
对输入图像预测物体位置、整个分割区域及其对应类别
CNN内部的工作原理是什么?
第一层:可视化卷积核的权重
在该层中,卷积核在输入图像上来回滑动,输出图像块和卷积核权重的点积
可视化为64个带三个通道的11x11图像
可视化结果中,可以看出该层在寻找有向边,从不同角度和位置观察图像,与人类视觉系统早期的工作相似
中间层卷积核的权重
第二层用20个卷积核进行7x7的卷积,接受了16个通道的输入,无法直接可视化,因此把16x7x7的卷积核平面展开成16x7x7的灰度图,但这些卷积核没有直接连接到输入图像,因此看上去没有意义
最后一个隐层
在分类器前4096维的特征向量层
通过训练的CNN提取数据集检测图像,为每个图像标记4096维的向量,根据这个向量计算其近邻,可视化最后一个隐层。与根据像素空间确定近邻的方式不同,因为在其特征空间和近邻之间有很大的差异,然而图像的语义内容在特征空间中是相似的
在4096维空间中计算近邻,可视化结果表明特征空间的特性是捕捉图像的语义信息
另一种方法:降维
简单:PCA
强大:t-SNE(t-分布邻域嵌入,t-distributed stochastic neighbor embeddings),常用语可视化特征的非线性降维方法
提取大量的图像,使其在CNN上运行,记录每个图像在最后一层4096维的特征向量,使用t-SNE将4096维压缩到2维。取图像的原始像素,将其放在二维坐标上,即为对应的4096维特征向量降维版本。可视化结果体现出不连续的语义概念
可视化中间层的激活映射图具备可解释性
可视化输入图像中什么类型的图像块可以最大程度地激活不同的特征
选取卷积层,得到所有激活值(128x13x13,三维数据),从128通道中选一个。通过卷积层运行很多图像,记录卷积特征,可视化来自特定层特定特征的最大激活的图像块,根据激活程度排序。可视化结果体现特定层的特定特征的神经元在寻找什么特征
排除实验
弄清楚是图像的哪个部分导致网络做出分类的决定
用数据集平均像素值遮挡图像,记录遮挡图像的预测概率,将遮挡部分划过图像的每个位置。画出的热力图显示了作为图像遮挡部分的预测概率输出
可视化结果表明,遮挡部分可能对分类决策起重要作用。黄色和白色对应高预测概率
显著图
想知道哪些像素对于分类是重要的
计算关于输入像素的预测分类的分值的梯度
可视化结果显示对于输入图像的每个像素,如果进行小小的扰动,相应类的分类分值会产生多大的变化
引导式反向传播(guided back-propagation)
对于一个特定的图像,提取中间层的一些神经元,输入图像的哪个部分影响其分值
计算中间值关于图像像素的梯度
梯度上升法
了解什么类型的输入大体上会激活某个神经元
修正训练的CNN的权重,在图像的像素上执行梯度上升来合成图像最大化某些中间神经元和类的分值。执行梯度上升的过程中,不再优化网络中保持不变的权重,而是试图改变一些图像的像素,使得类的分值最大化,并加入正则项防止生成的图像过拟合特定网络的特性,强制其看起来像是自然图像。如果不加,生成的图像可能看上去没有意义
需要两个特定属性的生成图像:最大程度地激活一些分值或神经元的值,同时希望生成图像看起来是自然的
特征反演(feature inversion)
选取一张图像将其通过神经网络,记录其中一个图像的特征值,根据其特征标识重建这张图。
最小化捕获到的特征向量之间的距离,在生成图像的特征之间合成一个新的与之前计算过的图像特征匹配的图像
全变差正则化
将左右相邻的像素之间的差异拼凑成上下相邻,以尝试增加生成图像中的空间平滑度
例子:尝试使用VGG-16的relu2_2特征重构图像,图像被完美重构,不会丢弃原始像素值得许多信息。而在神经网络较高层低层次细节更容易损失,更多保留的是语义信息
纹理合成
给定一些纹理的输入图像块,构建模型使其生成更大块的相同纹理的图像
计算机图形学中的古老问题,采用简单的算法即可解决。2015年采用神经网络的做法:
使用格拉姆矩阵,抽取不同特征描述其共现关系,统计特征映射图中的哪些特征倾向于在空间不同位置一起激活
丢弃了体积的所有信息,因为对图像中每一点对应的特征取平均值
有了纹理在神经网络上的描述符,通过梯度上升合成图像。不是重构输入图像的全部特征映射图,而是重构输入图像格拉姆矩阵的纹理描述符
利用高层重构纹理能恢复更多的特征
风格迁移
取两张图像,一张作为内容图像,引导生成图像的主体;一张作为风格图像,生成图像的纹理或风格。共同做特征识别,用随机噪声初始化输出图像,计算L2范数损失和图像上的像素梯度,在生成图像上执行梯度上升。最小化内容图像的特征重构损失和风格图像的格拉姆矩阵损失,得到图像,在风格图像的艺术风格上呈现内容图像的内容
但训练太慢->训练一个可以输入内容图像的前馈网络,直接输出风格迁移后的结果。训练前馈网络时计算相同内容图像和风格图像的损失,使用相同梯度更新前馈神经网络的权重。速度很快,实时
谷歌:训练一个神经网络,在测试时间内使用一个训练好的神经网络应用许多不同风格
Q:为何将先验假设也就是隐变量分布定为高斯分布?
A:我们是在定义牟征生成过程,该过程首先对z采样然后对x采样,对隐变量的属性来说高斯分布是一种合理的先验模型,接下来能够优化模型
总流程
训练好VAE之后,用解码器生成数据
总结
在原来的自编码器上加入随机成分,采用了随机分布和采样的思想,从而生成数据
变分指用近似的方法来解决难解的表达式。VAE定义了一个难解的密度分布,推导出一个变化的下界然后优化它
采用一个博弈论的方法,模型将会习得从训练分布中生成数据
问题:没有直接的方法能从复杂高维的分布中采样
解决:从简单分布中采样,例如随机噪声。需要神经网络学习的是从简单分布到训练分布的变换
梯度信号主要受到采样良好的区域支配,而事实上希望在采样效果并不好的时候多学到一些知识。为了提高学习效率,针对梯度定义一个不同的目标函数,做梯度上升。不再最小化判别器判别正确的概率,转而最大化判别器出错的概率
提升样本质量:加入卷积结构
总结
Environment赋予agent一个状态,agent采取行动,envi回馈给agent奖励,直到envi给出终态,结束这个环节
agent在所处环境中采取行动,因为其行动获得奖励。目标是学会如何采取行动以最大程度地获取奖励
值函数(value function)&Q值函数(Q-value function)
最佳策略是在任何状态下按照具体的Q* 采取最好的行动
Q-learning
用函数逼近器来估计动作值函数。若函数逼近器为深度神经网络,则这种方式被称为深度Q-learning,是深度强化学习常用方法之一
网络将试图接近不同状态动作组的Q值函数
训练这个损失函数,最小化Bellman等式的误差
一次前向传播就能根据当前状态算出所有Q的值
训练Q-Network:经验回放(experience replay)
从连续样本中学习存在问题:
样本都是相关的,导致低效率的学习
当前的Q-network参数决定了接下来的训练样本的大致方向,会导致不好的反馈循环
保留状态转换的重放记忆表,在训练中获得更多的经验,不断更新表。从回放记忆中采样小批量的转移样本而不是连续样本训练Q-network。每个转换可能对多次权重更新起作用,数据效率更高
Policy gradient
Q-learning非常复杂,但策略可以非常简单->可以直接学习这个策略吗?从一系列策略中找到最好的策略,而不是通过这个评估Q值的过程来推断
定义一类参数化策略,对每个策略定义价值。目标:找到最大化策略的参数
对策略参数进行梯度评价:REINFORCE算法
获取对轨迹的未来奖励的期望
采样经验轨迹,使用策略pi(θ),对每个轨迹计算奖励
对期望值求梯度,并转化为梯度的期望。可以用蒙特卡罗抽样使用得到的样本轨迹来估计梯度(强化的核心思想)
p(τ;θ)是一个轨迹的概率,是所有得到的下一个状态的转移概率和在策略π下采取行动的概率的乘积
得到的梯度会告诉我们应该对参数调节多少才能增加行动增加行动的似然值,通过乘以奖励值来放缩
希望给定奖励就可以认为所有行动就是最好的行动,需要大量的样本、对时间求平均才有一个好的估计。方差较大。
Q:如何减少方差提高估计量?
A:
1.给定梯度估计量,通过影响来自该状态的未来奖励来提高行为的概率,先不对似然值进行放缩,或通过轨迹的总奖励增加行动的似然值
2.使用折扣因子来忽略延迟效应,更关注即将获得的奖励而不是更晚的,即关注在不久的将来产生的行动组,降低晚一点发生行为的权重
3.使用baseline来减少方差
仅仅使用轨迹的原始值不一定有意义。如果奖励一直是正的,将不断提高行动的概率,但真正重要的是奖励与期望的相比更好->
提高一个已知状态的行动的概率,只要这个行动好于从那个状态得到的期望值
引入一个依赖于状态的基线函数表示期望从这个状态得到的值,那么用来增加或降低概率的奖励或放缩因子=未来奖励的期望-基线值
Q:如何选取baseline?
A:
最简单的做法:获取所有轨迹上迄今为止获得的奖励的滑动平均值。也可以利用方差
Q:不知道Q和V,如何学习?
A:Actor-Critic算法。结合policy gradients和Q-learning训练一个actor(策略)和一个critic(Q值函数),来判断一个状态怎么样,在该状态下的行动怎么样
actor决定采取哪一种行动,critic判断行动怎么样以及如何调整
之前提到的Q-learning问题必须学习每一个状态行动组的Q值,而critic只需要学习这个策略产生的状态行动组的值,减轻了critic的负担
可以结合Q-learning的技巧,如经验回放
可以由优势函数(advantage function)定义一个行动比期望值高出多少
-初始化策略参数θ和评价参数φ(phi)
-对于每次训练的迭代,在当前策略下采样M个轨迹,计算梯度
-对每个轨迹和每个时间步,计算其优势函数,用于梯度估算,并累积起来
-用同样的方法训练φ,增强值函数来学习我们的值函数,使优势函数最小化使其接近Bellman等式
-在学习和优化策略函数以及评价方程间进行迭代,更新梯度
行为强化:RAM(Recurrent Attention Model),硬attention
目标:图像分类
有选择地集中在图像的某些部分周围通过观察来建立信息,预测分类
-从人类感知图片的行为中获得灵感。人类在看图像时要确定图像中的内容,首先低分辨率地看见它或只看图像的某些部分,再针对局部观察
-节约计算资源,不需要处理整幅图的像素
-可以忽略图片中混乱和不相关的信息,有助于正确分类
State:目前已经看到的微景(glimpses)
Action:下一个要看的图像部分的坐标
Reward:分类正确为1,否则为0
从图像周围取得glimpse是不可导操作,因此要使用强化学习公式学习获取glimpse的行动的策略。给定目前已经看到的glimpse的状态,使用RNN对状态建模,输出下一个行动
-输入一张图像,观察图像获取glimpse,传入根据不同任务制定的神经网络
-使用RNN集成历史状态
-输出一个行动的分布(高斯分布的均值),从行为分布中抽取一个特定的坐标,作为输入并得到下一个glimpse
-采用轨迹进行计算,得到策略梯度的估算,做反向传播
总结
Q-learning:对很多维度要计算确切的状态行动组的值,但比决策梯度有更高的采样效率。面临的挑战:需要充分的探索