Deep Learning for Computer Vision 课程笔记
Lecture 1
计算机视觉(Computer Vision)和机器学习(Machine Learning)都属于人工智能(Artificial Intelligence)。深度学习(Deep Learning)是机器学习的一个子集,它与计算机视觉相交,并属于更大的AI领域。
CV和DL的背景
计算机视觉的历史是从60年代初开始的,Block World 是由Larry Roberts出版的一部作品,被广泛地称为计算机视觉的第一篇博士论文,其中视觉世界被简化为简单的几何形状,目的是能够识别它们,重建这些形状是什么。1966年MIT的暑期视觉项目,目的是为了构建视觉系统的重要组成部分。
七十年代另外一个非常重要的工作(Brooks&Binford,1979 Fischler & Elschlager 1973),这个时候他们提出了一个问题,我们如何越过简单的块状世界,开始识别和表示现实世界的对象。70年代是一个没有数据可用的时代,计算机的速度很慢,计算机科学家开始思考如何识别和表示对象。
80年代,由于样本小,物体识别是很难的。如果物体识别太难,那么我们首先要做的是目标分割,这个任务就是把一张图片中的像素点归类到有意义的区域,我们可能不知道这些像素点组合到一起是一个人型,但是我们可以把这些属于这人的像素点从背景中抠出来,这个过程就叫做图像分割。他们用一个图论算法对图像进行分割,还有另外一个问题,先于其他计算机视觉问题有进展,即面部检测,脸部是人类最重要的部位之一。
1999-2000年机器学习技术,特别是统计机器学习方法,开始加速发展,出现了很多方法:支持向量机模型,boosting方法,图模型。有一种工作做出了很多贡献,技术使用AdaBoost 算法进行实时面部检测,由Paul Viola和Michal Jones 完成。
从90年代末到2000年的前十年有一个非常有影响力的思想方法是基于特征的目标识别,叫做SIFT特征,思路就是去匹配整个目标。
可以看到我们从60年代、70年代、80年代一步步走到20世纪,有一件事情一直在变化,就是图片的质量,随着互联网的发展,随着数码相机的发展,计算机视觉的研究也能拥有更好的数据了,计算机视觉在21世纪早期提出了一个非常重要的基本问题,我们一直在目标识别,但是直到21世纪的早期,我们才开始真正拥有标注的数据集,能供我们衡量在弥补识别方面取得的成果,其中最具有影响力的标记数据集之一叫PASCAL Visual Object Challenge 这个数据集由20个类别的图片,数据集中的每个种类都有成千上万张图片,现场不同的团队开发算法来和数据测试集做对抗训练,来看有没有优化,这里有一张图表列举了从2007年到2012年在基准数据集上检测图像中的20中目标的检测效果,可以看到在稳步提升。在差不多时候,普林斯顿和斯坦福中的一批人开始,向我们或者说我们这个领域提出了一个更加困难的问题,我们是否具备了识别真实世界中的每一个物体的能力,或者说大部分物体。这个问题是由机器学习中的一个现象驱动的,就是大部分的机器学习算法,无论是图模型,还是支持向量机或者是AdaBoost都可能会在训练过程中过拟合,部分原因是可视化的数据非常复杂,我们的模型的维数就很高,参数量就很大,输入是高维的模型,则还有一堆参数需要调优,当我们的训练数据量不够时,很快就产生了过拟合的现象,这样我们就无法很好地泛化,因此即使有两方面的动力,一是我们单纯地想识别自然世界中的万物,二是要回归机器学习克服机器学习中的瓶颈问题,过拟合问题。
LIfeifei开展了一个叫ImageNet的项目,汇集所有能够找到的图片,包含世界万物,组建一个尽可能大的数据集,用一个称为WorldNet的字典来排序,这个字典里有上万个物体类别,用亚马逊土耳其机器人平台进行排序清洗数据,给每张图片打上标签,最终的结果是一个ImageNet,最后由将近500万甚至4000万多的图片,分成22000类的舞台或者场景,这是一个巨大的,很有可能是由当时AI领域最大的数据集,它将目标检测算法的发展推到了一个新的高度。从2009年开始,ImageNet团队组织了一场国际比赛,叫做ImageNet大规模视觉识别竞赛,这是一个筛选更严格的测试集,总共140万的目标图像有1000种目标类别,分别识别来测试计算机视觉算法。2012年卷积神经网络算法击败了所有其他的算法。CNN模型展现了强大的能量。
Lecture 2 Image Classification
图像分类是计算机视觉的核心问题。一个给定的数据集,比如猫、狗、树等,对于人来说,很容易识别,但对机器来说是一项很难的任务。
语义鸿沟: 计算机获取的图像的视觉信息与用户对图像理解的语义信息的不一致性而导致的低层和高层检索需求间的距离。
实际识别中,还要面临如下挑战: 1. 光照;2. 形变;3. 遮挡;4. 背景杂物;5. 同类差异。算法需要对这些方法具有鲁棒性,同时算法不仅仅要能识别分类猫,还要能识别世界上的其他种类(保持对类间差异足够敏感),这是一个巨大的挑战。
需要更鲁棒的方法,更具扩展性的方法,某些方法不需写下all人对不同类型对象的知识。图像分类,就是输入一个元素为像素值的数组,然后给它分配一个分类标签。数据驱动,数据集MNIST, CIFAR10, CIFAR100, ImgeNet, Places365, Omniglot(alphabets)。
算法
- 最近邻(Nearest Neighbor)
Nearest Neighbor算法将会拿着测试图片和训练集中每一张图片去比较,然后将它认为最相似的那个训练集图片的标签赋给这张测试图片。
比较两张图片可以计算他们的L1(Manhattan)距离:
d1(I1,I2)=∑p∣I1p?I2p∣d_1(I_1,I2)=\sum_p{|I^p_1-I^p_2|} d1?(I1?,I2)=p∑?∣I1p??I2p?∣
L2(Euclidean)距离:
d2(I1,I2)=∑p(I1p?I2p)2d_2(I_1,I2)=\sqrt{\sum_p{(I^p_1-I^p_2)^2}} d2?(I1?,I2)=p∑?(I1p??I2p?)2? - k-最近邻(k-Nearest Neighbor)
不像最近邻只找最相近的那一个图片的标签,k-Nearest Neighbor找最相似的k个图片的标签,然后让他们针对测试图片进行投票,最后把票数最高的标签作为对测试图片的预测。
如何选择哪个k值最合适,选择哪个最好的距离函数等等,这些选择,被称为超参数(hyperparameter)。
设置超参数:
- 选择在数据上表现最好的超参。
- 将数据分为训练集(90%)和测试集(10%),选择在测试集上表现最好的超参。注:决不能使用测试集来进行调优。
- 将数据分为训练集、验证集、测试集,选择在验证集上表现最好的超参,在测试集上评价你的算法。
- 交叉验证,当训练集数量较小时,将训练集随机等分为k份,取其中一份为验证集评估模型,其余k-1份为训练集训练模型,重复该步骤k次,每次都取一份不同的子集为验证集,最终得到k个不同的模型(不是对一个模型迭代k次)和k个评分,综合这k个模型的表现(平均得分或其他)评估模型在当前问题中的优劣。(最常用)
最近邻分类器能够在CIFAR-10上得到将近40%的准确率。该算法简单易实现,但需要存储所有训练数据,并且在测试的时候过于耗费计算能力。最近邻分类器在某些特定情况(比如数据维度较低)下,效果不错,但是在实际的图像分类工作中,很少使用。因为图像都是高维度数据(他们通常包含很多像素),而高维度向量之间的距离通常是反直觉的。
Lecture 3 Linear Classifiers
评分函数(score function): 原始图像数据到类别分值的映射
损失函数(loss function): 用来量化预测分类标签的得分与真实标签之间一致性的。
评分函数
可以把图像看做这个高维度空间中的一个点,整个数据集就是一个点的集合,每个点都带有1个分类标签。
偏差和权重的合并技巧:
在分类评分函数中:
f(xi,W,b)=Wxi+bf(x_i, W, b)=Wx_i+b f(xi?,W,b)=Wxi?+b
分开处理这两个参数(权重参数W和偏差参数b)有点笨拙,一般常用的方法是把两个参数放到同一个矩阵中,同时[公式]向量就要增加一个维度,这个维度的数值是常量1,这就是默认的偏差维度。这样新的公式就简化成:
f(xi,W)=Wxif(x_i, W)=Wx_i f(xi?,W)=Wxi?
图像数据预处理:归一化,零均值的中心化
损失函数
- 多类支持向量机损失 Multiclass Support Vector Machine Loss
在正确分类上的得分始终比不正确分类上的得分高出一个边界值Δ\DeltaΔ。
max(0,?)max(0, -)max(0,?)函数,它常被称为折叶损失(hinge loss) - Softmax分类器
在Softmax分类器中,函数映射f(xi;W)=Wxif(x_i; W)=Wx_if(xi?;W)=Wxi?保持不变,但将这些评分值视为每个分类的未归一化的对数概率,并且将折叶损失(hinge loss)替换为交叉熵损失(cross-entropy loss)。Softmax分类器所做的就是最小化在估计分类概率和“真实”分布之间的交叉熵。Softmax分类器为每个分类提供了“可能性”。
Lecture 4 Optimization
最优化Optimization。最优化是寻找能使得损失函数值最小化的参数WWW的过程。
由于max操作,损失函数中存在一些不可导点(kinks),这些点使得损失函数不可微,因为在这些不可导点,梯度是没有定义的。但是次梯度(subgradient)依然存在且常常被使用。
最优化技巧
- 一个差劲的初始方案:随机搜索。随机生成的权重矩阵W,其中某些的损失值较小,而另一些的损失值大,把这次随机搜索中找到的最好的权重W取出。
核心思路:迭代优化。 我们的策略是从随机权重开始,然后迭代取优,从而获得更低的损失值。
- 随机本地搜索
从一个随机WWW开始,然后生成一个随机的扰动δW\delta WδW ,只有当W+δWW + \delta WW+δW的损失值变低,才会更新。 - 跟随梯度:可以直接计算出最好的方向,这就是从数学上计算出最陡峭的方向。这个方向就是损失函数的梯度(gradient)。在输入空间中,梯度是各个维度的斜率组成的向量(或者称为导数derivatives)。
梯度计算
- 利用有限差值计算梯度
对所有维度进行迭代,在每个维度上产生一个很小的变化h,通过观察函数值变化,计算函数在该维度上的偏导数。
在梯度负方向上更新:为了计算W_new,要注意是向着梯度df的负方向去更新,因为希望损失函数值是降低而不是升高。
**步长的影响:**梯度指明了函数在哪个方向是变化率最大的,但是没有指明在这个方向上应该走多远,走多远即步长(学习率)。
梯度下降
小批量数据梯度下降(Mini-batch gradient descent)
在大规模的应用中,训练数据可以达到百万级量级。如果像这样计算整个训练集,来获得仅仅一个参数的更新就太浪费了。一个常用的方法是计算训练集中的小批量(batches)数据。
小批量数据策略有个极端情况,那就是每个批量中只有1个数据样本,这种策略被称为随机梯度下降(Stochastic Gradient Descent 简称SGD)。
Lecture 5 Neural Networks
激活函数
历史上,使用最多的是Sigmoid,但Sigmoid有三个问题:
第一个问题,饱和的neuron会杀死backpropagation过程中的gradient。这个问题被称作vanishing gradient problem。
第二个问题,Sigmoid function的输出不是趋向于0的(zero-centered)。
第三个问题,exp()函数是消耗计算资源的。
使用relu,但是小心选择learning_rate。
尝试其他的函数,但是都不常用。
不要使用sigmoid。
Lecture 6 Backpropagation
函数关于每个变量的导数指明了整个表达式对于该变量的敏感程度。
深度学习中常见函数的导数:
f(x,y)=xy→?f?x=y?f?y=xf(x,y) = xy \to \frac{\partial f}{\partial x}=y \quad \frac{\partial f}{\partial y}=x f(x,y)=xy→?x?f?=y?y?f?=x
f(x,y)=x+y→?f?x=1?f?y=1f(x,y) = x+y \to \frac{\partial f}{\partial x}=1 \quad \frac{\partial f}{\partial y}=1 f(x,y)=x+y→?x?f?=1?y?f?=1
f(x,y)=max(x+y)→?f?x=1(x>=y)?f?y=1(x<=y)f(x,y) = max(x+y) \to \frac{\partial f}{\partial x}=1(x>=y) \quad \frac{\partial f}{\partial y}=1(x<=y) f(x,y)=max(x+y)→?x?f?=1(x>=y)?y?f?=1(x<=y)
注意:记住一件非常重要的事情,我们要检查变量梯度的向量大小应该跟变量向量大小一致,这在实际应用中是非常有用的完整性的检查,一旦计算出梯度后,检查梯度向量的大小,因为每个梯度元素,量化了每个元素,对最终输出影响的贡献。
Lecture 7 Convolutional Networks
一般由卷积层、池化层、全连接层组成。
参数共享: 在卷积层中使用参数共享是用来控制参数的数量
1x1卷积
扩张卷积
归一化层
全连接层
在全连接层中,神经元对于前一层中的所有激活数据是全部连接的,这个常规神经网络中一样。它们的激活可以先用矩阵乘法,再加上偏差。
Lecture 8 CNN Architectures
VGG, google et, ResNet都广泛使用,ResNet当前最佳。
Lecture 9 Hardware and Software
CPU指中央处理器,GPU指图形处理器。CPU主要负责操作系统和应用程序,GPU主要负责跟显示相关的数据处理,GPU的活CPU一般都可以干,但是效率低下。
Lecture 10&11 Training Neural Networks
数据预处理 Data Preprocessing
中心化(零均值化)是最常见的预处理方式
- 减去图像平均值
- 减去每个通道的平均值
权值初始化 Weight Initialization
Xavier Initialization 常用
训练过程监控 Babysitting the Learning Process
超参数优化 Hyperparameter Optimization
- 学习速率初始化
- 学习速率衰变常数
- 正则化强度
Lecture 12 Recurrent Neural Networks
普通神经网络只能单独处理一个个的输入,前一个输入和后一个输入完全没有关系。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的,主要是NLP。
基础的神经网络只在层与层之间通过权值连接,RNN最大的不同之处就是在层之间的神经元之间也通过权值连接。
标准RNN的还有以下特点:
1、权值共享。
2、每一个输入值都只与它本身的那条路线建立权连接,不会和别的神经元连接。
循环神经网络的训练算法:BPTT
Lecture 13 Attention
RNN 用于文本caption时,弊端是图像信息只在初始化时有用到。
Attention用于文本caption时,主要思路就是我们在每个时刻不仅输出描述的词汇,还输出一个分布函数,将这个函数作为一个mask与CNN输出的特征图相乘,得到一个有权特征图,代表我们在当前时刻关注图像的某一特定部分。
attention机制类似于人眼的聚焦机制,只集中注意力于重要的事情上面,忽略次要影响。
Lecture 14 Visualizing and Understanding
浅层的是具体的特征(比如边、角、色块等),高层的更抽象,最后的全连接层是把图片编码成一维向量然后和每一类标签作比较。如果直接把图片和标签做像素级的最近领域分类,误差很大,但是转成编码之后就准多了。
可以用PCA可视化最后一层的特征,深度学习领域更高阶的做法是用t-SNE。可视化非线性函数的激活值也可以帮助理解神经网络。
DeepDream: 试图放大网络中某个层的神经元激活来扩大现存特征。
Lecture 15 Object Detection
1.使用region proposal的,目前是主流,比如RCNN、SPP-Net、Fast-RCNN、Faster-RCNN以及MSRA的R-FCN。
2.不使用region proposal的,YOLO,SSD。
Lecture 16 Detection+Segmentation
Semantic Segmentation主要任务是将每个像素(pixel)做分类
Lecture 17 3D Vision
Lecture 18 Videos
Video = 2D + Time
Video Classification
3D CNN 3D Conv
2D Conv和3D Conv的区别:
Dataset
Sports-1M
Lecture 19&20 Generative Models
监督学习与无监督学习区别:
Generative Model包括Discriminative Model,Generative Model。
Lecture 21 Reinforcement Learning
强化学习:学习如何采取行动使回报最大化。
马尔可夫决策过程(Markov Decision Processes,MDPs)
MDPs 简单说就是一个智能体(Agent)采取行动(Action)从而改变自己的状态(State)获得奖励(Reward)与环境(Environment)发生交互的循环过程。
Lecture 22 Course Recap Open Problems in Computer Vision
ImageNet 1000个类别,1431167张图像。