[CS131] Lecture 19 Introduction to Deep Learning

根据 Stanford CS131 课程写的笔记(大部分为 note 翻译),英语水平一般,如有错误请评论指正

Lecture 19 Introduction to Deep Learning

Introduction

目前为止,本课程已经包含了一系列经典的计算机视觉技术,包括边缘检测 (edge detection)、聚类 (clustering) 方法、分类器 (classifiers)、特征检测器 / 描述子 (feature detectors/descriptors)。然而这些方法都有一个主要缺点:它们依赖于人类手动设计特征并选择表现良好的分类器。结果是,用于解决一个问题的计算机视觉方法往往无法很好的解决另一个问题,构建一个合理且精确的视觉流程需要大量人力和实验。甚至最佳的流程也受限于它能取得的最高精度,因为他们是由人类设计的,所以只能选取人类首先选取的模式。

深度学习 (deep learning) 已经成为现代计算机视觉研究的一个基本模块,因为它能够避免上述缺点。深度学习不再依赖于人工选择的特征和分类器,而是自身学习如何最好的消化和解释数据,来解决它们被训练的任何问题。关键点在于它们执行端到端学习 (end-to-end learning),即学习如何将原始数据(图像)直接映射到想要的输出(例如,标签、分割图像、预测)。深度学习常常包含将一系列简单的工具组合来构建一个网络,接着在数据上对想要解决的特定问题训练网络。它们常常能只靠替换训练数据来解决不同的问题。深度学习方法受到人类大脑的启发,它们尝试去模仿人类大脑新皮层中神经元的活动。

Applications

Image Classification

图像分类的任务是辨别所有输入图像中物体的类别。一个常见的基准是 ImageNet,之前的 lecture 中有简单的介绍过。

最初应用于 ImageNet 的流行算法,是手动调整且用了仔细挑选、硬编码 (hardcode) 的特征标记测试图像,再讲标记过的图像输入分类器,像用 SVM 来完成最后的分类。例如,2010 年的时候,ImageNet 优胜算法是先用 HOG 和 LBP 描述子,两者结合后再提供给 SVM。但是这种叫做 “shallow” 的方法很快就被 “deep” 方法打败了。接下来的几年内,分别出现了 AlexNet、VGG、GooLeNet,直到 2015 年的 ResNet,错误率已经低于人眼识别。

通常来说,这意味着深度学习算法在计算机视觉领域的前景极佳。深度学习算法的表现远超过传统的计算机视觉算法,甚至在某些精细的、较难的视觉任务上甚至超过了人类的表现,特别是当网络中层数较多时。

Object Detection

物体检测实际上是图像分类的一种拓展,在问 “什么”(例如,识别图中物体)之上又提出了 “哪里”(例如,定位被识别的物体)。在深度卷积神经网络 (deep convolutional neural networks, CNN) 出现之前,“shallow” 计算机视觉方法在 PASCAL VOC 数据集上的 mAP(mean average precision) 在 40% 左右。之后出现的一系列深度学习方法,将 mAP 提升到了 85.6%。

Object Segmentation

物体分割包括首先将一个物体划分为多个不同的语义区,这些语义区通常代表不同物体,接着检测每个区域包含的物体类型。这在传统分割算法(像我们在本门课中学的)是极具挑战性的——我们需要对我们想检测的物体有特定的知识,且必须手工设计符合物体的特征(例如,甜甜圈是中间带有孔的圆形物体,所以我么需要一个能够优先考虑这些形状的特征)。但是,最近的深度学习方法在解决物体分割方面展示了令人影响深刻的结果,例如:用三个独立的深度网络可得到下图的结果。

Pose Estimation

姿态估计包含通过一系列图片,追踪人体结构骨架来理解人类正在做什么。利用 CNN 共同学习定位身体部位,然后将部位与图中独立的人相关联。下图是一个姿态估计的例子。

Image Captioning

图像说明是通过算法理解图中物体、动作、关系,并附上与图像描述相关的说明。同样,深度学习能很好的解决这方面的问题:用一个卷积和递归结合的神经网络来给图像标记一个单独的说明,并用一个相似的结构加上一个额外的神经网络层用于定位图中独立的物体 / 行为和密集的给每一个物体 / 行为标记一个说明。

Other Computer Vision Tasks

