DeepMind 发布星际争霸强化学习课程

此前,跨象乘云介绍了:Pysc2 —— 基于 Python 的星际争霸 II 机器学习环境,这是 DeepMind 和暴雪合作开发星际争霸 II 到强化学习研究的一个丰富环境,为强化学习代理提供了与星际争霸 II 进行交互的界面,获得观察结果并发送动作。

很长时间以来,因为星际争霸这个游戏包含非常多的状态和动作空间,以及只有部分可观察和多玩家的特点,这个游戏一直被机器学习界认为是人工智能的下一个『大挑战』。

于是,一个由澳大利亚开发人员、机器学习工程师和研究人员组成的团队 —— StarAi 就基于星际争霸开发了一个机器学习课程!

课程特色

大多数强化学习课程都是采用高度数学化的方法学习的,但是这个课程使用更加人性化工具 —— 『故事』,来解释基本的强化学习概念。不能自己动手创造的东西你是不会明白的!所以课程提供了易于实际操作的练习,与步骤详解,以帮助学习。

学习方法

所有练习都在谷歌实验室中执行,直接在浏览器中就可以操作,而与硬件无关。所以你所需要的只是一个谷歌帐户和 Chrome 浏览器。学习的步骤就是先观看演讲材料,然后尝试进行练习。当然课程官方就像高中老师一样,也是要求你在自己实际操作很多遍之后如果还不能解决再看答案,不要直接看答案!

而对于基础较好的技术人员,如果想深入了解的话,课程还提供了Sutton & Bartos 的优秀教科书《An Introduction for each week’s material》中相关章节的链接。课程一共六周,每一部分都包含视频讲解、PPT、课后练习和答案,非常完善!赶紧上手进行学习吧!

课程链接

https://www.starai.io/course/

计算机视觉各研究方向汇总

所谓计算机视觉,即 compute vision ,就是通过用计算机来模拟人的视觉工作原理,来获取和完成一系列图像信息处理的机器。计算机视觉属于机器学习在视觉领域的应用,是一个多学科交叉的研究领域,涉及数学,物理,生物,计算机工程等多个学科,由此也可以想象到计算机视觉的研究范围非常广,也是图像,语音,自然语言处理领域中从业人数最多的。

1. 图像分类

1.1 基本概念

图像分类是计算机视觉中最基础的一个任务,也是几乎所有的基准模型进行比较的任务,从最开始比较简单的 10 分类的灰度图像手写数字识别 mnist ,到后来更大一点的 10 分类的 cifar10 和 100 分类的cifar100 ,到后来的 imagenet ,图像分类任务伴随着数据库的增长,一步一步提升到了今天的水平。

现在在 imagenet 这样的超过 1000 万图像,2 万类的数据集中,计算机的图像分类水准已经超过了人类。

图像分类,顾名思义,就是一个模式分类问题,它的目标是将不同的图像,划分到不同的类别,实现最小的分类误差。

总体来说,对于二分类的问题,图像分类可以分为跨物种语义级图像分类,子类细粒度图像分类,以及实例级图像分类三大类别。

图像分类三大类别
图像分类三大类别

传统机器学习方法:
通过各种经典的特征算子+经典分类器组合学习,比如 HoG+SVM。

深度学习方法:
各种分类网络,最为大家熟知的就是 ImageNet 竞赛了。

2012 年 Alexnet 诞生,意味着 GPU 训练时代的来临。
Alexnet 是第一个真正意义上的深度网络,与 LeNet5 的 5 层相比,它的层数增加了 3  层,网络的参数量也大大增加,输入也从 32 变成了 224 。

2014 年 VGG 诞生,它共包含参数约为 550M 。全部使用 3*3* 的卷积核*和 2*2 的最大池化核,简化了卷积神经网络的结构。VGG 很好的展示了如何在先前网络架构的基础上通过增加网络层数和深度来提高网络的性能,网络虽然简单,但是却异常的有效,在今天 VGG 仍然被很多的任务选为基准模型。

同一年 GoogleNet 诞生,也被成为 Inception Model ,它的核心是 Inception Module 。一个经典的   inception 结构,包括有四个成分,1*1 卷积,3*3  卷积, 5*5  卷积,3*3  最大池化,最后对运算结果进行通道上组合,可以得到图像更好的表征。自此,深度学习模型的分类准确率已经达到了人类的水平(5%~10%)。

2015 年,ResNet 被提出。ResNet 以  3.57% 的错误率表现超过了人类的识别水平,并以 152 层的网络架构创造了新的模型记录。由于 resnet 采用了跨层连接的方式,它成功的缓解了深层神经网络中的梯度消散问题,为上千层的网络训练提供了可能。

2016 年 ResNeXt 诞生,101 层的 ResNeXt 可以达到 ResNet152  的精确度,却在复杂度上只有后者的一半,核心思想为分组卷积。即首先将输入通道进行分组,经过若干并行分支的非线性变换,最后合并。

在 resnet 基础上,密集连接的 densenet 将前馈过程中将每一层与其他的层都连接起来。对于每一层网络来说,前面所有网络的特征图都被作为输入,同时其特征图也都被其他网络层作为输入所利用。

2017 年,也是 imagenet 图像分类比赛的最后一年,senet 获得了冠军。这个结构,仅仅使用了“特征重标定”的策略来对特征进行处理,也就是通过学习获取每个特征通道的重要程度,根据重要性去抑制或者提升相应的特征。

1.2 方向特点

图像分类的比赛基本落幕,也接近算法的极限。但是在实际的应用中却面临着比比赛中更加复杂,比如样本不均衡,分类界面模糊,未知类别等。

