没有数据制造数据也要学习(文字版)

点击这里收听本期节目音频版

编辑: 肖怡婷

本期嘉宾: 李正钦(UCSD 博士生) (G)

主播: 阿拉法特 (A), 舒晏 (S)


 02:28 
A
今天这期节目的名字叫《没有数据制造数据也要学习》。我们要聊的话题其实是我比较陌生的一个。我们都知道机器学习算法的训练是离不开数据的,但是数据的收集,尤其是数据标签的收集是非常困难的。那么今天的节目就和怎么样用人工生成的数据进行一些学习有关系。

 02:59 
A
大家好,欢迎收听德塔赛。我是阿拉法特。今天我请到的嘉宾是 UCSD 的博士生李正钦。
G
大家好,我叫李正钦,我是 UCSD 博士第二年的学生。我主要的研究方向是计算机视觉以及和计算机途径学相关的一些话题。
A
那么昨天我在和李正钦聊我们这周的节目要录什么的时候,他就跟我说了这个想法,应该说这样一种研究方向。我们后来聊到这其实是迁移学习的一个具体应用,但是我并不是特别了解迁移学习。当我听李正钦介绍完之后,我觉得还是非常的有趣。这个问题的背景是说我们在训练一个算法的时候我们需要很多的数据,但是这些数据的收集可能是非常困难的,再者即便我们能够收集这个数据,怎么样标注这些数据也还是非常的昂贵,我们就想能不能人工生成一些数据,然后让算法在人工收集的或者人工生成的这些数据上进行学习。李正钦能给我们些例子吗?具体会在什么情况下出现这样的收集数据很困难的问题,并且我们可以用人工生成的数据去作为我们的训练数据?
G
我可以举这样几个例子。在计算机视觉里面有这样三个问题是经常会被应用到的。一个是图像分割。在图像分割的时候,如果我们需要去训练的话,我们需要把图像中每一个像素它所属的那个物体种类都标注出来。
A
我打断一下,对不熟悉这个问题的听众,图像分割是说我们给算法一个图像,然后我们希望算法能够把图像中的每一个物件都标注出来。
G
对,应该是说把图像中每一个像素它所属的那个物体的种类都标注出来。
A
对,具体实现就是在像素级别上告诉我这个像素是属于哪一个物体的。
G
是的。如果需要在真实数据上去标注这样的数据的话,我们需要请人工的方式,就是请人对每一个像素做标注,而这个标注的成本是非常昂贵的,尤其是当图像的分辨率非常高的时候,可能需要标注的时间会非常非常的大。
A
但实际上你也不需要对每一个像素标记对吧。因为我之前和秦瑶聊的时候,她告诉我们说你只要标出这个物体的轮廓,然后就说这个轮廓以内的所有的像素点都属于比如说一个苹果或者一只猫这样。
G
对,这个是就现在来说比较常见的一种标注的方法,一般是用多边形去做一个标注,但这样它的标注成本依然会比较高。所以说可能一个更加好的方式是我能不能够从一些合成的数据集中我直接去获得物体的标签,这是一个我们可以用合成的数据集去帮助训练一些算法的具体例子。另外一个例子是光流法。光流法的定义,大概就是说如果我在一个视频中有连续的两帧,然后我希望能够找到这两帧中图片中像素的对应关系,这个如果需要用人工标注的话是非常非常困难的,因为即便是人也很难看出像素之间具体的一个对应关系。
A
具体的例子,比如说是什么时候你会用到这种?
G
比方说我需要对一个物体做追踪,我需要知道那个物体在视频中是怎么去运动的,在这个时候我需要知道物体每一个像素它在相邻的两帧中,它们之间的移动的轨迹是怎么样的。
A
类似于在一个电影中追踪一个物件,它具体在怎么运动。
G
是的。光流法的另外一个应用是说在视频中把运动的物体给找出来,这样的话我们可以在后期,比方说把运动的幅度给加大,这样能够帮助我们更好地看到图片中运动的部分是什么。这是光流法的两个应用。
A
把它加大是什么意思?
G
比方说你要检测婴儿的呼吸和心跳,如果你直接看视频的话,你可能很难看到婴儿的呼吸的那个身体的起伏。
A
所以你就可以放大这个动作的幅度。
G
对,如果我能计算出光流的话,我可以把这个运动的幅度给加大。这样的话,如果婴儿出现一些问题,比方说它停止呼吸或者怎么样的话,我就能够及时地从图片中把它给检测出来。
A
真的有这种应用吗?听起来还是挺可怕的。这是一个医疗上的应用吗?
G
对,应该是有的。因为原来本科的时候我实验室应该有一个学长在做类似的研究。还有一些好玩的应用,比方说一个人轻轻地笑了一下,然后你希望把他笑的幅度给加大的话,你也可以先把光流给计算出来,然后再把光流给加大之后,你就可以把他笑的脸做一个更大的位移,这样的话可以把他笑容的幅度给加大。还有一个应用是说图像的叫做 intrinsic decomposition。什么叫做 intrinsic decomposition 呢,这个跟图像生成的方式有关。就是图像生成的过程它其实是一个积分的过程,它是由物体表面的一些性质还有光照它们之间互相积分去得到的。在这种情况下,我们其实看到的物体的样貌就有很多因素去影响。如果我们想把这个积分给分开来的话,在这种情况下就叫做图像的 intrinsic decomposition。
A
这我觉得是一个在计算机图像学方面非常专业的一个建模事件的方法。
G
我觉得这个可能主要的应用是说我们可以用这种方式去采集到物体本身的样貌,在得到本身的样貌之后,我们就可以去生成新的场景出来。
A
在现实世界中,我们可以说我们也能把我们看到的一个物件的 intrinsic property 给它分离出来,达到一个比如说我们把它光照方面的 intrinsic property 分离出来,我们就可以得到它在光照发生了变化,比如说没有光照的情况下,它会长什么样,这理论上是可以做到的。
G
对,是可以做到。但这里就有个小问题,就如果没有光照它应该是全黑的,应该是在新的光照下是怎么样。
A
对,在新的光照方向或者新的可以说光照的一个材质?
G
对,可以这样说。
A
你就可以想象你刚举的三个例子都是这个很难做标注的。尤其在第三个例子中标注是非常困难,我们都不知道怎么去做这个标注。
G
第三个原来也是有一些标注的,但标注的方法会比较奇怪。它标注的方法就是说我在图像中选两个点,然后我人去判断这两个点,在光照相同情况下它们的颜色是不是会相同。但这样它只能得到一个比较稀疏的标注,并不能够对整个图像做标注。
A
在前两个例子中更多是说,虽然我们可以想象作为一个人类要怎么给它标注,但是标注的困难非常大。
G
对,标注会非常非常困难。
A
说了一个是图像分割,还有一个是...
G
光流。
A
为什么要叫它光流?
G
因为英文名是 optical flow
A
噢因为英文名是 optical flow 所以我们叫它光流。
G
对。
A
但我觉得其实叫它什么物件追踪,可能我还更能理解一点。
G
对我也觉得,但它可能比较特殊一点,就是它是计算非常微小的移动,不是说很大范围的移动。我也不知道原来他们怎么起的名字,反正就是这样子。

 11:06 
