雷锋网(公众号:雷锋网) AI 科技评论按:本文为 CVPR 2017 的论文解读,作者周纵苇(Zongwei Zhou),邮箱:zongweiz@asu.edu,微博:@MrGiovanni。本文首发于简书,经作者授权,雷锋网转载。
下面要介绍的工作发表于 CVPR 2017,题为「Fine-tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally」。它主要解决了一个深度学习中的重要问题:如何使用尽可能少的标签数据来训练一个效果 promising 的分类器。根据我的判断,当遇到两种情况的时候,这篇论文的可以非常强大的指导意义:
-
一共手头有 100 个未标记样本,和仅仅够标记 10 个样本的钱,老板说,通过训练这十个标记的样本,能接近甚至达到训练 100 个样本的 performance;
-
手头有了一个已经在 100 个样本中训练完的分类器,现在又来了 100 个新标记的样本,老板说,只给提供够训练 10 个样本的计算机;或者只给你提供够训练 10 个样本的时间,让分类器尽快学习到新来样本的特征;
这两个情况发生的条件是完全不同的,Situation A 发生在屌丝公司,没有钱拿到精标记的数据集,却也想做深度学习;Situation B 一般发生在高富帅公司,有海量的精标记数据,但是由于目前即使是最牛逼的计算机也不能用深度学习在短时间内一次性地去处理完这些数据(e.g.,内存溢出,或者算上个几年都算不完)。Anyway,我想我已经说清楚应用背景了,读者可以根据实际情况判断是否往后读下去。
感谢你选择继续往下阅读,那么如果觉得下文所传递的思想和方法对你有帮助,请记得一定引用这篇 CVPR 2017 的文章。Fine-tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally.
@InProceedings{Zhou_2017_CVPR,
author = {Zhou, Zongwei and Shin, Jae and Zhang, Lei and Gurudu, Suryakanth and Gotway, Michael and Liang, Jianming},
title = {Fine-Tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally},
booktitle = {The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
month = {July},
year = {2017}
}
1. 为什么会想到去解决这个问题?
现在深度学习很火,做的人也越来越多,那么它的门槛可以说是很低的,Caffe,Keras,Torch 等等框架的出现,让该领域的 programming 的门槛直接拆了。所以深度学习真正的门槛变成了很简单概念——钱。这个钱有两个很重要的流向,一是计算机的运算能力(GPU Power),二是标记数据的数量。这儿就引出一个很重要的问题:是不是训练数据集越多,深度学习的效果会越好呢?这个答案凭空想是想不出来的,能回答的人一定是已经拥有了海量的数据,如 ImageNet,Place 等等,他们可以做一系列的实验来回答这个问题。需要呈现的结果很简单,横坐标是训练集的样本数,纵坐标是分类的 performance,如下图所示:
Fig.1 如果答案是左图,那么就没什么可以说的了,去想办法弄到尽可能多的训练数据集就 ok,但是现实结果是右图的红实线,一开始,训练集的样本数增加,分类器的性能快速地在上升,当训练集的样本数达到某一个临界值的时候,就基本不变了,也就是说,当达到了这个临界的数目时,再去标注数据的 ground truth 就是在浪费时间和金钱。有了这个认知,接下来就是想办法让这个临界值变小,也就是用更小的训练集来更快地达到最理想的性能,如右图的红虚线所示。红实线我们认为是在随机地增加训练集,那么红虚线就是用主动学习(Active Learning)的手段来增加训练集,从而找到一个更小的子集来达到最理想的性能。
这里需要说明的一点是,训练样本数的临界点大小和这个分类问题的难度有关,如果这个分类问题非常简单,如黑白图像分类(白色的是 1,黑色的是 0),那么这个临界值就特别小,往往几幅图就可以训练一个精度很高的分类器;如果分类问题很复杂,如判断一个肿瘤的良恶性(良性是 0,恶性是 1),那么这个临界值会很大,因为肿瘤的形状,大小,位置各异,分类器需要学习很多很多的样本,才能达到一个比较稳定的性能。
FIG.1 对于很多从事深度学习的无论是研究员还是企业家都是一个十分有启发性的认知改变。一般来讲,人的惯性思维会引领一个默认的思路,就是训练样本越多越好,如左图所示,这将直接导致许多工作的停滞不前,理由永远是「我们没有足够的数据,怎么训练网络!」进一步的思路是图二的红实线认知:要多少是多啊,先训着再说,慢慢的就会发现即便用自己有的一小部分数据集好像也能达到一个不错的分类性能,这个时候就遇到一个问题:自己的数据集样本数到底有没有到达临界值呢?这个问题也很关键,它决定了要不要继续花钱去找人标注数据了。这个问题我会在第三部分去回答它,这里先假设我们知道了它的答案,接下来的问题就是如何让这个临界值变小?
2. 如何让临界值变小?
解决方案就是主动学习(Active Learning),去主动学习那些比较「难的」,「信息量大的」样本(hard mining)。关键点是每次都挑当前分类器分类效果不理想的那些样本(hard sample)给它训练,假设是训练这部分 hard sample 对于提升分类器效果最有效而快速。问题是在不知道真正标签的情况下怎么去定义 HARD sample?或者说怎么去描述当前分类器对于不同样本的分类结果的好坏?
定义:由于深度学习的输出是属于某一类的概率(0~1),一个很直观的方法就是用「熵(entropy)」来刻画信息量,把那些预测值模棱两可的样本挑出来,对于二分类问题,就是预测值越靠近 0.5,它们的信息量越大。还有一个比较直观的方法是用「多样性(diversity)」来刻画 labeled data 和 unlabeled data 的相似性。这两个方法都是在「Active batch selection via convex relaxations with guaranteed solution bounds」中被提出。是十分重要的两个 Active Learning 的选择指标。
Important Observation: To boost the performance of CNNs in biomedical imaging, multiple patches are usually generated automatically for each candidate through data augmentation; these patches generated from the same candidate share the same label, and are naturally expected to have similar predictions by the current CNN before they are expanded into the training dataset.
有了这两个指标来选 hard sample,是比较靠谱了——实验结果表明,这比随机去选已经能更快地达到临界拐点了。
FIG.2 Active Learning 的结构示意图。利用深度学习所带来的优势在于,一开始你可以不需要有标记的数据集。
举例来讲,假设你是一个养狗的大户,你现在想做一个非常偏的(专业化的)分类问题,如卷毛比雄犬和哈瓦那犬的分类问题,你手头有这两种狗各 50 条,你自己可以很轻松地区分这 100 条狗,现在需要做的是训练一个分类器,给那些不懂狗的人,他们拍了狗的照片然后把照片输入到这个分类器就可以很好地判断这是卷毛比雄犬还是哈瓦那犬。首先你可以给这 100 条狗拍照片,每条狗都有不同形态的 10 张照片,一共拍了 1000 张没有标记的照片。对于这 1000 张照片,你所知道的是哪 10 张对应的是一条狗,其他什么都不知道。
在这个实际分类问题中,你拥有绝对的数据优势,即便是 Google Image 也不能企及,当然一种选择是你把 1000 张图片从头到尾看一遍,标注好,但是你更希望是把大多数简单的分类工作交给分类器,自己尽可能少的做标记工作,并且主要是去标记那些分类器模棱两可的那几张照片来提高分类器的性能。
我们初步提供的解决方案是 (参考 Fig.2 或者 Fig.3):
-
把 1000 张图放到在大量自然图像中预训练的网络(LeNet,AlexNet,GoogLeNet,VGG,ResNet 等等)中测试一遍,得到预测值,然后挑出来那些「最难的」,「信息量最大的」样本,你看一下,给出他们的标签(卷毛比雄犬还是哈瓦那犬);
-
用这些刚刚给了标签的样本训练深度网络 N;
-
把剩下那些没有标签的图像用 N 测试,得到预测值,还是挑出来那些「最难的」,「信息量最大的」样本,你再给出他们的标签(卷毛比雄犬还是哈瓦那犬);
-
刚刚给了标签的样本和原来有标签的样本组成新的训练集,继续用它们来训练深度网络 N;
-
重复步骤 3,4,直到 [?]
如 FIG.2 所示,每次循环都用不断增加的标记数据集去提升分类器的性能,每次都挑对当前分类器比较难的样本来人为标记。
3. 这个过程什么时候可以停?
-
钱用光了;
-
当前分类器对选出来的 hard samples 分类正确;
-
选出来的 hard samples 人类也无法标记;
以上三种情况都可以让这个循环训练过程中断,第一种就很无奈了,没钱找人标记了... 第二种情况和第三种情况的前提共识是如果难的样本都分类正确了,那么我们认为简单的样本肯定也基本上分类正确了,即便不知道标签。第三种情况,举例来说就是黑白图像分类,结果分类器模棱两可的图像是灰的... 也就是说事实上的确分不了,并且当前的分类器居然能把分不了的样本也找出来,这时我们认为这个分类器的性能已经不错的了,所以循环训练结束。
至此,主要讲了传统的 Active Learning 的思想,接下来会讲讲这篇 CVPR2017 论文的几个工作点。
The way to create something beautiful is often to make subtle tweaks to something that already exists, or to combine existing ideas in a slightly new way.
-- "Hackers & Painters"
上面我讲到了 Active Learning 的大概思路,如 Fig. 3 所示,是一个很有意思的概念,说实话很实用,我在 Mayo Clinic 实习的时候,每次遇到新的数据集,都会想着用一用这个方法,来让给数据标注的专家轻松一点...
Fig.3 暗的表示 unlabeled 的数据,高亮的表示 labeled 的数据,CNN 的结构可以随便挑 SOTA 的无所谓,CNN0 是拍 retrained from ImageNet,得到的第二列表示每个 image 对应的 importance 指标,越红的说明 entropy 越大,或者 diversity 越大,每次挑这些 important 的 sample 给专家标注,这样 labeled 的数据就变多了,用 labeled 的数据训练 CNN,得到新的更强的分类器了,再在 unlabeled data 上测试,挑出 entropy/diversity 大的样本,交给专家去标注,如此循环...
4. 发现新问题
貌似前面讲的算法没留下什么问题啊,也就是说,只要学术视野够开阔,这个 Active Learning 的技术完全可以直接用啦。但是实际上并不是这样的,上面说的熵(Entropy)的确没有什么严重的问题,但是多样性(Diversity),在很多现实应用中问题就会出现。
根据「Active batch selection via convex relaxations with guaranteed solution bounds」的描述,Diversity 是计算 labeled data 和 unlabeled data 之间的相似度,把和 labeled data 比较相似的作为简单样本,每次 active select 难样本,也就是挑出来和 labeled data 不太像的出来。体现在矩阵上就是行是 labeled data,列是 unlabeled data,在它们组成的大矩阵中找出最优的子矩阵。这个方法在理论上是可行的,但是实际应用中,数据量(labeled 和 unlabeled)会非常大,这个矩阵会特别的大,导致求最优解会很慢,或者根本得不出来最优解。因此,我们并不在 image-level 上算 diversity。
由于标记的医学影像训练数据量和自然图像的没法比,Data Augmentation 是必须的环节,我们就抓住了这个点来设计 Diversity 这个指标。这里的假设是:经过 data augmentation 后的 patches,从 CNN 出来的预测值应该相对是一致的,因为它们的 truth 应该还是一致的。比如一张猫的图像,经过数据扩充,得到的那些个 patch 所对应的 truth 也应该都是猫。
定义:对于来自同一幅 image 的 patch 集,如果它们的分类结果高度不统一了,那么这个 image 就是 Important 的,或者 hard sample。
需要展开解释的两点:
-
由于在 annotation 之前不知道 label,所以我们不能知道网络的预测正确还是错误,但是我们可以知道预测统一还是不统一。所以比如一幅猫的图,如果网络的预测很统一都是狗,那么我们也认为这是一个 easy sample,不去 active select 它的。
-
结合 data augmentation 的优点是我们可以知道哪些 patch 对应什么 image,比较容易控制。这样就可以在一个 image 內算 diversity 了,每个 image 对应一个矩阵,大小是一样的,非常的简洁,也容易控制计算量。
这样的 diversity 就完美了吗?并没有... 读者可以先猜猜哪儿又出问题啦,我在第五部分会指出来。
5. 这次是 Data Augmentation 的锅
问题出在上面的假设:经过 data augmentation 后的 patches,从 CNN 出来的预测值应该相对是一致的,因为它们的 truth 应该还是一致的。
我们知道有几种经典的数据扩充方法:平移,旋转,缩放,形变,加噪声等等。但是很有可能发生的是,经过这些变化以后,得到的 patch 是无法分类的。举例来讲,Augmentation Lecture 讲到的平移 crop,如果我们将它应用到猫的分类问题中,很有可能得到这样的训练样本:
Fig.4 左图是原始的图像,中间的 9 个 patches 是根据平移变化的扩充得到的,restrictions: region must contain objects or part of the object 详见这里,右图是网络得到的对应 patch 的预测值。
可以看出,在这个实例中,对于一个 candidate,网络预测的一致性很低,套用 Diversity 的公式,Diversity 的值很大,也就是说,应该被认为是 hard sample 挑出来。但是仔细观察一下这九个 patches 就不难看出,即便是很好的分类器,对于中间图中的 1,2,3,也是很难分出这个是猫... could be rat, rabbit, etc. 我们把像这三个 patch 的例子叫做从 data augmentation 带来的 noisy label issue。而对于 4~6 的 patches,网络很好地做出了分类,这很合情合理。所以我们把这种像 1,2,3 的 patches,由于随机的数据扩充(Random Data Augmentation)带来的干扰样本称为 noisy labels。Fig.4 只是一个很直观的例子,其实在实际的数据集中会有很多这样的案例。
我们给出的解决方法是:先计算 majority 的预测,然后在 majority 上面算 diversity,只要网络的预测大方向是统一的,就是统一的。意思就是想个办法把 Fig.4 中的三个非主流 0.1 扔掉。只抓住大方向,也就是 0.9——我们不希望 Fig.4 这种情况被当作 important sample 挑出来,因为当前的分类器实际上已经可以分出来这幅图的类别啦。
这个改进的数学表达也非常直观,以 Fig.4 为例,为了知道大方向,我们计算它们的平均值,如果大于 0.5,大方向就是 label 1,反之大方向是 label 0,如果是前者,那么就从大到小取前 25% 的预测,其他的不要啦,如果是后者,就从小到大取前 25%,其他的不要啦。这样 Fig.4 就只剩下三个 0.9,它们的 diversity 就非常小,也就不会被当作 important sample 挑出来啦。成功解决了 data augmentation 带来的 noisy label issue。
整体的算法流程可参见 Fig.5
Fig.5 Active Learning Algorithm
至此,主要讲了这篇论文是怎样成功的将 Diversity 这个重要的指标引入到 Active Learning 中来,所有的 Active Selection 部分结束。
6. 如何训练?
既然用了迁移学习,那么一开始的 CNN 测试的效果肯定是一团糟,因为这个 CNN 是从自然图像中学过来的,没有学习过 CT 这种医学影像,所以这个 loop 的启动阶段,Active Learning 的效果会没有 random selecting 好。不过很快,随着 CNN 慢慢地在 labeled 的 CT 上训练,Active Learning 的效果会一下子超过 random selecting。
接下来讨论 Continuous fine-tuning 的细节,随着 labeled data 集变大,CNN 需要一次次地被训练,有两种选择,一是每次都从 ImageNet pretrained 来的 model 来迁移,二是每次用当前的 model 上面迁移 (Continuous Fine-tuning)。方法一的优点是模型的参数比较好控制,因为每次都是从头开始 fine-tuning,但是缺点是随着 labeled 数据量大增加,GPU 的消耗很大,相当于每次有新的标注数据来的时候,就把原来的 model 扔了不管,在实际应用中的代价还是很大的。第二种方法是从当前的 model 基础上做 finetune,在某种意义上 knowledge 是有记忆的,而且是连续渐进式的学习。问题在于参数不好控制,例如 learning rate,需要适当的减小,而且比较容易在一开始掉入 local minimum。关于 Continuous Finetuning 的前期论文也是有的,需要更进一步的研究。
另外,如何能够真正意义上去体现出 increamentally learning,只是这样一个网络结构去不断的学习吗,还是随着数据集的增加去让网络自适应的变深,便复杂,都是我比较关心的问题。
乍一看,Active Learning 的工具很直观,思想也很简洁,但随着博客讨论的技术细节越来越深入,会出现很多的 open question 有待研究,因此,只能说我们的论文是 active learning 的一个引子。
本文只是从思想的角度来阐述这篇论文,至于后续的分析,结果和结论都在论文中详细的 report 了。反正一句话来总结,hin 好...
Find paper here.
Find poster here.
Find author here.
祝好,
本文作者:奕欣
本文转自雷锋网禁止二次转载,原文链接