标签归档:分享总结

复旦大学Ph.D沈志强:用于目标检测的DSOD模型(ICCV 2017) | 分享总结

雷锋网 AI科技评论按,目标检测作为一个基础的计算机视觉任务,在自动驾驶、视频监控等领域拥有非常广泛的应用前景。目前主流的目标检测方法都严重依赖于在大规模数据集(如ImageNet)上预训练初始模型。而在DSOD: Learning Deeply Supervised Object Detectors from Scratch这篇论文中,作者通过分析深度检测模型从头训练存在的问题,提出了四个原则,他们根据这些原则构建了DSOD模型,该模型在三个标准数据集(PASCAL VOC 07, 12和COCO)上都达到了顶尖的性能。这篇论文已被ICCV2017收录。

在近期雷锋网 AI研习社的线上分享会上,该论文的第一作者——复旦大学Ph.D沈志强为我们带来了对DSOD的详细解读,与此同时也介绍了他在CVPR 2017和ICCV 2017上的一些其它研究工作。

沈志强,复旦大学Ph.D,UIUC ECE系访问学者,导师Thomas S. Huang教授。研究兴趣包括:计算机视觉(目标检测、视频描述、细粒度分类等),深度学习,机器学习等。他曾在因特尔中国研究院(Intel Labs China)进行为期一年的实习研究,期间合作者包括研究院Jianguo Li博士和在读博士生Zhuang Liu等。

分享内容:

很高兴与大家分享我们的最新的工作DSOD,这篇论文已经被ICCV 2017 所收录。

众所周知,计算机视觉有几个比较重要的分类,包括目标分类、定位、目标检测、实例分割,前两个分类是针对单个目标,后两个分类是针对多个目标,DSOD主要是针对目标检测。

说到目标检测,大家可能会想到如下几个比较有代表性的方法:R-CNN、Faster-RCNN、YOLO、SSD。下图是关于他们的一些介绍。

ImageNet预训练模型的限制:一是模型结构是固定的,你不可能改变它的结构,二是会有learning bias,三是会出现domain不匹配的情况。我们的思路是从头训练检测器,但是我们用R-CNN和Faster-RCNN都没能得到较好的表现。

简单回顾下Rol pooling,如下图所示:

它其实就是一个max pooling:

可以在下图中看到forward和backward情况,把Rol pooling去掉这个框架就类似于YOLO和SSD。

几个原则:一是Proposal-free。去掉Rol pooling,虽然对模型的表现影响不大,但这一点非常重要。

二是Deep Supervision。采用Dense Block,能避免梯度消失的情况。


三是Dense Prediction Structure。大大减少了模型的参数量,特征包含更多信息。

四是Stem Block。采用stem结构,好处是能减少输入图片信息的丢失。

下面是DSOD整体结构:

这是我们做的一些对比实验,可以看到增加这些结构之后性能提升的百分点:

下面是在PASCAL VOC2007上的实验结果,可以看到Faster-RCNN和R-CNN速度很慢,YOLO和SSD的速度非常快,但是mAP不高。最下面是我们没有用预训练模型做的一些对比实验,可以看到Faster-RCNN和R-CNN均以失败告终,最后的一行的实验加入COCO后mAP值提升,说明DSOD模型本身的泛化能力非常强。

下面是在PASCAL VOC2012上的实验结果,可以看到DSOD有不错的mAP值。

接下来是在COCO上面的一些结果,对比起来DSOD的也有很好的性能。

最后是一些实际的检测结果,可以看到bounding box对目标的检测非常贴合。

论文地址: https://arxiv.org/abs/1708.01241

代码:https://github.com/szq0214/DSOD

模型可视化示例:http://ethereon.github.io/netscope/#/gist/b17d01f3131e2a60f9057b5d3eb9e04d

最后简单介绍下我们在CVPR 2017的相关工作Dense Video captioning,主要是做视频描述。在视频当中包含很多内容,而这些内容并不一致,因此视频描述相对来说会比较困难。下图是一些示例。

网络结构如下图所示。具体细节大家可以参见我们的论文Weakly Supervised Dense Video Captioning,论文地址:https://arxiv.org/abs/1704.01502

接下来是我们在ICCV 2017上的工作,主要是做网络压缩。我们用了一个衡量channel是否重要的值来训练模型,然后剔除掉不太重要的特征层。论文代码我们也放在github上了。具体细节大家可以参见论文Learning Efficient Convolutional Networks through Network Slimming,论文地址:https://arxiv.org/abs/1708.06519

本次分享的视频如下:

雷锋网 AI科技评论整理编辑。

雷锋网

搜狗研究员讲解基于深度学习的语音分离 | 分享总结

雷锋网 AI 科技评论按:基于深度学习的有监督语音分离在学术界和工业界越来越受到关注,也是深度学习在语音领域的应用中重要的一部分。作为雷锋网AI研习社近期组织的一系列语音领域应用的分享会之一,本次我们请到了来自搜狗的研究员文仕学对语音分离方面主要的研究课题和相关方法做一些介绍。

文仕学,过去学物理,后来学EE,现在从事Deep Learning工作,未来投身AI和CM事业。他的研究兴趣在于语音信号处理和深度学习。在加入搜狗之前,曾在中国科学技术大学学习,在该领域的期刊和会议上发表了若干篇论文。现在在搜狗语音团队任副研究员。

雷锋网 AI 科技评论将本次分享的内容整理如下。

分享主题:基于深度学习的语音分离

文仕学首先介绍了“语音分离”(Speech Separation)是怎么样的一种任务。这个问题来自于“鸡尾酒会问题”,采集的音频信号中除了主说话人之外,还有其他人说话声的干扰和噪音干扰。语音分离的目标就是从这些干扰中分离出主说话人的语音。

根据干扰的不同,语音分离任务可以分为三类:

  • 当干扰为噪声信号时,可以称为“语音增强”(Speech Enhancement)

  • 当干扰为其他说话人时,可以称为“多说话人分离”(Speaker Separation)

  • 当干扰为目标说话人自己声音的反射波时,可以称为“解混响”(De-reverberation)

由于麦克风采集到的声音中可能包括噪声、其他人说话的声音、混响等干扰,不做语音分离、直接进行识别的话,会影响到识别的准确率。因此在语音识别的前端加上语音分离技术,把目标说话人的声音和其它干扰分开就可以提高语音识别系统的鲁棒性,这从而也成为现代语音识别系统中不可或缺的一环。

基于深度学习的语音分离,主要是用基于深度学习的方法,从训练数据中学习语音、说话人和噪音的特征,从而实现语音分离的目标。

这次分享的内容有以下这5个部分:分离使用的模型、训练目标的设置、训练数据的生成、单通道语音分离算法的介绍和讨论。

基于深度学习的语音分离方法使用的模型

第一类模型是多层感知机,DNN,可以先做RBM预训练,再做微调(fine-tune);不过文仕学介绍,他们团队通过实验发现,在大数据集上不需要预训练也可以收敛。

LSTM(长短时记忆网络)的方法中把语音作为一个随时间变化的序列进行建模,比较适合语音数据;CNN(卷积神经网络)通过共享权值,可以在减少训练参数的同时获得比全连接的DNN更好的性能。

近些年也有人用GAN(对抗性生成式网络)做语音增强。模型中通常会把生成器设置为全部是卷积层,为了减少训练参数从而缩短训练时间;判别器负责向生成器提供生成数据的真伪信息,帮助生成器向着“生成干净声音”的方向微调。

训练目标的设置

训练目标包括两类,一类是基于Mask的方法,另一类是基于频谱映射的方法。

基于Mask的方法又可以分为几类

  • “理想二值掩蔽”(Ideal Binary Mask)中的分离任务就成为了一个二分类问题。这类方法根据听觉感知特性,把音频信号分成不同的子带,根据每个时频单元上的信噪比,把对应的时频单元的能量设为0(噪音占主导的情况下)或者保持原样(目标语音占主导的情况下)。

  • 第二类基于Mask的方法是IRM(Ideal Ratio Mask),它同样对每个时频单元进行计算,但不同于IBM的“非零即一”,IRM中会计算语音信号和噪音之间的能量比,得到介于0到1之间的一个数,然后据此改变时频单元的能量大小。IRM是对IBM的演进,反映了各个时频单元上对噪声的抑制程度,可以进一步提高分离后语音的质量和可懂度。

  • TBM与IRM类似,但不是对每个时频单元计算其中语音和噪声的信噪比,而是计算其中语音和一个固定噪声的信噪比

  • SMM是IRM在幅度上的一种形式

  • PSM中加入了干净语音和带噪语音中的相位差信息,有更高的自由度

虽然基于Mask的方法有这么多,但最常用的还是开头的IBM和IRM两种

如果使用频谱映射,分离问题就成为了一个回归问题。

频谱映射可以使用幅度谱、功率谱、梅尔谱以及Gammatone功率谱。Gammatone是模拟人耳耳蜗滤波后的特征。为了压缩参数的动态范围以及考虑人耳的听觉效应,通常还会加上对数操作,比如对数功率谱。

基于频谱映射的方法,是让模型通过有监督学习,自己学习有干扰的频谱到无干扰的频谱(干净语音)之间的映射关系;模型可以是DNN、CNN、LSTM甚至GAN。

这一页是使用相同的DNN模型、相同的输入特征、不同的训练目标得到的结果。

左边的STOI指语音的可懂度,得分在0到1之间,越高越好;右边的PESQ是语音的听觉质量、听感,范围为-0.5到4.5,也是越高越好。

基于Mask的方法STOI表现较好,原因是有共振峰的能量得到了较好的保留,而相邻共振峰之间波谷处的声音虽然失真较大,但人耳对这类失真并不敏感;两类方法在PESQ中表现相当。

训练数据的生成

针对语音分离中的语音增强任务,首先可以通过人为加噪的方法生成带噪语音和干净语音对,分别作为输入和输出(有标注数据),对有监督学习模型进行训练。加入的噪声可以是各种收集到的真实世界中的噪声。

不过收集噪声需要成本,而且人工能够收集到的噪音总是有限的,最好能够有一套完备、合理的方案,用仿真的方式生成任意需要的噪声。 在今年的MLSP(信号处理机器学习)会议上,搜狗语音团队就发表了一项关于噪声基的工作,通过构造一个噪声基模型,在不使用任何真实噪音数据的情况下,生成带噪语音对语音增强模型进行训练,达到了与使用50种真实噪音的情况下相当的性能(下图)。

如果将这50种真实噪声和噪声基产生的数据混合在一起,性能可以比单独使用真实噪音的情况得到进一步提高。这也说明噪声基生成的噪声和真实噪声数据之间有着互补性,在实际应用中也可以解开一些真实噪声数据不足带来的限制。

单通道语音分离算法

如开头所说,语音分离任务可以分为三类,语音增强、多说话人分离和解混响。不同任务的处理方法也有所不同。

对于语音增强,基于Mask的方法首先进行耳蜗滤波,然后特征提取、时频单元分类、二值掩蔽、后处理,就可以得到增强后的语音了。