A
那我们进入下一个话题,就是我们怎么样在这些收集数据以及标注数据比较困难的问题上使用人工制造的数据。我估计在每一个不同的这些应用中,你人工制造数据的方法都是不太一样的。
G
对,是这样子的。
A
那我们先从第一个说起。在这个图像分割中,你可以跟我们讲一下我们可以怎么样人工的制造数据吗?
G
行,可以。现在有一个非常大的图像分割的合成的一个数据集,是从 GTA 那个游戏中获得的。它大概获得的方式就是说把游戏引擎跟显卡之间做交互的信息给截取出来,然后做出一些分析之后,它能够知道这中间它 render 的每一个像素的类标签是什么,这样的话它可以在非常快的时间内获得非常高分辨率的一些真值的标签的标记。这个是目前经常用来训练神经网络的一个数据集。
A
所以他们是使用这个游戏引擎,你刚提到的侠盗猎车手这个游戏。
G
对的,就 GTA。
A
那游戏引擎在渲染,我不是特别了解游戏行业是怎么样制造它们的游戏的,那它每一帧是这游戏引擎在渲染出这每一帧上每一个物件?
G
对,是。
A
我们可以接触到这个引擎本身吗?
G
这个它是不开源的,所以我们唯一能够获取的是游戏引擎跟显卡之间做交互的时候那个信息。
A
所以引擎会给显卡发一些信息,说它现在在某一个位置渲染一辆车,你可能可以捕获到这个信息,然后去试图理解它是要做什么事情。
G
对,然后我们可以通过这个推断出那个物体的种类到底是什么。
A
其实我在跟你录节目之前还看到 MIT tech review 他们有发一篇文章说有很多做这个自动驾驶的公司也在用 GTA 侠盗猎车手这个游戏做他们的训练数据的生成,因为可能可以比较近似的模拟现实世界的场景。
G
对他们在那种情况下应该用到的不光是对场景中的物体做识别,他们还要去训练一些具体的策略,比方说他在开车的时候做什么操作,车会在现实世界中会有什么样的反应?这个的模拟过程他们可以用游戏引擎去做。
A
但游戏引擎其实是一个基于物理引擎的一个东西,它不是一个基于机器学习的算法,所以基本上是说这种物理引擎在模拟现实世界的准确度上的提升,帮助我们去使用这个人工制造的数据去理解现实世界了。
G
对,是可以这样说。
A
你刚提到游戏厂商并没有对他的引擎进行开源,所以研究者其实是在分析游戏引擎发给显卡的这个信息,然后根据这个信息去猜测现在引擎在渲染一个什么物件。那游戏引擎可以直接用来做我们的下一个应用的生成的数据,就是做光流的生成的数据吗?
G
这个是可以做到的,提到这个就可以先讲一下 Blender。 Blender 是一个 3D 渲染引擎,它可以用来制作游戏和视频。当时 Blender 的公司为了推广这个引擎,他们制作了一个 15 分钟的动画短片,短片的名字叫做 Sintel。Sintel 是动画短片里面女主人公的名字,女主人公在动画短片里面收养了一条龙,后来她跟龙就走失了,最后她费尽千辛万苦去找那个小龙,但她找到小龙的时候小龙已经长大了,但她并没有就认出那个龙,她失手把那个龙给杀死了。当时 Blender 那个动画厂商把动画短片每一帧的所有渲染的信息都公布了出来,也就是说对于每一帧,我们知道在每一帧中所有物体的位置,它们的几何信息,它们物体表面的一些性质还有光照信息。知道这个之后,我们一方面可以知道每一帧之间物体的对应关系是什么,通过这个我们可以得到光流的真值。另外由于我们知道物体光照的信息以及物体表面的性质,所以我们也可以用这个来做 Image Decomposition 的真值,就 Intrinsic Decomposition 的真值。
A
由于这些开源你有更多的信息,基本上你想做什么就做什么。
G
对,就基本上我所有的信息都获得了。

 15:45 