2. 目标检测

2.1 基本概念

分类任务给出的是整张图片的内容描述,而目标检测任务则关注图片中特定的目标。

检测任务包含两个子任务,其一是这一目标的类别信息和概率,它是一个分类任务。其二是目标的具体位置信息,这是一个定位任务。

face 0.996
face 0.996

与计算机视觉领域里大部分的算法一样,目标检测也经历了从传统的人工设计特征和浅层分类器的思路(以),到大数据时代使用深度神经网络进行特征学习的思路

在传统方法时代,很多的任务不是一次性解决,而是需要多个步骤的。而深度学习时代,很多的任务都是采用 End-To-End 的方案,即输入一张图,输出最终想要的结果,算法细节和学习过程全部丢给了神经网络,这一点在物体检测这个领域,体现得尤为明显。

不管是清晰地分步骤处理,还是深度学习的 end-to-end 的方法,目标检测算法一定会有 3 个模块。第一个是检测窗口的选择,第二个是图像特征的提取,第三个是分类器的设计。

2.2 方法分类

传统机器学习方法:
以保罗·维奥拉和迈克尔·琼斯于 2001 年提出的维奥拉-琼斯目标检测框架为代表,这是第一篇基于Haar+Adaboost 的检测方法,也是首次把检测做到实时的框架;

此方法在 opencv 中被实现为

cvHaarDetectObjects()

是 opencv 中最为人熟知的目标检测方法。

速度非常快,检测召回率相对如今的算法较低。

深度学习方法:
仍然要解决区域选择、提取特征、分类回归三个问题。但是在演变过程中,却发展出了 multi-stage和one-stage 的方法。其中 multi-stage 方法,是分步骤完成上面的任务,甚至可能需要单独训练各个网络。而 one-stage 则是一步到位。

RCNN 的框架是 multi-stage 方法的典型代表。它使用了 Selective search 先生成候选区域再检测,候选窗口的数量被控制在了 2000 个左右。选择了这些图像框之后,就可以将对应的框进行 resize 操作,然后送入 CNN 中进行训练。由于 CNN 非常强大的非线性表征能力,可以对每一个区域进行很好的特征表达,CNN 最后的输出,使用多个分类器进行分类判断。该方法将 PASCAL VOC 上的检测率从  35.1%  提升到了 53.7% ,其意义与  Alexnet 在 2012 年取得分类任务的大突破是相当的,对目标检测领域影响深远。

随后 Fast R-CNN 提出 RoIPooling 从整图对应的卷积特征图选取区域特征,解决了重复提取特征的问题。Faster R-CNN 则提出 Region Proposal , anchors 把一张图片划分成  n*n 个区域,每个区域给出 9 个不同 ratio 和 scale 的 proposal ,解决了重复提取候选 proposal 的问题。 RCNN 系列在工业届应用非常广泛,因此从事目标检测的同学必须掌握。

除了 multi-stage 方法,还有 one-stage 方法。以 YOLO 为代表的方法,没有显式的候选框提取过程。它首先将图片 resize 到固定尺寸,将输入图片划分成一个 7×7 的网格,每个网格预测 2 个边框,对每一个网络进行分类和定位。YOLO 方法也经过了许多版本的发展,从 YOLO v2  到  YOLO v3 。YOLO 的做法是速度快,但是会有许多漏检,尤其是小的目标。所以 SSD 就在  YOLO 的基础上添加了 Faster R-CNN 的   Anchor  概念,并融合不同卷积层的特征做出预测。虽然 YOLO 和 SSD 系列的方法没有了 region proposal 的提取,速度更快,但是必定会损失信息和精度。

2.3 方向特点

目标检测方向有一些固有的难题,比如小脸,遮挡,大姿态。

小脸,遮挡,大姿态
小脸,遮挡,大姿态

而在方法上,多尺度与级联网络的设计,难样本的挖掘,多任务 loss 等

3. 图像分割

3.1 基础概念

图像分割属于图像处理领域最高层次的图像理解范畴。所谓图像分割就是把图像分割成具有相似的颜色或纹理特性的若干子区域,并使它们对应不同的物体或物体的不同部分的技术。这些子区域,组成图像的完备子集,又相互之间不重叠。

图像分割
图像分割

在图像处理中,研究者往往只对图像中的某些区域感兴趣,在此基础上才有可能对目标进行更深层次的处理与分析,包括对象的数学模型表示、几何形状参数提取、统计特征提取、目标识别等。

传统方法:
图像分割问题最早来自于一些文本的分割,医学图像分割。在文本图像分割中,我们需要切割出字符,常见的问题包括指纹识别,车牌识别;由于这一类问题比较简单,因为基于阈值和聚类的方法被经常使用。

基于阈值和聚类的方法虽然简单,但因此也经常失效。以 graphcut 为代表的方法,是传统图像分割里面鲁棒性最好的方法。Graphcut 的基本思路,就是建立一张图,其中以图像像素或者超像素作为图像顶点,然后移除一些边,使得各个子图不相连从而实现分割。图割方法优化的目标是找到一个切割,使得移除边的和权重最小。

深度学习方法:
全卷积神经网络(Fully connected Network)是第一个将卷积神经网络正式用于图像分割问题的网络。