语音增强的另一类基于频谱映射的方法中,先特征提取,用深度神经网络学习带噪语音和干净语音的对数功率谱之间映射关系,再加上波形重建,就可以得到增强后的语音。

基于有监督学习的算法都存在推广性(generalization)的问题,语音增强这里也不例外。针对噪音类型、信噪比和说话人的推广性都还有提升的空间。

对于解混响,同样可以使用基于频谱映射的方法。解混响中也需要生成训练数据,但不同于带噪语音生成时做时域的相加,带混响的语音是在时域上进行卷积;同样都把干净语音作为带标注数据。

在基于频谱映射的方法基础上还可以加以改进。对于不同的混响时间,深度神经网络需要学习的时间窗口长度是不一样的,因而改进方法中加入了告知混响时间的功能,根据帧移R和扩帧数目N提特征后解码,可以获得更好的解混响效果。

多说话人分离分为三种情况

  • 目标说话人和干扰说话人都固定,Speaker dependent,有监督分离

  • 目标说话人固定,训练阶段和测试阶段的干扰说话人可变,Target dependent,半监督分离

  • 目标说话人和干扰说话人都可变,Speaker independent,无监督分离

对于有监督和半监督分离,可以使用基于频谱映射的方法,与前面使用基于频谱映射的方法做语音增强类似。

对于无监督分类,有无监督聚类、深度聚类以及最近的序列不变训练(PIT)方法。PIT方法的核心是红框中标出的部分,在误差回传的时候,分别计算输出序列和标注序列间各种组合的均方误差,然后从这些均方误差中找到最小的那个作为回传误差,也就是根据自动找到的声源间的最佳匹配进行优化,避免出现序列模糊的问题。

讨论两个问题

最后,文仕学给大家留了两个思考题,欢迎大家在评论区给出自己的见解。

  • 第一个问题是语音分离任务中,是按传统思路先变换到频域,然后在频域上进行处理,还是直接在时域上处理比较好?后者的好处是端到端训练,不用考虑频域方法做傅立叶反变换时相位的问题。

  • 第二个问题是对于语音增强任务,应该使用真实噪声加噪还是使用人工仿真生成的噪声进行降噪?

感谢文仕学此次的分享以及对文本的指正,也欢迎大家关注雷锋网 AI 研习社未来的更多分享活动!

雷锋网

「Deep Learning」读书系列分享第四章:数值计算 | 分享总结


雷锋网 AI 科技评论按:「Deep Learning」这本书是机器学习领域的重磅书籍,三位作者分别是机器学习界名人、GAN的提出者、谷歌大脑研究科学家 Ian Goodfellow,神经网络领域创始三位创始人之一的蒙特利尔大学教授 Yoshua Bengio(也是 Ian Goodfellow的老师)、同在蒙特利尔大学的神经网络与数据挖掘教授 Aaron Courville。只看作者阵容就知道这本书肯定能够从深度学习的基础知识和原理一直讲到最新的方法,而且在技术的应用方面也有许多具体介绍。这本书面向的对象也不仅是学习相关专业的高校学生,还能够为研究人员和业界的技术人员提供稳妥的指导意见、提供解决问题的新鲜思路。

面对着这样一本内容精彩的好书,不管你有没有入手开始阅读,雷锋网 AI 研习社都希望借此给大家提供一个共同讨论、共同提高的机会。如果大家有看过之前的分享的话,现在除了王奇文之外,我们还继续邀请到了多位机器学习方面优秀、热心的分享人参与这本书的系列分享。这期邀请到的是陈安宁与大家一起分享他对这本书第四章的读书感受。

分享人:陈安宁,Jakie,名古屋大学计算力学博士。

「Deep learning」读书分享(四) —— 第四章 数值计算

大家好,我叫陈安宁,目前在名古屋大学攻读计算力学博士。今天我要和大家分享的是「Deep Learning」这本书的第四章节,Numerical Calculation,即“数值计算”。

其实大家如果翻过这本书的话,可以看出第四章是整本书所有章节里面篇幅最少的一章。为什么,是因为其实我们大部分人在运用机器学习或者深度学习的时候是不需要考虑这一章的内容的,这章的内容更多是针对算法的数学分析,包括误差的增长以及系统的稳定性。

今天分享的主要轮廓包括以下四个点,

  • 第一,在机器学习、包括了深度学习中数值计算的应用。

  • 第二,数值误差的问题

  • 第三,简单的分析机器学习系统的稳定性问题

  • 最后,针对优化问题给出了两种不同的优化算法,一种是梯度下降法,一种是限制优化算法。

我们首先来看一下机器学习中的数值计算问题。所谓的机器学习或者深度学习,其实最终的目标大部分都是极值优化问题,或者是求解线性方程组的问题。这两个问题无论哪个,我们现在的求解办法基本上都是基于计算机的反复迭代更新来求解。因为目前肯定是没有解析解的,大家都是通过离散数学来求解这两个问题。

既然这个过程有迭代或者大量的重复计算,那么肯定会牵扯到数据的累积。数据累积就极有可能会有误差的产生。误差如果过于大或者过于小,在某些特定的情况下都会对系统产生非常致命的影响。

数值误差的产生原因和避免方法

首先我们来看数值误差。所谓的数值误差是指由于计算机系统本身的一些特性产生的误差,比如说我们知道,无论你使用任何编程语言,它里面都有很多的数据类型,包括单精度、双精度、整形、长整型。那么每一种数据当你定义以后,它在计算机的内存里面都是有对应的数值范围和精度范围的。如果在反复的迭代计算过程中,你产生的数据超过了数据类型定义的范围,计算机会自动的进行取舍。

这时就会产生一个问题,因为取舍就导致了和真实值之间的变化,这个变化就极有可能产生很大的麻烦,如果一个很小的数出现在了分母上,那么计算机在计算过程中就会得到一个非常大的数,如果这个非常大的数超过了你所定义的数据类型的范围,计算机就会出现错误。

我们可以简单看一下PPT中这个函数,它叫softmax函数,softmax函数经常会在概率里面用到。它有很多特性,它的所有元素的softmax之和是等于1的;然后如果所有元素Xi也是相等的话,那么softmax的每一个元素也是相等的,等于所有n个元素合的1/n。

我们考虑一些比较特殊的情况,比如X是一个非常小的一个量,在指数函数中当这个X非常小的时候,这个指数函数也是非常小,无限趋于零的。无限趋于零的话,假如有限个值相加,比如n=10的话,十个数以后这个分母也是一个非常小的值;如果特别小,比如10-10,这个在计算机里面一算的话,softmax就会产生一个很大的数,经过多次累积的话,产生的这个大数极有可能超过你的所定义的数据范围,这个时候你的程序就会报错。所以我们在计算的时候要避免分母上出现一个极小的数的情况。

同理,分子 xi 如果是一个非常大的数字的话,它的指数也是趋向于无穷的,整个的softmax也是一个非常大的数。这也就是说,分子过大或者是分母过小,都是我们应该在计算过程中极力避免的事情。

举一个实际应用的例子,为什么会有这种过小或过大的情况产生。比如说有一条线,我们要计算某一个点到这个线的距离,这个距离d之后会出现在分母上。对于这样一个式子,如果这个点我们取得离线过于近的话,这个距离就非常之小,这在实际应用中是经常出现的。这种情况下softmax这个函数就极容易出现问题。

那么有人会问了,怎么样去避免这个问题呢?当然有很多方法,可以的最简单的办法就是定义一个max函数,里面带有一个常数比如10-4;如果这个距离D很小的话,我们就取这个10-4,限定了d的最小的值就是10-4

当然这是一个朴素简单的想法,在实际应用当中,我们可以使用很多其他的方法,比如可以再取一个指数,那么如果这个值非常小的话,它的整个值就会是趋向于1的,实际上也是一个解决问题的办法。

这两个问题,一个叫做分母趋近于0,或者是分子趋近于无穷大,一个叫underflow,下溢,就是指分母过于小;一个是overflow,是指分子过于大,趋近于无穷。这两个问题都是由于计算机的数据有一个有限的范围而产生的,并不是我们的算法本身系统产生的。这是Numerical error其中的一种,我们可以把它理解为,数据类型的范围限定而导致的对于分子或者分母不能过大或过小而产生的限制。

还有一种极容易出现错误的方式,是我们所构造的系统产生的。比如我们在求解线性方程组Ax=B的时候,如果这个矩阵A的是一个病态矩阵,所谓的病态矩阵,最简单形象的理解就是其中的某些列向量,它们之间的相关性过于大,也就是说列向量非常的接近。

假设这是其中的两个列向量,取了其中一个列向量上的点。这两个列向量过于接近的话,对点进行一个微小的变化,它就有可能跑到了另外一个向量上,就是说它的解发生了发生了很大的变化;按理说这个点是属于向量1的,但仅仅是因为很小的一个扰动,它就跑到了向量2上,它的解就发生了很大的变化。

有一个一般的办法判断矩阵是否病态,就是把矩阵A所有的特征值λ求出来以后,然后把所有λ里的最大的值除以最小值,然后取它的模。我们根据这个值可以判断一个矩阵是否是病态矩阵。

所以很多时候,在进行machine learning或者deep learning之前,我们会对数据进行一个筛选。筛选时候有时候很大的一个目的就是为了把其中的特征叫量过于接近的一些数据排除出去,让我们经过筛选后的矩阵,在它的每一个列向量上有明显的差异,尽量避免过于接近的列向量的产生。

优化算法的意义以及如何选择

下面我们来简单说一下优化算法。绝大部分的机器学习或者说深度学习,都是可以归结为一个求极值的最优化问题。最优化问题,我们想到的简单的办法当然可以有很多,比如说梯度下降,就是仅仅求一个导数就可以判断求极值点的方向。

最优化问题,所谓的最优化去找最小值或者是最大值,涉及到两个问题,一是我怎么找、往哪个方向走;第二个问题是,我知道了这个方案以后我应该怎么走,每一步走多少。这基本上是所有求最值的两个问题,一个是找方向,第二个是找步长。

这是Deep Learning书中关于一些基本函数的定义,包括objective funtion目标函数,或者也可以称为损失函数,或者也可以称为误差函数。这时候我们一般都是要求它的最小值,让误差或者损失尽量的小。

这里我们看一个非常简单的例子,怎么解释刚才说的两个问题,一个是找方向,一个是找步长。这是一个目标函数,一个非常简单的二次函数。我们看红色箭头指的这一点,先看刚才说的取方向、怎么走的问题。这里有无数种方法,每一条直线都可以代表它可以前进的一个方向。但是我们要从中找到一个,因为这个最低点是我们的目标点,我们要找到从这个点出发到目标点的最快的路径、一个方向。

这里面这条红线是书中原有的,我做了两条蓝色的线。我们从这三条线中可以比较出来,红线是这三条线里面朝目标点下降最快的一条线,因为红色线在这个点和目标函数的角度是最小的,所以它是过这个点的下降最快的一条线。

然后我们看第二个问题,就是知道了方向以后怎么去走。对于每一个步长,我们在这里面引入一个ε的权值,为了保持系统的稳定性,一般会取一个比较小的值,比如说0.001或者是10-4这样的一个小值,让这个点缓慢地沿着这个红色的这个方向,一小步一小步地,朝着目标函数前进。