A
听起来在这些 Vision 相关的应用上,我们能够使用人工数据很大程度上是要感谢现在的这些游戏引擎和这些 3D 渲染引擎能够渲染出和现实世界非常接近的一些景象。但无论这些引擎渲染得多么的真实,我想在这些引擎上训练出来的模型如果直接用在现实世界上,它的错误率还是会非常的高。
G
对,是的。
A
这是我们要引入迁移学习的地方了,怎么样把在这些人工制造的数据上训练出来的这些图像模型用在判断现实世界上收集的影像和图片上。那我们具体要怎么做呢?
G
首先可以讲一下为什么通过游戏引擎渲染出来的图片跟现实世界中的物体不太一样。有这样几点:第一点的话,因为大部分游戏引擎需要能够实时地把图片给渲染出来,所以它并不是一个完全基于现实世界中物体的物理性质去做渲染,所以在最开始的时候它们的样貌跟真实世界的物体就不太一样。另外还有一个地方是说他们的类标签的分布可能跟现实世界的物体也不太一样。这两种差距都会导致最后在用合成数据去训练出来的那个算法,可能在现实世界中就不会太有用。
A
第二个是说他们渲染的世界里面的物件分布和现实世界中不太一样。
G
对,这个也是有可能。并且比方说我们刚刚提到动画短片,它因为是一个卡通片,所以它里面人物的形状还有外貌肯定跟现实世界中的人物都是不太一样的。
A
对,在这个迁移学习的具体应用中,我们的目标是让人工生成的图片和现实世界中真实的图片尽可能接近。
G
这个是一方面,另外一个方面其实最根本的目的是说,我们希望能够在合成数据上去训练一个算法之后,它能够直接在现实的数据上工作。
A
但是这是很难做到的,因为你很难让你人工生成的图片和你现实世界中的图片很像,所以这完全可以说是不一样的数据集。那我们要怎么入手呢?
G
就是有这样几个方法,就是说如何能够让一个算法在不同的数据上都能够有比较好的表现。其中第一个思路是假设我们有两个神经网络,然后我们用两个神经网络分别作用在不同数据集的图片中去,然后我们在某一层把特征给提取出来,我们希望同一个神经网络在不同数据集上提取的特征的一些数学的性质要接近。这个数学性质,比方说是它们的平均值,或者是它们的协方差矩阵,这个是两个现在经常用的思路。
A
也就是说我们不是从原始的数据入手,而是希望我们的算法或者说我们的神经网络提取的特征是尽可能相似的,虽然原始数据不一样,但是这两个提取出来这两组特征是比较相似的。
G
对,这个是现在主要的思路。因为最后的一部分分割是直接作用在特征上面的,而不是作用在原始的图片上面。所以如果两个特征它们的分布是接近的话,那么我们就可以认为它们得到的结果应该会比较接近。
A
我们的学习算法就被分割成了两部分,从提取到的特征到做我们要做的学习任务,这部分是固定不变的,我们只是希望前一部分从原始图片到特征这一部分能够兼顾不同的数据集。
G
对,是这样子的。但其实在实际的训练过程中,我们会把两个数据集提取的特征要相近的性质作为一个额外的损失函数,在训练的时候我们会把这个 loss 跟原始任务的 loss 叠加在一起,然后共同的来训练神经网络。
A
就是具体我们怎么做到让这两个特征比较相似,是通过让他们俩的距离成为我的损失函数的一部分。
G
对,是的。
A
还有其他别的思路可以做这个任务吗?
G
另外一个思路的话,它们也是需要使得两个特征的分布相似,但是它们使得分布相似的方式就不是说直接计算两个特征的平均值或者协办差矩阵,而是说我在训练一个新的判别器。我用那个判别器去判断这两个特征是不是来自于不同的数据集,我们希望能够在特征提取的过程中可以去欺骗这个判别器。如果它们可以欺骗判别器的话,那我们就认为神经网络在两个数据集提取的特征它们的分布是相近的。这就是最近比较流行的对抗训练的一个例子。
A
这个思路感觉和对抗生成网络还是比较相近的。
G
对,它基本上就跟对抗生成网络是同一个事。
A
现在还是有两个网络吗?
G
对,是有两个网络。
A
一个网络是负责提取特征,另外一个网络负责分辨这个特征是从现实世界还是从人工生成的图片上提取的。
G
对,是的。然后我们希望提取特征的网络能够欺骗做判别的网络。
A
那最后我们是把提取特征的网络提取的特征直接喂给真的要做训练的网络,让它来做你的抑或是图像分割或者别的图像学上的任务?
G
对,是这样子。
A
那么我感觉这会有点问题,就是在这种做法和相比较第一种做法,因为在第一种做法中我们是把让两组特征相近作为了我们整个训练任务的损失函数的一部分,但是在你这做法中,在你提到的第二种做法中就用来提取特征的网络和真正用来做学习任务的网络是两个分开的?
G
不是分开的,这个是同一个网络。
A
噢还是同一个网络。
G
对,但你说有两个网络我认为一个是就判别器。
A
对,那也是我原来的意思。但我是说那这两个网络也是一起的?
G
对,它只是说把网络某一层的特征给取出来。
A
对,不然我觉得它会就是说就第一部分提取特征的网络它可以做得非常极端,它可以让所有的图片都产生完全一样的特征。
G
对,都是零就好。
A
那后面这个特征你再喂给学习的网络它什么都学不到了。所以它们整个是并在一起的,相当于用来提取特征的网络它是要从两个方面去获得它的 propagation。它是从...
G
对,就一方面它的 propagation 是来自于本来那个任务,另外它那个 propagation 是来自判别器,就是它们希望判别器会把它们两个特征根混淆在一起。
A
这样的话,我们就不用再费尽心机的设计一个特别的损失函数,可以说神经网络会替我们找到一个比较好的比例。
G
就是 adversary loss 是它损失函数的一部分,就是判别器产生的 loss 是它损失函数的一部分。

 22:49 