一个用于分类任务的深度神经网络通过卷积来不断抽象学习,实现分辨率的降低,最后从一个较小的featuremap 或者最后的特征向量,这个 featuremap 通常为 5*5 或者 7*7 等大小。而图像分割任务需要恢复与原尺度大小一样的图片,所以,需要从这个 featuremap 恢复原始图片尺寸,这是一个上采样的过程。由于这个过程与反卷积是正好对应的逆操作,所以我们通常称其为反卷积。

实际上并没有反卷积这样的操作,在现在的深度学习框架中,反卷积通常有几种实现方式,一个是双线性插值为代表的插值法,一个是转置卷积。

转置卷积
转置卷积

3.2 方向特点

在基于深度学习的图像分割中,有一些比较关键的技术,包括反卷积的使用,多尺度特征融合,crf  等后处理方法。

多尺度与上下文信息:
多尺度的信息融合可以从特征图,还可以直接采用多尺度的输入图像,不过这两者本质上没有太多的差异。使用金字塔的池化方案可实现不同尺度的感受野,它能够起到将局部区域上下文信息与全局上下文信息结合的效果。对于图像分割任务,全局上下文信息通常是与整体轮廓相关的信息,而局部上下文信息则是图像的细节纹理,要想对多尺度的目标很好的完成分割,这两部分信息都是必须的。

CRF:
由于经典的 cnn 是局部的方法,即感受野是局部而不是整个图像。另一方面,cnn 具有空间变换不变性,这也降低了分割的边缘定位精度。针对 cnn 的这两个缺陷,crf 可以进行很好的弥补。crf 是一种非局部的方法,它可以融合 context 信息,Deeplab 系列就使用了cnn 加上全连接的 crf 的方式。

另一方面,前面我们说的图像分割,是属于硬分割,即每一个像素都以绝对的概率属于某一类,最终概率最大的那一类,就是我们所要的类别。但是,这样的分割会带来一些问题,就是边缘不够细腻,当后期要进行融合时,边缘过渡不自然。此时,就需要用到 image matting 技术。

4. 目标跟踪

4.1 基本概念

目标跟踪,指的其实就是视频中运动目标的跟踪,跟踪的结果通常就是一个框。目标跟踪是视频监控系统中不可缺少的环节。

目标跟踪
目标跟踪

根据目标跟踪方法建模方式的不同,可以分为生成式模型方法与判别式模型方法。

生成式模型跟踪算法以均值漂移目标跟踪方法和粒子滤波目标跟踪方法为代表,判别式模型跟踪算法以相关滤波目标跟踪方法和深度学习目标跟踪方法为代表。

生成类方法:
在原始影像帧中对目标按指定的方法建立目标模型,然后在跟踪处理帧中搜索对比与目标模型相似度最高的区域作为目标区域进行跟踪。算法主要对目标本身特征进行描述,对目标特征刻画较为细致,但忽略背景信息的影响。在目标发生变化或者遮挡等情况下易导致失跟现象。

判别类方法:
通过对原始影像帧,对目标及背景信息进行区分建立判别模型,通过对后续影像帧搜索目标进行判别是目标或背景信息进而完成目标跟踪。

判别类方法与生成类方法的根本不同在于判别类方法考虑背景信息与目标信息区分来进行判别模型的建立,由于判别类方法将背景与目标进行区分,因此该类方法在目标跟踪时的表现通常更为鲁棒,目前已经成为目标跟踪的主流跟踪方式。判别类方法包括相关滤波,深度学习方法。

4.2 方向特点

目标跟踪有一些难点:

  1. 目标表征表达问题,虽然深度学习方法具有很强的目标表征能力,但是仍然容易受相似环境的干扰。
  2. 目标快速运动,由于很多跟踪的物体都是高速运动,因此既要考虑较大的搜索空间,也要在保持实时性的前提下减小计算量。
  3. 变形,多尺度以及遮挡问题,当目标发生很大的形变或者临时被遮挡如何保持跟踪并且在目标重新出现时恢复跟踪。

5. 图像滤波与降噪

5.1 基本概念

现实中的数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响,称为含噪图像或噪声图像。减少数字图像中噪声的过程称为图像降噪,有时候又称为图像去噪。

降噪可以应用于图像增强和美颜等领域。

图像降噪
图像降噪

传统方法:
传统降噪算法根据降噪的原理不同可分为基于邻域像素特征的方法,基于频域变换的方法,和基于特定模型的方法。

基于空域像素特征的方法,是通过分析在一定大小的窗口内,中心像素与其他相邻像素之间在灰度空间的直接联系,来获取新的中心像素值的方法,因此往往都会存在一个典型的输入参数,即滤波半径r。此滤波半径可能被用于在该局部窗口内计算像素的相似性,也可能是一些高斯或拉普拉斯算子的计算窗口。在邻域滤波方法里面,最具有代表性的滤波方法有以下几种:算术均值滤波与高斯滤波,统计中值滤波,双边滤波,非局部平均滤波方法,BM3D 算法。

深度学习方法:
在 2012 年,随着 Alexnet 的出现,深度学习做去噪的工作取得了一些进展,可以达到和 BM3D 差不多的水平。对于仿真的噪声和固定的噪声,深度学习已经可以很好的去除,达到或超过传统领域里最好的算法。

利用卷积神经网络去除噪声的原理很简单,输入是一张有噪声的图,标签是一张无噪声的图,输出是一张降噪后的图,损失函数是无噪声 groundtruth 与网络输出的 L2 距离,网络通常就是与图像分割算法一样的网络,卷积+与之对称的反卷积。

5.2 方向特点

降噪的研究聚焦在真实数据的去噪声,因为真实世界的噪声不符合高斯加性噪声的假设,而且是依赖于信息本身的。不过,真实噪声图像和相应的无噪声图像获取是非常困难,慢慢的也有了一些 benchmark 。