视觉问题回答 (Visual question answering) 是利用算法回答图中描述的相关物体 / 行为的问题,例如,给定一张披萨的图像,算法可能需要回答 “披萨有几块?” 或者 “这是一块素披萨吗?”。用一个基于递归神经网络,利用 LSTM(长短记忆网络,long short-term memory) 模块来回答关于图像主题和行为的多选题。

图像超分辨率 (Image super-resolution) 包括通过缩小的输入图像,推导出高分率版本——这是一个较难的任务,因为它包含产生未知的细节,并保证这些产生的细节与整张图片是相关的。用一个生成对抗网络 (generative adversarial network) 来从缩小的图像中恢复真实的细节,并产生接近原始高分辨率验证图像接近的插值结果。

Outside Computer Vision

深度学习同样也对在计算机视觉之外的方面有着特别好的效果,包括机器翻译 (machine translation),文本生成 (text generation),语音识别 (speech recognition) 和语音合成 (speech synthesis)。

另外,深度强化学习 (deep reinforcement learning) 方法也在一系列任务取得了成功。深度强化学习包括反复使用试凑法学习一种端到端的最优控制策略(也就是在特定情况下采取一系列行动达到最终目标),最终目标是直接映射状态信息(例如,一个视频游戏的截图)。深度强化学习在许多基于游戏的任务上有着显著的结果,例如:Alpha Go。

Motivation

大多数深度学习问题被制定为监督学习任务:给定数据 X 和标签 y ,目标是学习精确的预测标签 y ^ 。图像分类是一个监督学习问题,通常用深度学习方法解决。我们提及的其他解决图像分类问题的方法是首先提取手工设定的特征,再用机器学习方法(例如:PCA、KNN)去学习在指定特征集下的模型。在测试的时候,我们用分类器输出 y ^ 作为我们的预测分类。问题在于手工设定的特征提取器在训练时不能被优化。下图是传统计算机视觉对图像分类的流程

本门课所包含的大多数策略专注于将图像减少至手工设定的特征集。这些特征集将图像原始信息的一部分编码,可以用于大多数机器学习方法训练分类器。

深度学习允许我们学习特征与分类器的联合,以取得更好的模型。深度学习由从类似第一准则获得可提供信息的特征,并以此作为动力,即同时最优化特征提取和分类器模块。下图是深度学习作用于图像分类的例子。

层次特征如下:

深度学习模型包含许多层,可以学习到层次特征。低层学习简单特征,而高层学习简单特征的结合。

Supervised Learning

Problem Formulation

监督学习是从被标记的训练数据中学习一个方程的过程。给定一个训练样本集,模型通过调整权重 (weights) 来最小化代价函数 (cost function) 的值。代价函数是用于衡量预测值和实际值之间不同的程度,例如:均方误差 (mean squared error)。通常,损失函数会包含一个正规化项 R ( w ) ,用于惩罚较大的权重值并限制模型的复杂度。接下来模型就可以用这些权重来对测试数据进行预测。随后可以用测试误差来对模型进行表现分析。

W = arg min W 1 N i = 1 N l ( f ( x x , w ) , y i ) + R ( w )

Linear Regression

线性回归是一种监督学习方法,我们尝试将输入向量 x i R D i n 通过模型关联至输出向量 y i R D o u t 。线性回归通过一个简单的线性转换或者矩阵乘法来建模:

f ( x , W ) = W x

我们可以将其视作一个监督学习问题,我们需要学习权重 W 。我们通过最优化一个将欧几里德距离 l ( y ^ , y ) = 1 2 | | y ^ y | | 2 2 和正规化项 R ( W ) 结合的损失函数。利用 frobenius 正规化项,可以用以下方程描述:
W = arg max W 1 2 N i = 1 N | | W x i y | | 2 2 + λ | | W | | f r o 2

下图是一个简单的线性回归模型用于对图像分类。 W 的每行代表用于计算输入到每个输出类总和的权重。

Neural Networks

在一些情况下,简单的线性转换已经不能满足我们的需求,所以我们需要引入一个更复杂的模型。首先,我们可能想只添加矩阵乘法,如下:

f ( x , W 1 , W 2 ) = W 2 W 1 x