A
那我们到现在是聊了一些怎么样在视觉这个任务上生成一些人工生成的数据的问题。我们一般都会聊一下嘉宾自己是做哪一方面研究的,可以大概介绍一下你自己的工作。
G
我之前做过一些跟图像分割相关的研究,我最近主要是尝试把深度学习的算法应用在一些传统的图形学的问题上面,比方说 appearance 的 capture 或者其他的一些事情。
A
图形学的?这不是视觉的问题,更多是图像方面的问题。
G
我觉得应该说是计算机视觉跟计算机图形学一些交界的地方。
A
我们可以很简单的解释一下给没有这方面背景的听众,当我们说计算机视觉和计算机图形学的时候,它们俩的区别是什么吗?
G
好的,计算机视觉的话,是说我们已经有了图片,然后我们需要对图片去进行分析。而计算机图形学的话,是说我们有一些物理性质,还有就是物体本身,我们如何去产生一个图片,使得它更加接近真实世界中的一个图片。
A
所以像这些物理引擎的设计更多是计算机图形学方面的成果。
G
对,所以就基本上是说通过一些物理引擎去产生一些图片,然后用这个图片来对一些视觉的算法去做训练。
A
那我们今天就差不多聊到这里。
G
行。
A
好。我也非常感谢李正钦,今天给我们解释了这些迁移学习很有趣的应用。
G
也谢谢小阿邀请我来参加这个节目。
A
希望我们以后还有机会可以聊更多图形学和视觉方面的问题。那我们今天这期节目就到这里了,我们下期节目再见。
G
再见。