导读
快手硅谷Y-tech实验室负责人王华彦在2019 中国 AI 开发者大会,讲述了快手端上视觉技术的极致效率及其短视频应用实践。
王华彦,斯坦福大学计算机科学博士,师从Daphne Koller教授研究计算机视觉。曾就读于斯坦福大学人工智能实验室,为复杂化的概率图模型开发了高效的推理算法,并将其应用于计算机视觉研究。王博士现在领导快手位于硅谷的Y-tech实验室,在开发高效的人工智能解决方案的同时,也将更多的尖端技术引入快手的移动平台。
本文为此次演讲的实录。
演讲嘉宾简介:
王华彦,斯坦福大学计算机科学博士,师从Daphne Koller教授研究计算机视觉。曾就读于斯坦福大学人工智能实验室,为复杂化的概率图模型开发了高效的推理算法,并将其应用于计算机视觉研究。王博士的研究曾登上行业期刊CACM首页,并在多个顶级会议如CVPR、ICML、ECCV、IJCV、AAAI上发表。王华彦本科和硕士阶段就读于北京大学,师从査红彬教授,也曾参与香港科技大学杨强教授的科研活动。加入快手前,他曾担任Vicarious AI的高级研究员,以极其高效的数据方式,开发高度结构化的模型,解决CAPTCHA和Robotics等现实问题。他在人工智能领域的工作曾发表于美国的《科学》杂志。王博士现在领导快手位于硅谷的Y-tech实验室,在开发高效的人工智能解决方案的同时,也将更多的尖端技术引入快手的移动平台。
快手用户日均上传1500万个视频,要把这些作品准确的分发给超2亿活跃用户,如果没有强大的AI技术系统去理解视频内容以及用户行为和需求,很难做到。
2019年10月,由新一代人工智能产业技术创新战略联盟(AITISA)指导,鹏城实验室、北京智源人工智能研究院支持,专业中文 IT 技术社区 CSDN 主办的 2019 中国 AI 开发者大会(AI ProCon 2019)在北京举办。在计算机视觉技术专题,快手硅谷Y-tech实验室负责人王华彦讲述了端上视觉技术的极致效率及其短视频应用实践。
他指出了其中面临的技术挑战:第一,不可控的复杂场景和环境;第二,极为有限的移动设备计算资源;第三,由于所有应用有很强的时效性,需要做到快速开发和部署模型。
为了应对这些挑战,他介绍了解决方案和研究方向的三要素:首先是运用高度结构化的模型,并充分利用先验知识;其次,面对计算资源紧缺需要充分发掘各种冗余来提高算法的推理效率;最后,用高度结构化的信息表示提高学习算法利用数据的效率。
王华彦称,他们希望从一个可分解的、结构化的视觉信息表示出发,全面提高现有计算机视觉算法中的数据和计算效率,从提高模型推理效率,以此实现全面的效率提升,赋能短视频应用。
快手成立于2011年,从2013年开始把视频转型为短视频平台,2015年DAU突破1千万,百度和腾讯相继领投快手,2017年DAU突破1亿。在积累了这些资本和流量的优势之后,快手进入了非常高速的发展阶段,今年DAU突破2亿,全资收购A站,并领投了知乎。我们后面的目标是在明年春节之前DAU突破3亿。
快手平台的背后是有一套AI技术支撑,快手从2015年开始大量把AI技术用于各方面的内容生产、内容理解、用户理解、内容推荐、游戏广告,在所有这些落地场景中背后有硬件层、平台层、算法层一整套的AI硬核技术,这些技术会帮助我们用户生产出更多更有趣的内容,帮助平台更好的理解用户每天上传的视频,大家知道每天上传的视频有1500万,如果没有非常强大的系统理解用户行为和需求,就没办法把这些视频准确的分发给用户。
端上视觉技术赋能短视频应用
我们介绍几个案例说明端上视觉技术如何赋能短视频应用,快手Y-tech是我们公司专注于端上计算机视觉以及其他AI核心技术的部门。
这两个例子是去年上线的一个快手时光机可以通过现在的样子看到60年后的样子。今年8月份Y-tech北京团队上线了一个快手的娃娃脸,快手娃娃脸是国内首家实现端上实时GAN,从技术的层面讲变老是比较容易的,变年轻是比较难的,跟现实生活是一样的。为什么变老比较容易?它不需要改变整体的形状,只需要在脸上加上一些元素,变年轻需要通过对抗生成网络的技术改变脸部整体的信息。
还有个例子是用户只需要输入一幅图像,可以利用全自动的过程生成右边的视频,以全自动的方式把天空变暗,建筑物里的灯光亮起,大家都开始加班,建筑物上的大屏幕开始播放快手视频,所有这些都是自动实现。当然还有更多的例子,我们可以通过对用户拍摄场景进行很好的理解,然后加入各种各样虚拟元素,使得用户拍出更多更好玩的视频。
所有这些端上视觉短视频的应用场景在技术上的挑战,我们总结为三方面:第一是不可控的复杂场景和环境,比如在短视频应用中手机是拿在用户手里的,想怎么拍就怎么拍,可以横着、倒着、晃动拍,有各种完全没办法事先预料的场景;第二是极为有限的移动设备计算资源,大家知道一般的手机计算能力相对GPU来说是远远不如的,所以给我们的研究工作带来了更多挑战;第三是由于所有应用有很强的时效性,所以看到一个热点应用的时候就需要快速开发和部署模型,这也是短视频所独有的挑战。
为了解决这些挑战,我们的解决方案和研究方向有三个要素:第一是我们运用高度结构化的模型和充分利用先验知识,跟它相对的策略是随便一个什么任务只要知道了这个任务的输入和输出,然后以一种盲目的方式去确定很多数据,训练一个很大的神经网络,业界很多应用场景都是这样用的,但是对于独特的应用场景,我们为了提高效率需要更加高度结构化的模型运用更多的先验知识,不能简单是从输入到输出的网络。
第二是面对计算资源的紧缺需要充分发掘各种冗余来提高算法的推理效率,举个简单的例子,当你看到一个视频的时候,传统方法是每一帧都用同样的网络,每一帧都重复同样的计算,虽然你是在动,但是视频有很大的相似性,每一帧都重复计算就会有很多的冗余。
第三是用高度结构化的信息表示提高学习算法利用数据的效率。
关于在复杂环境下运用高度结构化的模型和先验知识进行推理,这里详细讲解一个案例。这是我们今年发表在ICCV的一篇论文,该论文中的场景是从一只手的单幅图像出发,希望得到手的姿势和形状的完整信息,然后用右边这样一个三维网格来表达,从而对它有一个完整理解。
为了解决这样非常困难且有非常多不确定性的任务,我们需要一整套非常结构化的方法,简单介绍一下这个方法。
从左上角开始,首先是从单幅的图像经过一个类似于网络的结构得到二维关键点信息,每个二维关键点都用一个Heat maps表示,然后进入第二个模块,通过迭代回归网络,它的输出就是两部分参数,一部分是摄像机参数,比如从什么样的远近来看这只手,另一部分是网格参数。
再看右下角这部分,从网格参数出发有一个从参数得到完整的手的网格,这些参数控制了手的形状和它的姿势,通过这个参数得到的三维网格再加上相机参数就可以计算很多关于手的特征,有了这些信息之后,训练模型的时候就可以拿这些计算特征和它的真实值相比得到一个函数,比如二维关键点,我们可以得到一个二维关键点位置的准确性的函数,轮廓的信息也可以跟它的真实mask相比得到一个函数。
值得一提的是。还有一部分是关于手的几何约束,三维上手的姿势是不能任意变化的,比如每个手指上的关键点必须在一个平面上,不可能一个关节往这边弯另一个关节往另外一个方向,关键点不在一个平面,这是不可能的。有了所有这些函数,很重要的一条是这里使用的关于手的模型是一个可微分的,这些网格的顶点位置和那边的参数之间是一个很微分的关系,这样我们就可以对整个结构化的模型进行端到端的训练。
刚才提到的第二部分,从关键点到形状参数这样的网络叫做迭代回归网络,这个网络的输入是两部分,一部分从这些二维的关键点位置得到的feature,另一部分是对这些参数的预估值,一开始是一个初始值,每次我们都从feature和初始值出发得到一个修正值,这个修正值会被加到那个初始值上面再使用一次网络(更新),再得到一个修正值,经过几次的修正得到最后的参数值。这样一个推理的过程经过检验比直接从feature出发得到那个参数的最后值的直接网络效率高很多,所以在同样的大小下它的准确性更高。
这是一些结果的事例,最左边的一列是输入的图像,再过来的三列是从这个图像不同角度的得到的手的网格,所以我们是从一个图像可以完整地得到手的三维信息。由于这个方法中使用了大量的先验知识和极核约束,有遮挡的时候网络得到了很好的应用。
下面进入下一个案例,在这些应用中如何适应极为有限的移动设备计算资源,我们将会介绍两个工作,这都是Y-tech西雅图实验室今年发表的。
在移动端部署一个神经网络模型的时候我们关心的通常有三方面,我们不仅要关心结果的准确性,重要的是我们还需要关心计算过程的能耗以及计算过程的时间。
传统的方法是通过一个剪枝方法来优化这个模型的能耗时间,什么叫剪枝的方法?我们去压缩模型的大小,把模型的大小作为一个直接的目标函数,通过压缩模型的大小间接优化它的能耗以及推理的效率,具体的剪枝方法分为三类,在某一层剪除一些节点,在一个矩阵中把一些元素设为零或者整行整列设为零,或者对这个位置进行量化。
剪枝方法隐含的假设是这里用到的目标函数(也就是模型大小)跟我们的直接目标(运算时间和能耗)有一个严格对等的关系,但这个关系在实际中并不成立,一个更合理的方法并不是用模型大小作为目标,而是直接把能耗和运算时间作为一个目标的优化。
这么做肯定会有困难,问题是可以做成这样的形式,最小化的问题是我们在一个训练集上训练这个模型,底下的约束是我们需要在训练这个模型的同时,使这个模型满足某个能耗的约束,有两个关键的问题是,我们如何看这样的能耗约束以及在这样的约束下如何处理训练的问题。
第一个例子是在底层硬件操作的层面,我们把这样的能耗约束进行一个建模,我们把神经网络中的线性层抽象成一个矩阵乘积形式,分解成两部分,一部分是要进行计算,另一部分是其数据读写,我们把每一步计算和数据的读写都拿出来给一个参数,对整个过程进行建模。
这个工作中我们用了剪除连接关系的方法。建模后发现,约束在现在的硬件实现上表现为分段线性函数,这里有很多参数,取决于硬件和实现的具体环境,这里还有一些取最大和最小的操作,导致它并不是一个线性函数,而是分段线性函数,因为我们的硬件上有一些缓存操作,这就导致当它达到一个缓存最大值时会有非线性表现,这里的β1,β2是缓存大小的函数。
SGD是我们用来训练所有神经网络模型的基本方法,简单描述就是现在有一个约束,所以先用SGD走一步,发现现在不满足约束了,就把它投影到约束里,找一个跟现在最近的地方满足这个约束,再按照SGD的方向走一步再投影回来,是这么一个循环的过程。
这需要解决的一个关键技术问题是如何实现投影的分子,当给定这个约束时,如何从一个不满足约束的地方跳到满足约束的地方。在具体问题中经过一系列的推导,我们发现最后是可以写成线性约束,在每个投影的步骤上只需要满足一个线性约束。
这个问题最后等价于背包问题:我有一个书包,现在有一堆东西,怎么用这个书包拿走价值最大的东西,现在我有一堆神经网络的链接,如何在固定资源下使用更多神经网络链接?
背包的问题是Knapsack,如果不出意外的话没有什么好办法,但是在理论上会有一些实现起来非常复杂的近似的方法,我们用了一个非常简单的方法,先拣值钱的拿,先拿黄金,再拿白银,再拿其他的。
我们比较了三种不同的网络,比较了SSL、MP、EAP这几种现存方法,这个图的横轴是Normalized能耗,竖轴是准确度。蓝色线表现我们在同样的能耗下可以比MP的准确度高1.7%,横过来这个距离表示我们在同样的准确度下可以比EAP多节省30%的能耗。
下面进入第二个例子,通过剪除节点的方式。
剪除节点表现在模型参数上,我们会把模型整行设为零,(2,0)表示矩阵里的非零行的个数。这里需要考虑的主要关系是每个层上面非零节点的个数,用这些东西来表达整个能耗时候并不是一个线性函数,而是双线性函数,因为相邻的层之间有关联,而隔的很远的层之间可能没有关联,把每个相邻的层关联起来的话写出来就是双线性函数。
我们把这个能耗用这样一个双线性函数来建模,把这个模型参数用实测的数据拟合,就可以发现它在两种流行的硬件上都可以拟合得非常好。求解这样一个双线性函数的优化问题也可以有很多不同的方法,比如前面说到投影的SGD的方式,这边论文还介绍了ADM的方式都可以求解这个问题。
看一下结果,我们把这个方法比较了几种现存方法,纵轴是准确率,横轴是能耗,可以看出越往纵深越好,这些方法超出了现有方法。
追求计算机视觉的极致效率
下面讲一讲Y-tech硅谷实验室现在正在进行和落地的研究工作,分为两部分,总目标是提升计算机视觉算法的效率,效率包含计算资源效率和数据资源效率。
计算资源的效率能够提高是因为有很多冗余的计算,比如对每一帧都用一个模型的话实际是进行了一个冗余的计算;数据资源的效率,在学习知识的时候因为现在的神经网络类似于黑箱子,为了更加形象的说明为什么可以很大程度上提高效率,举个例子。
我们对比了人的认知过程的一些特性和现有神经网络的一些特性,发现人的认知过程是基于一个可分解的结构化表示,这让人类可以用非常高的效率来学习,而且可以进行非常高效的推理。当然这样一个比较并不能简单理解为我们要去模仿人的大脑建造AI,而是我们可以通过人的认知方式的特征出发,通过类比发现现有的AI算法可能存在的局限性,知道可以从哪些方面进行改进。
这里举一个例子,这里有很多关于人的图像,上排是真实图像,下排是一些虚拟图像,假设现在的任务是要从所有图像中如何学习别人的姿势。假设人来看这些图像,我们对于真实图像和虚拟图像的理解方式本质上差不多,比如我们会把它分解为形状和颜色纹理两部分,形状的信息对于我们学习人体姿态知识是有用的,颜色和纹理相对来说是不那么重要的,这样一种分解就可以让人在学习知识时把不同样本之间有用的部分联系起来,把不同样本之间的形状信息联系起来,从而达到非常高效的利用样本的学习方式。
但是现有的神经网络方法在表示视觉信息的时候对于颜色纹理、形状所有东西是混在一起的,因为这样一个特性对真实图像和虚拟图像进行表示时,在特征空间中会match到不同区域,这样的特性导致它没办法把不同样本以合适方式联系在一起,这样就使学习的效率非常低。
困难是由于表示方式造成的,这是我之前在Vicarious AI的工作,我们针对验证码这样一种特殊类型的图像建造了一个把形状和纹理分开表示的模型,这个模型只需虚拟数据就可以训练,比现有最好的神经网络在300倍的数据量下的处理效果要好,这个工作发表在2017年的《科学》杂志。
总结一下前面讲的观点。如果希望像人一样高效的从很少的数据或者虚拟的数据中学习,我们就需要分解的本事,把视觉信息分解为形状轮廓信息和颜色纹理的信息,对于很多任务来说只有形状轮廓是有用的,颜色和纹理不是那么重要,通过把不同属性信息分解出来才能在不同样本中有效建立联系,从而提高学习效率。
进行一个类比的话,我们想要实现像人一样高效的推理也需要一个分解,这是另一个角度,把视觉信息分解为形状、视觉属性和位置运动的信息,这样我们在看见一个运动场景时就不需在每一帧都反复识别不同的运动物体,对已经识别的运动物体,我对它的属性就了解了,只需要用知识判断它如何运动的。
这样具体的想法怎样落地到实践当中?传统的方法是通过单帧人工标注图像来训练一个神经网络,每一帧都用同一个网络,我们的工作是在前面神经网络的基础上出发进行一些结构上的修改,得到一个针对序列的网络,用我们标注的视频来训练这样一个RNN网络,这个网络就会发掘帧间冗余,利用动态信息,部署到视频应用。
简单总结一下Y-tech硅谷实验室的研究内容。我们希望从一个可分解的、结构化的视觉信息表示出发,全面提高现有计算机视觉算法中的数据和计算效率,提高模型推理的效率,以此实现全面的效率提升,赋能短视频应用。