6. 图像增强

6.1 基本概念

图像增强,即增强图像中的有用信息,改善图像的视觉效果。

图像增强
图像增强

图像增强实际上包含了很多的内容,上面的降噪也属于其中,只是因为降噪多了美颜这一个应用单独拿出来说一下。

对比度增强,用于扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,可用于改善图像的识别效果,满足某些特殊分析。

超分辨,使图像变得更加清晰,可以用于视频的传输先进行降采样,再进行升采样,即降低了传输成本,又增加了视觉效果。

图像修复,重建图像和视频中丢失或损坏的部分,也被称为图像插值或视频插值,主要是替换一些小区域和瑕疵,如 photoshop 中的印章工具。随着发展,已经从原先针对划痕、污点等的修复到现在对图像、视频中文字、物体等的移除,比如水印等。

传统方法:
传统的方法就是一个预定义好的非线性变换,主要有三大类方法,一类是点操作,一类是直方图操作,一类是 Retinex 理论。

点操作也被称为直接对比度增强,将每个像素独立操作,包括对数变化,指数变化,负图像,阈值化等。我们熟知的 gamma 变换如下,可以进行不同形状的映射。

直方图操作也被称为间接对比度增强,包括直方图均衡,直方图匹配等。直方图均衡化通常用来增加图像的全局对比度,尤其是当图像中主体和背景对比度相当接近的时候。直方图均衡化的效果就是让直方图更均衡的分布,这种方法对于背景和前景都太亮或者太暗的图像非常有用,通常是曝光过度或者曝光不足的图片。

Retinex 理论,即颜色恒常知觉的计算理论,Retinex 是一个合成词,它的构成是 retina (视网膜)+cortex (皮层),它将图像认为是 reflectance 和 illumination 的点乘,理论基础是在不同的照明条件下,物体的色彩不受光照非均性的影响是恒定的,而物体的颜色是由物体对长波、中波和短波光线的反射能力决定的而不是由反射光强度的绝对值决定。

深度学习方法:
以增强对比度为例,深度学习方法使用了CNN 来进行非线性变换的学习,而且通常不仅仅局限在对比度增强,经常会同时学习到降噪。深度学习的方法有两种,一种是采用成对的图片训练,比如 pix2pix,learning in the dark ,缺点是没有普适性,只能对所实验的数据集有用。一种是不需要成对图片训练,只需要好图,比如 WESPE ,常配合 GAN 使用。

6.2 方向特点

一个图像增强任务,传统方法需要分别进行降噪,颜色校正,对比度增强等各种操作,而深度学习算法的好处就是 end-to-end 输出,将整个流程丢给了网络。目前图像增强相对于前面的一些方向还是一个蓝海,覆盖的方向和应用非常广,有精力的朋友可以好好研究。

7. 风格化

图像风格化之所以引起我们的注意,完全是因为 2015 年的一个研究,可以将任意的图像转换为梵高的画作风格。 也是得益于深度学习技术的发展,传统的方法做不到这么好的效果。而随着美图秀秀,天天 P 图等 app 层出不穷的滤镜,风格化已经成为了单独的一个研究领域。

图像风格化是一个综述性的技术应用,为了简单起见,就理解为艺术类滤镜把,它指通过算法,将数码相机拍摄的照片,变成绘画、素描等艺术类的非数码相机效果,是后期程度最深的操作,将彻底改变相片的风格。

风格化
风格化

深度学习方法:
以 A Neural Algorithm of Artistic Style 论文发表为起始,Prisma 滤镜为典型代表。虽然风格迁移技术的发展日新月异,但是最革命性的还是该文章的方法,这是德国图宾根大学的研究,它通过分析某种风格的艺术图片,能将图片内容进行分离重组,形成任意风格的艺术作品,最开始的时候需要将近一个小时来处理。

就是把一幅图作为底图,从另外一幅画抽取艺术风格,重新合成新的艺术画,可以参考上面的图。

研究者认为,图片可以由内容层(Content)与风格层(Style)两个图层描述,相互分离开。在图像处理中经常将图像分为粗糙层与细节层,即前者描述图像的整体信息,后者描述图像的细节信息,具体可以通过高斯金字塔来得到。

卷积神经网络的各个神经元可以看做是一个图像滤波器,而输出层是由输入图像的不同滤波器的组合,深度由浅到深,内容越来越抽象。

底层信息重建,则可以得到细节,而从高层信息重建,则得到图像的”风格“。因此,可以选择两幅图像,一幅构建内容信息,一幅构建风格信息,分别进行 Content 重建与 Style 重建。通过将内容与风格组合,可以得到新的视觉信息更加有意思的图像,如计算机油画,这就是它的基本原理。方法的核心在于损失函数的设计,包括内容损失和风格损失

内容损失在像素空间,要求风格化后的图能够保证内容的完整性。风格损失使用 vgg 特征空间的 gram 矩阵,这样就有了较高的抽象层级,实践结果表明可以很好的捕捉风格。

7.2 方向特点

如今风格化方法在很多地方都有应用,比如大家熟悉的变脸等。方法也演变成了几个方向;

  1. 单模型单风格,即一个网络只能做一种风格化。
  2. 单模型多风格,即一个网络可以实现多种风格,比(1)实用的多。
  3. 单模型任意风格,即一个网络可以任意风格,视输入图像而定,这是最好的,更多的研究我们以后会开专题。

8. 三维重建

8.1 基本概念