但是这里面会有一些问题,比如说我们会遇到一些特殊的点。刚才的比较简单的二次函数是没有问题的,但是看一下后面一些复杂的函数。

这里是一些特殊的点,critical points,我们可以把它称为临界点。

所谓的临界点是指,它的一次导数为零,也就是说这个点往左或者往右都会都会变大或变小,这个点本身就是这个小的局部系统里面的一个极值点。如果你往两边走都是变大,那么它就是一个极小值点;如果你往两边走都是变小,那么它就是一个极大值点;如果一边减小、一边变大,这种情况是我们在计算里面最不想看到的情况,叫做驻点,虽然它的导数也是零,但是这个点并不是我们所期待的那个objective point,不是我们想要找的目标点。

我们看一个复杂一点的。像这个函数曲线,图中有三个点都满足我们刚才说的一阶导数为零,但是右侧这两个点就不是我们想要的,最左侧点的值更小。这个时候就有两个问题,就是局部极值和全局最值的问题。这三个点都可以称为局部的极值点,只要满足一阶导数为零,但是怎么判断你所求的局部极值点是否是全局的最值点?有一个简单的办法是把整个系统所有的极值点都找到,然后比从里面比较出最小值;但是在实际应用中是不会这么做的,一是浪费太多的计算资源,二是因为起点的不同,找这个局部极值点也会有很多的问题。

所以如果要是把每一个极值点都找的话,会非常的繁琐,会浪费大量的资源。那么,我们设计的系统怎么样保证找到的这个点是一个最优点、或者说是全局的最值点呢?

之前介绍的都是只有单个变量的系统,现在看一下有多个变量的系统。在单变量系统里面,我们只需要求一个输入的导数;但是在多变量的系统里面,有很多的输入,就有一个偏导数的概念,假定其它的变量固定、系统对其中的某一个变量求导的话,就称之为关于这个变量的偏导数。

把所有的变量的偏导数求出来,并用向量的形式表示出来,可以表示成这个形式。刚才我们分析过了,如果要找到局部极值点的话,我们最快的方向是求导数、沿着梯度的方向;那么多变量系统里面也一样,就是说我们要求一个系统的最小值的话,还是通过求导,但这次是多变量的系统,所以我们的求导要改成偏导数向量的方向来去寻找新的最值。

这种梯度下降算法在实现的时候会有一些不同,比如根据每次下降所采用的系统点数的不同,可以大致分为两大类,一种叫做Batch Gradient Desecent,就是批梯度下降。所谓的“批”就是批量,比如说我们现在有一个系统h(x)等于θi*xi的合集(右上角),这是一个非常简单的线性系统。按照我们之前所说的,首先要求出这个系统的目标函数,我们这里用了一个最小二乘法的目标函数,然后求这个目标函数的最小值问题。

首先我们要求它的偏导数,∂J(θ)/∂θj,它表示一个方向,然后沿着这个方向更新那个变量。在变量更新的时候,批梯度下降是指每一次的变量更新,都会用到所有的xj;然后从i=1到m,会用到所有的单独变量的偏导数。比如假设这个系统里面的每一个样本有五个特征的话,那么在更新任意一个权值的时候都要把这五个特征遍历一遍。

这样的话,如果是一个非常小的系统,比如说样本数量不是很多、每一个样本所包含的特征也不是很多的话,这个是完全可以的,因为它求解的是一个全局的最优,考虑了考虑到了每一个变量方向的梯度问题,所以求的是全局的最优下降的方向。但是所求的系统往往有大量的样本,同时每一个样本还包含了不少的特征,简单分析一下这个系统的计算量的话,假设它的样本数量是n,然后每一个的特征是m,那么其中一个样本的计算量是m×m;有n个样本的话,总的计算量是m×m×n。如果样本1万、2万、10万超级大的话,每一次迭代的计算量是非常大的。

这个时候大家就想到另外一种办法,我能不能在每一次更新权值的时候,不用到所有的特征,只用其中的所求变量的特征,这就是我们所谓的随机梯度下降Stochastic Gradient Descent。随机梯度就是说,每一次针对权值的更新,只随机取其中的一个i,就是随机取其中的一个特征来计算。这样它的计算量立马就下降了,同样是n个样本就变成了m×n。因为原来的公式里面有一个求和符号,需要求m个特征的值;这里面每次只求一个特征的。所以这个计算量就少了非常多。

这又引发了一个问题,通过刚才分析,我们知道BGD是全局自由梯度下降,SGD是随机梯度现象,随机梯度中只找了其中一个变量所在的方向进行搜索,向目标点前进,那么这种方法是否能保证最后到达目标呢?理论上是有证明的,是可以的,只是这个会收敛的非常慢。

这两个方法就有点矛盾,一个是计算量大,但是全局最优,收敛比较快;一个是计算量小,但是收敛比较慢,只能找到最优目标值的附近。所以又产生了一种调和的算法,叫做小批量梯度下降,Mini-Batch Gradient Descent。其实很简单,既不像批量用到所有的特征去更新权值,也不像随机梯度下降只用其中一个,我选取一部分,假设每个样本有100个特征,我只取其中的10个特征用于每一次的权值更新。那么首先它的计算量是下降的,其次它也并不是仅仅按照其中某一个、而是它是按照了10个特征向量所在的方向进行搜索,既保证了搜索速度,又保证了计算量,这是目前在梯度下降中用的比较多的一个方法,算是一个BGD和SGD两种方法的折中方法。

它们三者的优缺点分别就是,批量是计算量大,随机是计算量小,但是搜索精度有一定的问题;Mini-batch就是权衡了两者。

刚才所有的分析都是基于一阶导数,这也是在简单的线性系统优化中常用的。其实二阶导数对于系统的分析也是非常有用的。

看一下这几个简单的例子。我们知道一阶导数的意义表示的是f(x)的变化,二阶导数的意义就是一阶导数的变化情况。比如说第一幅图,它的一阶导数从正(上升)到0(水平)再到负的(下降),不停地减小,就可以知道它的二阶导数是小于0的。第二幅图一条直线的话,它的斜率也就是一阶导数是永远不变,那么它的二阶导数就永远是0;同理第三个图指的是二阶导数大于零的情况。

二阶导数的意义就是我们可以分析这个系统。下面先介绍一个雅克比矩阵(Jacobian Matrix),我们的系统是一个多输入、多输出的系统,它变量的范围是Rm 域的范围,输出是Rn 域的范围,那么f(x) 的雅克比矩阵就是,针对所有的输入啊求导,比如第一行是那个f1对所有的输入变量求导,第二行就是f2f的第二个变量,对所有的变量求导;同理,最后一行就是fm对所有的变量求导。这就是雅克比矩阵的定义。

雅克比矩阵是一阶的求导矩阵,还有二阶求导矩阵黑塞矩阵(Hessian Matrix)。

黑塞矩阵的定义其实也很简单,每一个f(x) 同时对两个方向的变量求二次导数。当然你也可以把它看成雅克比矩阵的变形,黑塞矩阵里的每一项相当于雅克比矩阵里面的每一项再求导,因为二阶导数可以看成一次求导再求导。这是黑塞矩阵的定义。

黑塞矩阵有一个特点,对于一个系统,如果它的偏导数不分方向的,就是说先对xi求导、或者先对xj求导,求导的先后顺序不影响二次导数值的话,那么黑塞矩阵就明显是一个对称矩阵,因为xi、xj可以互相交换。就是说对先对x2求导或者先对x1求导是没有关系的,那么∂x1*∂x2和∂x2*∂x1是相等的。

那么二阶矩阵有什么影响,它对先前的一阶矩阵梯度下降的不足有什么样的改进呢?简单分析一下,一个f(x) 可以做这样的泰勒展开,其中包含特定点的值,这个表示的是一阶导数,也就是梯度,然后H是一个二阶的梯度矩阵。

当我们更新x值的时候,比如说现在是x0,然后下一步更新到x0-εg的时候(这是刚才梯度下降的定义嘛),带入这个泰勒展开会得到图中下方的公式。

列出这个公式的主要目的是为了考察梯度下降的步长系数应该怎么取值比较好。刚才讲过了,刚开始我们可以随便给一个比较小的值,0.01、0.004或者更小的值。但是实际的情况下,我们不想随机给一个,而是通过数学的分析得到一个比较好的值,从而定义这个步长系数,可以走得既快又准确。

带入得到这个公式之后(当然这时候我们可以把约等号当作等号),我们可以把它当做一个关于ε的函数,其它的变量可以都当作常数。如果要得ε的一个比较优化的值的话,我们可以看作f(ε) 等于这个式子,然后对它关于ε求导,最后在所有可能的系数里面得到一个比较好的系数。有了这个系数就可以保证我们的步长取得又大又稳。

下面我介绍两个方法,一个是仅仅用了一阶导数的、我们前面提到的gradient descent;另一个是牛顿方法,这是用到二阶导数的方法。梯度下降仅仅用到了一阶导数,所以我们把它称为一阶优化算法;牛顿方法用到了二阶,我们就把牛顿方法称为二阶优化算法。

我们看一下牛顿迭代方法,这是刚才提到的泰勒展开,然后现在想要找到这个系统的极值点,当然,仅仅求导就行了。根据一阶导数为0,它的临界点就是图中下方这个公式。这样我们更新就按照这个公式。

这个公式有什么意义呢?就是一次直接找到了这个critical point,过程中用到的是黑塞矩阵。因为在这里面用到了黑塞矩阵,所以我们把牛顿方法称为一个二阶方法。

这之前,我们遇到的所有求极值的问题都是就是无约束的,就是freestyle,x没有任何的约束。仅仅是求目标函数的最小值问题。但是实际情况里有大量的约束问题,这就牵扯到了另外的约束优化的问题。

这是维基百科上关于约束优化的定义。

首先f(x) 是目标函数,如果没有下面这一堆subject to的话,它就是我们之前讲到的最优化问题,你可以用梯度下降,也可以用牛顿法来求解。但是这个时候它有了很多的约束,比如x必须满足某一个函数,xi代进去要等于一个特定的值ci。这是一个等式,所以又把它称作等式约束;相反就是不等式约束问题。

遇到这样问题应该怎么做?很容易想到能不能把这两个约束的条件整合到目标函数里面,然后对这个整合的系统再求优化问题。其实我们做工程很多时候都是这样的,之前先有一个基本的、best的处理方法,再遇到一个问题以后,就想办法把新产生的问题去往已知的基本问题上靠拢。

这里介绍一个KKT的约束优化算法。KKT优化算法其实很简单,它就是构造了一个广义的拉格朗日函数,然后我们针对这个广义的拉格朗日函数,或者是这个系统来求它的极值。

我们可以从图片上来看这个约束问题。比如我们选了一个初始点,如果没有阴影部分的面积,那就从初始点随便怎么走去找这个最优的x。走的方法就是它的梯度方向。但是现在有约束问题的话,x的取值必须要在阴影范围之内走动,这是一个比较形象的约束问题的表征。

