mirror of
https://github.com/cheetahlou/CategoryResourceRepost.git
synced 2026-05-11 12:07:13 +08:00
del
This commit is contained in:
61
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/115 | 什么是计算机视觉?.md
Normal file
61
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/115 | 什么是计算机视觉?.md
Normal file
@@ -0,0 +1,61 @@
|
||||
<audio id="audio" title="115 | 什么是计算机视觉?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f0/53/f00ac0295db7c217d3cc1025fb704553.mp3"></audio>
|
||||
|
||||
在之前的一系列分享中,我们详细讲解了人工智能核心技术中的搜索、推荐系统、计算广告以及自然语言处理和文本处理技术。从今天开始,我们来分享专栏里人工智能核心技术模块的最后一部分内容:计算机视觉技术。
|
||||
|
||||
可以说,计算机视觉技术是人工智能技术的核心方向,特别是深度学习技术在计算机视觉中的应用,在最近五六年的人工智能浪潮中担当了先锋者的角色。甚至可以说,如果没有深度学习技术在过去几年对计算机视觉一些核心领域的推动和促进,就很可能没有这一波的人工智能技术浪潮。
|
||||
|
||||
我们可以这么来看待人工智能技术,它可以说是利用计算机技术来对人的感官,例如视觉、听觉、触觉以及思维进行模拟,从而建立起逻辑推断等智能才具备的能力。其中,计算机视觉技术无疑是至关重要的,也是非常困难的。
|
||||
|
||||
今天我会带你先来看看究竟什么是计算机视觉,以及这个方向的研发都需要解决哪些核心问题。
|
||||
|
||||
## 计算机视觉的定义
|
||||
|
||||
关于计算机视觉(Computer Vision,CV),有两种人们普遍接受的定义。
|
||||
|
||||
第一种定义认为,计算机视觉是从数字图像(Digital Images)中提取信息。这些信息可以是图像中的物品识别(Identification)、导航系统的位置测量(Space Measurement)以及增强现实(Augmented Reality)的应用。
|
||||
|
||||
计算机视觉的第二种定义主要是从应用的角度出发,认为计算机视觉是为了构建可以理解数字图像内容的算法,从而有多种应用。
|
||||
|
||||
那到底什么是计算机视觉呢?主要解决哪些问题?我们可以拿人类视觉的主要功能来做类比,就比较容易理解了。
|
||||
|
||||
当人类面对一个现实中的场景时,我们有一个感官器官来收集信号,那就是“眼睛”。眼睛收集的原始信号转换为人可以处理的信息之后,这些信息就来到了“大脑”这一个人类信息处理中心,进行分析和处理。
|
||||
|
||||
这个过程中最主要的一个处理模块,就是对信号产生“语义”(Semantic)解释或者进行逻辑上的理解。比如,当我们看到一个公园的一角以后,需要识别这个场景里的桥梁、水、树等物体,并且在头脑中形成这些物体的概念。可以说,这就是人类视觉系统的一个简单的框架,眼睛收集信息,大脑处理信息。
|
||||
|
||||
那么,在整体的框架上,计算机视觉其实就是希望模仿人类的视觉系统构架。输入依然是一个现实中的场景,但是我们需要借助其他的**感知仪器**(Sensing Device)来从中**获取原始信息**。最常见的感知仪器包括照相机、摄像机以及现在广泛普及的手机摄像头。从这些感知仪器中获取了最初级的信息之后,计算机视觉的“大脑”就是计算机。这里的“计算机”其实是指**计算机算法,通过算法理解原始数据,构建语义信息**。
|
||||
|
||||
这么理解起来,计算机视觉技术好像挺简单的。就像1966年,麻省理工大学的一个本科生想做这样一个暑期项目,并且认为这个项目可以在一个暑假里解决。这或许就是计算机视觉的一个起源了。但是,令人感慨的是,计算机视觉绝不是可以在一个假期内解决的项目,整整半个多世纪已经过去了,计算机视觉依然有很多值得挑战的课题,也依然还在高速发展中。
|
||||
|
||||
## 计算机视觉的领域特点
|
||||
|
||||
了解了计算机视觉的定义之后,我们来进一步聊一聊这个领域的一些特点。
|
||||
|
||||
首先,**计算机视觉是一个“跨学科领域”**。正如刚才所说,对人类视觉的研究给计算机视觉带来了重要的启发。那这里就涉及到生物领域的研究,包括对人的眼睛以及视觉神经的研究。一方面,我们需要感知器来从现实世界中获取信息。那么,对于感知仪器来说,设备越是精确,就越能完整地捕捉外界世界的信息。这里就涉及到物理,特别是光学的研究。另一方面,人脑是处理所有信号并且形成语义概念的器官,理解人脑的信息处理机制就会对计算机视觉的发展有重要的作用,这就涉及到脑科学和认知科学等领域。
|
||||
|
||||
除此以外,计算机视觉毕竟是一个和计算机结合得很紧密的学科方向。因此,要想设计高效的计算机视觉算法,就必须和计算机科学的很多其他方向结合并借鉴,例如信息检索、计算机体系结构、机器学习等。
|
||||
|
||||
**计算机视觉的另外一个特点,就是这个领域包含了很多非常深刻的困难问题**。我们说,从计算机视觉被当作一个暑假项目到现在,五十多年已经过去了,这个领域依然在蓬勃发展着。时至今日,我们依然不能说计算机视觉是一个已经被完全解决的问题。
|
||||
|
||||
那计算机视觉任务“难”在哪里呢?我认为根本原因在于计算机视觉算法处理的输入,也就是数字化了的图像信息和我们需要理解的语义信息之间存在巨大的鸿沟。举例来说,一个200乘以200的RGB图像其实就是一个由12万个数字组成的矩阵,但是这个矩阵可能代表一个非常复杂的图像。从数字到具体的图像中的物体,再到去理解这个图像的语义,这中间有很长的距离。
|
||||
|
||||
一直以来,计算机视觉也在尝试去构造和逼近一些人类视觉系统的特点,但是困难重重。比如,人类视觉系统的反应很快。有实验表明,从一幅普通场景的图像中,人类只需要150毫秒就能够识别出里面的物体。另外,人类视觉系统的复杂性还来自于对世界认知的理解。例如,人可以依靠过去的记忆或者经验,还可以依靠其他外界知识,来对图像中的物体进行判断。这些都是计算机视觉系统难以企及的。
|
||||
|
||||
当然,在经历了半个世纪的研究之后,也有不少学者提出怀疑的观点,计算机视觉研究是否要对人类视觉系统进行完全的模仿呢?一种观点是,计算机视觉系统并不需要亦步亦趋地完全照搬人类视觉系统,这可能也并不是一条切实有效的道路。有一种观点认为,计算机视觉系统可以从人类视觉或者其他领域得到灵感,但是究竟应该如何搭建一个有效的系统,还是需要开辟新的研究道路。
|
||||
|
||||
## 计算机视觉的应用
|
||||
|
||||
计算机视觉技术的领用非常广泛,可以说是深入到了普通人生活的方方面面。在这些应用中,除了我们日常比较容易接触到的,例如面部识别、光学字符识别(OCR)、电影特效、视觉搜索以外,还包括最近几年飞速兴起的自动驾驶、自动无人商店、虚拟现实、增强现实等等。
|
||||
|
||||
可以说计算机视觉的应用任务领域众多。近几年都受到深度学习的影响,绝大多数领域都得到了高速发展,但是依然需要领域知识来构建更加有效的模型。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我和你讲了计算机视觉技术的一个,是我们计算机视觉基础知识系列的第一篇,帮助你对计算机视觉有一个最基本的概念性的了解。
|
||||
|
||||
一起来回顾下要点:第一,我们聊了什么是计算机视觉;第二,我们讲了计算机视觉的特点;第三,我们简要提及了一些计算机视觉的应用。
|
||||
|
||||
最后,给你留一个思考题,我们说计算机视觉的核心挑战是从数字到语义的理解,那么理解图像数据有什么特殊的地方吗?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
||||
59
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/116 | 掌握计算机视觉任务的基础模型和操作.md
Normal file
59
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/116 | 掌握计算机视觉任务的基础模型和操作.md
Normal file
@@ -0,0 +1,59 @@
|
||||
<audio id="audio" title="116 | 掌握计算机视觉任务的基础模型和操作" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/b9/61/b9f3c54effef4af2f0ec11cdd86f1c61.mp3"></audio>
|
||||
|
||||
今天,我们来聊一聊计算机视觉的一些最基础的操作和任务,包括像素表达、过滤器和边界探测。基于这些内容,我们一起讨论利用计算机来处理视觉问题的核心思路。很多时候,越是基础的内容就越重要,因为只有掌握了基础的思路,我们才能在今后复杂的任务中灵活应用。
|
||||
|
||||
## 像素表达
|
||||
|
||||
我们在上一次的分享中谈到了计算机视觉任务中一个非常重要的步骤,那就是把现实世界的信号通过感知仪器(Sensing Device)收集起来,然后在计算机系统中加以表达。那么,在所有的表达中,最基础的就是“**像素表达**”(Pixel)。我们这里就展开说一说这种表达的思路。
|
||||
|
||||
把图像信息利用像素来进行表达是一种非常直观简单的表达方式。
|
||||
|
||||
对于黑白图像来说,图像就被转换为了0或者1的**二元矩阵**。这个矩阵的每一个元素就是一个像素,0代表黑,1则代表白。
|
||||
|
||||
对于灰度图像来说,每一个像素,或者说是矩阵的每一个元素,代表灰度的“**强度**”(Intensity),从0到255,0代表黑,255代表白。
|
||||
|
||||
对于彩色的图像来说,我们一般要先选择一种模型来表示不同的颜色。一种较为流行的表达方式是RGB(红、绿、蓝)模型。在这样的模型中,任何一个彩色图像都能够转化成为RGB这三种颜色表达的叠加。具体来说,就是RGB分别代表三种不同的“通道”(Channel)。每一种通道都是原始图像在这个通道,也就是这个原始颜色下的表达。每一个通道都是一个矩阵像素表达。每一个像素代表着从0到255的值。换句话说,**一个彩色图像在RGB模型下,是一个“张量”**(Tensor),也就是三个矩阵叠加在一起的结果。
|
||||
|
||||
针对像素,你需要建立一种概念,那就是**像素本身是对真实世界中的“采样”**(Sample)。每一个像素是一个整数,整个像素表达并不是一个“连续”(Continuous)表达。因此,在把世界上的连续信号采样到离散像素的这一过程中,难免会有失真。而不同的“分辨率”,会带来失真程度不同的像素表达。
|
||||
|
||||
## 过滤器
|
||||
|
||||
既然已经把图像表达成为了像素,也就是某种矩阵的形式,那么我们就可以利用线性代数等工具在这个矩阵上进行变换,从而能够对图像进行某种操作。这就是“过滤器”(Filter)的一个基本思想。
|
||||
|
||||
**很多计算机视觉的操作本质上都是过滤器操作**。除了把过滤器想成某种线性代数变换之外,更普遍的一种思路是把在矩阵上的操作想成某种函数的操作。因此,我们也可以认为过滤器是函数在某一个特定区间内的操作。
|
||||
|
||||
举一个最简单的过滤器的例子,就是“**移动平均**”(Moving Average)。这个过滤器的本质就是针对每一个像素点,计算它周围9个像素点的平均值。如果我们针对每一个像素进行这样的操作,就会得到一个新的矩阵。然后我们把这个矩阵当作新的像素表达进行视觉化,就会发现是在原有图像基础上进行了“柔化”处理。反过来,如果我们需要对某一个图像进行柔化处理,就需要对其进行“移动平均”过滤操作。
|
||||
|
||||
有了这个直观的例子,你一定能够想到,很多我们熟知的图像特效处理,其实都对应着某种过滤器操作。
|
||||
|
||||
这里,我们提及一种比较特殊的过滤处理,那就是“**卷积**”(Convolution)。这个概念我们在深度学习中经常接触到。
|
||||
|
||||
刚才我们说到“移动平均”这个过滤器。如果我们把图像看作是一个函数F在某一个区域的取值,那么,“移动平均”这个过滤器是针对函数在某一点的取值(也就是某一个像素的取值),通过利用同样的函数F在周围的取值,从而得到一个新的计算值。
|
||||
|
||||
那卷积操作的思想是怎样的呢?卷积是针对F在某一个点的取值,除了需要利用F在周围的点以外,还需要利用另外一个函数,这里称作是H的取值。也就是说,我们要利用H来针对F进行操作。
|
||||
|
||||
## 边界探测
|
||||
|
||||
除了通过过滤器对图像进行简单操作之外,还有一些图像的基本操作蕴含了计算机视觉的基本原理。我们这里也稍微做一些介绍。
|
||||
|
||||
例如我们通常需要了解图像的边界。有研究表明,图像的边界对于人类认知图像的内涵有着特殊的意义。因此从一个完整的图像中找到不同物体的边界是一个很有现实意义的任务,并且通常被称作是“**边界探测**”(Edge Detection)。
|
||||
|
||||
那么,怎么来认识图像中的物体边界呢?我们先从直观上来想一想,在图像中,“边界”都有什么特征?一般来说,如果我们遇到了色彩、景深、照明的突然变化,或者是其他某种图像特质上的突然变化,我们就有可能遇到了边界。现在的问题是,在像素或者函数表达的情况下,如何来描述和检测这些“突然变化”?
|
||||
|
||||
在数学分析中我们学过,描述函数值变化的概念叫“导数”或者“梯度”(Gradient)。梯度大小(Gradient Magnitude)和梯度方向(Gradient Direction)都包含了函数变化的重要信息。
|
||||
|
||||
虽然梯度从数学的角度来说刻画了函数的变化,但是这对于设计一个实际的边界探测器依然是不够的。一个好的边界探测器需要真正能够探测到边界,也就是要尽可能少地出现错误,能够对边界进行定位(Location)的同时还需要尽量使边界平滑和链接。
|
||||
|
||||
在真实的边界探测中,我们往往先让图像变得更加平滑,比如利用“**高斯柔化**”(Gaussian Blur)的办法,然后在这个基础上计算**梯度大小和方向**,有了这些之后再进行一些后期处理。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我和分享了计算机视觉的一些基本数学模型和操作。
|
||||
|
||||
一起来回顾下要点:第一,像素是对真实世界的采样,我们分别讲了对黑白、灰度和彩色图像的像素表达;第二,我们讲了在像素表达之上的过滤器,介绍了移动平均和卷积两种方式;第三,我们简要提及了利用函数的梯度计算来进行边界检测的任务。
|
||||
|
||||
最后,给你留一个思考题,从边界检测的任务中,如何知道检测到的像素是真正属于边界呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
||||
59
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/117 | 计算机视觉中的特征提取难在哪里?.md
Normal file
59
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/117 | 计算机视觉中的特征提取难在哪里?.md
Normal file
@@ -0,0 +1,59 @@
|
||||
<audio id="audio" title="117 | 计算机视觉中的特征提取难在哪里?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/62/66/629c4bd66a80d321b9da86eca8972766.mp3"></audio>
|
||||
|
||||
在上一次的分享中,我们聊了计算机视觉的一些最基础的操作和任务,包括像素表达和过滤器这两个视觉问题。我们还简单介绍了边界探测这个任务,了解如何从计算机视觉的角度来对这个任务进行建模。
|
||||
|
||||
今天,我们来看计算机视觉基础问题中的另一个核心任务,那就是特征(Feature)提取。
|
||||
|
||||
## 特征提取的目的
|
||||
|
||||
在深入讨论特征提取之前,我们先来了解一下特征提取的目的,或者说是研究特征提取的必要性。
|
||||
|
||||
从大的方面来说,计算机视觉的一部分任务是实现对图像的智能理解。那么,理解图像的语义就是其中一个非常重要的任务。
|
||||
|
||||
我们提到的边界检测或者是颜色检测,虽然都是理解图像的任务,但是这些任务并不理解图像中具体的物体,比如哪里是一只动物、哪里是行人等。那么,怎样才能理解图像中具体的物体呢?或者更进一步,整个图像表达了怎样的社会关系或者说是场景关系?例如一张会议室的图像,我们不仅关心里面的陈设和人物,还关心会议室的整体气氛,以及这样的气氛是不是传递出了更复杂的人物之间的社会关系。
|
||||
|
||||
那么,如何实现这种更高维度的语义理解呢?这往往需要我们**对底层的一些图像先进行抽象,然后再在抽象出来的特征基础上,进一步来建模**。
|
||||
|
||||
除了我们这里提到的对图像本身的理解以外,在很多任务中,我们还需要对图像和其他信息结合起来进行理解和分析。一种常见的形式是图像和一段文字结合起来,对某一个物品或者某一个事件进行描述。例如电商网站的商品信息,一般都有精美的图片和详细的介绍,这些信息组合起来完整地描述了整个商品的信息。
|
||||
|
||||
这个时候,我们就要同时理解图像和文字信息。很明显,在这样的任务中,一种比较容易想到的模式是先从图像和文字中分别抽取一定的抽象特征,有了高度概括的图像特征和文字特征之后,我们再在这个基础上进行建模。
|
||||
|
||||
从比较小的计算机视觉的任务来说,很多时候,一个任务会涉及到**两个步骤**:把任务抽象为提取特征,然后转换为一个普通的机器学习任务。这个流程的第二步可以是一个监督学习任务,例如回归或者分类;也可以是一个非监督学习任务。需要注意的是,我们这里提到的两个步骤,并不一定是绝对地把建模过程当作两个完全独立的步骤,而是从逻辑上对这两个步骤进行区分。事实上,**在现代的深度学习架构中,这两个步骤往往都在统一的一个架构下进行训练,从而能够得到更好的效果**。
|
||||
|
||||
今天,我们就从传统的计算机视觉的角度,来看看特征提取有哪些难点和经典方法。
|
||||
|
||||
## 特征提取的难点及基本思路
|
||||
|
||||
图像数据的特征提取为什么有难度呢?原因在于图像信息本身的复杂性。
|
||||
|
||||
试想我们有两张人民大会堂的建筑物照片,一张是从地面拍摄的,一张是从空中拍摄的。虽然这两张照片可能在角度、色彩、位置等方面有很多的不同,但是因为这两张照片本身所描述的对象是一致的,都是人民大会堂,因此我们希望从这两个图片中提取的特征有一些相似性。也就是说,我们需要**找到在诸多变化因素中不变的成分**。
|
||||
|
||||
一个经典的思路是从**局部信息**(Local Information)入手,从图像中提取相应的特征。从实际的效果来看,局部特征(Local Feature)比全局特征更加稳固。
|
||||
|
||||
回到上面的例子,如何构造一个能够匹配两个图片的普遍的局部特征呢?过程如下:第一,找到一组关键的点或者是像素;第二,在关键点周围定义一个区域;第三,抽取并且归一化这个区域;第四,从归一化后的区域提取“**局部描述子**”(Local Descriptor)。得到局部描述子之后,我们就可以利用它来进行匹配了。
|
||||
|
||||
从上面这个流程来看,整体的思路其实就是希望**从局部找到具有代表性的特征,然后把所有因为各种因素造成的特征变化归一化掉**。
|
||||
|
||||
当然,这个简单的流程是有一些问题的。比如,如果我们针对两幅不同的图像分别进行上述的流程,那么很有可能最后得到的关键点和局部描述子都不一样。所以我们需要一种更具普适性的方法。
|
||||
|
||||
其实从70年代开始,就有一大部分的计算机视觉工作是在研究**如何构建局部特征描述子**。在这30多年的发展历程中,很多研究工作者提出了不少既有理论基础又有实用价值的特征提取方法。甚至是最近的深度学习热潮,从某种程度上来说也是一个重要的特征提取成果。
|
||||
|
||||
在这些研究成果中,比较有代表性的局部描述子包括**SIFT(Scale-invariant feature transform)描述子**和**HOG(Histogram of oriented gradient)描述子**。关于这两个描述子,我在这里不展开介绍它们的细节,因为在深度学习浪潮中,大部分利用描述子来对特征进行提取的方法都被淘汰了,但是这些方法的思路,我们在很多类似的工作中依然可以借鉴。所以,如果你有兴趣继续了解,可以阅读我在文末提供的两个参考文献。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了计算机视觉中的又一个核心任务:特征提取。帮助你对计算机视觉的一些基本特征提取有一个了解。
|
||||
|
||||
一起来回顾下要点:第一,在图像理解任务中,高维度的语义理解,以及理解图像和其他信息的组合形式,都需要特征提取这个关键步骤;第二,特征提取的难点在于图像信息本身的复杂性,一个经典的思路是从局部信息入手,提取局部特征。
|
||||
|
||||
最后,给你留一个思考题,除了图像数据以外,还有没有其他形式的数据,也需要我们先对数据的不同形态(例如图像中的颜色、方位、角度等)进行处理,从而识别出相同的物体或者数据个体?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
1. David G. Lowe, “Distinctive image features from scale-invariant keypoints,” International Journal of Computer Vision, 60, 2 (2004), pp. 91-110.
|
||||
|
||||
2. N. Dalal and B. Triggs. Histograms of Oriented Gradients for Human Detection. In CVPR, pages 886-893, 2005.
|
||||
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
<audio id="audio" title="118 | 基于深度学习的计算机视觉技术(一):深度神经网络入门" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f4/e1/f4b64e5adb2dae45eb1e6524c8f20de1.mp3"></audio>
|
||||
|
||||
在最近几年的人工智能发展中,深度学习技术成为了一个强劲的推动力。对于计算机视觉来讲,深度学习在过去几年重新改写了这个领域的核心方法论。时至今日,深度学习已经深入到了计算机视觉技术的方方面面,成为解决各类视觉问题的有力工具。
|
||||
|
||||
从今天开始,我们将介绍一系列以深度学习为背景的计算机视觉技术。那么在这个环节的第一篇分享中,我们首先来了解一下什么是深度学习。
|
||||
|
||||
## 为什么是深度学习
|
||||
|
||||
在了解一些深度学习技术细节之前,我们首先要来看一下为什么需要深度学习技术。
|
||||
|
||||
初学者经常会有一个误区,那就是认为和“深度学习”相对的就是“浅层学习”(Shallow Learning)。这种看法也对,也不对。
|
||||
|
||||
“对”的地方在于“深度学习”的确强调从数据或者说是特征(Feature)中构造多层或深度的变换,从而能够得到非线性的表征(Representation)。显然,这种效果是线性模型所达不到的。
|
||||
|
||||
“不对”的地方是,在所谓的“深度学习”,或者准确地讲是深度神经网络技术发展之前,就已经有了很多构造复杂非线性表征的尝试和技术。这些技术在机器学习和人工智能的发展中都起到了举足轻重的作用。
|
||||
|
||||
说到这里,我们就要从**线性模型**聊起了。从线性模型发展到非线性模型,这一步貌似理所当然,但其实这里面有一个非常重要的思路,那就是线性模型并不是不能处理数据中的非线性关系,这一点很容易被忽视。很多时候,我们其实是可以构造非线性的特征,然后利用线性模型来把所有的非线性特征给串联起来。
|
||||
|
||||
举个例子,在网页搜索中,我们经常利用类似PageRank来表征一个网页的重要性。这个模型本身就是非线性的对网页图(Graph)的一种表征。所以,即便在此之上构建线性模型,整个模型其实也是包含了非线性的表征转换。
|
||||
|
||||
其实,对于很多深度学习模型而言,即便进行了复杂的表征转换,在最后一层对最终的输出进行建模的时候依然是一个线性模型。所以,线性模型在非线性特征的帮助下,依然能够满足整体的非线性建模的需求。
|
||||
|
||||
那么,这种非线性特征外加线性模型的方法有什么问题呢?
|
||||
|
||||
这类方法的主要问题是,如何才能系统性地找到这些非线性特征呢?其实,传统的机器学习中的特征工程(Feature Engineering)主要就是在做特征寻找这个事情,也就是要消耗人力和物力去寻找这些特征。有时候,找到一个好的特征可能还需要灵感和其他领域特定的知识。
|
||||
|
||||
那么,有没有办法让模型自身就能从现有的数据中发现这些非线性关系,从而不需要额外的特征工程呢?
|
||||
|
||||
其实在机器学习发展的早期,研发人员就意识到了这个方向的重要性,这样就发展出了各种各样的非线性模型。
|
||||
|
||||
这里面比较有代表性的模型是“**决策树**”(Decision Tree),以及在此基础上发展出来的一系列“**树模型**”(Tree Models)。我们在专栏里介绍过,树模型在搜索和推荐的一些场景中都有不错的性能表现。在很大程度上,树模型可以表达非线性的关系,但是它的困难之处在于无法表达过于深层次的数据关系。一般来说,3到4层的树已经算是比较深的结构了,如果一个树模型有特别多层次还能被训练成功,这样的例子是比较少见的。
|
||||
|
||||
除了树模型之外,还有一类模型,用来挖掘数据中间的隐含关系,特别是非线性关系,这就是“**概率图模型**”(Probabilistic Graphical Model)。例如在文本挖掘领域非常流行的LDA(Latent Dirichlet Allocation),以及在推荐领域流行的矩阵分解(Matrix Factorization),都可以被看作是概率图模型中的佼佼者。
|
||||
|
||||
概率图模型的一大优势是可以融入众多对于数据以及所需要处理问题的直觉,从而能够让模型具有一定的可解释性,甚至是“因果性”(Causality)。但是,概率图模型的最大挑战就是每一个模型都需要单独计算训练算法。也就是说,算法无法做到普适通用。这就极大地限制了概率图模型在实际问题,特别是大数据问题中的应用。
|
||||
|
||||
综合来看,**我们急需一种方法,能够自动挖掘数据中的非线性关系,而且最好能够找到数据中的隐含规律,这种隐含的规律可能是非常多层次的非线性转换;并且,这种方法还需要在计算上直接通用,不同模型可以共用一个计算框架**。
|
||||
|
||||
所有这些因素如何囊括在一个方法里呢?答案就是深度学习技术。
|
||||
|
||||
## 深度学习的特点
|
||||
|
||||
深度学习技术慢慢成为了主流的非线性模型。接下来我们来看一看深度学习技术的一些特点。
|
||||
|
||||
首先,深度学习技术是一个非常大的外延,这里面包含了很多不同的**模型**和模型的**计算框架**技术。这两者都是深度学习成功必不可少的组成部分。
|
||||
|
||||
深度学习中有一种最简单也是最基础的模型,就是“**深度神经网络**”(Deep Neural Networks)。这种模型其实很早就已经被提出了。
|
||||
|
||||
从形式上来说,深度神经网络就是把多层简单的非线性操作叠加起来,希望能够发现更加复杂的非线性关系。实际上,有理论研究表明,**在有足够的内部隐含变量的情况下,深度神经网络可以表达任意复杂的函数关系**。也就是说,深度神经网络有希望能够对现实世界中的复杂现象进行建模。这一点对于我们刚才提到的树模型和概率图模型来说,有相当大的难度或者说几乎是不可能的。
|
||||
|
||||
另外,回到我们刚才说的特征工程的需求,深度神经网络的确可以减轻这方面的压力。虽然并不如很多人预期的那样,深度神经网络依然需要依赖一定的初始数据,但是已经有实验表明,通过深度神经网络学习的特征在很多时候相比于研发人员手动挖掘的特征要更加健壮。
|
||||
|
||||
实际上,**在计算机视觉这样的领域里,利用深度神经网络来挖掘特征基本上已经完全代替了手动的特征挖掘**。
|
||||
|
||||
深度神经网络还有一个特点就是**计算的普适性**。刚才我们讲到概率图模型有一个“死穴”,就是计算无法做到模型普适,或者说在不牺牲性能的前提下,计算无法做到普适性。那么这一点来说,以深度神经网络为代表的深度学习,依赖简单的梯度下降就能对非常复杂的网络进行计算。而这种计算是可以针对不同的模型的,因此这就极大地降低了深度学习在实际工程应用中的代价。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了基于深度学习的计算机视觉技术的第一篇分享,帮助你对深度学习有一个更加明确的认识。
|
||||
|
||||
一起来回顾下要点:第一,深度学习技术能够自动挖掘数据中的非线性关系;第二,在计算机视觉领域里,利用深度神经网络来挖掘特征已经基本代替了手动的特征挖掘,而且,深度神经网络还具有计算的普适性。
|
||||
|
||||
最后,给你留一个思考题,和树模型或者概率图模型相比较,深度学习有什么劣势吗?如果有,你认为它最大的劣势是什么?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
<audio id="audio" title="119 | 基于深度学习的计算机视觉技术(二):基本的深度学习模型" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/78/e6/78f37432593b19fa2cd139062ddda3e6.mp3"></audio>
|
||||
|
||||
在上一期的介绍里,我们讨论了以深度学习为背景的计算机视觉技术,重点讲解了为什么需要深度学习,特别是从传统模型的眼光来看深度学习模型的特点。
|
||||
|
||||
今天,我们来聊一聊应用到图像上的一些最基本的深度学习模型。
|
||||
|
||||
## 前馈神经网络
|
||||
|
||||
**前馈神经网络**(Feedforward Networks)应该算是最基本的神经网络架构了。这种架构是理解其他神经网络结构的基础。
|
||||
|
||||
我们可以从最基本的线性模型(Linear Model)入手,来理解前馈神经网络。线性模型说的是有一组输入x,然后有一个输出y,我们学习到一组向量,有的时候也叫作系数w,来通过x预测y。这种线性模型可以算是最简单的机器学习模型了。在图像的情况下,输入往往是一个向量,输出也是一个向量,这个时候,我们需要学习的系数就从一个向量变为一个**矩阵**了。
|
||||
|
||||
那么,试想一下,如果我们把多层的线性模型进行叠加,能否得到多层的神经网络结构呢?答案是否定的。即便是多层的线性模型,只要每一层的变换是线性的,那么最后的结果一定也是线性的。因此,要想构建多层的非线性模型,每一层的变换也一定要是非线性的。
|
||||
|
||||
那么,如何在线性模型的基础上,我们只进行一些最小的改动,就能引入非线性的因素呢?
|
||||
|
||||
在这里,我们引入一个叫“**激活函数**”(Activation Function)的概念。直观地理解,激活函数就是在线性模型输出的基础上进行非线性变换。一个最简单的激活函数就是**Sigmoid函数**,也就是把负无穷到正无穷的实数给映射到0~1这个范围内。我们经常提到的对数几率回归,其实就是对这种变换的另一种称呼。
|
||||
|
||||
利用了Sigmoid激活函数的线性模型,本质上就是在做二元分类。在神经网络发展的早期,Sigmoid激活函数是一种普遍使用的非线性变换方式。遗憾的是,在之后的发展中,研究人员发现了Sigmoid函数在数值稳定性上存在严重的问题。
|
||||
|
||||
具体来说,在很多机器学习的优化算法中,我们都需要依赖“梯度下降”(Gradient Descent)的方法来优化目标函数。在前馈神经网络中,梯度下降也是一种简单的优化神经网络并且学习到系数矩阵的方法。但是因为有Sigmoid函数的存在,计算的梯度有可能会溢出或者归零。在这样的情况下,模型就无法得到正常的学习。
|
||||
|
||||
为了解决Sigmoid激活函数的问题,研究人员发明了“**线性整流函数**”(Rectified Linear Unit),或简称**ReLu函数**。和Sigmoid函数相比,ReLu函数直接留下大于0的数值,把小于0的数值统统归0。在ReLu函数的帮助下,我们能够更容易地训练多层的前馈神经网络。
|
||||
|
||||
有了非线性的转换之后,前馈神经网络往往可以把多个非线性的转换给叠加在一起,形成多层的结构。有了这个多层的转换之后,最后一层往往是是把已经有的信息再映射到最终需要的输出上。这可以是一个回归问题,也可以是一个分类问题。
|
||||
|
||||
从我们之前提到的特征提取的角度来讲,前馈神经网络的中间层次就是利用最原始的信息来提取数据的特征,而最后一层可以当作是我们之前讲过的线性模型层。只不过和手动构造复杂特征有一个不同的地方,前馈神经网络是自动学习这样的特征。
|
||||
|
||||
## 卷积神经网络
|
||||
|
||||
了解了最基本的前馈神经网络之后,我们来看一看它是怎么应用到图像处理中的。我们在之前的计算机视觉基础知识中讲到过,一种最直观的表达图像数据的方法就是**把图像看成矩阵数据**。
|
||||
|
||||
比如,有一个长32像素、宽32像素并且有3个颜色通道(Channel),或者简称为“32乘32乘3”的图像,如果我们采用前馈神经网络来对这个图像进行建模,需要学习的系数或者说权重是多少呢?就是把这3个数乘起来,一共有3072个系数需要学习。如果说这还是一种可以接受的方案的话,那么一个长宽为200像素,也是3个颜色通道的图片就需要12万个系数。很显然,直接采用前馈神经网络来表达图想信息需要大量待学习的参数。那么,我们在这里就需要有一种方法能够更加简洁地表达数据。
|
||||
|
||||
**卷积神经网络**(Convolutional Neural Networks),简称为CNN,就是来解决这类问题的一种神经网络架构。其实,CNN最初就是专门为视觉问题而提出的。那么,如何利用CNN来解决这个问题呢?
|
||||
|
||||
首先,**卷积神经网络试图用向量来描述一个矩阵的信息**。从工具的角度来讲,卷积神经网络利用两个特殊的架构来对图像数据进行总结,一个叫“卷积层”(Convolutional Layer),一个叫“池化层”(Pooling Layer)。
|
||||
|
||||
在简单理解卷积层和池化层之前,我们先来看一下卷积神经网络是采用怎样的架构来处理图像的。一般来说,图像的输入要先经过一个卷积层,再经过一个线性整流函数,然后经过一个池化层,再经过一个全联通层(也就是前馈神经网络),最后得到一个向量的表达。需要注意的是**卷积神经网络的优势就是直接处理3维数据,进行3维的变换**。
|
||||
|
||||
现在我们来看卷积层是如何工作的。卷积层直接作用在3维的输入上,利用另外一个3维的“过滤器”(Filter)来对原始的数据进行卷积操作。例如对于一个“32乘32乘3”的图像来说,我们可以使用一个“5乘5乘3”的过滤器来对其进行卷积。
|
||||
|
||||
在这里,我不展开来讲卷积操作,如果你有兴趣可以在网上找到卷积操作的数学定义。在这里,我们只需要理解**卷积操作是利用一个小的过滤器来对原始的更大的图像进行函数变换,从而希望能够提取图像的局部特征**。
|
||||
|
||||
在刚才这个例子中可以看到,因为有了卷积层,我们就不需要针对原始大小的图像进行表达了,而仅仅需要学习过滤器上的参数,这种方法就大大减少了参数的数目。
|
||||
|
||||
池化层的目的是对数据进行进一步的高度总结和概括。**对于一个矩阵来说,池化层针对某一个矩阵的局部,采用平均值、最大值来总结这个区域的矩阵数值**。例如,我们有一个“4乘4”,一共16个单元的矩阵,如果我们针对每个“2乘2”的区域加以最大值(Max Pooling)池化,那么我们就可以把16个单元的数据总结为“2乘2”,也就是一共4个单元的数据。每个单元是原来矩阵中“2乘2”区域中的最大值。
|
||||
|
||||
当一个图像经过了卷积和池化等一系列的操作以后,我们就说已经提取了这个图像的关键特征。这个时候,我们往往会把数据经过基本的前馈神经网络来进一步融合,最后能够完整地总结数据信息。在前馈神经网络之后,这就又是一个线性的决策层,可以是回归,也可以是分类。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了基于深度学习的计算机视觉技术的第二篇分享,帮助你对深度学习的基本模型,包括前馈神经网络和卷积神经网络有一个基本的认识。
|
||||
|
||||
一起来回顾下要点:第一,我们从线性模型入手讨论了前馈神经网络架构,重点介绍了激活函数和线性整流函数;第二,我们讲了在前馈神经网络基础之上的卷积神经网络,核心是用向量来描述一个矩阵的信息。
|
||||
|
||||
最后,给你留一个思考题,卷积神经网络中池化层的必要性是什么?为什么需要总结周围的单元到一个单元?这难道不是丢失了很多信息吗?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
<audio id="audio" title="120 | 基于深度学习的计算机视觉技术(三):深度学习模型的优化" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/1b/dd/1bf30283f668139a9e0c0151bd161edd.mp3"></audio>
|
||||
|
||||
在上一讲的分享里,我们聊了应用到图像上的一些最基本的深度学习模型,主要讨论了前馈神经网络和卷积神经网络的定义,以及它们在图像处理上的应用。
|
||||
|
||||
今天,我们从**优化**的角度来讨论,如何对深度学习模型进行训练。可以说,模型优化是成功利用深度学习模型的关键步骤。
|
||||
|
||||
## 一般机器学习模型的优化
|
||||
|
||||
要想了解深度学习模型的优化,我们首先得来看一看一般机器学习模型的优化。先了解一些基本的步骤,我们在讨论深度学习模型优化的时候就能更容易地看清事物的本质。
|
||||
|
||||
在开始说模型优化之前,要说一点需要注意的问题,我觉得这一点对于初学者来说尤为重要,那就是**要区分开模型、目标函数和优化过程**。这三个实体相互关联而且相互影响,我们需要对每一个实体都有一个清晰的理解。
|
||||
|
||||
我们以线性模型作为例子,来感受下这三个实体的关系。
|
||||
|
||||
我们说一个模型是线性**模型**,是指我们期望利用一组特征(Feature)来对一个输出反馈进行线性预测。这里的线性其实主要是指参数针对于反馈变量而言是线性的。
|
||||
|
||||
需要注意的是,线性模型是一个数学模型。线性模型的设置本身并没有限定这个模型的参数(也就是模型的系数)是如何得来的,也就是数学模型本身的设置和得到参数的过程往往是互相独立的。我们把得到参数的过程叫作**模型训练**或者简称为**模型优化过程**。
|
||||
|
||||
对于线性模型而言,我们常常利用最小二乘法来构造参数学习的**目标函数**。在最小二乘法的目标函数下,一般情况下,我们既可以得到一个“解析解”(Closed Form Solution),也能通过例如梯度下降的方法来进行数值优化。
|
||||
|
||||
对模型、目标函数和优化过程这几个概念有了清晰的认识后,那具体的模型优化过程是怎样的呢?
|
||||
|
||||
这里,我们就总结一下一般机器学习模型,主要是简单模型的优化过程。
|
||||
|
||||
**模型优化的第一步就是选择目标函数**。总的来说,简单的机器学习模型主要有两类目的,回归和分类。对于回归而言,我们选择**最小二乘法**,也就是“**平方损失**”(Squared Loss)作为目标函数;对于分类而言,我们选择“**对数几率损失**”(Logistic Loss)。这两种损失和模型是否是线性并没有直接的关系。当然,对于简单模型来说,模型往往是线性的。那么,当模型是线性的,而目标函数又是我们刚才所说的这两类,这种情况下,我们找到的其实就是**线性回归**和**对数几率回归**这两大基本模型。
|
||||
|
||||
当我们选择好了目标函数之后,下面一个步骤一般是尝试**根据目标函数寻找参数的最优解**。这一个步骤我们往往需要根据参数**尝试写出参数的梯度**。对于简单的线性模型来说,这一步往往相对比较容易。但是有一些模型,包括深度学习模型,梯度并不是那么直观就能够得到的。这也就直接导致下面的步骤变得更加复杂。
|
||||
|
||||
得到梯度以后,一般来说,我们首先**尝试有没有可能得到一个解析解**。
|
||||
|
||||
有解析解,往往就意味着我们并不需要通过迭代的方法来得到一个数值优化的解。解析解往往也不是近似解,而是一个确切的答案。当然,在真实的数据中,一些理论上的解析解因为数值稳定性的因素依然无法得到。对于解析解来说,我们需要写出参数的梯度,然后尝试把等式置零,然后看是否能够解出参数的表达式。这个过程并不一定对于每一个模型都适用。
|
||||
|
||||
如果我们没法得到解析解,就需要另外一个方法了,那就是利用数值计算来取得一个近似解。在有了梯度信息以后,一种最普遍的数值计算方法就是**梯度下降法**。从原则上来说,梯度下降是求一个函数最小值的数值流程。如果你需要求一个函数最大值的流程,那就需要**梯度上升**。
|
||||
|
||||
怎样才能保证梯度下降一定能够得到最优解呢?一般来说,梯度下降并不能保证找到函数参数的最优解,往往只能找到一个局部最优解。对于**凸问题**(Convex Problem)而言,局部最优也就是全局最优。因此,**从理论上说,梯度下降能够找到凸问题的全局最优解**。当然,到底多快能够找到这个最优解,也就是算法的收敛速度是怎样的,就又是另外一个问题了。
|
||||
|
||||
但是对于**非凸**(Non Convex Problem)问题而言,梯度下降仅仅能够收敛到一个局部最优解,这个解是否能够被接受,还有待考证。
|
||||
|
||||
## 深度学习模型的优化
|
||||
|
||||
在这里,我们从普通的模型衍生出来,看一看深度学习模型的优化问题。
|
||||
|
||||
和普通模型一样,**深度学习模型也需要一个目标函数来对参数进行有效学习**。我们前面在介绍深度学习模型的时候提到过,很多时候,深度模型都充当了更加复杂的**特征提取器**的角色。而在最后一层的表达中,我们可以认为是在复杂特征后的线性模型。因此,我们依然可以使用回归(或者说平方损失),抑或分类(或者说是对数几率损失),来对不同的问题进行建模。
|
||||
|
||||
遗憾的是,深度模型的特点就是多层。而进行优化的流程中,第一个步骤就是梯度的计算,这一步因为模型的多层变得复杂起来。从概念上来说,我们需要得到在当前迭代下,针对模型参数的**梯度**,这些梯度包括每一个隐含层的参数。我们之所以能够计算深度模型,第一个重要发展就是能够计算这些梯度。
|
||||
|
||||
在深度学习的语境中,计算梯度的方法叫作“**反向传播**”(Back Propagation)。关于如何计算反向传播,网络上有很多教程,我们在这里就不赘述了。你需要记住的是,**反向传播是为了有效快速地计算梯度**。
|
||||
|
||||
那么,有了梯度之后,我们是不是就能够得到深度模型参数的解析解呢?
|
||||
|
||||
很可惜,我们无法得到一个解析解。原因是**深度模型的复杂性**以及其**高度的非凸性**。我们不仅无法得到一个解析解,也没有办法轻易得到一个全局最优解。能够采用的一种办法就是使用**梯度下降**来对问题进行**近似求解**。而如何利用梯度下降的办法来对深度模型有效求解,一直都是深度学习研究领域的一个重心。
|
||||
|
||||
在过去将近10年的研究中,大家发现,一个**好的初始值**往往能够让优化过程变得容易一些。而在梯度下降的过程中,有一些下降方法也要好于其他的方法。一些小技巧,比如Dropout,批量归一化(Batch Normalization)等,已经变成了深度模型优化的标准流程之一,目的就是能够有效地计算梯度,而且有较好的数值稳定性。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了机器学习模型,包括传统模型和深度学习模型的优化流程。
|
||||
|
||||
一起来回顾下要点:第一,我们聊了什么是模型、目标函数和优化过程这三个概念,清晰理解这三个概念之间的关系非常重要;第二,我们从一般机器学习模型的优化过程入手,讲了深度模型的优化。
|
||||
|
||||
最后,给你留一个思考题,有哪些因素造成了深度模型优化的困难?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
<audio id="audio" title="121 | 计算机视觉领域的深度学习模型(一):AlexNet" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/cc/ca/cc17e32ff2ac22277755f8a3d5ccf9ca.mp3"></audio>
|
||||
|
||||
我们继续来讨论基于深度学习的计算机视觉技术。从今天开始,我们进入一个新的模块,我会结合几篇经典的论文,给你介绍几个专门为计算机视觉而提出来的深度学习模型。这些模型都在最近几年的深度学习发展中,起到了至关重要的作用。
|
||||
|
||||
我们这个系列要分享的第一篇论文题目是《基于深度卷积神经网络的图像网络分类》(ImageNet Classification with Deep Convolutional Neural Network)[1]。因为这篇文章的第一作者名字叫Alex,所以文章提出的模型也经常被称为**AlexNet**。
|
||||
|
||||
那接下来我们就先介绍一下这篇论文的作者群。
|
||||
|
||||
第一作者就是亚力克斯·克里切夫斯基(Alex Krizhevsky)。发表这篇论文的时候他在多伦多大学计算机系攻读博士学位;之后的2013~2017年间在谷歌任职,继续从事深度学习的研究。
|
||||
|
||||
第二作者叫伊利亚·苏兹克维(Ilya Sutskever)。发表这篇论文的时候,苏兹克维也在多伦多大学计算机系攻读博士学位;之后到斯坦福大学跟随吴恩达做博士后研究。2013~2015年间,他在谷歌担任研究科学家一职。2016年之后,他参与共同创立了OpenAI并且担任研究总监这一职位。苏兹克维在深度学习方面已经发表了很多篇论文,目前论文的引用数已经超过7万次。
|
||||
|
||||
最后一位作者是杰弗里·辛顿(Geoffrey Hinton)。对于辛顿,我们就比较熟悉了,他是多伦多大学计算机系的教授,是机器学习,特别是深度学习的学术权威。可以说,几十年来,辛顿都在以神经网络为代表的深度学习领域深耕,即便是在其他学术思潮涌动的时候,他都能够坚持在深度学习这一领域继续钻研,这种精神让我们钦佩。
|
||||
|
||||
## 论文的主要贡献
|
||||
|
||||
如何来描述这篇论文的主要贡献呢?简而言之,这篇论文**开启了深度学习在计算机视觉领域广泛应用的大门**。通过这篇论文,我们看到了深度学习模型在重要的计算机视觉任务上取得了非常显著的效果。
|
||||
|
||||
具体来说,在ImageNet 2012年的比赛中,文章提到的模型比第二名方法的准确度要高出十多个百分点。能够达到这个效果,得益于在模型训练时的一系列重要技巧。这篇论文训练了到当时为止最大的卷积神经网络,而这些技巧使得训练大规模实用级别的神经网络成为可能。
|
||||
|
||||
## 论文的核心方法
|
||||
|
||||
要了解AlexNet的一些核心方法,我们就需要简单提一下ImageNet竞赛的数据集。这个数据集在当时有大约120万张训练图片,5万张验证图片和15万张测试图片。这些图片属于1000个类别。这个数据集在当时来说应该算是无可争议的大型数据集。为了能够方便地处理这些图片,作者们把所有图片的分辨率都重新调整到了“256*256”。AlexNet直接在这些图片的RGB像素点上进行建模。
|
||||
|
||||
整个模型的架构是怎样的呢?AlexNet一共包含8层网络结构,5层全联通层(也就是前馈神经网络)。这8层网络架构总体来说是逐渐变小的一个趋势,也就是说每一层提取的信息越来越呈现高度的概括性。
|
||||
|
||||
那么在整个架构中,这篇文章提出的模型有哪些独到之处呢?
|
||||
|
||||
第一,**AlexNet采用了“线性整流函数”(ReLu)来作为激活函数**。虽然这个选择在今天看来可以说是非常平常,甚至已经成为了神经网络建模的默认选项。但这个选择在当时还是很大胆的一种创新。这个创新带来了训练时间的大幅度减少,同时还能保持,甚至提升了模型性能。
|
||||
|
||||
第二,**整个模型的训练大量采用了GPU,并且使用了多个GPU来进行计算**。这一点就在速度上和模型的大小上彻底解放了模型的选择。以前仅仅利用单个GPU的方式,没办法把所有的训练数据都放入一个GPU上。
|
||||
|
||||
第三,作者们介绍了一种叫作“**局部响应归一化**”(Local Response Normalization)的方法来对每层之间的单元进行归一。
|
||||
|
||||
如何进行最有效的归一,以及这些归一化有什么作用,这些问题一直都是深度学习研究面临的重要课题。从实际的使用上来看,这种局部响应归一化的方法在几年之后让位给了其他更为主流的归一方法。但是从这一个技术要点来看,我们**要想把深度学习模型真正应用到实际场景任务中,归一化是一个必不可少的组件**。
|
||||
|
||||
第四,作者们在AlexNet里面使用了所谓的“**重叠池化**”(Overlapping Pooling)这种方法。在普通的卷积神经网络中,“池化”的作用是从周围的单元中总结出必要的信息。一般来说,池化的过程中,并不重复覆盖相同的单元。也就是说,池化不会重叠。而在这篇论文中,作者们发现重叠池化能够降低错误率,虽然非常微量但是很重要。这个组件在之后的发展中并不多见。
|
||||
|
||||
除了在网络架构上的一些创新之外,AlexNet的训练过程中最需要注意的是防止“过拟合”(Overfitting)。在很长的一段时间里,我们没有办法把深度神经网络模型应用在实际场景中,一个很重要的原因就是过拟合。可以说,如何防止神经网络模型过拟合,这个问题让研究人员伤透了脑筋。
|
||||
|
||||
所谓过拟合就是说模型在训练集上工作得很好,但是无法“泛化”(Generalization)到测试集,也就是没有出现过的数据上。无法泛化其实也就证明训练的模型对未知数据的预测能力很差。
|
||||
|
||||
这篇论文中主要提到了两种防止过拟合的方法。
|
||||
|
||||
第一种思路叫“**数据增强**”(Data Augmentation)。简单来说,这里的思路其实就是增加“虚拟数据”来增加数据的多样性,从而能够让模型更加健壮。那虚拟数据是怎么来的?虚拟数据其实来源于真实数据的变形。
|
||||
|
||||
第二种思路就是 **Dropout**。这种方法在当时看显得很随便,就是在训练的时候随机把一些单元置零。作者们发现在这样随机置零的过程后,模型会变得更加稳定。值得一提的是,Dropout已经成为了这几年深度学习的一个标配。
|
||||
|
||||
## **小结**
|
||||
|
||||
今天我为你讲了第一篇基于深度学习的经典论文,讨论了AlexNet这个模型,这个模型开启了深度学习全面进军计算机视觉领域的时代。
|
||||
|
||||
一起来回顾下要点:第一,AlexNet模型在ImageNet 2012竞赛中胜出,让我们看到了深度学习模型在计算机视觉领域中所取得的显著效果;第二,我们讨论了AlexNet模型的四大创新之处,以及论文提出的两种防止过拟合的方法。
|
||||
|
||||
最后,给你留一个思考题,站在现在的立场,AlexNet在当时的成功是否给你一些启发呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
1. **ImageNet Classification with Deep Convolutional Neural Networks**, Alex Krizhevsky, Ilya Sutskever, and Geoffrey Hinton, NIPS, 2012.
|
||||
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
<audio id="audio" title="122 | 计算机视觉领域的深度学习模型(二):VGG & GoogleNet" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/87/62/872cc3100671bad09c901aa207191762.mp3"></audio>
|
||||
|
||||
在上第一期的分享中,我们通过一篇经典论文讲了AlexNet这个模型。可以说,这篇文章是深度学习在计算机视觉领域发挥作用的奠基之作。
|
||||
|
||||
AlexNet在2012年发表之后,研究界对这个模型做了很多改进工作,使得这个模型得到了不断优化,特别是在ImageNet上的表现获得了显著提升。今天我们就来看看针对AlexNet模型的两个重要改进,分别是VGG和GoogleNet。
|
||||
|
||||
## VGG网络
|
||||
|
||||
我们要分享的第一篇论文题目是《用于大规模图像识别的深度卷积网络》(Very Deep Convolutional Networks for Large-Scale Image Recognition)[1]。这篇文章的作者都来自于英国牛津大学的“视觉几何实验室”(Visual Geometry Group),简称VGG,所以文章提出的模型也被叫作 **VGG网络**。到目前为止,这篇论文的引用次数已经多达1万4千次。
|
||||
|
||||
首先,我们简单来了解一下这篇论文的作者。
|
||||
|
||||
第一作者叫卡伦·西蒙彦(Karen Simonyan),发表论文的时候他在牛津大学计算机系攻读博士学位。之后,西蒙彦加入了谷歌,在DeepMind任职,继续从事深度学习的研究。
|
||||
|
||||
第二作者叫安德鲁·兹泽曼(Andrew Zisserman),是牛津大学计算机系的教授,也是计算机视觉领域的学术权威。他曾经三次被授予计算机视觉最高荣誉“马尔奖”(Marr Prize)。
|
||||
|
||||
这篇论文的主要贡献是什么呢?一个重要贡献就是研究**如何把之前的模型(例如AlexNet)加深层次,从而能够拥有更好的模型泛化能力,最终实现更小的分类错误率**。
|
||||
|
||||
为了更好地理解这篇文章的贡献,我们来回忆一下AlexNet的架构。AlexNet拥有8层神经网络,分别是5层卷积层和3层全联通层。AlexNet之所以能够有效地进行训练,是因为这个模型利用了“线性整流函数”(ReLu)、数据增强(Data Augmentation)以及Dropout等手段。这些方法让AlexNet能够达到8层。
|
||||
|
||||
但是,学术界一直以来都认为,从理论上看,神经网络应该是层数越多,泛化能力越好。而且在理论上,一个8层的神经网络完全可以加到18层或者80层。但是在现实中,梯度消失和过拟合等情况让加深神经网络变得非常困难。在这篇论文中,VGG网络就尝试从AlexNet出发,看能否加入更多的神经网络层数,来达到更好的模型效果。
|
||||
|
||||
那VGG是怎么做到加深神经网络层数的呢?总体来说,VGG对卷积层的“过滤器”(Filter)进行了更改,达到了19层的网络结构。从结果上看,和AlexNet相比,VGG在ImageNet上的错误率要降低差不多一半。可以说,**这是第一个真正意义上达到了“深层”的网络结构**。
|
||||
|
||||
VGG在“过滤器”上着手更改,那么具体的改变细节究竟有哪些呢?简单来说,就是在卷积层中仅仅使用“3*3”的“接受域”(Receptive Field),使得每一层都非常小。我们可以从整个形象上来理解,认为这是一组非常“瘦”的网络架构。在卷积层之后,是三层全联通层以及最后一层进行分类任务的层。一个细节是,VGG放弃了我们之前介绍的AlexNet中引入的一个叫“局部响应归一化”(Local Response Normalization)的技术,原因是这个技巧并没有真正带来模型效果的提升。
|
||||
|
||||
VGG架构在训练上的一个要点是先从一个小的结构开始,我们可以理解为首先训练一个AlexNet,然后利用训练的结果来初始化更深结构的网络。作者们发现采用这种“**初始训练**”(Pre-Training)的办法要比完全从随机状态初始化模型训练得更加稳定。
|
||||
|
||||
## GoogleNet
|
||||
|
||||
我们要分享的第二篇论文题目是《更深层的卷积》(Going deeper with convolutions)[2]。因为这篇论文的作者基本都来自于谷歌,所以文章提出的模型有时候又被叫作 **GoogleNet**。这篇论文拥有8千多次的引用数。
|
||||
|
||||
GoogleNet不仅和VGG一样在把架构做“深”上下文章,而且在模型的效率上比AlexNet更加优秀。作者们利用了比AlexNet少12倍的参数,在更深的架构上达到了更好的效果。
|
||||
|
||||
**GoogleNet创新的重点是在网络架构上**。和AlexNet以及VGG都不同的是,GoogleNet的作者们认为更加合适的网络架构不是简单地把相同的卷积层叠加起来,然后再把相同的全联通层叠加。如果我们需要更深的架构,必须从原理上对网络架构有一个不同的理解。作者们认为,网络结构必须走向“稀疏化”(Sparsity),才能够达到更深层次、更高效的目的。
|
||||
|
||||
那么,能否直接用稀疏结构来进行网络的架构呢?过去的经验表明,这条路并不那么直观。第一,直接利用稀疏的结构所表达的网络结构效果并不好,第二,这样做就无法利用现代的硬件,特别是GPU的加速功能。现代的GPU之所以能够高效地处理视觉以及其他一系列类似的问题,主要的原因就是**快速的紧密矩阵运算**。所以,直接使用稀疏结构有一定的挑战。
|
||||
|
||||
这篇论文的核心思想就是希望**用一组“局部的”(Local)紧密结构来逼近理想中的最优的稀疏化结构**,从而能够在计算上达到高效率,同时在理论思想上,能够利用稀疏化结构来达到更深的网络架构。
|
||||
|
||||
这种局部模块被作者们称作是**Inception模块**。什么意思呢?传统上,卷积层都是直接叠加起来的。而这篇论文提出的Inception模块,其实就是让卷积层能够在水平方向上排列起来,然后整个模块再进行垂直方向的叠加。至于水平方向排列多少个卷积层,垂直方向排列多少Inception模块,都是采用经验试错的方式来进行实验的。
|
||||
|
||||
这篇论文最终提出的GoogleNet有22层网络结构。如果把所有的平行结构都算上的话,整个网络超过了100层。为了能够在这么深的结构上训练模型,作者们还采用了一种方法,那就是在中间的一些层次中**插入分类器**。相比之下,我们之前遇到过的网络结构都是在最后一层才有一个分类器。分类器层的特点就是最终的标签信息会在这里被利用,也就是说,分类的准确性,或者说是图片中物体究竟是什么,都会被这个标签信息所涵盖。在中间层加入分类器,其实就是希望标签信息能够正确引导中间层的目标,并且能够让梯度依然有效经过。
|
||||
|
||||
在实验中,GoogleNet模型可以说是达到了非常好的效果。在2014年的ImageNet竞赛中,GoogleNet和VGG分列比赛的第一名和第二名。两个模型之间的差距仅有不到1个百分点。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了两篇基于深度学习的经典论文,讨论了两个模型VGG和GoogleNet。这两个模型在AlexNet的基础上做了不少的革新。
|
||||
|
||||
一起回顾一下要点:第一,VGG模型对卷积层的“过滤器”进行了更改,实现了19层的网络结构,可以说是第一个真正意义上达到了“深层”的网络结构;第二,GoogleNet模型的创新是在网络架构上,利用稀疏化结构达到了更深的网络架构。
|
||||
|
||||
最后,给你留一个思考题,总结和比较VGG和GoogleNet这两个模型,我们看到了深度模型研发的一个什么趋势?
|
||||
|
||||
欢迎你给我留言,我们一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
K. Simonyan, A. Zisserman. **Very Deep Convolutional Networks for Large-Scale Image Recognition**. International Conference on Learning Representations, 2015.
|
||||
</li>
|
||||
<li>
|
||||
C. Szegedy et al. **Going deeper with convolutions**. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Boston, MA, pp. 1-9, 2015.
|
||||
</li>
|
||||
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
<audio id="audio" title="123 | 计算机视觉领域的深度学习模型(三):ResNet" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/97/82/970aab7ac9035480f92ba20cdbb15182.mp3"></audio>
|
||||
|
||||
今天我们继续来讨论经典的深度学习模型在计算机视觉领域应用。今天和你分享的论文是《用于图像识别的深度残差学习》(Deep Residual Learning for Image Recognition)[1]。这篇论文获得了CVPR 2016的最佳论文,在发表之后的两年间里获得了超过1万2千次的论文引用。
|
||||
|
||||
## 论文的主要贡献
|
||||
|
||||
我们前面介绍VGG和GoogleNet的时候就已经提到过,在深度学习模型的前进道路上,一个重要的研究课题就是**神经网络结构究竟能够搭建多深**。
|
||||
|
||||
这个课题要从两个方面来看:第一个是现实层面,那就是如何构建更深的网络,如何能够训练更深的网络,以及如何才能展示出更深网络的更好性能;第二个是理论层面,那就是如何真正把网络深度,或者说是层次度,以及网络的宽度和模型整体的泛化性能直接联系起来。
|
||||
|
||||
在很长的一段时间里,研究人员对神经网络结构有一个大胆的预测,那就是更深的网络架构能够带来更好的泛化能力。但是要想真正实现这样的结果其实并不容易,我们都会遇到哪些挑战呢?
|
||||
|
||||
一个长期的挑战就是**模型训练时的梯度“爆炸”(Exploding)或者“消失”(Vanishing)**。为了解决这个问题,在深度学习研究刚刚开始的一段时间,就如雨后春笋般爆发出了很多技术手段,比如“线性整流函数”(ReLu),“批量归一化”(Batch Normalization),“预先训练”(Pre-Training)等等。
|
||||
|
||||
另外一个挑战是在VGG和GoogleNet的创新之后,大家慢慢发现**单纯加入更多的网络层次其实并不能带来性能的提升**。研究人员有这样一个发现:当一个模型加入到50多层后,模型的性能不但没有提升,反而还有下降,也就是模型的准确度变差了。这样看,好像模型的性能到了一个“瓶颈”。那是不是说深度模型的深度其实是有一个限度的呢?
|
||||
|
||||
我们从GoogleNet的思路可以看出,网络结构是可以加深的,比如对网络结构的局部进行创新。而这篇论文,就是追随GoogleNet的方法,在网络结构上提出了一个新的结构,叫“**残差网络**”(Residual Network),简称为 **ResNet**,从而能够把模型的规模从几层、十几层或者几十层一直推到了上百层的结构。这就是这篇文章的最大贡献。
|
||||
|
||||
从模型在实际数据集中的表现效果来看,ResNet的错误率只有VGG和GoogleNet的一半,模型的泛化能力随着层数的增多而逐渐增加。这其实是一件非常值得深度学习学者振奋的事情,因为它意味着深度学习解决了一个重要问题,突破了一个瓶颈。
|
||||
|
||||
## 论文的核心方法
|
||||
|
||||
那这篇论文的核心思想是怎样的呢?我们一起来看。
|
||||
|
||||
我们先假设有一个隐含的基于输入x的函数H。这个函数可以根据x来进行复杂的变换,比如多层的神经网络。然而,在实际中,我们并不知道这个H到底是什么样的。那么,传统的解决方式就是我们需要一个函数F去逼近H。
|
||||
|
||||
而这篇文章提出的“残差学习”的方式,就是不用F去逼近H,而是去逼近H(x)减去x的差值。在机器学习中,我们就把这个差值叫作“残差”,也就是表明目标函数和输入之间的差距。当然,我们依然无法知道函数H,在实际中,我们是用F去进行残差逼近。
|
||||
|
||||
F(x)=H(x)-x,当我们把x移动到F的一边,这个时候就得到了残差学习的最终形式,也就是F(x)+x去逼近未知的H。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/7b/cf/7b6ec9405504bc25042366ea0e9e92cf.png" alt="">
|
||||
|
||||
我们引用论文中的插图来看这个问题,就会更加直观。(图片来源:[https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf](https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf) )
|
||||
|
||||
在这个公式里,外面的这个x往往也被称作是“捷径”(Shortcuts)。什么意思呢?有学者发现,在一个深度神经网络结构中,有一些连接或者说层与层之间的关联其实是不必要的。我们关注的是,**什么样的输入就应当映射到什么样的输出**,也就是所谓的“等值映射”(Identity Mapping)。
|
||||
|
||||
遗憾的是,如果不对网络结构进行改进,模型无法学习到这些结构。那么,构建一个从输入到输出的捷径,也就是说,从x可以直接到H(或者叫y),而不用经过F(x),在必要的时候可以强迫F(x)变0。也就是说,捷径或者是残差这样的网络架构,在理论上可以帮助整个网络变得更加有效率,我们希望算法能够找到哪些部分是可以被忽略掉的,哪些部分需要保留下来。
|
||||
|
||||
在真实的网络架构中,作者们选择了在每两层卷积网络层之间就加入一个捷径,然后叠加了34层这样的架构。从效果上看,在34层的时候ResNet的确依然能够降低训练错误率。于是,作者们进一步尝试了50多层,再到110层,一直到1202层的网络。最终发现,在110层的时候能够达到最优的结果。而对于这样的网络,所有的参数达到了170万个。
|
||||
|
||||
为了训练ResNet,作者们依然使用了批量归一化以及一系列初始化的技巧。值得一提的是,到了这个阶段之后,作者们就放弃了Dropout,不再使用了。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了一篇经典论文,提出了ResNet,残差网络这个概念,是继VGG和GoogleNet之后,一个能够大幅度提升网络层次的深度学习模型。
|
||||
|
||||
一起来回顾下要点:第一,我们总结归纳了加深网络层次的思路以及遇到的挑战;第二,我们讲了讲残差网络的概念和这样做背后的思考以及在实际应用中的一些方法。
|
||||
|
||||
最后,给你留一个思考题,从AlexNet到VGG、GoogleNet,再到ResNet,除了网络深度加深以外,模型进化过程中是否还有一些地方也让你有所感触?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
1. Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun. **Deep Residual Learning for Image Recognition**. The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), pp. 770-778, 2016.
|
||||
|
||||
|
||||
64
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/124 | 计算机视觉高级话题(一):图像物体识别和分割.md
Normal file
64
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/124 | 计算机视觉高级话题(一):图像物体识别和分割.md
Normal file
@@ -0,0 +1,64 @@
|
||||
<audio id="audio" title="124 | 计算机视觉高级话题(一):图像物体识别和分割" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/55/20/55c460b963cc8b106fb3c24f5bd84f20.mp3"></audio>
|
||||
|
||||
从今天开始,我们讨论几个相对比较高级的计算机视觉话题。这些话题都不是简单的分类或者回归任务,而是需要在一些现有的模型上进行改进。
|
||||
|
||||
我们聊的第一个话题就是图像中的**物体识别**(Object Recognition)和**分割**(Segmentation)。我们前面介绍过物体识别和分割。通俗地讲,就是给定一个输入的图像,我们希望模型可以分析这个图像里究竟有哪些物体,并能够定位这些物体在整个图像中的位置,对于图像中的每一个像素,能够分析其属于哪一个物体。
|
||||
|
||||
这一类型任务的目的是更加仔细地理解图像中的物体,包括图片分类、对图像里面的物体位置进行分析,以及在像素级别进行分割,这无疑是一个充满挑战的任务。
|
||||
|
||||
## R-CNN
|
||||
|
||||
深度模型,特别是卷积神经网络(CNN)在AlexNet中的成功应用,很大程度上开启了神经网络在图像分类问题上的应用。这之后,不少学者就开始考虑把这样的思想利用到物体识别上。第一个比较成功的早期工作来自加州大学伯克利分校[1],这就是我们接下来要介绍的**R-CNN模型**。
|
||||
|
||||
首先,R-CNN的输入是一个图片,输出是一个“选定框”(Bounding Box)和对应的标签。R-CNN采用了一种直观的方法来生成选定框:尽可能多地生成选定框,然后来看究竟哪一个选定框对应了一个物体。
|
||||
|
||||
具体来说,针对图像,R-CNN先用不同大小的选定框来扫描,并且尝试把临近的具有相似色块、类型、密度的像素都划归到一起去。然后,再利用一个AlexNet的变形来对这些待定(Proposal)的选定框进行特征提取(Feature Extraction)。在模型的最后一层,R-CNN加入了一个支持向量机(Support Vector Machine)来判断待选定框是否是某个物体。判断好了选定框以后,R-CNN再运行一个线性回归来对选定框的坐标进行微调。
|
||||
|
||||
R-CNN虽然证明了在物体识别这样的任务中,CNN的确可以超越传统的模型,但整个模型由多个模块组成,相对比较繁琐。
|
||||
|
||||
## Fast R-CNN
|
||||
|
||||
意识到了R-CNN的问题以后,一些学者开始考虑如何在这个模型上进行改进。第一个重大改进来自于R-CNN原文中的第一作者罗斯·吉尔什克(Ross Girshick)。吉尔什克这个时候已经来到了微软研究院,他把自己改进的模型叫作**Fast R-CNN**[2]。
|
||||
|
||||
Fast R-CNN的一个重要特点就是观察到我们刚才介绍R-CNN中的第二步骤,也就是每一个待定的选定框都需要进行特征提取。这里的特征提取其实就是一个神经网络,往往非常消耗资源。而且很多待定的选定框有很多重叠的部分,可以想象就会有很多神经网络的计算是重复多余的。
|
||||
|
||||
那么,有没有什么办法我们可以针对一个图片仅仅运行一次神经网络,但是又可以针对不同的待选定框共享呢?这其实就是Fast R-CNN的核心思想。Fast R-CNN的另外一个特点就是尝试用一个神经网络架构去替代R-CNN中间的四个模块。这样两个改进的结果是怎样的呢?Fast R-CNN和R-CNN相比在效果上差不多,但是训练时间快了9倍以上。
|
||||
|
||||
## Faster R-CNN和Mask R-CNN
|
||||
|
||||
在Fast R-CNN的技术上,一群当时在微软研究院的学者们把对R-CNN的加速往前推进了一步,这就是模型**Faster R-CNN**[3]。Faster R-CNN是在如何提出待定的选定框上做了进一步的改进,使得这部分不依赖一个单独的步骤,而依赖我们已经训练的CNN网络。这在速度上比Fast R-CNN又快了不少。
|
||||
|
||||
在Faster R-CNN的基础上,**Mask R-CNN**不仅能够做到对图像中的物体进行判别,而且还能够做到像素级的抽取[4]。前面我们在讲2017年ICCV最佳研究论文的时候,介绍过这部分内容。这里我带你做一个简单的回顾。
|
||||
|
||||
Faster R-CNN分为两个阶段。第一个阶段是“区域提交网络”(Region Proposal Network),目的是从图像中提出可能存在候选矩形框。第二个阶段,从这些候选框中使用“RoIPool”这个技术来提取特征从而进行标签分类和矩形框位置定位这两个任务。这两个阶段的一些特征可以共享。
|
||||
|
||||
区域提交网络的大体流程是什么样的?大体来说,最原始的输入图像经过经典的卷积层变换之后形成了一个图像特征层。在这个新的图像特征层上,模型使用了一个移动的小窗口来对区域进行建模。
|
||||
|
||||
这个移动小窗口有这么三个任务需要考虑。首先移动小窗口所覆盖的特征经过一个变换达到一个中间层,然后经过这个中间层,直接串联到两个任务,也就是物体的分类和位置的定位。其次,移动的小窗口用于提出一个候选区域,也就是矩形框。而这个矩形框也参与刚才所说的定位信息的预测。当区域提交网络“框”出了物体的大致区域和类别之后,模型再使用一个“物体检测”的网络来对物体进行最终的检测。
|
||||
|
||||
Mask R-CNN的第一部分完全使用Faster R-CNN所提出的区域提交网络,模型对第二部分进行了更改。那Mask R-CNN的第二部分都输出什么呢?不仅仅输出区域的类别和框的相对位置,同时还输出具体的像素分割。和很多类似工作的区别是,像素分割、类别判断、位置预测是三个独立的任务,并没有互相的依赖,这是作者们认为Mask R-CNN能够成功的一个重要的关键。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了计算机视觉高级话题之一的物体识别和分割技术。我们总结了从最早的R-CNN到加速的Fast R-CNN和更快的Faster R-CNN,以及最后能够进行像素分割的Mask R-CNN。
|
||||
|
||||
最后,给你留一个思考题,从这一系列模型的发展中,你能总结出一些心得体会吗?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik. **Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation**. The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), pp. 580-587, 2014.
|
||||
</li>
|
||||
<li>
|
||||
Ross Girshick. **Fast R-CNN**. The IEEE International Conference on Computer Vision (ICCV), pp. 1440-1448, 2015.
|
||||
</li>
|
||||
<li>
|
||||
Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun. **Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks**. Conference on Neural Information Processing Systems (NIPS), 2015.
|
||||
</li>
|
||||
<li>
|
||||
K. He, G. Gkioxari, P. Dollar and R. Girshick. **Mask R-CNN**. In IEEE Transactions on Pattern Analysis and Machine Intelligence.
|
||||
</li>
|
||||
|
||||
|
||||
67
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/125 | 计算机视觉高级话题(二):视觉问答.md
Normal file
67
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/125 | 计算机视觉高级话题(二):视觉问答.md
Normal file
@@ -0,0 +1,67 @@
|
||||
<audio id="audio" title="125 | 计算机视觉高级话题(二):视觉问答" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/1e/0d/1e13e92a7ede4b4c1069df9c382a700d.mp3"></audio>
|
||||
|
||||
今天,我们继续分享计算机视觉领域的高级话题,聊一聊“**视觉问答**”(Visual Question Answering)这个话题。
|
||||
|
||||
我们在前面曾经提到过“问答系统”(Question Answering),可以说这是人工智能领域最核心的问题之一。传统的问答系统主要是针对文字而言的,问题和答案都是以文字的形式表达的。当然,问答所针对的内容,有可能来自一个外在的知识库,例如维基百科。
|
||||
|
||||
我们今天要讨论的视觉问答,特别是“自由形式”(Free-Form)或者“开放形式”(Open Ended)的视觉问答,主要指的是根据一个图片进行自由的基于自然语言的问答。例如,我们可以问一个图片中是否存在一只猫;或者可以问图片里的天气是不是阴天等等。
|
||||
|
||||
## 视觉问答的挑战
|
||||
|
||||
那么,为什么视觉问答会在最近几年里得到很多学者的关注呢?我们有必要先来分析一下视觉问答所面临的挑战。
|
||||
|
||||
首先,**视觉问答需要对图片中的细节加以理解**。例如,我们问图片中的匹萨用了哪种奶酪,那就代表着我们的系统必须能够识别匹萨中的奶酪,而这往往意味着非常微观的一些细节的物体的识别。
|
||||
|
||||
其次,**视觉问答还需要我们对图片的上下文进行理解**。例如,我们可以问图片中有几辆自行车。这个问题其实不仅需要我们对图片中的自行车进行理解,还需要能够计数,这显然是一种更加复杂的理解任务。
|
||||
|
||||
除此以外,**我们还需要对图片中的物体进行推理**。例如,我们问图片中的匹萨是不是素食匹萨。那这个问题就需要对匹萨的种类进行分类,这是一个最基本的推理。
|
||||
|
||||
当然,视觉问答的挑战还远远不止这些。但从这些例子我们已经可以看出,视觉问题是一个综合性的人工智能问题。
|
||||
|
||||
不少视觉问答的数据集除了纯粹的图片作为输入以外,还有一个图片的“标题”(Caption)。这个图片标题往往提供了不少的信息,也算是帮助研究者在一定程度上降低了任务的难度。
|
||||
|
||||
如果需要对视觉问答的总体情况有一个更加深入的理解,推荐你阅读我在文末列出的参考文献[1]。
|
||||
|
||||
## 视觉问答建模
|
||||
|
||||
接下来我们来聊一个视觉问答的基础模型[1]。这个模型需要对问题、图片以及图片标题分别进行建模,从而能够进行问答。
|
||||
|
||||
针对问题,模型利用所有问题中的重要词进行了“词包”(Bag of Words)的表达,并且得到了一个1030维度的输入表征。类似地,针对图片标题,模型也进行了词包表达,得到了一个1000维度最高频词的表征。最后,作者们利用了VGG网络来提取图片的特征,得到了一个4096维度的图像表征。一种更加简单的方法则是先利用神经网络的隐含层,针对每一种特征单独训练,然后把第一层中间层给串联起来。串联起来之后,这就是所有特征的一种联合的表达了。那么我们可以再经过一层隐含层学习到各个表征之间的相互关系。
|
||||
|
||||
文章中还讨论了另外一种模型,那就是利用LSTM来把问题和图像结合到一起,来最后对回答进行预测。
|
||||
|
||||
在这样的模型架构下,回答的准确度大概在55%左右。如何来理解这个准确度呢?在同样的一个数据集中,如果针对所有的问题回答都是“是”(Yes)所达到的准确度大概是20%多。
|
||||
|
||||
在最初的模型被开发出来以后的几年时间里,针对视觉问答的各类模型如雨后春笋般爆发式地增长。其中一个大类的模型利用了“关注”(Attention)机制。在深度模型中,**关注机制是一种相对来说复杂一些的“加权”模式**。也就是说,我们希望对某一些神经元或者是隐含变量更加关注一些。这个机制在视觉问答中的一种应用就是,针对不同的问题,我们希望让模型学习到图片的哪一部分来负责回答。
|
||||
|
||||
在一篇论文中[2],作者们提出了一种更加高级的“关注”机制,那就是“**层次同关注**”(Hierarchical Co-Attention)。
|
||||
|
||||
这个机制是什么样的呢?针对某一个回答,我们不仅要学习到究竟需要模型“看到”图片的某一个局部,这也就是我们刚才说到的“加权”,还需要针对问题,也就是文字,进行“加权”。这里的一个观察是,有时候一个问题中的核心其实就是几个关键词,这些关键词直接影响了回答。这就是“同关注”这一概念。
|
||||
|
||||
文章中还提出了另外一个概念,那就是“层次关注”,是指问题的文字,在单词、短语以及整个提问三个层次来进行建模。可以说,这种方法在语义的局部以及整体上更能找到问题的核心所在。
|
||||
|
||||
最后,需要提及一点,最近的一些研究又把视觉问答和“推理”(Reasoning),特别是“神经编程”(Neural Programming)联系起来,让回答问题变成自动生成程序的某种特殊形式[3]。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了计算机视觉高级话题之一的视觉问答的概念。
|
||||
|
||||
一起来回顾下要点:第一,我们讲了视觉问答所面临的三大主要挑战;第二,我们讨论了对视觉问答进行建模的一些基本思路。
|
||||
|
||||
最后,给你留一个思考题,你觉得当前视觉问答的主要瓶颈是什么?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
Stanislaw Antol, Aishwarya Agrawal, Jiasen Lu, Margaret Mitchell, Dhruv Batra, C. Lawrence Zitnick, Devi Parikh. **VQA: Visual Question Answering**. The IEEE International Conference on Computer Vision (ICCV), pp. 2425-2433, 2015.
|
||||
</li>
|
||||
<li>
|
||||
Jiasen Lu, Jianwei Yang, Dhruv Batra, and Devi Parikh. **Hierarchical question-image co-attention for visual question answering**. Proceedings of the 30th International Conference on Neural Information Processing Systems (NIPS’16), Daniel D. Lee, Ulrike von Luxburg, Roman Garnett, Masashi Sugiyama, and Isabelle Guyon (Eds.). Curran Associates Inc., USA, 289-297, 2016.
|
||||
</li>
|
||||
<li>
|
||||
Justin Johnson, Bharath Hariharan, Laurens van der Maaten, Judy Hoffman, Li Fei-Fei, C. Lawrence Zitnick, Ross B. Girshick. **Inferring and Executing Programs for Visual Reasoning**. ICCV 2017: 3008-3017.
|
||||
</li>
|
||||
|
||||
|
||||
74
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/126 | 计算机视觉高级话题(三):产生式模型.md
Normal file
74
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/126 | 计算机视觉高级话题(三):产生式模型.md
Normal file
@@ -0,0 +1,74 @@
|
||||
<audio id="audio" title="126 | 计算机视觉高级话题(三):产生式模型" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/65/4b/65f2547adbe7b17f02dd1ebec1ae244b.mp3"></audio>
|
||||
|
||||
今天,我们来讨论计算机视觉高级话题中的“**产生式模型**”(Generative Model)。
|
||||
|
||||
我们前面讲到的计算机视觉问题,绝大多数场景都是去学习一个“判别式模型”(Discriminative Model),也就是我们希望构建机器学习模型来完成这样的任务,比如判断某一件事情或一个图片的特征,或者识别图片里面的物体等,这些任务都不需要回答“数据是如何产生的”这一问题。简言之,针对判断类型的任务,不管是回归还是分类,我们都不需要对数据直接进行建模。
|
||||
|
||||
然而,判别式模型并不能解决所有的机器学习任务。有一些任务的核心其实需要我们针对数据进行有效的建模,这就催生了“产生式模型”。
|
||||
|
||||
## 产生式模型的一些基础概念
|
||||
|
||||
那么,针对数据建模的产生式模型都有哪些基本思想呢?
|
||||
|
||||
首先,产生式模型的一个核心思想就是模型要能够产生数据。也就是说,产生式模型不仅需要针对已有的数据建模,还需要有能力产生新的数据。产生出的这些新数据当然需要和已有的数据有一定的相似度。换句话说,新产生的数据要能够“以假乱真”。
|
||||
|
||||
那么,有哪些能够产生数据的工具呢?
|
||||
|
||||
**在比较简单的模型中,概率分布其实就起了产生数据的作用**。例如,在离散概率分布的世界里,如果我们知道了一个伯努利分布的参数,也就是某一个事件发生的概率,那么,从理论上来说,我们就可以模拟出这个事件的发生。
|
||||
|
||||
比如,我们利用伯努利分布来对掷硬币产生的正反面建模。一旦我们知道了这个分布的概率是0.5(或者说是50%),那么,我们从这个分布中产生的数据就可以形成和掷一枚没有偏差的硬币一样的效果。
|
||||
|
||||
同样的道理,如果我们利用正态(或者叫高斯)分布来针对一个连续变量建模,例如某一个地区的温度,那么一旦我们知道了这个正态分布的均值和方差这两个参数,我们就可以产生所有温度的可能值。假设温度完全服从这个正态分布,那么就可以认为这些可能值就是以后这个地区可能出现温度的真实情况。
|
||||
|
||||
当然,我们可以看到,简单概率分布无法对真实世界的绝大多数场景进行建模。这也不断激发研究人员来开发各种更加复杂的概率模型来对真实世界进行描述。
|
||||
|
||||
在过去十多年的时间里,一类机器学习思想逐渐成为主流的产生式模型,那就是**概率图模型**。顾名思义,概率图模型就是概率论和图论的巧妙结合,以此来对复杂的联合概率分布来进行描述。
|
||||
|
||||
我们今天就不针对概率图模型展开讨论了。你需要了解概率图模型的一个重要特点,那就是能够利用一个“显示的”表达式来写出这个联合概率分布,不管这个式子本身有多复杂。也就是说,**概率图模型期望能够通过构建复杂的、显示的表达式来完成对真实场景的模拟**。
|
||||
|
||||
## 产生式对抗网络
|
||||
|
||||
显然,构造一个概率图模型是一个极具挑战的任务,面对复杂的情况,我们都需要写出一个显示的表达式,或者是针对这种场景的数据来进行模拟。例如,图像和音频信息就是比较复杂的数据,很难用一个公式(不管这个公式多么复杂)来表达。
|
||||
|
||||
那究竟该怎么办?针对这种复杂的数据,研究人员提出了一种新的产生式模型,这就是“**产生式对抗网络**”(Generative Adversarial Nets),简称为 **GAN**[1]。在过去的几年里,这种模型因其概念简单而备受青睐。
|
||||
|
||||
GAN的基本思想是怎样的呢?
|
||||
|
||||
首先,我们有一个**数据的“产生器”**(Generator)。这个产生器的作用是从一个我们可以控制的模型中产生数据。最终我们的期望是这个产生器能够产生和真实数据一样的数据。
|
||||
|
||||
其次,我们有一个**数据的“判别器”**(Discriminator),其目的是区分数据究竟是真实的数据还是产生器产生的数据。
|
||||
|
||||
GAN的模型训练是一个迭代的过程。最开始,产生器肯定无法真正产生有效的数据,这个时候,判别器能够很轻松地对产生的数据进行一个评判:哪些是真实数据,哪些不是。但是产生器会根据这个判别结果,逐渐调整自己产生数据的过程,慢慢地让自己产生的数据趋于真实。一直到最后,判别器无法分别出数据的真伪。
|
||||
|
||||
GAN其实代表了这么一类模型,那就是不再对数据的产生过程进行显式建模,因为这个太过于困难,而是**想办法定义一个流程,通过这个流程产生数据,从而能够直接去对真实数据进行模拟**。
|
||||
|
||||
GAN和深度学习的结合点在哪里呢?就是产生器和判别器可以分别是多层的神经网络,甚至可以是更加复杂的深度学习模型。这样,GAN的学习过程其实也就是两个不同的,各司其职的深度学习模型参数学习的过程。
|
||||
|
||||
在近几年的发展中,基于GAN的各类模型层出不穷,而且能够产生的图片质量也越来越高,甚至有的真的达到了能以假乱真的程度。
|
||||
|
||||
就在很多人都对这类模型充满了信心的时候,一些理论界的研究再次让大家对产生式模型,特别是GAN的前景萌生了怀疑。GAN能够彻底解决产生式模型的所有问题吗?
|
||||
|
||||
最新的论文[2]论证了GAN在一些限定情况下并不是对数据的整个分布进行建模。一个通俗的例子是,如果我们训练了一个可以产生猫的图片的GAN,那么在理想状态下,这个模型是不是应该可以产生各式各样不同种类的猫的图片呢?答案是,经过某种训练的GAN并不能做到这一点。相反,GAN只能产生有限的猫的图片。这肯定是不太理想的一种情况。
|
||||
|
||||
那么,研究者究竟是应该修改GAN来克服这个问题,还是能够找到更好的方法来产生数据,目前这还是一个未知答案的研究课题。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了计算机视觉高级话题之一的产生式模型。
|
||||
|
||||
一起来回顾下要点:第一,我们来讲了为什么需要产生式模型和简单的基于概率分布的数据产生器;第二,我们讨论了基于GAN的产生模型和最新研究的GAN的一些局限。
|
||||
|
||||
最后,给你留一个思考题,有了能够以假乱真的产生式模型,我们可以有哪些应用呢?
|
||||
|
||||
欢迎你给我留言,我们一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
Ian J. Goodfellow, Jean Pouget-Abadie, Mehdi Mirza, Bing Xu, David Warde-Farley, Sherjil Ozair, Aaron Courville, and Yoshua Bengio. **Generative adversarial nets**. Proceedings of the 27th International Conference on Neural Information Processing Systems - Volume 2 (NIPS’14), Z. Ghahramani, M. Welling, C. Cortes, N. D. Lawrence, and K. Q. Weinberger (Eds.), Vol. 2. MIT Press, Cambridge, MA, USA, 2672-2680, 2014.
|
||||
</li>
|
||||
<li>
|
||||
Sanjeev Arora and Yi Zhang. **Do GANs learn the distribution? Some theory and empirics**. ICLR. 2018
|
||||
</li>
|
||||
|
||||
|
||||
46
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/复盘 5 | 计算机视觉核心技术模块.md
Normal file
46
极客时间专栏/geek/AI技术内参/计算机视觉核心技术/复盘 5 | 计算机视觉核心技术模块.md
Normal file
@@ -0,0 +1,46 @@
|
||||
|
||||
今天我们来对计算机视觉核心技术模块做一个复盘。在这个模块里,我们一起学习了12期内容,讨论了四个话题,这些话题主要围绕计算机视觉的基础知识和深度学习技术在这个领域的应用。
|
||||
|
||||
之所以这么安排,是因为没有深度学习技术,就不会有现在计算机视觉的发展。我们站得稍微高一点就可以看到,正是因为深度学习技术在计算机视觉中的成功应用,才有了近几年的人工智能浪潮。
|
||||
|
||||
提示:点击知识卡跳转到你最想看的那篇文章,温故而知新。
|
||||
|
||||
## 图像技术基础
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/c0/dc/c066fa0d0124eb11e379fece979ac9dc.jpg" alt="" />](https://time.geekbang.org/column/article/14002)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/d1/7b/d1fc116851940ca156d1ab657f2d207b.jpg" alt="" />](https://time.geekbang.org/column/article/14193)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/c4/d4/c4ee32279091710120c2e509bfb168d4.jpg" alt="" />](https://time.geekbang.org/column/article/14349)
|
||||
|
||||
## 基于深度学习的计算机视觉技术
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/b4/49/b49e94a8b96b6c73d6ff5ea6c68e6849.jpg" alt="" />](https://time.geekbang.org/column/article/14574)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/2a/30/2a31d7e6439fd5c12bfd5fe6453ee330.jpg" alt="" />](https://time.geekbang.org/column/article/14853)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/17/30/17a601ac5d908fad2a359127eb41cc30.jpg" alt="" />](https://time.geekbang.org/column/article/16938)
|
||||
|
||||
## 计算机视觉领域的深度学习模型
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/9b/51/9bfc83d9687bd3a13dd2f6024d9eaa51.jpg" alt="" />](https://time.geekbang.org/column/article/17874)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/17/87/171862e97a5e69233f84cb52c6a2ee87.jpg" alt="" />](https://time.geekbang.org/column/article/18126)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/9a/8f/9a6979b7bdfa1a86f9e60dc6a7c13c8f.jpg" alt="" />](https://time.geekbang.org/column/article/22892)
|
||||
|
||||
## 计算机视觉高级话题
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/94/6b/94a55d58b60337f4d5d64380dbec1e6b.jpg" alt="" />](https://time.geekbang.org/column/article/39727)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/46/5e/46790b81b2ad2afa9d84f392da5d825e.jpg" alt="" />](https://time.geekbang.org/column/article/39929)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/b8/22/b8c134ab49b5c94f101d82a2983d4a22.jpg" alt="" />](https://time.geekbang.org/column/article/40063)
|
||||
|
||||
## 积跬步以至千里
|
||||
|
||||
最后,恭喜你学完了这个模块中的内容。今日记一事,明日悟一理,积久而成学。每一个收获都是一个不小的成就。
|
||||
|
||||
在计算机视觉领域你有怎样的经验、心得或者疑惑,都欢迎你留言和我一起交流讨论。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user