什么是三维重建呢?广义上来说,是建立真实世界的三维模型。随着软硬件的成熟,在电影,游戏,安防,地图等领域,三维重建技术的应用越来越多。目前获取三维模型的方法主要包括三种,手工建模,仪器采集与基于图像的建模。

三维重建
三维重建
  1. 手工建模作为最早的三维建模手段,现在仍然是最广泛地在电影,动漫行业中应用。顶顶大名的3DMax 就是典型代表,当然了,它需要专业人士来完成。
  2. 由于手工建模耗费大量的人力,三维成像仪器也得到了长期的研究和发展。基于结构光(structured light)和激光扫描技术的三维成像仪是其中的典型代表。这些基于仪器采集的三维模型,精度可达毫米级,是物体的真实三维数据,也正好用来为基于图像的建模方法提供评价数据库。由于仪器的成本太高,一般的用户是用不上了。
  3. 基于图像的建模技术(image based modeling),顾名思义,是指通过若干幅二维图像,来恢复图像或场景的三维结构,这些年得到了广泛的研究。

我们这里说的三维重建,就特指基于图像的三维重建方法,而且为了缩小范围,只说人脸图像,并简单介绍其中核心的 3DMM 模型。

3DMM 模型:

人脸三维重建方法非常多,有基于一个通用的人脸模型,然后在此基础上进行变形优化,会牵涉到一些模板匹配,插值等技术。有基于立体匹配(各种基于双目,多目立体视觉匹配)的方法,通过照相机模型与配准多幅图像,坐标系转换,获取真实的三维坐标,然后进行渲染。有采用一系列的人脸作为基,将人脸用这些基进行线性组合的方法,即 Morphable models 方法。

其中,能够融会贯通不同传统方法和深度学习方法的,就是 3D Morphable Models 系列方法,从传统方法研究到深度学习。

它的思想就是一幅人脸可以由其他许多幅人脸加权相加而来,学过线性代数的就很容易理解这个正交基的概念。我们所处的三维空间,每一点(x,y,z),实际上都是由三维空间三个方向的基量,(1,0,0),(0,1,0),(0,0,1)加权相加所得,只是权重分别为 x,y,z。

转换到三维空间,道理也一样。每一个三维的人脸,可以由一个数据库中的所有人脸组成的基向量空间中进行表示,而求解任意三维人脸的模型,实际上等价于求解各个基向量的系数的问题。

每一张人脸可以表示为:
形状向量 Shape Vector:S=(X1,Y1,Z1,X2,Y2,Z2,…,Yn,Zn)
纹理向量 Texture Vector:T=(R1,G1,B1,R2,G2,B2,…,Rn,Bn)

形状向量 纹理向量
形状向量 纹理向量

而一张任意的人脸,其等价的描述如下:

形状和纹理的平均值
形状和纹理的平均值

其中第一项 Si,Ti 是形状和纹理的平均值,而 si,ti 则都是 Si ,Ti 减去各自平均值后的协方差矩阵的特征向量。 基于 3DMM 的方法,都是在求解 α,β 这一些系数,当然现在还会有表情,光照等系数,但是原理都是通用的。

8.2 方向特点

人脸的三维建模有一些独特的特点:

1.预处理技术非常多,人脸检测与特征点定位,人脸配准等都是现在研究已经比较成熟的方法。利用现有的人脸识别与分割技术,可以缩小三维人脸重建过程中需要处理的图像区域,而在有了可靠的关键点位置信息的前提下,可以建立稀疏的匹配,大大提升模型处理的速度。

2.人脸共性多。正常人脸都是一个鼻子两只眼睛一个嘴巴两只耳朵,从上到下从左到右顺序都不变,所以可以首先建立人脸的参数化模型,实际上这也是很多方法所采用的思路。

人脸三维重建也有一些困难:

  1. 人脸生理结构和几何形状非常复杂,没有简单的数学曲面模型来拟合。
  2. 光照变化大。同一张脸放到不同的光照条件下,获取的图像灰度值可能大不一样的,这些都会影响深度信息的重建。
  3. 特征点和纹理不明显。图像处理最需要的就是明显的特征,而光滑的人脸除了特征关键点,很难在脸部提取稠密的有代表性的角点特征。这个特点,使得那些采用人脸配准然后求取三维坐标的方法面临着巨大的困难。

9. 图像检索

9.1 基本概念

图像检索的研究从 20 世纪 70 年代就已经开始,在早期是基于文本的图像检索技术(Text-based Image Retrieval,简称 TBIR ),利用文本来描述图像的特征,如绘画作品的作者、年代、流派、尺寸等。随着计算机视觉技术的发展,90年代开始出现了对图像的内容语义,如图像的颜色、纹理、布局等进行分析和检索的图像检索技术,也就是基于内容的图像检索(Content-based Image Retrieval,简称 CBIR )技术,本小节的图像检索就特指基于内容的图像检索。

基于内容的图像检索也经历了传统方法和深度学习方法两个主要阶段,传统的基于内容的图像检索通常包括以下流程:

图像检索流程
图像检索流程

预处理,通常包括一些图像归一化,图像增强等操作。特征提取,即提取一些非常鲁棒的图像特征,比如SIFT,HoG 等特征。特征库就是要查询的库,库中不存储图像而是存储特征,每一次检索图像完成特征提取之后,就在特征库中进行匹配和相似度计算。索引就是在某种相似性度量准则下计算查询向量到特征库中各个特征的相似性大小,最后按相似性大小进行高效的排序并顺序输出对应的图片。