前面提到我们要构造拉格朗日函数。要构造拉格朗日函数也简单,我们现在有一个等式约束,还有一个不等式约束,只要在等式约束和不能约束之前加入一个系数,当然我们是把这些系数看作变量的。把这些系数加入到原来的函数之上,构成了一个新的函数系统,我们就可以把它叫做广义拉格朗日函数。

之前我们是仅仅是求f(x) 的最小值,现在加入了这两个,我们可以根据它的特征分析一下。

首先,h(x) 小于等于0的话,针对它的系数α,我们就要求它的最大值;然后看 λ,因为 λ 是一个常数,求最大或者最小是一样的;最后又归结到f(x),还是求它的最小值。当然,我们也可以两个累加前面都变成负号,那么同理下面可以变成要求它的最小值。

其实也可以很好理解,就是说原来是一个f(x),现在加入了一个东西,这个东西满足的条件是对于任意的x,h(x)都必须是小于等于0的。那么如果我的最大值都小于等于0的话,那肯定所有值都小于等于0了。所以我这边要求一个最小值。

当然我假设加入的这部分是正的,这边所有的α都是大于零的,那么L(x,λ,α) αjhj(x) 就始终是小于等于0的;小于等于0的话,我只要让它的最大值满足的小于等于0,那么它所有的其他值肯定也是满足这个条件的。这就是如何构建一个拉格朗日函数的方法。

有了这个构建的函数以后,它的极值问题就可以用梯度下降的方法来求解。

我们举一个简单的例子,最简单的,线性最小二乘法,这个是在求误差的时候最常用的损失函数或者目标函数了。那么我们可以用到前面讲到的梯度下降法,求它的导数,然后x更新的话就是用一个小的补偿系数乘以Δx,就是它的梯度。当然你也可以用牛顿方法,用求它的二阶导数来更新。

现在我们把这个系统稍微改一下,把它变成一个受限的系统。比如我们要求向量x满足这个条件,这样它就变成了一个带有限制的优化问题。这个时候我们可以构造拉格朗日函数,原函数不变,加上它的限制条件,前面加上一个λ变量,然后就可以写出它的目标函数。

首先f(x) 是不变的,然后因为xTx小于等于1,所以这边要求最大的(当然如果xTx大于等于1,你这边要求最小的)。然后怎么更新这个系统呢,x可以这样来表示

基本上就是求逆的操作。λ满足的一个梯度条件是,把它看作单变量,对它求导,它的导数需要满足

这样Deep Learning书的第四章书基本上就讲完了。

总结

最后简单总结一下,这一章主要讲的问题。

第一,我们在做数值计算,包括深度学习或者机器学习的时候,我们要注意里面的变量,尤其是在分母上的变量,不要出于出现过小的值,比如距离,分母不要过桥,分子不要过大。现在是有软件是可以帮助我们检测的,但是因为我们平时用到的算法基本上是成熟的,或者是用了很多Library/库,其中已经对一些异常状况做过提前预防,所以我们的计算中是不存在这个问题的。一般是针对我们要自己动手设计出新的计算方法时才会考虑这个问题;平时的计算过程中一般不需要考虑系统的稳定性问题的。你如果设计一个新的系统,你就要分析一下这个系统的稳定性。

然后就是梯度下降的意义,就是我们找了一个什么样的方向去接近目标函数,有了方案以后我们应该怎么走,每一步应该走多少;有时候你走的过大的话,也会导致系统的发散。

其实在这本书的最后作者也说了,目前Deep Learning系统缺少严格的理论保障。为什么我们做机器学习的时候经常说调参数、调参数,就是因为很多东西可以说是试出来的,并没有严格的数学证明说某一个值应该怎么取。这一章节在最后也说了一个目前使用的深度学习算法的缺点,就是因为它的系统目前过于复杂,比如一层接一层的函数的叠加或者是相乘,它的系统分析就会很复杂,很难有一个明确的理论去分析这个系统的各种特征。如果仅仅是一个简单的f(x)=x2,这种系统无论怎么做都行,它已经被分析的太彻底了,无论怎么算都会有一个精确的算法在那里。所以前面讲的误差也仅仅是在一个常见的容易出错的地方给了一个比较好的指导,但实际的计算过程中还会遇到各种各样的问题。这个时候一是要靠经验,二是也希望会有越来越多的数学理论来支持深度学习的系统分析。

还有就是,我们在做计算的时候都知道有一个天然的矛盾,就是计算量和精度的问题。计算量大就会让精度提高,但是有时候过大的计算量又是我们承受不了的,所以这也是一个矛盾。现在的很多算法其实也就是在中和这个矛盾,既要降低计算量,要保持我们能够接受的精度。所以现在有很多前处理的方式,针对大量的数据要怎么样处理,让设计的系统最后既能够满足我们的要求,又尽量的减少计算量,同时也尽量避免一些不必要的误差。其实这是就是一个洗数据的过程,把数据洗得干净一点,把噪音和没有用的数据都淘汰掉的过程。

今天就和大家分享到这里,如果有什么问题的话,欢迎大家在群里面讨论。

机器学习的数学数学理论其实比较匮乏,所以有很多值得讨论的问题,包括其实有我刚才有好几个点想讲没有讲的,因为时间有限,比如说二阶的优化问题,怎么样去用二阶的优化问题去保证一阶优化找到那个全局的最小点,而不是局部的最小点。其实这个在多目标、多变量的系统里面,目前还没有特别好的方法,当然在单系统里面就不存在这个问题,有很多方法去解决。今天就先到这里,谢谢大家。

(完)

雷锋网 AI 科技评论整理,感谢陈安宁此次分享,后续更多章节的分享请大家继续关注我们!

雷锋网

一文详解YOLO 2与YOLO 9000目标检测系统 | 分享总结

雷锋网 AI 科技评论按:YOLO是Joseph Redmon和Ali Farhadi等人于2015年提出的第一个基于单个神经网络的目标检测系统。在今年CVPR上,Joseph Redmon和Ali Farhadi发表的YOLO 2进一步提高了检测的精度和速度。这次讲座的主讲人为王东,前硅谷资深工程师。

讲解顺序和论文结构类似,先讲YOLO 2的网络结构,重点分析如何产生目标边框和分类,以及相关的损失函数。训练YOLO 2的第一步是在ImageNet上预先学习darknet-19,在224×224图像上,它仅需5.58个G-ops。此外,YOLO 2在VOC2007,VOC2012和COCO检测数据集上有很好的表现。

在YOLO 2的基础上,论文中进一步提出了YOLO 9000,可以产生9418个类别的目标检测。首先是需要建立一个基于wordNet结构的wordTree。这个树包含imagenet上最流行的9000个分类,还有COCO的80个大类。YOLO 9000的最后一层采用层次分类的方法,来计算400多个条件概率,用它来产生目标的最终分类。

                                           

目标检测

首先是目标检测,目标检测和图像分类的不同是图像分类只需要识别出图中的物体,而目标检测需要在图片中精确找到物体所在位置,并标注出物体的类别。物体的位置一般用边框(bounding box)标记,一个图像中可能有好几个边框,目标检测需要给出边框里物体的类别和概率。

关于YOLO2

YOLO2结构

YOLO 2采用神经网络结构,有32层。结构比较常规,包含一些卷积和最大池化,其中有一些1*1卷积,采用GoogLeNet一些微观的结构。其中要留意的是,第25层和28层有一个route。例如第28层的route是27和24,即把27层和24层合并到一起输出到下一层,route层的作用是进行层的合并。30层输出的大小是13*13,是指把图片通过卷积或池化,最后缩小到一个13*13大小的格。每一个格的output数量是125(5*25),5是指对每一个13*13的小格配有5个边框,25则是指每一个边框输出了25个浮点数。25个是YOLO 2对VOC的结构。VOC一共有20个class,在25个数中,有20个是class的probability,剩下的5个中,有四个表示stx、sty、tw、th,这4个来识别边框的位置和大小,还有一个数是confidence,表示边框预测里有真正的对象的概率。所以一共是13*13*125个数。

 

YOLO2 Forward 计算边框

现在讲一下怎样把stx、sty、tw、th变成输出边框。如右图所示,里面的σ(tx)可以理解为stx,σ(ty)可以理解为sty。每一个输出的bbox是针对于一个特定的anchor,anchor其实是参考bbox的width及height。对于VOC来讲,产生了5个固定的参考。

如图,给出了stx、sty、tw、th之后,通过简单的公式,就可以计算出最后输出的边框的位置和大小。具体是否要输出当前的边框,它的概率,还有生成的物体的类别,这个取决于后面的probability和confidence。Confidence表示有没有物体,假设有物体之后,probability表示物体的概率。

YOLO forward分类

通过将confidence和最大可能输出的类的probability相乘之后,要是得出的结果大于门限0.24,就会输出当前计算出的bbox的大小和位置,同时会输出是哪一个类,probability大小是多少。一共会生成13*13*5个bbox,然后根据probability,通过filter,产生出最后预测的物体和其边框。

YOLO2例子

举一个例子,就是最前面那个有狗,有轿车,有自行车的图像,比较图中最后的三行就可以看出来,里面有轿车,狗和自行车,也能看到probability和bbox分别是什么,它们分别表示概率、大小和位置。具体来讲,从第一行,可以看出轿车的class_id为6,通过row和col可以看出大概的位置,还给出了anchor_id。第二行可以看到轿车的confidence和stx。

YOLO2 损失函数

前面讲的是forward的过程,即给了一个图像和神经网络,怎么得到识别的物体概率和位置。那么具体的训练过程是如何的呢,怎么去进行训练?论文了中给了一个损失函数。要是给予一个合适的损失函数,给一定的数据去训练,那么神经网络就会得到好的表现。

进行训练的一共有四类loss,他们weight不同,分别是object、noobject、class、coord。总体loss是四个部分的平方和。具体的计算步骤以及如何选择过程如PPT所示。

Darknet-19计算量

上面讲述了训练函数和训练对象,大家都需要先选择预训练函数。另外,对于YOLO 2来说,主要是想提高精度和速度,重点是base network要好。YOLO 2采用的是Darknet-19预训练模型。右图是在ImageNet上使用的一些模型,分别给出了他们的计算量和精度。在224×224的图片上,图中VGG16需要30.69个G-ops,基于GoogLeNet的YOLO需要8.52个 G-ops。而Darknet-19更小,G-opsS是5.58。

VOC 2007 准确度和速度

论文中列出了一些YOLO 2在标准目标检测集上的表现,由于YOLO 2网络只包含卷积层和池化层,因此可以接受任意尺寸的图像输入。从图中可以看到R-CNN和SSD的精度也是比较高的,但SSD是基于VCC-16来预训练,fps比较慢。YOLO 2的精度相对YOLO提高了很多,速度也有相应提升。对于YOLO 2,不同的图像大小也会产生不同的mAP。

在VOC 2012和COCO上的准确度

接下俩是在VOC 2012和COCO上的准确度,COCO是比VOC难的用于目标检测的benchmark,COCO里有80个类, VOC里有20个。从图中可以看出SSD的精度比YOLO 2要高,可能的原因是COCO里有比较小的物体。从图中也可以看出YOLO 2的速度依然很快。