但是,这种方法实际上与之前的线性转换没有差别。因为 W 1 W 2 可以写作矩阵乘法 W = W 1 W 2 ,这样又变成了之前的线性转换 f ( x , W ) = W x 。作为替代,我们需要在矩阵乘法之间引入非线性部分。进而产生以下的新模型:
f ( x , W 1 , W 2 ) = W 2 ( σ ( W 1 , x ) )

式中, W 1 R H × D i n , W 2 R D o u t × H 。 在这个模型中,一个矩阵 W 1 和一个非线性方程 σ : R H R H 点乘。这就是一个一层神经网络的例子。 σ 函数让这个模型比简单的线性模型更加有效。

现在较为流行的激活函数 σ ( x ) 有两种:

  • sigmoid 函数,定义 σ ( x ) = 1 1 + e x ,因为它是连续的且可微。同时也限制了输入。
  • 修正线性单元 (rectified linear unit, ReLu),定义 σ ( x ) = m a x ( 0 , x ) ,在文学和效率方面都有出色的表现

由激活函数产生的向量被称作一个隐藏层。可以通过包含更多的矩阵乘法,即更多的隐藏层来拓展这种模型。如下式,是一个二层神经网络:

f ( x , W 1 , W 2 , W 3 ) = W 3 σ ( W 2 σ ( W 1 , x ) )

给定一个可微的损失函数(正如我们在线性回归所用的一样),这种新的神经网络结构可以用一系列最优化技术进行最优化。当神经网络训练时,隐藏层开始表现关于输入的 “学习特征”。重要的是,这是这种类型的模型和之前手工产生特征的最大进步。

Gradient Descent

如上所述,我们最终想要最小化以下的方程以检测最佳的权重:

g ( w ) = 1 N i = 1 l ( f ( x x , w ) , y i ) + R ( w )

一个优化上式的方法是直接解方程,但花费极大。类似的,对最佳权重的随机搜索效率也较低,特别是维度较大时。

这里我们采用梯度下降的方法。梯度下降通过计算权重向量 w 发生较小变化时,给定的函数 g ( w ) 会发生多少变化。一个经典的检测变化量的方法是计算导数 g ( w ) ,这里假设 w 是一个标量。但如果 w 是一个向量,我们旧必须计算 g ( w ) w 每个部分的偏导数。

基于以上梯度下降的想法,我们可以写出一个最直接的算法

Initialize w randomly
while true do:
    read current
    g = compute gradient of g(w)
    w = w - a * g

用以上算法,我们可以迭代的更新权重。学习率 α 是一个超参数,代表在搜索最小值时梯度每一步下降的速度。

Convolutional Neural Networks

卷积神经网络是一个常用且成功的深度学习模型子集,它包含了之前提过的卷积滤波器。从一张原始图像 (大小为 32x32,3 个颜色通道) 开始,图像和多个滤波器卷积。在课上的例子中,使用了一个 5x5 的滤波器,只对图中的 “有效区域” 卷积——所以不包含图外区域,输出的长度为 32-5+1=28,如下图。至关重要的是,这些滤波器通过反向传播 (backpropagation) 集体被优化——我们不再受限于手动选择的特征。

卷积的方法给了我们平移不变性——一个特征不管在图像的哪里出现,表达的意思都相同。许多独立的卷积滤波器可以应用于原图,然后其堆叠的输出相当于得到一个有更多通道的图像。像其他深度学习模型一样,非线性在卷积神经网络中也有应用,且卷积层可以再之前输出的基础上再训练,得到高层次的特征(即地层次特征的结合)。这个特性允许我们从简单的成分中提取有效的模型,这正是深度学习的特征。

关于 GoogLeNet 的研究通过” 开始模块”(Inception modules)——一个接下来会被连接的层的特殊模式,推动了这个方法的发展。为了训练这个深度网络,Szegedy et al. 使用 “成长分类器”(auxillary classifiers) 仅基于一些 GoogLeNet 的层,有效的尝试预测图像的类别。在训练中,损失函数是所有输出权重之和。

Conclusion

深度学习是一个在计算机视觉和机器学习领域较新的方法,它同时训练特征提取器和分类器,而不是依赖于人类去检测有效的特征。深度学习方法在大多数计算机视觉问题中都有极佳的表现。但是,在训练样本庞大或者过小的时候,本课程介绍的其他方法可能会更有效,因为人类的直觉在一些领域可以选出良好的特征集。

猜你喜欢

转载自blog.csdn.net/bear507/article/details/82354418