图像检索的中最复杂的一步就是检索,在这一步完成验证过程。

图像检索验证过程
图像检索验证过程

最简单的方法就是暴力(brute-force) 搜索方法(又称线性扫描),即逐个与数据库中的每个点进行相似性计算然后进行排序,这种简单粗暴的方式虽然很容易实现,但是会随着数据库的大小以及特征维度的增加其搜索代价也会逐步的增加,从而限制在数据量小的小规模图像数据库,在大规模图像库上这种暴力搜索的方式不仅消耗巨大的计算资源,而且单次查询的响应时间会随着数据样本的增加以及特征维度的增加而增加,为了降低搜索的空间的空间复杂度与时间复杂度,研究者们提出了很多高效的检索技术,其中最成功的大家也最熟悉到方法是基于哈希的图像检索方法

深度学习在图像检索里面的作用就是把表征样本的特征学习好,就够了。

9.2 方向特点

图像检索系统具有非常大的商业价值,从搜索引擎的以图搜图,到人脸验证和识别系统,到一些搜索排序系统(比如基于美学的摄影图库)。由于图像特征的学习是一个通用的研究方向,因此更多的在于设计高效的检索系统。

10. GAN

10.1 基本概念

GAN,即 Generative adversarial net ,被誉为新的深度学习,涉及的研究非常多,可以单列为一个方向,一个经典的网络结构如下。

Generative adversarial net
Generative adversarial net

GAN 的原理很简单,它包括两个网络,一个生成网络,不断生成数据分布。一个判别网络,判断生成的数据是否为真实数据。

Generative adversarial net
Generative adversarial net

上图是原理展示,黑色虚线是真实分布,绿色实线是生成模型的学习过程,蓝色虚线是判别模型的学习过程,两者相互对抗,共同学习到最优状态。

关于 GAN 的基础,我们以前已经写过相关的内容,大家去看就可以了。

10.2 方向特点

作为新兴和热门方向,GAN 包含的研究方向非常的广,包括 GAN 的应用,GAN 的优化目标,GAN 的模型发展,GAN 的训练技巧,GAN 的理论分析,GAN 的可视化等等。

OpenAI 重磅发布深度强化学习资源

在项目主页中,OpenAI 提供了非常完整的使用教程,包括 Spinning Up 的详细介绍、各种环境下的安装方法、收录的算法,以及实验实现的教程等。除此之外,OpenAI 也提供了丰厚的学习资料,包括:强化学习的入门基础、结合 Spinning Up 学习 RL 的课程、论文推荐、实验练习和基准结果参考等。给人的第一印象就是,要想在深度强化学习上从 Zero 到 Hero,天天逛这个网站就够了。

DeepMind 开源强化学习库:松露

近日,DeepMind 开源了一个基于 TensorFlow 的强化学习库,名字叫 TRFL(译名:松露)。思路是模块化,强调灵活度:如果把造智能体想象成搭积木,许多关键的、常用的木块都在这里集合了:比如,DQN (深度 Q 网络) 、DDPG (深度确定策略梯度),以及 IMPALA (重要性加权演员学习者架构) ,都是 DeepMind 功勋卓著的组件。库里面的组件,虽然来源各不相同,但都经过严密测试,因而相对可靠;并且只要一个API,对开发者比较友好。即便是 DeepMind 团队自身做研究,也严重依赖这个库。

深度强化学习 (DRL) ,依赖价值网络或策略网络的不断更新。DeepMind 团队发现,比起传统的 RL 更新,损失函数更加模块化,更容易结合到监督/无监督的目标里去。松露里包含了许多损失函数和运算,全部在纯 TensorFlow 里实现。不是完整算法,但是各自经过严密测试,可以用来搭成完整的智能体。

此前,Google 开源了强化学习框架 Dopamine,中文叫多巴胺,也是基于 TensorFlow。名字取自人类大脑奖励机制中的主角物质多巴胺,为了表达神经科学和强化学习之间的缘分联系。多巴胺框架,也是强调灵活性、稳定性和复现性。

GitHub地址项目 GitHub 地址

神经网络架构搜索(NAS)综述

深度学习模型在很多任务上都取得了不错的效果,但调参对于深度模型来说是一项非常苦难的事情,众多的超参数和网络结构参数会产生爆炸性的组合,常规的 random search 和 grid search 效率非常低,因此最近几年神经网络的架构搜索和超参数优化成为一个研究热点。

机器之心的译文,从网络架构搜索的三个方面进行了分类综述,包括:

  • 搜索空间
  • 搜索策略
  • 评价预估

问题定义

网络架构和超参数优化的问题,有以下的特点:

  1. 评价函数未知,是一个黑箱优化问题,因为评价往往是在 unseed dataset 上进行评价;
  2. 非线性;
  3. 非凸;
  4. 混合优化,既有离散空间,又有连续空间;
  5. 一次优化结果的评价非常耗时,大型的深度学习模型参数数以亿计,运行一次结果需要几周时间;
  6. 在某些应用场景中,存在多个目标。比如:移动端的模型结构优化,既希望得到尽量高的准确率,又希望有非常好的模型计算效率。
Neural Architecture Search
Neural Architecture Search

搜索空间

搜索空间定义了优化问题的变量,网络结构和超参数的变量定义有所不同,不同的变量规模对于算法的难度来说也不尽相同。

早期很多工作都是用以遗传算法为代表的进化算法对神经网络的超参数和权重进行优化,因为当时的神经网络只有几层,每层十几个神经元,也不存在复杂的网络架构,参数很有限,可直接进行优化。而深度学习模型一方面有着复杂的网络结构,另一方面权重参数通常都以百万到亿来计,进化算法根本无法优化。