YOLO与YOLO2的比较

从图中可以看到采用不同的步骤之后,YOLO 2相较YOLO的提升。可以看到mAP明显提高。

与Faster-rcnn的比较

以前基于rcnn的过程不是一次计算出来的,首先要前向计算出proposal,然后再去go through下面的层,一个一个proposal去分类,所以基于rcnn的网络会比较慢。

SSD

SSD是当前最精确的一种目标检测算法,是基于单个神经网络。如图,前面几层是VGG网络,它主要是加入卷积特征层,得到不同尺度的特征层,从而实现多尺度目标检测。对于每个添加的特征层,使用一组卷积滤波器,可以得到一组固定数目的目标检测的预测 。

SSD 方法获取目标位置和类别的机理跟YOLO方法一样,都是使用回归,但是YOLO对小目标检测效果不好,而SSD则在不同的feature map上分割成grid然后去做回归,效果会好一点。

前面讲的就是YOLO2的部分,在一些小的物体的检测上不如ssd,但在精度、准确度上都和ssd很接近,最大的优点是非常快。 

YOLO 9000

YOLO 9000是论文的第二部分,它的主要优点是可以检测9418个类。这个数目非常惊人,因为检测数据不容易得到,人工标记比较困难。

图中是论文里的几个检测的例子。

YOLO 9000的基本触发是用少量的有检测标注的数据和大量的图像分类数据合并到一块,来互相帮助,产生出可以生成很多类的预测。

具体实践过程 

首先建立标签树(WordTree),这个树很大,如图红色的部分是ImageNet里面最流行的九千个类别,检测数据是来自COCO里面的80个类。这个标签树是基于WordNet构建的,总共9418个类,1846个内部节点。可以在每个tree的节点做一个softmax,节点概率是从原点的路径上的条件概率的乘积,最后输出的标签是节点概率高于阈值(0.5)的最深节点。

使用WordTree整合了数据集之后就可以在数据集(分类-检测数据)上利用层次分类的办法训练模型,使该系统可以识别超过9000种物品。训练时检测数据wordTree上的路径都有class loss,而imagenet数据只有class loss 和noobj loss。

YOLO 9000结构

如图所示,与之前相比,它的结构简化到24层,第23层是17*17*28269,17*17和以前YOLO 2的13*13类似,只是把prediction网格变成了17*17。然后每个位置有28269(3*(4+1+9418)),3是指每一个位置给了三个bounding box,每个bounding box包含有stx,sty,tw,th,confidence和9418个类。给了这些数之后就可以通过WordTree产生所需要的bbox等。

YOLO 9000的结果

如图是YOLO 9000在ilsvrc 2014上的表现。Ilsvrc 2014一共有200个category,ssd300在这个数据集上训练完以后可以得到43.4mAP,YOLO 9000只能得到19.7mAP。区别是YOLO 9000在训练过程中根本没有利用ImageNet上的ilsvrc训练数据,只利用了COCO和ImageNet数据,能得到19.7也是非常不错的结果。图右可以看出在不同类别的图像检测上的表现,可以看到在检测动物时表现最好,因为COCO上有一些动物的类。

总结:

YOLO 2相比YOLO,提高了速度和准确率,基于darknet-19模型,除去完全连接层,用了边框聚类,两层组合,采用图像多分辨率的训练。

YOLO 9000可以利用无边框的数据和有边框的数据一起来实现9418类的监测。采用wordTree层次分类的办法。

下面为大家提供一些github上的开源代码,有训练好的YOLO 2和YOLO 9000模型。

https://pjreddie.com/darknet/

https://github.com/philipperemy/yolo-9000

雷锋网 AI 科技评论编辑整理。雷锋网

雷锋网

多任务深度学习框架在ADAS中的应用 | 分享总结

雷锋网AI科技评论按:在8月10日雷锋网AI研习社邀请了北京交通大学电子信息工程学院袁雪副教授给我们讲解了在高级辅助驾驶系统(ADAS)中的多任务深度学习框架的应用

内容提纲:

ADAS系统包括车辆检测、行人检测、交通标志识别、车道线检测等多种任务,同时,由于无人驾驶等应用场景的要求,车载视觉系统还应具备相应速度快、精度高、任务多等要求。对于传统的图像检测与识别框架而言,短时间内同时完成多类的图像分析任务是难以实现的。

袁雪副教授的项目组提出使用一个深度神经网络模型实现交通场景中多任务处理的方法。其中交通场景的分析主要包括以下三个方面:大目标检测(车辆、行人和非机动车),小目标分类(交通标志和红绿灯)以及可行驶区域(道路和车道线)的分割。

这三类任务可以通过一个深度神经网络的前向传播完成,这不仅可以提高系统的检测速度,减少计算参数,而且可以通过增加主干网络的层数的方式提高检测和分割精度。

以下为当天分享的内容总结。


图文分享总结


一、任务分析

WHO在2009年统计的一个数据显示,在全世界范围内每年由交通事故死亡的人数有123万人。但是我们知道,在朝鲜战争中,整个战争死亡的人数也差不多一百多万。也就是说,每年死于交通事故的人数差不多等于一次非常惨烈的战争的死亡人数了。根据WHO统计,在全世界范围内每年由交通事故造成的死亡人数有123万之多;而发生交通事故90%是由司机人为原因造成的,比如注意力不集中、超速、安全意识弱等等。所以目前减少交通事故的最主要途径通过采用高级辅助驾驶系统(ADAS)就是减少认为错误。


对于ADAS系统,基本上包括这些功能:夜视辅助、车道保持、司机提醒、防撞提醒、车道变换辅助、停车辅助、碰撞疏解、死角障碍物检测、交通标志识别、车道线偏移提醒、司机状态监测、远光灯辅助等。这些功能是ADAS所必备的。

为了实现这些功能,一般其传感器需要包括视觉传感器、超声波传感器、GPS&Map传感器、Lidar传感器、Radar传感器,还有一些别的通信设备。但是我们在市面上看到的大多数传感器其功能其实是比较少的,例如mobile I,它只有车道保持、交通标志识别、前车监测和距离监测的功能,但并不全面。从厂家或者用户的角度来说,自然我们希望能用最便宜的传感器来完成更多ADAS的功能。最便宜的传感器基本上就是视觉传感器。所以我们设计方案时就想,能不能通过算法将视觉传感器实现更多ADAS系统的功能呢?这就是我们整个研发的初衷。

此外,我们还需要考虑ADAS的一些特点。ADAS系统(包括无人驾驶)是在一个嵌入式平台下进行的,也就是说它的计算资源很少。那么我们也必须考虑如何在这样一个计算资源非常少的基础上,保证ADAS系统能够快速且高精度地响应,同时还能保证多任务的需求。这是我们第二个要考虑的问题。


为了解决以上两个问题,我们首先把ADAS的任务分解一下。如图所示,我们将ADAS的任务分解成目标检测与识别、图像分割、摄像机成像目标跟踪、图像分割。我们过去一年多的研发工作其实就是,用一个深度学习框架来同时实现上述这四个的功能。

对于一个前向传播的网络,其计算量和计算时间主要取决于它的参数数量,而80%的参数都来自全链接层,所以我们的第一个想法就是去掉全链接层。其次,网络越深,它的参数就会越多所以如果我们把目标检测与识别、图像分割、摄像机成像目标跟踪、图像分割做成四个网络的话,就会有X4倍的参数。

所以针对这两个考量,我们用一个主干的网络来做前面的运算,然后在后面再根据具体的任务分成多个小的分支加到主干网络上。这样多个图像处理的任务就可以通过一个主干网络的前向传播来完成了,其参数大大减少,计算速度也变的更快。同时我们也能实现多个任务同时进行的需求。另外,在最后我们还可以将多个结果进行融合,驾到训练过程的调整中,这样就可以提高我们结果的可信性。

但是在这个过程中我们也碰到一些难点。第一个难点就是我们在同一个网络中需要将较大的目标(例如车辆)和较小的目标(例如交通标志)同时检测出来。第二个难点是,测速测距时我们需要的目标的位置是非常精确的,目前这个问题我们还没有解决。

二、模型结构

这个是我们设计的网络的一个基本结构。它分为几个部分:主干网络(我们称为解码器)、多个分支(我们称为编码器)和基于CRF的结果融合。现在这个网络我们只设计了两个编码器,一个是检测任务编码器,还有一个是分割任务编码器,以后我们还可以增加其他的编码器。结果融合,主要是想用它来影响主干网络的一些权重选择。主干网络,我们选择了一些比较有人气的算法,例如VGG 16、GoogleNet、ResNet等。分割任务编码器我们用了FCN编码器,检测任务编码器我们用了YOLO9000编码器。

1、主干网络

下面我们来详细看一下这个网络各个部分。首先我们来看主干网络。主干网络我们使用了VGG、GoogleNet或者ResNet。这几个是可选择的。从右侧的这张图(纵轴是网络深度,圈的大小表示模型的大小)我们可以看到ResNet在深度和大小上都比较好,我们选择使用ResNet可以有比较好的实时性。

2、FCN语义分割解码器

然后我们看一下FCN语义分割解码器。在神经网络中,一张图片经过主干网络后,再对其提取高维特征图。其实这个过程就是用pooling的方法给它降维。结果到了输出高维特征图时,它只有原图像的1/32大小了。随后我们采用上采样把它升维成原图像大小。上采样的过程就如左侧所示,这个示例中我们将2*2的图像上采样成4*4的图像。

上采样的结果就是解码器预测出来的,我们将它与标注好的图像进行比较运算,算出loss,然后对权重进行修改。在上采样中一个问题就是,比较小的物体是计算不出来的。我们知道一些较浅的卷积层感知阈比较小,它会包含更多比较局部的信息;而较深的卷积层具有较大的感知阈,它能够学习到更加抽象的信息。于是FCN就通过将pool3、pool4和pool5的信息叠加在一起进行上采样,这样就可以做到同时上采样多个尺度的信息了。

3、目标检测/识别解码器 YOLO

其次我们再来介绍一下用于目标检测/识别的解码器YOLO。我们使用的是YOLO V2的解码器,但这里我们先介绍一下YOLO V1。这是YOLO V1的主框架,它的主干网络是Darknet19,我们不用管它。我们重点关注编码器的过程。主干网络输出的特征图,这种特征图会用1*1 的卷积核给正规化成7*7*30的特征图。那么这个30是什么呢?

在这样一个7*7的矩形框中,每一个方形框用一个点来表示。然后我们分别用5维表示包含这个方形框的一个矩形框,其中4维表示x、y、z、w,另外一维为confidence。

在YOLO V1中30维的前10个为两个这样的矩形框。它们的(x,y,z,w)分别表示了坐标预测,而另外一维为confidence预测。另外的20维为类别预测(也就是说在模型中有20种可能出现的例如汽车、行人之类的模型 )。