但换个思路,假如我们找到了一组网络架构参数和对应的超参数,深度学习模型的性能其实是由这组参数来控制和决定的,所以只需要对复杂模型的架构参数和对应的超参数进行优化即可。

目前常见的一种网络架构是链状结构,如下图:

N 层序列网络架构
N 层序列网络架构

这种结构相当于一个 N 层的序列,每一层有几种可选的算子,比如卷积、池化等,每种算子包括一些超参数,比如卷积尺寸、卷积步长等。

最近的一些工作受启发于一些人工设计的网络架构,研究带有多分支的网络,如下图:

多分支网络架构
多分支网络架构

很多的深层 RNN 会有类似的结构,很多的网络结构虽然很深,但会有许多重复 cell,将 cell 抽象出来之后,复杂的结构也会变得简单,一方面可以减少优化变量数目,另一方面相同的 cell 在不同任务之间进行迁移,如下图。

深层循环神经网络(RNN)架构
深层循环神经网络(RNN)架构

网络架构搜索问题由于其高维度、连续和离散混合等诸多难点,在搜索空间维度这块如果可以做些降维,将会大大提升效果,Zoph 在 2018 年的工作用了 cell 这种方式相比于 2017 年的工作有 7 倍的加速。

搜索策略

搜索策略定义了使用怎样的算法可以快速、准确找到最优的网络结构参数配置。常见的搜索方法包括:随机搜索、贝叶斯优化、进化算法、强化学习、基于梯度的算法。其中,2017 年谷歌大脑的那篇强化学习搜索方法将这一研究带成了研究热点,后来 Uber、Sentient、OpenAI、Deepmind 等公司和研究机构用进化算法对这一问题进行了研究,这个 task 算是进化算法一大热点应用。

强化学习

强化学习是一种非常有意思的范式,几乎只要可以提炼出强化学习四要素,原问题就可以用强化学习来求解。

在 NAS 任务中,将架构的生成看成是一个 agent 在选择 action,reward 是通过一个测试集上的效果预测函数来获得(这个函数类似于工程优化问题中的 surrogate model,即代理模型)。这类工作整体的框架都是基于此,不同的点在于策略表示和优化算法。

一个工作是,用 RNN 来表示策略函数,初始化时先用策略梯度算法赋初值,然后用 PPO 来进行优化。另一个工作是,用简单的 Q-learning 算法来训练策略函数,序列地进行动作选择,即选择 layer 的类型和相关的超参数。

因为在 NAS 任务中,agent 与环境没有交互,可以降阶为无状态的多臂老虎机(MAB)问题。 这里的几个工作都是近两三年的新工作,后面会对这些 paper 进行专门解读。

进化算法

进化算法是一大类算法,大概的框架也基本类似,先随机生成一个种群(N 组解),开始循环以下几个步骤:选择、交叉、变异,直到满足最终条件。最近几年流行一种基于概率模型的进化算法 EDA (Estimation Distribution of Algorithm),基本的思路类似遗传算法,不同的是没有交叉、变异的环节,而是通过 learning 得到一个概率模型,由概率模型来 sample 下一步的种群。

用进化算法对神经网络超参数进行优化是一种很古老、很经典的解决方案,90 年代的学者用进化算法同时优化网络结构参数和各层之间的权重,因为当时的网络规模非常小,所以还能解决,但后续深度学习模型网络规模都非常大,无法直接优化。

进化算法是一种无梯度的优化算法(Derivative Free Optimization Algorithm),优点是可能会得到全局最优解,缺点是效率相对较低,近两年几家高科技企业做 NAS 时都在用进化算法优化网络结构,同时用基于梯度的方法(BP)来优化权值。在 NAS 任务中,进化算法的交叉算子和任务结合比较紧,被定义为一些类似添加、删除层的操作,而非简单的更改某一位编码。

用进化算法解决 NAS 问题,不同的工作可能聚焦在不同的过程中,比如如何 sample 种群,如何 update 种群,如何生成子代种群等。这些工作将会被在后面的文章中进行解读。

贝叶斯优化

贝叶斯优化(Bayesian Optimization)是超参数优化问题的常用手段,尤其是针对一些低维的问题,基于高斯过程(Gaussian Processes)和核方法(kernel trick)。对于高维优化问题,一些工作融合了树模型或者随机森林来解决,取得了不错的效果。

除了常见的三大类方法,一些工作也在研究分层优化的思路,比如将进化算法和基于模型的序列优化方法融合起来,取各种方法的优势。Real 在 2018 年的一个工作对比了强化学习、进化算法和随机搜索三类方法,前两种的效果会更好一些。

评价预估

评价预估类似于工程优化中的代理模型(surrogate model),因为深度学习模型的效果非常依赖于训练数据的规模,大规模数据上的模型训练会非常耗时,对优化结果的评价将会非常耗时,所以需要一些手段去做近似的评估。

一种思路是用一些低保真的训练集来训练模型,低保真在实际应用可以有多种表达,比如训练更少的次数,用原始训练数据的一部分,低分辨率的图片,每一层用更少的滤波器等。用这种低保真的训练集来测试优化算法会大大降低计算时间,但也存在一定的 bias,不过选择最优的架构并不需要绝对数值,只需要有相对值就可以进行排序选优了。

另一种主流思路是借鉴于工程优化中的代理模型,在很多工程优化问题中,每一次优化得到的结果需要经过实验或者高保真仿真(有限元分析)进行评价,实验和仿真的时间非常久,不可能无限制地进行评价尝试,学者们提出了一种叫做代理模型的回归模型,用观测到的点进行插值预测,这类方法中最重要的是在大搜索空间中如何选择尽量少的点预测出最优结果的位置。

第三种主流思路是参数级别的迁移,用之前已经训练好的模型权重参数对target问题进行赋值,从一个高起点的初值开始寻优将会大大地提高效率。在这类问题中,积累了大量的历史寻优数据,对新问题的寻优将会起到很大的帮助,用迁移学习进行求解,是一个很不错的思路。

另一种比较有意思的思路叫做单次(One-Shot)架构搜索,这种方法将所有架构视作一个 one-shot 模型(超图)的子图,子图之间通过超图的边来共享权重。

小结

网络结构和超参数优化是自动机器学习(AutoML)中关键的一个环节,在上一个人工智能时代,浅层神经网络比较火的时候,自动调参也有很多工作,只不过区别在于不仅仅对超参数进行优化,还对网络的权值一起进行了优化。

在这个人工智能时代来临之后,各种深度模型的效果非常好,重新点燃了这个方向的研究激情,加上强化学习的火热,各种流派百家争鸣。

GitHub地址项目 GitHub 地址

Google 发布『多巴胺』开源强化学习框架

强化学习是一种非常重要 AI 技术,它能使用奖励(或惩罚)来驱动智能体(Agents)朝着特定目标前进,比如它训练的 AI 系统 AlphaGo 击败了顶尖围棋选手,它也是 DeepMind 的深度 Q 网络(DQN)的核心部分,它可以在多个 Workers 之间分步学习,例如,在 Atari 2600 游戏中实现『超人』性能。麻烦的是,强化学习框架需要花费大量时间来掌握一个目标,而且框架往往是不灵活和不总是稳定的。

但不用担心,Google 近日发布了一个替代方案:基于 TensorFlow 的开源强化学习框架 Dopamine(多巴胺)。 Google 的博文中提到,这个基于 TensorFlow 的强化学习框架,旨在为 RL 的研究人员提供灵活性,稳定性和可重复性的研究。受到大脑中奖励动机行为的主要成分的启发,以及反映神经科学与强化学习研究之间强烈的历史联系,该平台旨在实现可推动激进发现的思辨研究(Speculative Research)。此版本还包括一组阐明如何使用整个框架的 Colabs。

除了强化学习框架的发布,谷歌还推出了一个 Baseline plots 网站,允许开发人员快速可视化多个智能体的训练运行情况。他们希望,这一框架的灵活性和易用性将使研究人员能积极尝试新的想法,不管是渐进式还是激进式的想法。

GitHub地址项目 GitHub 地址

强化学习环境 Gym Retro

Gym 是 OpenAI 发布的用于开发和比较强化学习算法的工具包。使用它我们可以让 AI 智能体做很多事情,比如行走、跑动,以及进行多种游戏。目前,它运行在支持 Python 3.5 和 3.6 的 Linux、MacOS 和 Windows 系统上。

OpenAI 近日发布了完整版游戏强化学习研究平台 —— Gym Retro。在本次发布之后,OpenAI 公开发布的游戏数量将从大约 70 个雅达利和 30 个世嘉游戏增加到了 1,000 多个游戏,其中包括对任天堂 Game boy 等各种模拟器的支持。此外,OpenAI 还将发布用于向 Gym 平台添加新游戏的工具。

OpenAI 利用 Gym Retro 对强化学习算法及学习能力的泛化进行了研究。RL 领域之前的研究主要集中在优化智能体以完成单个任务上。Gym Retro 可以帮助研究在概念相似但外观不同的游戏之间进行泛化的能力。OpenAI 还将发布用于集成新游戏的工具。如果你有游戏 ROM,此工具可以帮你轻松创建储存状态、寻找内存位置以及设计强化学习智能体可以实施的方案。OpenAI 已经为希望增加新游戏支持的人编写了一个《集成器指南》。

此前,OpenAI 通过举办迁移学习竞赛:评估强化学习算法表现

GitHub地址项目 GitHub 地址

UC Berkeley 深度强化学习开放课程

UC Berkeley 最近发布了 CS 294: Deep Reinforcement Learning, Fall 2017 —— 深度强化学习的开放课程资源(中文翻译),这个课适合已经有一定机器学习基础的同学学习。同时,该课程主题选择深度增强学习,即紧跟当前人工智能研究的热点,又可作为深度学习的后续方向,值得推荐。

深度强化学习可以说是人工智能领域现在最热门的方向,吸引了众多该领域优秀的科学家去发掘其能力极限。而深度强化学习本身也由于其通用性备受各个应用领域推崇,从端对端游戏控制、机器人手臂控制、推荐系统,甚至也来到了自然语言对话系统。然而如何在日新月异,几乎每日都在更新迭代的深度强化学习的进展中保持好节奏,那是这篇文章带给大家的建议和思考。

开源强化学习环境:Control Suite

DeepMind 最近开源的强化学习环境 Control Suite,相比 OpenAI Gym,它拥有更多的环境,更易于阅读的代码文档,同时更加专注于持续控制任务。Control Suite 基于 Python,由 MuJoCo 模拟物理引擎提供支持。

完整的 DeepMind Control Suite + MuJoCo 套件,既是一套面向科研强大的强化学习(Reinforcement Learning)智能体性能评估基准;同时,又是一套完整的机器人模拟全仿真教学 Python 库。

GitHub地址项目GitHub地址