YOLO V2与V1最大的不同就是采用了Anchor boxes。所谓Anchor boxes就是每个中心预测(例如9种)不同大小和比例的建议框,每一个建议框对应一个4维的坐标预测、1维confidence预测和20维的类别预测。它提出一个非常有意思的思想就是维度聚类,也即现在训练集里通过聚类的方式算出Anchor boxes的大小。这样,例如它从9个boxes选出5个boxes。于是对于VOC数据集,总共就5*(4+1+20)=125个输出维度。

YOLO V2 Anchor boxes的选择以及维度聚类的思想对于我们车载摄像的问题是更有效的,因为我们摄像机的位置是相对固定的,所以我们可以算出每一个目标的大小都是相对比较固定的。

我们在YOLO V2的基础上也做了一些改动。首先是我们做了一些细粒度特征,来检测小目标。其次我们还在浅层特征中进一步地做坐标预测,然后加到我们的整个预测当中,这样可以提高小目标的预测。

4、一些思考

在这个研究的过程中,我们做了一些思考。

首先,在计算机视觉领域里,低中层视觉问题更关注原始视觉信号,与语义信息的联系相对松散,同时也是许多高层视觉问题的预处理步骤。本届CVPR有关低中层视觉问题的论文有很多,涵盖去模糊、超分辨率、物体分割、色彩恒定性(color constancy)。

其次,在最后的层中抽象的特征对分类很有帮助,可以很好地判断出一幅图像中包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好地给出物体的具体轮廓,指出每个像素具体属于哪个物体。

我们该如何将浅层特征和深层特征结合起来呢?这其实还需要进一步的研究。

 三、数据库建立

在数据库这方面,我们发现国内的路况与国外路况很不一样,且中国的车的种类也多种多样。所以我们开发了一种半自动标注软件,也就是我们可以通过算法自动完成车辆标注,同时我们还可以手动修正误差较大的标注。目前我们已经标注了5万张矩形标注数据集。我们力争在年底能够开放数据集,另一方面我们也能协助企业建立数据库。

另外在数据库建立方面,我们还要拓展一下数据库类型。例如通过原来白天的图片,我们可以生成黑夜的图片,增加到我们的训练样本中去。

四、结果显示

雷锋网注:此处结果显示仅为展示部分视频的截图,视频详细内容请关注  AI 研习社:第9期·分享回顾|袁雪:多任务深度学习框架ADAS中的应用


雷锋网

CVPR 2017精彩论文解读:综合使用多形态核磁共振数据的3D生物医学图像分割方法 | 分享总结

雷锋网 AI 科技评论按:计算机视觉盛会 CVPR 2017已经结束了,雷锋网 AI 科技评论带来的多篇大会现场演讲及收录论文的报道相信也让读者们对今年的 CVPR 有了一些直观的感受。

论文的故事还在继续

相对于 CVPR 2017收录的共783篇论文,即便雷锋网(公众号:雷锋网) AI 科技评论近期挑选报道的获奖论文、业界大公司论文等等是具有一定特色和代表性的,也仍然只是沧海一粟,其余的收录论文中仍有很大的价值等待我们去挖掘,生物医学图像、3D视觉、运动追踪、场景理解、视频分析等方面都有许多新颖的研究成果。

所以我们继续邀请了宜远智能的刘凯博士对生物医学图像方面的多篇论文进行解读,延续之前最佳论文直播讲解活动,此次是第2篇。

刘凯博士是宜远智能的总裁兼联合创始人,有着香港浸会大学的博士学位,曾任联想(香港)主管研究员、腾讯高级工程师。半个月前宜远智能的团队刚刚在阿里举办的天池 AI 医疗大赛上从全球2887支参赛队伍中脱颖而出取得了第二名的优异成绩。

在 8 月 1 日的直播分享中,刘凯博士为大家解读了「Joint Sequence Learning and Cross-Modality Convolution for 3D Biomedical Segmentation」(用于三维生物医学分割的合并序列学习和多形态卷积)这篇论文,它主要解决了一个三维生物医学图像分割中重要问题:如何综合使用多种形态的 MRI 数据进行区域分割。以下为当天分享的内容总结。

图文分享总结

刘凯博士:大家好,我是深圳市宜远智能科技有限公司的刘凯,我们的官网是 yiyuan.ai。这里也有我的微博ID,我经常会发一些跟人工智能相关的资料和文章,大家可以关注一下。今天讲的也是关于生物医学图像的应用,是结合序列学习和交叉模态卷积的3D生物医学图像分割。其实在医学图像方面,分割,英文是segmentation,是非常重要的工具或者应用。 

我先讲一下这篇文章的主要内容,它讲的是对核磁共振图像中的脑部肿瘤部位进行切割的例子。右边的图给出来的就是什么叫“对肿瘤部位进行切割”。我们通过MRI拍出来图片,如果有一些跟正常的大脑皮层细胞不太一样的部位,这些部位就很有可能是有脑部肿瘤,所以要把它切出来,切出来之后再做相应的研究。比如这三个例子可以看到大脑中有一些病变的位置,要达到的就是最右边一列的样子,把它们切出来。这个工作其实不算太容易,主要有几个方面的原因。

首先比较难定位到哪些是肿瘤部位,因为肿瘤部位的形状千奇百怪,没有固定的形状,不像人脸识别的时候,每个人的五官都差不多,位置区别也不会很大。比如说神经胶质瘤和胶质母细胞瘤的形状两种就就很不同,就是不同的肿瘤形状也不一样。然后肿瘤的分布很广泛,可能分布在大脑的任何区域,那跟人脸也不一样了,就跟刚才我说一样。

那怎么去实现、怎么去解决这些难点呢,这篇文章提出来一个思路就是交叉形态卷积的方法做一个 encoder-decoder 的网络结构,然后同时用LSTM对2D的切片序列建模。

这里有个概念,因为MRI也是跟CT一样断层扫描的过程,就是它一层一层,一层扫出来的就是一个2D的图片,然后多层累计起来就是3D的,但是其实切割是要切割出3D的脑部肿瘤位置,这样就需要把2D的变成3D的,把2D的切片之间的关系通过LSTM描述出来,最后把多模态卷积和LSTM网络结合在一起,达到3D切割。

刚才提到多模态的概念,就是因为这个是MRI特有的特征,因为CT里面并没有。这里有四个模态,就是通过四种方式扫描脑部得到MRI数据,这是这里列出来的四个的名字,我们先不用管它这四个具体是什么意思,只是知道它有四种模态就行了,这四种模态对最终切割的结果是有直接的作用的。现在大多数的3D图像切割方法只是用了一个模态,或者把多个模态分别来做,然后再堆积起来。

这个方法的framework大概是这样的,从左到右看。

  • 首先每一个脑部的MRI数据,他都是通过四种模态切出来的,这里用四种不同的颜色来表示,相当于每一个slice就是我说的那个2D的图片。

  • 切完之后他会把四个模态,就是到图b这个阶段了,四个模态交叉在一起做一个multi-modal的encoder,这个encoder就是用一个神经网络来实现的。

  • 四个模态encode到一起之后,在这一步就用神经网络把四个模态下的脑部切割出来了,这是2D的情况下。

  • 然后再加上convolution LSTM把2D的切割、2D和2D之间的dependency描述出来之后就形成了3D的切割,然后再做一下decoder,展现成最后这种形式。在最中间有一个切割出来的东西,其他没被切割到的background。

这就是一个大体的流程,然后对具体对每一个细节的过程,我再详细介绍一下。

第一个模块就是multi-modal的encoder,这里的网络结构最主要的几个方面是用四个卷积核,通过batch-normalization,然后加一个非线性变换,在后面有四个最大池化层。这就是先简单介绍一下,如果要详细了解这个网络结构是怎么设计的,可以去读一下这篇论文。

另外一个嗯比较重要的部分就是多模态交叉卷积。四个模态的数据进入到这个卷积网络之后,他就会把每一个模态下面的cross在一起,然后通过一个三维的卷积,卷积的大小里有个C×4,就是因为他每个channel里面有 c 个slice,就是说它是一个立体结构了,一个长宽是H、W,高是C的这种。四个模态弄到一起就是C×4×H×W,有大小。

然后在这里,是用4×1×1的一个卷积核,做卷积之后得到每一层的切割出来的特征。切割出来之后,然后就进入了后面的convolution LSTM。

这个convolution LSTM跟普通的LSTM有一个区别,就是把原来的矩阵相乘替换为一个卷积操作,就是普通的乘法变成卷积层,这样它就能够在把之前状态的空间信息保留着。其实它的目的就是,卷积LSTM会描述一个2D切割边缘的趋势,比如说这一张中切片它的形态是这样的,然后到下一张它会有一个轻微的变化,要把这种变化描述出来。

因为刚开始有一个图像的encoder,还是要把它解析出来。最后就有一个soft-max的分类,也是一个两分类的,就是每一个像素是前景还是背景的概率。是前景的话,就是我们要切割出来的部位;如果是背景的话就不是我们感兴趣的地方。

它的实验部分做了两个,第一个跟医学没有关系,这个通用的场景就不讲了。我讲一下跟医学相关的那个,他有一个公开的脑部MRI的数据,就叫BRATS-2015。

他切的是神经胶质瘤这个疾病,它的严重程度分为五种,0 就是非肿留,1 是脑细胞坏死,2 是水肿,3 是非增强性肿瘤,4 是增强性肿瘤,数字从低到高,它严重程度会越来越高。临床上是从三种不同的方面去评价切分的效果:

  • 第一种,完全把四种严重程度的病都切割切割出来,相当于区分肿瘤和非肿瘤;

  • 第二种,部分切割,只关注 1、3、4 这三种。2 的水肿,其实也是比较容易混淆的,就是它不是真正的肿瘤

  • 第三种,只关注增强型的肿瘤,就是最严重的那种

最右边是一个图例,看这几种方法哪一个切的好一些。第二列是就是ground truth,第三列是U-Net,是一个提的比较早、比较通用的一个benchmark的方法,来做数据切割;然后第四列的CMC,cross-modality convolution,这个也是这篇文章提出来的;然后CMC+convolution LSTM,就是描述了切片与切片之间的dependency的算法。可以看出来,最后一个跟ground truth是比较接近的。

这里有从三个方面看的评价结果,三个指标。其实都是算它切割得跟ground truth重合的部分的比例,第一种“Dice”就是它的 overlap 部分,除以他们两个面积交集和并集的一个平均,这里的P就是predict出来的区域,然后T是ground truth的区域。PPV是positive predicted value,那是他的交集部分除以预测的区域;sensitivity就是交集的面积除以ground truth区域。这里也是跟U-Net比较了一下。

我下面补充一下这个U-Net的概念,如果没有医学图像切割的一些知识背景的话,可能不太理解它。其实U-Net就是一个网络结构,参考文献在最下面。这种网络结构,就是画出来长得字母U,然后所以叫yU-Net。

它之所以长成这样,是因为这个图像进来,最左边可能大家看的不是很清楚,图像里其实是一个一个的细胞,它们都连在一起,但是边缘是有一些线割开的。网络的目标是把这些细胞一个一个地切开,就像最右边的这种情况。网络刚开始的时候用的卷积就先是3×3的卷积,然后加上ReLu这个非线性变换,然后一步一步做下去。其实这个网络结构还是挺深的,如果有兴趣可以去看一下这篇文章。其实这个算法对大物体小物体的切割都是做得还不错的,就是因为这种U结构的,先对大物体切割,然后再去对小物体切割。

这里面还有一些trick,就是在BRATS-2015这个数据上来,因为这个数据量其实不大,好像正例一共只有60多个,负例两百多个。这里也出现了一个数据不均衡的问题,它是用median frequency平衡法,这个很简单,这个算式里有一个除法,就是分子式median frequency,就是每一个类的平均frequency,除以这一类总的出现的次数。如果出现次数越多,那它这个权重就会越小,就是赋了一个比较小的权重,就在 loss 函数里对这一类的数据设定了一个权重,相当于下采样的过程。

在这个学习过程中使用了two-stage training,第一个阶段是只采用了包含肿瘤的切片,然后用median frequency减少大类的权重。第二阶段是降低学习率,然后把median frequency这种限制去掉,它的分布就是接近你的真实的分布,因为如果使用median frequency,它的分布是会变的,但是真实数据中那个大类的确实会存在,还是要去描述这个问题,先保证了这个模型第一部分不收敛到大类这个问题之后,然后第二个阶段去再去慢慢的学习真实的分布。

在第一阶段的时候避免采样到空的序列,就是先去采样了有肿瘤问题的,然后再在训练LSTM的时候也用了正交初始化的方法处理梯度消失的问题。这种方法其实都是可以用的,不一定非得这个问题上去用。

我读到最后就发现一个不太好的一个地方,就是他在前面后面都提到了这个KU-Net,它说了跟它的方法模型是最相关的,其实这个KU-Net就是用U-Net+RNN,他用RNN也是去描述2D切片之间的dependency。

这篇论文里方法的不同就是,它用的交叉模态的方法去代替U-Net的那一部分,然后用LSTM去代替RNN那一部分。从直观上来讲应该会比这个KU-Net效果要好,但是他说因为没有公开代码不进行实验对比,我觉得这个理由不是特别充分。其实写文章的时候既然他都给了U-Net的比较了,然后这种跟他更相关的、而且思路上也挺像的,应该更要比较一下才对。

问答环节

(先上一次论文讲解中的问题开始)

Q:Sequntial learning的时候有没有用move-and-average,就是有没有移动平移法

A:这个那篇文章里面并没有讲,但是我觉得这个移动平均法在sequntial的学习的时候还是可以用的,就是相当于你在不同的步骤的预测值都做一个平均,还是有一定的推广性的。

Q:关于医学图像数据不平衡的问题

A:其实不平衡的问题,解决方法有好多种,最简单的就是上采样和下采样。如果那些大类的数据特别多,做一下下采样,然后小类的做一下上采样。这个比较简单,然后我在实际问题中有一些经验,其实不是这一类多就一定要下采样,这一类少就一定要上采样,其实要看它具体的分布。

有的时候,比如说我们在做肺结节检测的这个过程中,通过肺CT或者X光去看那个肺部有一些会癌变的结节,去找这些病变的点。其实在这里面小结节会比较多,大结节会比较少。在这种例子里,大家直观的很可能觉得要下采样小结节,那实际上并不是的,我们这反而是上采用了上采样的小结节,就是把它的数据要增多。因为小结节比较难分,它其实很小,跟background非常像,然后就容易被忽略掉,然后大结节就很明显,即使只有少量的数据,它也能分出来的。

所以这个跟实际的应用有关系,一般情况下做模型之前一个很大的步骤是要去处理数据,有的时候一些trick是从数据得到灵感,就应该去怎么去实现。包括数据增强也好,怎么解决数据偏移也好。这是预处理的部分。

然后在实际训练中解决数据不平衡的问题可以通过一个叫hard negative mining的方式,就比如刚开始的数据不平衡,有的倾向于分到大类那一部分。而且你这个模型在分的时候,前期会有一些分错的,分错了就说明这个模型分的效果还不太好。比如说把小类的分到大类里面去了,明显是分错了,然后就把这些分错的小类的找出来,做一下增强,比如说做两倍的增强,然后再放到模型里面、再去学,这样持续下去,就会有针对性的把小的数据去增强,慢慢把数据变平衡了。这个思路其实是跟刚才的数据预处理是一样的,但是更灵活一些,因为在训练之前,直接把小的类做增强,这种是比较主观的,实际上不一定小类的就难分,最好先去模型试一下,看哪些比较难分,然后就专注于这种数据去做数据增强。其实上一篇论文讲解直播的时候,论文里面也提到这个思路。

然后数据增强的时候其实也挺有意思的,上一篇论文里面提到要根据泛化能力比较强的做增强,而不是统一形式的增强。我们在实际在做的时候,也还是以肺结节为例子,我们在做hard negative mining的时候,因为在肺结节检测里面少,就是发现肺结节在跟常规思路的机器学习方式有一些相反的现象。其实正例跟负例相比,本身是偏少的,因为他那个肺里面有很多部位结节是很少的。但是实际模型去训练,然后训练的时候就会发现好多并不是结节的预测成结节了。这个需要hard negative mining,就是要把negative的sample要增强一些。原来我们心想的通常情况下是应该把少的那一部分增强,那肺结节检测是实际上是相反的。在脑部切割的时候也会有这个问题。

然后最近关于一个segmentation的一个新的方法,目前还没有用到在segmentation里面,我只是有一个想法,提出目标检测Fast-RCNN这一系列的何恺明发了一篇文章,是Fast-RCNN的延续,叫做Mask-RCNN,就不光是把那个目标能检测出来了,还能把目标的轮廓给画出来。这样的话就非常像这里,比如说把病变的位置detect出来,其实是在这个地方画了一个rectangle,这是找出它的位置了。如果我们要把病变区域切出来的,就要沿着它的轮廓,把它做一个mask。我觉得这个方法是可以试一下的,就相当于把目标检测和segmentation结合在一起了,所以还是一个挺好的思路。

(等待问题过程中顺便插播一则公司介绍)

我们宜远智能位于深圳,也是一个初创公司,主要是做人工智能在医学图像处理上的应用,然后做一些基于医学图像的辅助诊断,大家有兴趣的话可以去我们官网看一下。我们现在也在招人,如果有兴趣的话可以在微博里面艾特我或者发邮件给我,邮箱地址是 kennethkliu@foxmail.com。加我的微信也可以,但是微信的话我也不会发太多东西。微信号是 kenneth_liukai。

Q:这个问题有人问,我重复一下。也是数据不平衡的问题,当positive和negative不平衡的时候可以做hard negative mining。那么假如第一次分类有部分数据分错了,那么增强的权重是重采样权重还是梯度的权重?

A:这个是两种都可以,我们实际中一般是数据重采样。如果增加梯度的权重,其实不知道是针对哪一种。只是说这个权重的话,就把数据重新放进去。增加权重也可以,但是你增加这个权重的时候,学的时候就不只针对分错的那些了,会对所有的数据都增加了权重。那么还是重采样来得更直接一些,就是分错的那个数据再重新放进去,或者是加倍重新放进去,再去训练,这个都是可以的。

其实在图像上面做数据增强,不光是重采样,还有一些时候为了增加它的泛化性,会做一些偏移、切割、平移这种操作,也是很有效果的。

Q:除了重采样,还有其他办法解决数据不平衡的问题吗?

A:重采样跟数据不平衡,其实是同一个思路。因为数据不平衡,你为了能达到平衡,那就是要打乱原来的数据分布了。除非这个模型对数据不平衡的状况不敏感,就是说即使数据不平衡,也能学出来,大类就大类的学,小类就小类的学。这种就是要考验模型的能力的,有些模型即使类别比较小的也是能够学出来的,要看这个模型的区分能力了。

Q:如果数据图像label有时标错的比较厉害,标错的比例甚至达到1/3,有没有什么数据清洗的办法?

A:对这个这个问题非常好,因为在医学图像里面这个问题特别严重。

其实医学标注数据是有很强的背景知识要求,一般都是要比较高水平的医生标的才会比较准确。

对普通的医生来说,比如说有一些结节,或者一些脑部的MRI上病变的位置,其实在那里,但他就看不到,因为他知识水平有限,他就没见过这种东西。我们也曾经试过要用好几个医生然后去标,水平不一样,指标的差异还挺大的,跟ground truth差距就更大了。

当然了这个ground truth也不是标准的ground truth,只是三个专家级的医生标的共同的结果。这种方法可以这么来,就是说你的模型也可以去标一下。如果这个模型是完全基于现在这种“脏”数据学出来的,那么它真的是没办法能够学得好,那它就是去拟和这个“脏”数据了。如果有另外一个好的模型,就可以transfer过来,它去把这个数据标一遍,跟达到1/3标错的那个数据一起,相当于两个专家会诊一样。它会有一个统计分布,这种情况下能够一定程度上把那些“脏”数据给剔除掉。这是一种思路。

另外的话,有一些如果他标错了,就会出现同样的图像、非常相近的图像,得到了不同的label。这种就是标注相冲突的,这也是一个问题。我们就可以拿一个ImageNet pre-train的model去看两个图像的差异。假如说真的差异很小,然后label标注的截然相反,就可以做一定形式的过滤。

这个问题我不知道回答的好不好,我就是以我的经验来说。这其实是一个开放性的问题,可能有很多的方法去实现。其实做机器学习,ground truth就相当于一个先知,告诉你哪些是真的标注数据,那才是真正的标注数据。那实际上很多都是人标的,人的知识水平就限制了标注质量的好与差。

雷锋网 AI 科技评论整理。感谢刘凯老师带来的分享。

雷锋网

CVPR 2017精彩论文解读:显著降低模型训练成本的主动增量学习 | 分享总结

雷锋网 AI 科技评论按:计算机视觉盛会 CVPR 2017已经结束了,雷锋网 AI 科技评论带来的多篇大会现场演讲及收录论文的报道相信也让读者们对今年的 CVPR 有了一些直观的感受。

论文的故事还在继续

相对于 CVPR 2017收录的共783篇论文,即便雷锋网 AI 科技评论近期挑选报道的获奖论文、业界大公司论文等等是具有一定特色和代表性的,也仍然只是沧海一粟,其余的收录论文中仍有很大的价值等待我们去挖掘,生物医学图像、3D视觉、运动追踪、场景理解、视频分析等方面都有许多新颖的研究成果。

所以我们继续邀请了宜远智能的刘凯博士对生物医学图像方面的多篇论文进行解读,延续之前最佳论文直播讲解活动,陆续为大家解读4篇不同的论文。

刘凯博士是宜远智能的总裁兼联合创始人,有着香港浸会大学的博士学位,曾任联想(香港)主管研究员、腾讯高级工程师。半个月前宜远智能的团队刚刚在阿里举办的天池 AI 医疗大赛上从全球2887支参赛队伍中脱颖而出取得了第二名的优异成绩。

在 8 月 1 日的直播分享中,刘凯博士为大家解读了「Fine-tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally」(用于生物医学图像分析的精细调节卷积神经网络:主动的,增量的)这篇论文,它主要解决了一个深度学习中的重要问题:如何使用尽可能少的标注数据来训练一个效果有潜力的分类器。以下为当天分享的内容总结。

图文分享总结

刘凯博士:大家好,我是深圳市宜远智能科技有限公司的首席科学家刘凯。今天我给大家介绍一下 CVPR 2017 关于医学图像处理的一篇比较有意思的文章,用的是 active learning 和 incremental learning 的方法。

今天分享的主要内容是,首先介绍一下这篇文章的 motivation,就是他为什么要做这个工作;然后介绍一下他是怎么去做的,以及在两种数据集上的应用;最后做一下简单的总结,说一下它的特点以及还有哪些需要改进的地方。

其实在机器学习,特别是深度学习方面,有一个很重要的前提是我们需要有足够量的标注数据。但是这种标注数据一般是需要人工去标注,有时候标注的成本还是挺高的,特别是在医学图像处理上面。因为医学图像处理需要一些 domain knowledge,就是说医生对这些病比较熟悉他才能标,我们一般人是很难标的。不像在自然图像上面,比如ImageNet上面的图片,就是一些人脸、场景还有实物,我们每个人都可以去标,这种成本低一点。医学图像的成本就会比较高,比如我右边举的例子,医学图像常见的两种方式就是X光和CT。X光其实一个人一般拍出来一张,标注成本大概在20到30块钱人民币一张;CT是横断面,拍完一个人大概有几百张图片,标注完的成本就会高一点,标注的时间也会比较长,特别是CT,因为医生要看好几百张。

举个例子,比如标1000张,这个数据对 deep learning 来说数据量不算太大,X光需要2到3万人民币、3到4天才能标完;CT成本就会更长,而且时间成本也是一个很重要的问题。那我们怎么解决深度学习在医学方面、特别是医学图像方面的这个难题呢?那我们就要用尽量少的标注数据去训练一个 promising 的分类器,就是说一个比较好的分类器。

那我们就要考虑要多少训练数据才够训练一个 promising 的分类器呢?这里有个例子,比如左边这个图,这个模型的 performance 随着数据的增加是一个线性增长的过程,就是说数据越多,它的 performance 就越高。但在实际中,这种情况很少出现,一般情况下都是数据量达到一定程度,它的 performance就会达到一个瓶颈,就不会随着训练数据的增加而增加了。但是我们有时候想的是把这个临界点提前一点,让它发生在更小数据量的时候。比如右边这个图的红色虚线部分,用更小的数据达到了相同的 performance。我们的文章里就是介绍主动学习 active learning 的手段,找到一个小数据集达到大数据集一样的效果。

怎么样通过 active learning 的方式降低刚才右图里的临界点呢?就是要主动学习那些比较难的、容易分错的、信息量大的样本,然后把这样的样本标记起来。因为这些是比较难分的,容易分的可能几个样本就训练出来了,难分的就需要大量的数据,模型才能学出来。所以我们先去学这些难的。

怎么去定义这个“难”呢?就是“难的”、“容易分错”、“信息量大”,其实说的是一个意思。这个“信息量大”用两个指标去衡量,entropy大和diversity高。entropy就是信息学中的“熵”,diversity就是多样性。这个数据里的多样性就代表了模型学出来的东西具有比较高的泛化能力。举个例子,对于二分类问题,如果预测值是在0.5附近,就说明entropy比较高,因为模型比较难分出来它是哪一类的,所以给了它一个0.5的概率。

用 active learning 去找那些比较难的样本去学习有这5个步骤

  1. 首先,把所有的未标注图片数据在大量自然图像中训练的网络,大家知道现在有很多常用的网络,从最初的LeNet、AlexNet、GoogLeNet、VGG、ResNet这样的网络中去测试一遍,得到预测值。 然后挑出来那些最难的、信息量大的样本去标注

  2. 用这些刚刚标注了的样本去训练深度学习网络,得到一个网络N

  3. 把剩下没有标签的图像用N过一遍,得到预测值,挑一遍那些最难的,用人工去给它标注

  4. 把刚刚标注了的样本和原来已经标好的样本一起,也就是整个标注集拿来继续训练这个网络

  5. 重复3到4这个步骤,直到当前的分类器可以对选出来的比较难的图像很好的分类了。

刚才的文字讲解可能不是很直观,我们用一个图来看一下。这个图从左到右看,一开始灰蒙蒙的意思是都还没有标注,然后用一个pre-trained model去预测一遍都是哪个类。这样每个数据上都有一个概率,可以根据这个概率去选择它是不是难分的那个数据,就得到了中间这个图,上面那一段是比较难的,然后我们把它标注出来。然后用一个 continuous fine-tune 的 CNN,就是在原来的模型上再做一次 fine-tune,因为有了一些标注数据了嘛,就可以继续 fine-tune了。 fine-tune后的模型对未标注的数据又有了一个预测的值,再根据这些预测值与找哪些是难标的,把它们标上。然后把这些标注的数据和之前就标注好的数据一起,再做一次 continuous fine-tune,就得到 CNN2了。然后依次类推,直到把所有的数据都标完了,或者是在没有标完的时候模型的效果就已经很好了,因为把其中难的数据都已经标完了。

刚才我们提到了两个指标来判定一个数据是不是难分的数据。entropy比较直观,预测结果在0.5左右就认为它是比较难分的;但diversity这个值不是很好刻画,就通过 data augmentation数据增强的方式来设计指标,就是说从一个图像设计出一系列它的变形。这些变形就可以是靠翻转、旋转、平移操作等等,一个变成了好几个甚至十几个,增加了它的多样性。然后对这些所有的变形去预测它们的分类结果,如果结果不统一的话,就说明这副图像的diversity比较强,那么这张图像就是比较难分的,是hard sample;反之就是比较好分的,那么就不去做它的增强了。然后对所有增强以后的数据的预测值应当是一致的,因为它们代表的是同一个东西,但是也有一些例外,如果是像我刚才说的那样的简单的数据增强。

这就会产生一个问题,原始的图像,比如左边这只小猫,经过平移、旋转、缩放等一些操作以后得到9张图,每张图都是它的变形。然后我们用CNN对这9张图求是一只猫的概率,可以看到上面三个图的概率比较低,就是判断不出来是一只猫,我们直观的去看,像老鼠、狗、兔子都有可能。本来这是一个简单的例子,很容易识别出来这是一只猫,但是增强了以后反而让模型不确定了。这种情况是需要避免的。

所以这种时候做一个 majority selection,就是一个少数服从多数的方式,因为多数都识别出来它是一只猫了。这就是看它的倾向性,用里面的6个预测值为0.9的数据,上面三个预测值为0.1的就不作为增强后的结果了。这样网络预测的大方向就是统一的了。

这篇文章的创新点除了active learning之外,它在学习的时候也不是从batch开始,而是sequential learning。它在开始的时候效果就不会特别好,因为完全没有标注数据,它是从一个ImageNet数据库训练出的模型直接拿到medical的应用里来预测,效果应该不会太好。然后随着标注数据的增加,active learning的效果就会慢慢体现出来。这里是在每一次fine-tune的时候,都是在当前的模型基础上的进一步fine-tune,而不是都从原始的pre-train的model做fine-tune,这样就对上一次的模型参数有一点记忆性,是连续的学习。这种思路就跟学术上常见的sequntial learning和online learning是类似的。但是有一个缺点就是,fine-tune的参数不太好控制,有一些超参数,比如learning rate还有一些其它的,其实是需要随着模型的变化而变化的,而且比较容易一开始就掉入local minimal,因为一开始的时候标注数据不是很多,模型有可能学到一个不好的结果。那么这就是一个open的问题,可以从好几个方面去解决,不过解决方法这篇文章中并没有提。

这个方法在机器学习方面是比较通用的,就是找那些难分的数据去做sequntial的fine-tune。这里呢主要是用在了医学图像上面,然后用两个例子实验了结果,一个是结肠镜的视频帧分类,看看有没有病变、瘤之类的。结论是只用了5%的样本就达到了最好的效果,因为其实因为是连续的视频帧,通常都是差不多的,前后的帧都是类似的,不需要每一帧都去标注。另一个例子也是类似的,肺栓塞检测,检测+分类的问题,只用1000个样本就可以做到用2200个随机样本一样的效果。

这个作者我也了解一些,他是在 ASU 的PhD学生,然后现在在梅奥,美国一个非常著名的私立医院梅奥医院做实习,就跟需要做标准的医生打交道比较多。这相当于就是一个从现实需求得出来的一个研究课题。

总结下来,这篇文章有几个比较好的亮点。

  • 从标注数据来说,从一个完全未标注的数据集开始,刚开始的时候不需要标注数据,最终以比较少量的数据达到很好的效果;

  • 然后,从sequntial fine-tune的方式,而不是重新训练;

  • 选择样本的时候,是通过候选样本的一致性,选择有哪些样本是值得标注的;

  • 自动处理噪音,就是我刚才举的猫的那个例子,数据增强的时候带来的噪音,通过少数服从多数的方式把那些噪音去掉了;

  • 在每个候选集只选少量的patches计算熵和KL距离,KL距离就是描述diversity的指标,这样减少了计算量。传统的深度学习的时候会需要在训练之前就做数据增强,每个样本都是同等的;这篇文章里面有一些数据增强不仅没有起到好的作用,反而带来了噪音,就需要做一些处理;而且还有一些数据根本不需要增强,这样就减少了噪音,而且节省了计算。

这篇文章其实还比较简单,但是思路是很好的,因为提出的问题是在现实中非常常见的。有一些缺点就是:

  • sequntial fine-tune,就跟机器学习提出incremental learning和online learning的时候遇到的问题类似,就是说怎么样才能达到和batch learning的时候一样的效果。

  • 以我们在公司以及以前的研究经历来看,在标注好的那些数据上也有一些可以借鉴的思路可以加进来,比如 hard nigtive mining 有一个思路,因为在医学图像还有其它的一些数据上面,真正有病的数据是比较少的,就会出现这个模型分类的结果倾向于他没有病,就会出现一个问题是模型的有偏。这种时候用hard mining的方法就把分错的那些重新送入模型里面去重新训练。

  • 这个工作也可以在其它方面推广,不过推广的例子还有待研究,这里只用了medical的例子。

我今天分享的大概就是这些内容。其实这里还有一个更详细的解释,最好还是把论文读一遍吧,这样才是最详细的。

提问环节

Q:为什么开始的时候 active learning 没有比random selection好?

A:其实不一定,有时候是没有办法保证谁好。active learning在一开始的时候是没有标注数据的,相当于这时候它不知道哪些数据是hard的,在这个医学数据集上并没有受到过训练。这时候跟 random selection 就一样了,正在迁移原来 ImageNet 图像的学习效果。random selection 则有可能直接选出来 hard的那些结果,所以有可能比刚开始的active selecting要好一点,但这不是每次都是 random selection 好。就是不能保证到底是哪一个更好。

(完)

雷锋网 AI 科技评论整理。系列后续的论文解读分享也会进行总结整理,不过还是最希望大家参与我们的直播并提出问题。

雷锋网