#对抗鲁棒性
搬来了 国内大神的 从对抗样本的发现过程、研究意义、寻找对抗样本、增强模型对抗鲁棒性、对抗鲁棒性问题导致的攻防竞赛现象方法等方面出发,对深度神经网络的鲁棒性问题进行了深入探讨,对抗鲁棒性,主要针对的是深度学习时代下深度神经网络的鲁棒性问题。大部分内容探讨最基本的机器学习分类任务。
作者介绍:陶略,PARNEC Group,南京航空航天大学
个人主页:https://www.zhihu.com/people/michael-63-42
1 对抗样本的发现
What has been is what will be, and what has been done is what will be done; there is nothing new under the sun.[1]
日光之下并无新事。
下图是用FGSM方法[2]生成的一个对抗样本。
对抗样本(Adversarial Examples)一词首次出现在Szegedy等人在ICLR 2014的一篇论文里[3]。通过对测试集的图片添加微小的扰动,导致神经网络对其误分类(而人类依然能够正确分类),可以使得经过良好训练的神经网络的准确率降为0。
但早在本世纪初,就有许多工作在设计传统机器学习模型的敌手(Adversary),它能够操纵输入数据从而欺骗分类器(比如,通过向垃圾邮件里添加特殊词汇以欺骗垃圾邮件检测器,而检测器也可以随敌手的出现而改进自己的词库,从而获得更好的性能[4])。当时就在许多领域里掀起了攻防角逐(arms races),比如欺骗计算机入侵检测系统、躲避空中监视系统、操纵搜索引擎排序系统等[5]。
事实上,第一个针对神经网络分类器的敌手是Biggio等人在2013年设计的,他们称之为规避攻击(Evasion Attacks)[6]。Biggio等人显然有些气愤,因为后来大部分研究对抗鲁棒性的论文只引用Szegedy等人的那篇论文[3],而不引用他们这篇;大部分论文都使用[3]里发明的术语,而不使用[6]里的术语(evasion attacks = adversarial examples,surrogate learners = substitute models)。Biggio等人在2017年终于把他们在2013年的那篇论文挂到了arxiv上面,并附了一段评语:
所以日光之下真的并无新事吗?当时的明月换拨人看?[7]
我们新发现的对抗样本与十多年前的没有区别吗?
我们深度学习时代的攻防竞赛是在重蹈覆辙吗?
我们要因为[3]没有引用[6]而把[3]批判一番吗?
我个人认为,答案都是否定的。
虽然从抽象的形式上看,十多年前的对抗样本与现在的并无二致,都是“攻击者精心设计的导致机器学习模型出错的输入”[8]。但时代变了,模型变了。能力越大,责任越大。深度学习复兴给大家带来了成功的喜悦,在许多任务上,以前模型做不到或做不好的事情,现在能出人意料地做得很好,需要的似乎只有数据和算力,深度学习一时间成了人工智能的代名词,学术界工业界一片欣欣向荣的景象。而深度网络的优异性能和深度网络在对抗攻击下的灾难性脆弱似乎是同一枚硬币的两面[9]。深度网络中的对抗样本现象给狂热的人群敲墙了警钟:我们的深度网络似乎什么都知道,但其实什么都不知道(You know nothing!)。
在传统机器学习的攻防竞赛中,攻击和防御都围绕着手工特征(handcrafted features)做文章,且主要是在浅层模型应用过的领域(如垃圾邮件过滤器,入侵检测,生物认证,欺诈检测)。而近些年来针对深度网络鲁棒性的攻防竞赛主要对原始数据(raw data)做扰动,且集中在深度学习最擅长的领域(视觉、听觉、自然语言处理等),同时更加强调对抗扰动对人类的影响,即人类察觉不到扰动,而模型却过分地敏感,以突出模型与人类的差距。更多讨论将推迟到 本文第五节“对抗鲁棒性问题导致的攻防竞赛现象”。
任何研究者都不希望自己的研究被埋没在书山书海中。但我倾向于相信[6]和[3]是两个独立的且同期的研究成果(ICLR 2014是在2013年12月截稿),[3]没有引用[6]的原因可能很简单:作者并不知道同行的工作。但这并不代表[3]和[6]的工作是等价的!实际上,[6]是延续传统机器学习里的那一套思路,在二分类的任务下对 Adversary 进行了设定,通过强调自己发现的机器学习系统存在的安全风险来讲故事。而[3]没有理会安全语境下那些繁琐的设置,从新的角度出发,旨在寻找模型的盲点(Blind Spots in Neural Networks):虽然深度学习的泛化性能非常好,但在高维数据流形附近存在着许多低概率的洞洞(pockets),在这些洞洞上模型表现很差,而我们人类在这些洞洞上的表现依然非常好。深度学习的成功让我们看到了人工智能的晴朗天空,但[3]告诉我们,晴朗天空中的远处漂浮着一朵乌云:你们可以暂时假装看不见,但它迟早会飘到你头顶。
2 我们为什么要研究对抗样本现象?
First of all,对抗样本突出了机器智能与人类智能的差距。我们希望我们的模型是“人工智能”而不是“人工智障”。我们最远大的理想就是训练出像人类一样强大的分类器帮我们执行分类任务,这样我们就可以躺着喝咖啡了。因此像把熊猫识别成长臂猿这样的现状是完全无法忍受的,我们会气得跺脚:虽然你每个神经元连接、每个参数我都清清楚楚,但我还是无法理解你的脑子里究竟在想些什么,所以我要骂你是个智障黑盒非线性深度神经。
Last but not least,安全性。因为你看起来让别人觉得你很能干,许多人就请你去帮他们做事。但我知道你外强中干,一旦有个敌手在旁边干扰你,你就崩溃了。外面有很多敌手在恶意设计扰动,让自动驾驶汽车直线拐弯[10],让目标检测失灵[11],让人脸识别系统失效[12]。我不放心你做事啊,尤其是人命关天的任务。
3 寻找对抗样本:一个约束优化问题
要消除盲点,我们首先要找到盲点。
(盲生,你发现了华点[13].
下图显示了近年来对抗样本相关论文的累计数目[16]:
对抗样本论文的累计数量随年份呈现指数级增长趋势
就这样一个简短的对抗样本问题,每年就有成百上千篇论文在研究。这有啥好研究的呢?
我粗略地从三个方面扯扯:替代损失、优化方法、度量函数。
替代损失
0-1损失不便于用梯度方法优化,故许多人在寻找替代损失。这里 just to name a few.
Gowal等人认为在这个高度非凸非光滑的优化问题里随机初始化的PGD并不高效,于是设计了一个新的替代损失,称作 MultiTargeted[21]。Tashiro等人则提出一种更高效的初始化方法[22]。Li等人则认为我们应该去寻找一个最坏的对抗扰动分布,而不是一个最坏的对抗扰动点(有点贝叶斯的味道了),并且运用NES技巧,优化时可以无需梯度信息[23]。
还有些论文在原问题上又加了些其它的目标。比如让一个对抗扰动同时欺骗多个模型[24]。比如让一个扰动同时使多张图片变成对抗样本[25]。比如让一个对抗扰动更容易去欺骗一个没见过的模型(即对抗样本的迁移性)[26]。
优化算法
有些论文认为敌手不是什么时候都能获取梯度信息的,比如Google Cloud Vision API,比如要攻击一个未见过的目标检测器。这些模型对于敌手来说都是黑盒。敌手只能知道模型的输入和输出,而不知道梯度。这时候 Zeroth-order 优化算法就被拿出来玩了。在对抗样本领域又被称为黑盒攻击(Black-box attacks),与之对应的是前文的白盒攻击(White-box attacks)。
黑盒攻击的花样就多了。有的人直接使用一个白盒模型来作为黑盒的替代。也有人把白盒替代和zeroth-order结合做的[28]。更多论文在直接做zeroth-order。最开始利用最简单的 coordinate梯度估计器去揣摩模型的梯度,然后用在高维数据下更高效的Gaussion和Uniform梯度估计器。之后一大批论文针对梯度估计器的查询代价过高的问题,认为实际系统的API不会允许你查询太多次,于是大家都限制自己在有限的查询次数下做性能的比较然后追求SOTA,这方面的论文我看得不太多,印象最深刻的是这篇[29]。
之后就有许多搞优化的朋友进场表演了。上面提到的所有替代损失,不管是用 first-order算法 还是用 zeroth-order算法 做优化,都存在一个可以改进的地方,就是加速。当然许多搞优化的文章只是把对抗样本问题作为一个小应用以证明自己存在的意义。同时也有些优化文章专门做对抗攻击,比如[30]和[31]。这方面的文章我看得也不太多。
度量函数
这其实是一个最本质的问题,也是一个最难搞的东西。
革命尚未成功,同志仍需努力!
4 增强模型对抗鲁棒性
黑客寻找对抗样本的目的是去攻击模型;而白客的目的是修补漏洞。
(红客的目的是啥?
白客通常有两种防御方法:一种是发现有人攻击漏洞了就阻止这个人进入系统;另一种是尽量修补已知的漏洞。
对应到对抗鲁棒性这里,就是两种策略:1、设计检测方法,检测到对抗样本后拒绝分类;2、真正增加模型鲁棒性,使模型正确分类对抗样本。
这里先讲讲第二个策略——增强模型鲁棒性。
这里本质上最有效的方法就是 Madry 等人在 ICLR 2018 上的那篇非常 seminal 的论文《Towards Deep Learning Models Resistant to Adversarial Attacks》。近三年大浪淘沙后剩下的有效的鲁棒化方法大都是它的变种。
它在经验风险最小化问题的基础上,增加了一个内部的敌手,变成了一个 min-max 问题:
上式实际上是一个经典的鲁棒优化问题(Robust Optimization),同时在机器学习里也被称作对抗训练(Adversarial Training)。上面这个需要被最小化的期望值也被称为对抗风险(adversarial risk),与之对应的传统的风险被称为自然风险(natural risk)。
把对抗样本加入到训练集中以提高模型鲁棒性在2017年9月ICLR 2018投稿时已经不是什么新鲜玩意了,但当时大部分人还是在用FGSM生成的对抗样本来做对抗训练,Madry等人最大的贡献是正本清源,从鲁棒优化的角度告诉大家,我们应该用PGD,而且对于这个非凸的问题,我们应该多次随机初始化以寻找更好的局部极值点。
在Madry等人那篇文章受到重视之前,大量论文在使用FGSM做对抗训练,这种方式只能使模型对FGSM攻击鲁棒,而C&W和PGD之类的迭代攻击依旧能够成功找到许多对抗样本。对此,最先用FGSM做对抗训练的Goodfellow也很头疼,他曾在twitter上表示:“When I invented adversarial training as a defense against adversarial examples, I focused on making it as cheap and scalable as possible.”[48]
鲁棒优化是个min-max问题,如果我们用10-steps的PGD做对抗训练,那么我们的训练代价就是普通训练的10倍以上。对于MNIST这种数据集比较无所谓,对于CIFAR-10就有点吃力(e.g. 在V100上用Wide-ResNet-28-10搞一个PGD-10的对抗训练需要24~40个小时),对于ImageNet一般实验室就受不了了。Kaiming He等人曾经用128块V100在ImageNet上做对抗训练,一个ResNet-101需要38 hours,一个ResNet-152需要52 hours[49]。
所以后来就有些论文在思考怎样减少对抗训练的计算代价了。NeurIPS 2019同时收了两篇通过玩弄做PGD时的梯度流来减少计算量:一篇是《Adversarial Training for Free!》[50],另一篇是Yiping Lu大佬等人的《You Only Propagate Once》[51]。ICLR 2020出了篇改进 FGSM-based adversarial training 的[52],深得Goodfellow欢心[48]。后面还有篇利用对抗样本在epoch之间的迁移性质来减少计算量[53]。但这些加速对抗训练的方法或多或少都会对模型性能造成负面影响,且在推广到较大规模数据集和较大扰动幅度上可能存在困难。
5 对抗鲁棒性问题导致的攻防竞赛现象
上文提到的原始的基于FGSM的对抗训练作为一种防御方法,之后被更强大的迭代式的攻击方法击破,后来基于PGD的对抗训练的防御方法又进一步增强了模型的鲁棒性。这是最淳朴的攻防竞赛。
然而,由于敌手的攻击大部分都严重依赖模型的梯度,许多花里胡哨的被称为混淆梯度(Obfuscated Gradients)的防御方法被提出。这些防御方法的作者有意或无意地使得分类器的梯度信息无效,从而使得基于梯度的攻击方法失效。
比如在模型中添加不可微结构,引入数值不稳定性质,随机化模型中的部分组件,把输入先进行随机变换后再送入网络,将网络的输出作为输入多次循环迭代以造成梯度爆炸或消失等。
从安全性的角度来看,这样的技巧是有一定意义的。但从鲁棒性上看,这样的技巧并不能真正解决漏洞。它们只是让基于梯度的敌手找不到对抗样本,但漏洞本身还是存在,可能会有别的敌手能够找到。
2017年,Carlini和Wagner宣布大名鼎鼎的混淆梯度方法 defensive distillation 无效[20]。
2018年,Athalye、Carlini和Wagner在ICML 2018上深刻总结并抨击了混淆梯度,并且一举攻破了7个发表在ICLR 2018上的防御方法,只有Madry那篇基于PGD的对抗训练无法击破,该论文直接拿下ICML 2018 Best Paper Awards,名声大噪[54]。
在这之前,许多防御方法提出防御策略,而并没有设计对应的适应性的攻击方法来评估防御策略的有效性。这给社区带来的是虚假的安全感。Athalye、Carlini和Wagner击破了这种虚假的安全感,树立了自己的地位。
在2018年之后,又有许多防御方法被提出,这些论文大都吸取了教训,在方法评估部分设计了适应性的攻击方法来测试模型鲁棒性。但有时,有意或无意,这些自我评估还是不可靠。
2020年1月,Carlini等人放了篇《On Adaptive Attacks to Adversarial Example Defenses》在arxiv上,他们以示范性和教育性的目的,在文中列举了13个最近发表在ICLR、ICML和NeurIPS上的防御方法,并教人如何正确地评估这些方法。他们展示了如何规避这13篇论文里提出的防御方法,并且证明这些模型的鲁棒精度远远低于他们原始论文里所宣称的精度。
这是一篇爽文,怼天怼地怼空气。比方说,一篇发表在ICLR 2020上名为 k-Winners Take All 的防御方法[55],被Carlini等人评价为“the existence of such a defense would go against common wisdom”[56],因为大佬们在ICML 2018就说了,这种混淆梯度形式的方法有根本性的缺陷,而这篇论文还在故意设计混淆梯度。
但有一说一,这篇论文本身还挺好玩的,你看它做了个啥事就知道了:
基于梯度的攻击过程的损失曲面(Loss Landscape)。第一张和第二张图使用了 k-Winners Take All技巧,第三张和第四张是正常模型的结果。
可以看出,k-Winners Take All技巧把 loss 对 input space 的 loss landscape 从比较光滑变成了极度扭曲的形状。从而造成了非常严重的混淆梯度现象。
好玩但是漏洞依然存在。
另外,有一系列防御工作是去尽可能检测对抗样本。最开始是直接训练一个二分类器去判断是干净样本还是对抗样本。而这个二分类器本身就是不鲁棒的,所以没啥用。也有些工作提出某些统计量来做检测。Carlini和Wagner也有篇工作专门攻破这些基于检测的防御方法[57]。后来可能有的检测器把握了问题本质,似乎有效,至少目前还没人来锤它[58]。
但无论如何,对抗样本和干净样本对人来说区别不大,甚至有时人眼都无法区分出哪个是对抗图片。而基于检测的防御方法要去做这件对人来说反直觉的事,我个人不太偏好。而且就算检测出来了,只能做拒绝,还是无法做分类识别,鲁棒的分类器还是无法实现。
6 深度学习为何不鲁棒?
传统的基于经验风险最小化的神经网络为何不鲁棒?为何需要对抗训练才能使其鲁棒?为什么越鲁棒的模型,在干净测试集上的精度反而越低[59]?
有许多论文对此进行了解释,其中我认为最接近本质的是 Madry等人的这篇《Adversarial Examples Are Not Bugs, They Are Features》[60]。
对抗样本不是缺陷,而是特征。对抗脆弱性是我们的模型对数据里易于泛化的特征过于敏感的直接结果。这里的易于泛化的特征,我们可以把它理解为隐藏在图片像素里的某些模式(pattern)。
实验表明,在一个鲁棒的数据集上普通地训练一个模型,能得到良好的标准精度和鲁棒精度;而在一个不鲁棒的数据集上普通训练的模型,能有良好的标准精度但是不鲁棒。
对抗鲁棒性揭示了深度学习与人类的差异之处。我们接下来要做的,是把更多的人类先验(human priors)编码到模型的训练过程之中。我们需要的不是对某一种特定的扰动邻域过分鲁棒的分类器,除非这个扰动邻域与人类的距离感知一致[15]。我们需要的是像人一样的分类器,以实现我们最远大的理想——训练分类器帮我们做事然后安心地躺着喝咖啡。
人类是鲁棒的吗?
前面批判了这么久深度神经网络,现在来批判一下我们人类自己。
就图像分类任务来说,我们人类当然是最鲁棒的,因为在这个任务下,我们人类就是 Oracle 啊,所有的模型都是学习我们人类的标注,模型如果与人类的表现不一致,那一定是模型错了,人不会错。
人真的不会错吗?这里有两个例子,都来自纪录片《深入大脑》[62]。
第一个例子是一个心理视觉实验,人受到参照物的影响,对色块的颜色产生了误判。
Color Illusion
https://www.zhihu.com/zvideo/1284242038373048320
第二个例子是一个简单实验,利用穿颅磁刺激技术(TMS)干扰人的决策:举起左手或举起右手。TMS是在无需手术的情况下,在脑皮质以电流刺激特定区域,它可以用来引发非自主动作。
穿颅磁刺激技术(TMS)干扰人脑的决策
https://www.zhihu.com/zvideo/1284242655015063552
这两个例子都表明,即使是我们人类自身,也存在某些扰动,能够干扰甚至操纵我们的决策。
事实上,在 NeurIPS 2018 就有一篇论文分析了人类的对抗鲁棒性——《Adversarial Examples that Fool both Computer Vision and Time-Limited Humans》[63]。 它通过限制人类做分类任务时决策的可用时长(60ms ~ 70ms),把人类变成一个严格受时间限制的分类器。然后让受时间限制的人类来分类对抗样本,这里的对抗样本是针对深度神经网络分类器生成的,对抗扰动幅度很小,故样本的标签并没有改变。在实验中,这种情形下的人类也可能会被对抗样本成功攻击,即人类的分类准确率降低了。
该论文对此现象的解释是,人脑通常依靠横向的和自上而下的脑回路做决策。如果人脑的视觉输入刺激的时间过短,人脑分类器就变成了一个前向传播的神经网络,这种脑子的鲁棒性不太好。这能够一定程度上启发未来我们对深度网络架构的设计。
7 对抗鲁棒性带来的额外益处
对抗训练可以增加模型在测试集上的鲁棒精度(即分类对抗样本的准确率)。通过让模型对人类不敏感的信号不敏感,鲁棒的训练目标可能会使得模型学习到更类似我们人脑使用的特征表示。
这种与人类感知更相符的特征表示,会有一些额外的益处。
可解释性:鲁棒模型对输入的梯度比普通模型更加有意义[64][65][66]。
2. 图像合成:利用一个鲁棒的分类器可以做许多从前只有生成模型可以做的图像合成任务[67][68][69]。
3. 异常检测:对抗鲁棒性可以增加异常检测的性能[70][71]。
4. 迁移学习:对抗鲁棒的预训练模型迁移到新任务时具有更好的性能[72][73][74]。
- What's next? Continual learning? Zero-shot learning? Open-set learning? Noisy label?
8 大厦已然建成?
近几年随着社区不断的努力,模型鲁棒性问题得到了深入的理解。我们刻画了对抗攻击的max问题,对抗训练的min-max问题,得到了许多toy任务在理论上的结论,对许多大规模数据集也做了大量的实验分析,我们的对抗攻击和对抗训练也被扩展到了其它机器学习模型和任务上:目标检测、分割、跟踪,自然语言处理,语音识别,图数据,医疗影像分析,行人重识别,度量学习,最近邻模型,决策树等等。
似乎对抗鲁棒性的大厦已经建成,剩下的只有修修补补的工作。
但实际上,剩下的是难摘的果实。
前文提到的距离度量问题是一个,对抗鲁棒性的泛化性能问题也是一个。
事实上,在鲁棒优化框架下,MNIST的性能还说得过去,但到CIFAR-10上就只有可怜的50%~70%的鲁棒分类精度,ImageNet就更别提了。非常多的工作在想方设法地提高泛化能力,比如加正则化项、修改模型结构、更改损失函数、利用未标注的数据等等。效果都差强人意,真正有效的改进能把CIFAR-10的鲁棒精度稳定提升一两个点已经是不错的工作了。
有人可能期望更多的训练数据和更大的深度网络能够解决问题。但问题是,究竟需要多大的数据集、多大的模型才能让我们对模型鲁棒性满意?如果现有的深度学习范式下模型的鲁棒性能对样本数量和模型复杂度的依赖是类似于指数爆炸的呢?解决鲁棒性问题需要新的思想,我们依然任重而道远[75]。
#AI~N篇论文1
N 篇论文分方向整理|检测、分割、人脸、视频处理、医学影像、神经网络结构、小样本学习等方向
- 检测 - 分割 - 视频处理 - 估计 - 人脸 - 目标跟踪 - 图像&视频检索/视频理解 - 医学影像 - GAN/生成式/对抗式 - 图像生成/图像合成 - 神经网络结构设计 - 数据处理 - 模型训练/泛化 - 图像特征提取与匹配 - 视觉表征学习 - 模型评估 - 多模态学习 - 视觉预测 - 数据集 - 小样本学习/零样本学习 - 持续学习 - 迁移学习/domain/自适应 - 场景图 - 视觉定位/位姿估计 - 视觉推理/视觉问答 - 对比学习 - 强化学习 - 机器人 - 半监督学习/弱监督学习/无监督学习/自监督学习 - 其他
检测2D 目标检测(2D Object Detection)
[1]Object-Aware Distillation Pyramid for Open-Vocabulary Object Detection paper:https://arxiv.org/abs/2303.05892
3D 目标检测(3D object detection)
[1]Bi3D: Bi-domain Active Learning for Cross-domain 3D Object Detection paper:https://arxiv.org/abs/2303.05886
[2]PiMAE: Point Cloud and Image Interactive Masked Autoencoders for 3D Object Detection paper:https://arxiv.org/abs/2303.08129 code:https://github.com/blvlab/pimae
[3]MSF: Motion-guided Sequential Fusion for Efficient 3D Object Detection from Point Cloud Sequences
paper:https://arxiv.org/abs/2303.08316
[4]CAPE: Camera View Position Embedding for Multi-View 3D Object Detection paper:https://arxiv.org/abs/2303.10209 code:https://github.com/PaddlePaddle/Paddle3D
[5]Weakly Supervised Monocular 3D Object Detection using Multi-View Projection and Direction Consistency paper:https://arxiv.org/abs/2303.08686)
[6]AeDet: Azimuth-invariant Multi-view 3D Object Detection paper:https://arxiv.org/abs/2211.12501 code:https://github.com/fcjian/AeDet
异常检测(Anomaly Detection)
[1]DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly Detection paper:https://arxiv.org/abs/2211.11317
分割全景分割(Panoptic Segmentation)
[1]UniDAformer: Unified Domain Adaptive Panoptic Segmentation Transformer via Hierarchical Mask Calibration paper:https://arxiv.org/abs/2206.15083
语义分割(Semantic Segmentation)
[1]MSeg3D: Multi-modal 3D Semantic Segmentation for Autonomous Driving paper:https://arxiv.org/abs/2303.08600 code:https://github.com/jialeli1/lidarseg3d
[2]Side Adapter Network for Open-Vocabulary Semantic Segmentation paper:https://arxiv.org/abs/2302.12242 code:https://github.com/mendelxu/san
[3]Multi-view Inverse Rendering for Large-scale Real-world Indoor Scenes paper:https://arxiv.org/abs/2211.10206
实例分割(Instance Segmentation)
[1]FastInst: A Simple Query-Based Model for Real-Time Instance Segmentation paper:https://arxiv.org/abs/2303.08594
[2]SIM: Semantic-aware Instance Mask Generation for Box-Supervised Instance Segmentation paper:https://arxiv.org/abs/2303.08578 code:https://github.com/lslrh/sim
[3]DynaMask: Dynamic Mask Selection for Instance Segmentation paper:https://arxiv.org/abs/2303.07868 code:https://github.com/lslrh/dynamask
视频目标分割(Video Object Segmentation)
[1]MobileVOS: Real-Time Video Object Segmentation Contrastive Learning meets Knowledge Distillation paper:https://arxiv.org/abs/2303.07815
[2]InstMove: Instance Motion for Object-centric Video Segmentation paper:https://arxiv.org/abs/2303.08132 code:https://github.com/wjf5203/vnext
[3]Unified Mask Embedding and Correspondence Learning for Self-Supervised Video Segmentation
paper:https://arxiv.org/abs/2303.10100
视频处理(Video Processing)
[1]MobileVOS: Real-Time Video Object Segmentation Contrastive Learning meets Knowledge Distillation paper:https://arxiv.org/abs/2303.07815
[2]InstMove: Instance Motion for Object-centric Video Segmentation paper:https://arxiv.org/abs/2303.08132 code:https://github.com/wjf5203/vnext
[3]Video Dehazing via a Multi-Range Temporal Alignment Network with Physical Prior paper:https://arxiv.org/abs/2303.09757 code:https://github.com/jiaqixuac/map-net
[4]Blind Video Deflickering by Neural Filtering with a Flawed Atlas paper:https://arxiv.org/abs/2303.08120 code:https://github.com/chenyanglei/all-in-one-deflicker
视频生成/视频合成(Video Generation/Video Synthesis)
[1]3D Cinemagraphy from a Single Image paper:https://arxiv.org/abs/2303.05724
[2]VideoFusion: Decomposed Diffusion Models for High-Quality Video Generation paper:https://arxiv.org/abs/2303.08320 code:https://github.com/modelscope/modelscope
视频超分(Video Super-Resolution)
[1]Towards High-Quality and Efficient Video Super-Resolution via Spatial-Temporal Data Overfitting paper:https://arxiv.org/abs/2303.08331
估计光流/运动估计(Optical Flow/Motion Estimation)
[1]Rethinking Optical Flow from Geometric Matching Consistent Perspective paper:https://arxiv.org/abs/2303.08384 code:https://github.com/dqiaole/matchflow
深度估计(Depth Estimation)
[1]Fully Self-Supervised Depth Estimation from Defocus Clue paper:https://arxiv.org/abs/2303.10752 code:https://github.com/ehzoahis/dered
人体解析/人体姿态估计(Human Parsing/Human Pose Estimation)
[1]Mutual Information-Based Temporal Difference Learning for Human Pose Estimation in Video paper:https://arxiv.org/abs/2303.08475
[2]Markerless Camera-to-Robot Pose Estimation via Self-supervised Sim-to-Real Transfer paper:https://arxiv.org/abs/2302.14338
手势估计(Gesture Estimation)
[1]CVT-SLR: Contrastive Visual-Textual Transformation for Sign Language Recognition with Variational Alignment paper:https://arxiv.org/abs/2303.05725 code:https://arxiv.org/abs/2303.05725
图像处理
[1]DeltaEdit: Exploring Text-free Training for Text-Driven Image Manipulation paper:https://arxiv.org/abs/2303.06285 code:https://github.com/yueming6568/deltaedit
图像复原/图像增强/图像重建(Image Restoration/Image Reconstruction)
[1]Contrastive Semi-supervised Learning for Underwater Image Restoration via Reliable Bank paper:https://arxiv.org/abs/2303.09101 code:https://github.com/huang-shirui/semi-uir
[1]ACR: Attention Collaboration-based Regressor for Arbitrary Two-Hand Reconstruction paper:https://arxiv.org/abs/2303.05938 code:https://github.com/zhengdiyu/arbitrary-hands-3d-reconstruction
风格迁移(Style Transfer)
[1]StyleRF: Zero-shot 3D Style Transfer of Neural Radiance Fields paper:https://arxiv.org/abs/2303.10598
[2]Fix the Noise: Disentangling Source Feature for Transfer Learning of StyleGAN paper:https://arxiv.org/abs/2204.14079 code:https://github.com/LeeDongYeun/FixNoise
人脸人脸识别/检测(Facial Recognition/Detection)
[1]Local Region Perception and Relationship Learning Combined with Feature Fusion for Facial Action Unit Detection paper:https://arxiv.org/abs/2303.08545
[2]Multi Modal Facial Expression Recognition with Transformer-Based Fusion Networks and Dynamic Sampling paper:https://arxiv.org/abs/2303.08419
人脸生成/合成/重建/编辑(Face Generation/Face Synthesis/Face Reconstruction/Face Editing)
[1]Robust Model-based Face Reconstruction through Weakly-Supervised Outlier Segmentation paper:https://arxiv.org/abs/2106.09614 code:https://github.com/unibas-gravis/Occlusion-Robust-MoFA
目标跟踪(Object Tracking)
[1]MotionTrack: Learning Robust Short-term and Long-term Motions for Multi-Object Tracking paper:https://arxiv.org/abs/2303.10404
[2]Visual Prompt Multi-Modal Tracking paper:https://arxiv.org/abs/2303.10826 code:https://github.com/jiawen-zhu/vipt
图像&视频检索/视频理解(Image&Video Retrieval/Video Understanding)
[1]Data-Free Sketch-Based Image Retrieval paper:https://arxiv.org/abs/2303.07775
[2]DAA: A Delta Age AdaIN operation for age estimation via binary code transformer paper:https://arxiv.org/abs/2303.07929
[3]Dual-path Adaptation from Image to Video Transformers paper:https://arxiv.org/abs/2303.09857 code:https://github.com/park-jungin/dualpath
图像/视频字幕(Image/Video Caption)
[1]Dual-Stream Transformer for Generic Event Boundary Captioning paper:https://arxiv.org/abs/2207.03038 code:https://github.com/gx77/dual-stream-transformer-for-generic-event-boundary-captioning
行为识别/动作识别/检测/分割/定位(Action/Activity Recognition)
[1]Video Test-Time Adaptation for Action Recognition paper:https://arxiv.org/abs/2211.15393
行人重识别/检测(Re-Identification/Detection)
[1]TranSG: Transformer-Based Skeleton Graph Prototype Contrastive Learning with Structure-Trajectory Prompted Reconstruction for Person Re-Identification paper:https://arxiv.org/abs/2303.06819 code:https://github.com/kali-hac/transg
医学影像(Medical Imaging)
[1]Neuron Structure Modeling for Generalizable Remote Physiological Measurement paper:https://arxiv.org/abs/2303.05955 code:https://github.com/lupaopao/nest
[2]Unsupervised Contour Tracking of Live Cells by Mechanical and Cycle Consistency Losses paper:https://arxiv.org/abs/2303.08364 code:https://github.com/junbongjang/contour-tracking
[3]Task-specific Fine-tuning via Variational Information Bottleneck for Weakly-supervised Pathology Whole Slide Image Classification paper:https://arxiv.org/abs/2303.08446
GAN/生成式/对抗式(GAN/Generative/Adversarial)
[2]Graph Transformer GANs for Graph-Constrained House Generation paper:https://arxiv.org/abs/2303.08225
[1]Cross-GAN Auditing: Unsupervised Identification of Attribute Level Similarities and Differences between Pretrained Generative Models paper:https://arxiv.org/abs/2303.10774
图像生成/图像合成(Image Generation/Image Synthesis)
[1]3DQD: Generalized Deep 3D Shape Prior via Part-Discretized Diffusion Process paper:https://arxiv.org/abs/2303.10406 code:https://github.com/colorful-liyu/3dqd
[2]A Dynamic Multi-Scale Voxel Flow Network for Video Prediction paper:https://arxiv.org/abs/2303.09875 code:https://github.com/megvii-research/CVPR2023-DMVFN
[3]Regularized Vector Quantization for Tokenized Image Synthesis paper:https://arxiv.org/abs/2303.06424
三维视觉点云(Point Cloud)
[1]Controllable Mesh Generation Through Sparse Latent Point Diffusion Models paper:https://arxiv.org/abs/2303.07938
[2]Parameter is Not All You Need: Starting from Non-Parametric Networks for 3D Point Cloud Analysis paper:https://arxiv.org/abs/2303.08134 code:https://github.com/zrrskywalker/point-nn
[3]Rotation-Invariant Transformer for Point Cloud Matching paper:https://arxiv.org/abs/2303.08231
[4]Deep Graph-based Spatial Consistency for Robust Non-rigid Point Cloud Registration paper:https://arxiv.org/abs/2303.09950 code:https://github.com/qinzheng93/graphscnet
三维重建(3D Reconstruction)
[1]Masked Wavelet Representation for Compact Neural Radiance Fields paper:https://arxiv.org/abs/2212.09069
[2]Decoupling Human and Camera Motion from Videos in the Wild paper:https://arxiv.org/abs/2302.12827
[3]Structural Multiplane Image: Bridging Neural View Synthesis and 3D Reconstruction paper:https://arxiv.org/abs/2303.05937
[4]NEF: Neural Edge Fields for 3D Parametric Curve Reconstruction from Multi-view Images paper:https://arxiv.org/abs/2303.07653
[5]PartNeRF: Generating Part-Aware Editable 3D Shapes without 3D Supervision paper:https://arxiv.org/abs/2303.09554
[6]SDFusion: Multimodal 3D Shape Completion, Reconstruction, and Generation paper:https://arxiv.org/abs/2212.04493 code:https://github.com/yccyenchicheng/SDFusion
场景重建/视图合成/新视角合成(Novel View Synthesis)
[1]Robust Dynamic Radiance Fields paper:https://arxiv.org/abs/2301.02239
[2]I2-SDF: Intrinsic Indoor Scene Reconstruction and Editing via Raytracing in Neural SDFs paper:https://arxiv.org/abs/2303.07634
[3]MobileNeRF: Exploiting the Polygon Rasterization Pipeline for Efficient Neural Field Rendering on Mobile Architectures paper:https://arxiv.org/abs/2208.00277 code:https://github.com/google-research/jax3d
神经网络结构设计(Neural Network Structure Design)
[1]LargeKernel3D: Scaling up Kernels in 3D Sparse CNNs paper:https://arxiv.org/abs/2206.10555 code:https://github.com/dvlab-research/largekernel3d
CNN
[1]Randomized Adversarial Training via Taylor Expansion paper:https://arxiv.org/abs/2303.10653 code:https://github.com/alexkael/randomized-adversarial-training
[2]Alias-Free Convnets: Fractional Shift Invariance via Polynomial Activations paper:https://arxiv.org/abs/2303.08085 code:https://github.com/hmichaeli/alias_free_convnets
Transformer
[1]BiFormer: Vision Transformer with Bi-Level Routing Attention paper:https://arxiv.org/abs/2303.08810 code:https://github.com/rayleizhu/biformer
[2]Making Vision Transformers Efficient from A Token Sparsification View
paper:https://arxiv.org/abs/2303.08685
图神经网络(GNN)
[1]Turning Strengths into Weaknesses: A Certified Robustness Inspired Attack Framework against Graph Neural Networks paper:https://arxiv.org/abs/2303.06199
数据处理
[1]TINC: Tree-structured Implicit Neural Compression paper:https://arxiv.org/abs/2211.06689 code:https://github.com/richealyoung/tinc
图像聚类(Image Clustering)
[1]On the Effects of Self-supervision and Contrastive Alignment in Deep Multi-view Clustering paper:https://arxiv.org/abs/2303.09877 code:https://github.com/danieltrosten/deepmvc
模型训练/泛化(Model Training/Generalization)
[1]HumanBench: Towards General Human-centric Perception with Projector Assisted Pretraining paper:https://arxiv.org/abs/2303.05675
[2]Universal Instance Perception as Object Discovery and Retrieval paper:https://arxiv.org/abs/2303.06674 code:https://github.com/MasterBin-IIAU/UNINEXT
[3]Sharpness-Aware Gradient Matching for Domain Generalization paper:https://arxiv.org/abs/2303.10353 code:https://github.com/wang-pengfei/sagm
图像特征提取与匹配(Image feature extraction and matching)
[2]Iterative Geometry Encoding Volume for Stereo Matching paper:https://arxiv.org/abs/2303.06615 code:https://github.com/gangweix/igev
[1]Referring Image Matting paper:https://arxiv.org/abs/2206.05149 code:https://github.com/jizhizili/rim
视觉表征学习(Visual Representation Learning)
[1]MARLIN: Masked Autoencoder for facial video Representation LearnINg paper:https://arxiv.org/abs/2211.06627 code:https://github.com/ControlNet/MARLIN
模型评估(Model Evaluation)
[1]TrojDiff: Trojan Attacks on Diffusion Models with Diverse Targets paper:https://arxiv.org/abs/2303.05762 code:https://github.com/chenweixin107/trojdiff
多模态学习(Multi-Modal Learning)
[1]Mutilmodal Feature Extraction and Attention-based Fusion for Emotion Estimation in Videos paper:https://arxiv.org/abs/2303.10421 code:https://github.com/xkwangcn/abaw-5th-rt-iai
[2]Emotional Reaction Intensity Estimation Based on Multimodal Data paper:https://arxiv.org/abs/2303.09167
[3]Multimodal Feature Extraction and Fusion for Emotional Reaction Intensity Estimation and Expression Classification in Videos with Transformers paper:https://arxiv.org/abs/2303.09164
[4]Understanding and Constructing Latent Modality Structures in Multi-modal Representation Learning paper:https://arxiv.org/abs/2303.05952
视听学习(Audio-visual Learning)
[1]Watch or Listen: Robust Audio-Visual Speech Recognition with Visual Corruption Modeling and Reliability Scoring paper:https://arxiv.org/abs/2303.08536 code:https://github.com/joannahong/av-relscore
[2]CASP-Net: Rethinking Video Saliency Prediction from an Audio-VisualConsistency Perceptual Perspective
paper:https://arxiv.org/abs/2303.06357
code:https://arxiv.org/abs/2303.06357
视觉-语言(Vision-language)
[1]Lana: A Language-Capable Navigator for Instruction Following and Generation paper:https://arxiv.org/abs/2303.08409 code:https://github.com/wxh1996/lana-vln
视觉预测(Vision-based Prediction)
[1]TBP-Former: Learning Temporal Bird's-Eye-View Pyramid for Joint Perception and Prediction in Vision-Centric Autonomous Driving paper:https://arxiv.org/abs/2303.09998
数据集(Dataset)
[1]A Whac-A-Mole Dilemma: Shortcuts Come in Multiples Where Mitigating One Amplifies Others paper:https://arxiv.org/abs/2212.04825 code:https://github.com/facebookresearch/Whac-A-Mole
[2]MVImgNet: A Large-scale Dataset of Multi-view Images paper:https://arxiv.org/abs/2303.06042
[3]SLOPER4D: A Scene-Aware Dataset for Global 4D Human Pose Estimation in Urban Environments paper:https://arxiv.org/abs/2303.09095 code:https://github.com/climbingdaily/SLOPER4D
[4]A Whac-A-Mole Dilemma: Shortcuts Come in Multiples Where Mitigating One Amplifies Others paper:https://arxiv.org/abs/2212.04825 code:https://github.com/facebookresearch/Whac-A-Mole
[5]MVImgNet: A Large-scale Dataset of Multi-view Images paper:https://arxiv.org/abs/2303.06042
小样本学习/零样本学习(Few-shot Learning/Zero-shot Learning)
[1]DiGeo: Discriminative Geometry-Aware Learning for Generalized Few-Shot Object Detection paper:https://arxiv.org/abs/2303.09674 code:https://github.com/phoenix-v/digeo
[2]Hubs and Hyperspheres: Reducing Hubness and Improving Transductive Few-shot Learning with Hyperspherical Embeddings paper:https://arxiv.org/abs/2303.09352 code:https://github.com/uitml/nohub
[3]Bi-directional Distribution Alignment for Transductive Zero-Shot Learning paper:https://arxiv.org/abs/2303.08698 code:https://github.com/zhicaiwww/bi-vaegan
持续学习(Continual Learning/Life-long Learning)
[1]Achieving a Better Stability-Plasticity Trade-off via Auxiliary Networks in Continual Learning paper:https://arxiv.org/abs/2303.09483 code:https://github.com/kim-sanghwan/ancl
迁移学习/domain/自适应(Transfer Learning/Domain Adaptation)
[1]Trainable Projected Gradient Method for Robust Fine-tuning paper:https://arxiv.org/abs/2303.10720
[2]DA-DETR: Domain Adaptive Detection Transformer with Information Fusion paper:https://arxiv.org/abs/2103.17084
[3]Instance Relation Graph Guided Source-Free Domain Adaptive Object Detection paper:https://arxiv.org/abs/2203.15793 code:https://github.com/vibashan/irg-sfda
[4]Instance Relation Graph Guided Source-Free Domain Adaptive Object Detection paper:https://arxiv.org/abs/2203.15793 code:https://github.com/vibashan/irg-sfda
场景图场景图理解(Scene Graph Understanding)
[1]PLA: Language-Driven Open-Vocabulary 3D Scene Understanding paper:https://arxiv.org/abs/2211.16312 code:https://github.com/cvmi-lab/pla
视觉定位/位姿估计(Visual Localization/Pose Estimation)
[1]PSVT: End-to-End Multi-person 3D Pose and Shape Estimation with Progressive Video Transformers paper:https://arxiv.org/abs/2303.09187
[2]StructVPR: Distill Structural Knowledge with Weighting Samples for Visual Place Recognition paper:https://arxiv.org/abs/2212.00937
视觉推理/视觉问答(Visual Reasoning/VQA)
[1]Divide and Conquer: Answering Questions with Object Factorization and Compositional Reasoning paper:https://arxiv.org/abs/2303.10482 code:https://github.com/szzexpoi/poem
[2]Generative Bias for Robust Visual Question Answering paper:https://arxiv.org/abs/2208.00690
对比学习(Contrastive Learning)
[1]Dynamic Graph Enhanced Contrastive Learning for Chest X-ray Report Generation paper:https://arxiv.org/abs/2303.10323 code:https://github.com/mlii0117/dcl
强化学习(Reinforcement Learning)
[1]EqMotion: Equivariant Multi-agent Motion Prediction with Invariant Interaction Reasoning paper:https://arxiv.org/abs/2303.10876 code:https://github.com/mediabrain-sjtu/eqmotion
机器人(Robotic)
[1]Efficient Map Sparsification Based on 2D and 3D Discretized Grids paper:https://arxiv.org/abs/2303.10882
半监督学习/弱监督学习/无监督学习/自监督学习(Self-supervised Learning/Semi-supervised Learning)
[1]Extracting Class Activation Maps from Non-Discriminative Features as well paper:https://arxiv.org/abs/2303.10334 code:https://github.com/zhaozhengchen/lpcam
[2]TeSLA: Test-Time Self-Learning With Automatic Adversarial Augmentation
paper:https://arxiv.org/abs/2303.09870
code:https://github.com/devavrattomar/tesla
[3]LOCATE: Localize and Transfer Object Parts for Weakly Supervised Affordance Grounding paper:https://arxiv.org/abs/2303.09665
[4]MixTeacher: Mining Promising Labels with Mixed Scale Teacher for Semi-Supervised Object Detection paper:https://arxiv.org/abs/2303.09061 code:https://github.com/lliuz/mixteacher
[5]Semi-supervised Hand Appearance Recovery via Structure Disentanglement and Dual Adversarial Discrimination paper:https://arxiv.org/abs/2303.06380
[6]Non-Contrastive Unsupervised Learning of Physiological Signals from Video paper:https://arxiv.org/abs/2303.07944
其他
[1]Facial Affective Analysis based on MAE and Multi-modal Information for 5th ABAW Competition paper:https://arxiv.org/abs/2303.10849
[2]Partial Network Cloning paper:https://arxiv.org/abs/2303.10597 code:https://github.com/jngwenye/pncloning
[3]Uncertainty-Aware Optimal Transport for Semantically Coherent Out-of-Distribution Detection paper:https://arxiv.org/abs/2303.10449 code:https://github.com/lufan31/et-ood
[4]Adversarial Counterfactual Visual Explanations paper:https://arxiv.org/abs/2303.09962 code:https://github.com/guillaumejs2403/ace
[5]A New Benchmark: On the Utility of Synthetic Data with Blender for Bare Supervised Learning and Downstream Domain Adaptation paper:https://arxiv.org/abs/2303.09165 code:https://github.com/huitangtang/on_the_utility_of_synthetic_data
[6]Taming Diffusion Models for Audio-Driven Co-Speech Gesture Generation paper:https://arxiv.org/abs/2303.09119 code:https://github.com/advocate99/diffgesture
[7]Skinned Motion Retargeting with Residual Perception of Motion Semantics & Geometry paper:https://arxiv.org/abs/2303.08658 code:https://github.com/kebii/r2et
[8]Towards Compositional Adversarial Robustness: Generalizing Adversarial Training to Composite Semantic Perturbations paper:https://arxiv.org/abs/2202.04235 code:https://github.com/twweeb/composite-adv
[9]Backdoor Defense via Deconfounded Representation Learning paper:https://arxiv.org/abs/2303.06818 code:https://github.com/zaixizhang/cbd
[10]Label Information Bottleneck for Label Enhancement paper:https://arxiv.org/abs/2303.06836
[11]LayoutDM: Discrete Diffusion Model for Controllable Layout Generation paper:https://arxiv.org/abs/2303.08137 code:https://github.com/CyberAgentAILab/layout-dm
[12]Diversity-Aware Meta Visual Prompting paper:https://arxiv.org/abs/2303.08138 code:https://github.com/shikiw/dam-vp
#IDGE~
对于每一位热爱打游戏的人而言,都曾经想过这样一个问题,「这游戏要是我来做就好了!」
可惜的是,游戏开发有很高的门槛,需要专业的编程技巧。
近日,来自上海交大的团队开展了一个名为「Instruction-Driven Game Engine, IDGE」的项目,他们针对未来游戏的开发,提出了一个酷炫的新范式:利用自然语言指令开发游戏,玩家说怎么玩就怎么玩,让 UGC 贯穿于游戏的每个角落。
IDGE 顾名思义,是一个指令驱动型的新概念「游戏引擎」,它能够支持用户输入对游戏规则的自然语言描述,来自动生成一个「玩家专属」的游戏。
- 论文:https://arxiv.org/abs/2404.00276
- 代码:https://github.com/gingasan/idge
- Demo:https://www.bilibili.com/video/BV1dA4m1w7xr/?vd_source=e0570b35759018455d30551c1e16a676
- 论文标题:Instruction-Driven Game Engines on Large Language Models
概述
什么是 IDGE
游戏引擎是游戏开发的核心,传统意义上的游戏引擎由复杂的编程语言驱动。这种壁垒阻碍了游戏爱好者实现他们开发游戏的梦想。
文中提出的指令驱动游戏引擎 IDGE,让使用者只需提供一段自然语言的指令,就能设计出新的游戏,并基于该引擎进行游玩。这种指令作者称之为「游戏剧本(Game Script)」,它详细描绘了用户想要的游戏的全貌。
从对话模型到游戏引擎
IDGE 是一个基于大语言模型(LLM)的神经引擎,如今的对话式大语言模型,如 ChatGPT,能够通过一个 system prompt 来扮演各种角色,和用户进行对话交互。
传统的游戏引擎也可以被看作是一个精密版的交互系统。引擎根据玩家利用编程语言实现的游戏规则,在每次玩家进行了输入以后,都会计算一次最新的游戏状态,并且将最新状态渲染成游戏画面展示给玩家。对于 IDGE 来说,其主体流程与传统游戏引擎类似,但游戏规则是用自然语言描述而不是用编程语言编程实现,游戏状态的计算也由 LLM 推理得到。
以大家最熟悉的石头剪刀布为例,对于 IDGE 而言,我们实现游戏的方式是给定一段游戏剧本作为 system prompt:
现在玩一个名为石头剪刀布的游戏,两位玩家同时发出代表游戏元素的动作;石头、剪刀和布。游戏的结果由 3 个简单的规则决定:石头战胜剪刀;剪刀战胜布;布战胜石头。如果动作相同则进入下一轮游戏。
以下是一个实际游戏的例子:
IDGE:开始剪刀石头布,请出示你的动作
- player 1:剪刀 | player 2:剪刀 (player 1 2 发出动作阶段互相不可见)
IDGE:player 1 的动作是剪刀,player 2 的动作是剪刀,游戏继续,请出示你的动作
- player 1:剪刀 | player 2:石头 (player 1 2 发出动作阶段互相不可见)
IDGE:player 1 的动作是剪刀,player 2 的动作是石头,player 2 获胜,游戏结束
稳定性和多样性的双重挑战
乍一看,IDGE 的运作方式跟传统的对话模型是一样的,用户皆以多轮对话的形式和模型进行互动。但是,作者认为 IDGE 相比于普通的对话模型,会遇到两大挑战。
- 首先是稳定性(Stability)。相比于聊天,在游戏中,任何一个小问题就有可能导致整个游戏发生错乱,因此 IDGE 的预测追求 100% 的准确率。
- 其次是多样性(Diversity)。玩家群体十分庞大,涵盖不同年龄、性别、以及文化上的差异,它们对游戏的偏好截然不同,描述规则的语言也差异颇大。这意味着,IDGE 要理解高度多样的用户输入,同时保证游戏运行的稳定。
如何建模游戏引擎的任务
文章中,作者基于对游戏的理解,提出了一种全新任务,称为「Next State Prediction」。相比于自然语言,由一串字符(token)定义了一句完整的话,一局完整游戏由一系列游戏中状态(in-game state)组成,这些状态代表了游戏当前的所有信息。因此对于一个游戏引擎来说,它的任务就是,根据之前的游戏状态,预测下一个游戏状态。
然而一个游戏状态序列相比于字符序列要大得多,这很可能造成输入的溢出。针对这种情况,作者引入了独立性假设,即某一时刻的游戏内状态只和此前的 1 个有关,那么问题的求解就简化成了:
其中 z 为游戏剧本,对于一整局游戏来说是全局变量,x_t 是 t 时刻的玩家输入。
数据生成和数据定义
除了问题的建模,如何构造数据也是 IDGE 的核心问题。
本文以扑克牌游戏作为 IDGE 的第一个探索场景。在文中,作者通过一个扑克牌模拟程序,获取了大量的游戏日志,由此作为 IDGE 的数据来源。
游戏剧本
作者制定了一个结构化的剧本模板,如下图所示。通过填充相应的配置参数,表达不同的游戏。
可以看到,剧本支持 7 种主要的参数:玩家人数、底注、初始筹码、花色种类、单牌的大小排序、组合牌的大小排序、游戏流程。
除了结构化的描述,游戏剧本还包含了对某些特定游戏规则的自然语言描述,如上图中的「Specific Rules」所示,这里的描述要求引擎把手牌最小的玩家视作为赢家,和传统的德州扑克相反。自然语言的引入,大大增加了游戏剧本的多样性。
游戏内状态和玩家输入
作者设计了一套简洁高效的标准化语言,来表达扑克游戏中的每一个状态,如下图左侧。
上图为作者发布的游戏 Demo 的截图。左侧为实际游戏中引擎的游戏内状态,右侧为游戏界面。
如图所示,作者所设计的语言以 "|" 作为分割符,可以说非常地简洁了。
我们还可以看到,图中里玩家 1 输入了一条指令「Raise to 10!」,代表他要加注。因此下一个状态则变为了下面一张图,可以看到玩家 1 的筹码发生了变化,由 「0/1000」变为了「10/990」。此时引擎的输出也发生了变化,它让玩家 2 进行下注。
数据效率
除了生成数据,作者还强调了数据的效率问题。由于模拟器是一局一局游戏生成的,那么会造成的结果是,一些出现概率较低的情况会更低,导致数据不平衡。作者提到,这是引擎(engine)相比于智能体(agent)的一个重大区别:智能体通常遵循一组特定的策略,而引擎则尽可能地保证对所有可能的策略都是无偏的。
一个直观的例子就是扑克牌里的顺子,正常来说它出现的情况远远低于对子。那么在这样的数据上训练得到的引擎,会在对子上过拟合,而在顺子上欠拟合,即使训练数据量非常大。
针对这个问题,作者给出了一个简单的小技巧,即调整数据采样的比例,让所有情况尽可能地均衡。下图左侧为随机采样下各个牌组出现的频率直方图,对子和高牌要远远高于其它组合,而右侧为均衡之后的直方图。
训练方法
为了使模型兼备稳定性和多样性,作者提出了一种课程学习的方法。一次训练分为三个阶段。
预热(Warmup)
一个游戏引擎涵盖了多类型的任务,对于一个扑克引擎来说,它需要学会发牌、翻牌、换牌、下注等。一次性让模型去学习大量的子任务,会带来冷启动问题。因此,作者提出了一个预学习过程,即让模型先在一个称为「核心集」(Core Set, CS)的指令微调数据集上进行预学习。核心集里包含了各种各样的基本函数,为模型提供了一个良好的初始化。
作者提到,核心集的作用类似于传统计算机系统的工具库,为系统的上层功能提供支持。只不过不同的是,对于大语言模型来讲,这些工具都以指令的形式存在。
标准(Standard)
预热过后的第二阶段,即让模型在标准的引擎数据上进行微调。
多样(Diverse)
最后一个阶段也是最难的阶段,模型需要超越标准数据中的结构化游戏剧本,学习理解自然语言描述的剧本。相对于人工标注大量的自然语言剧本,作者提出了一种简单而高效的方法,称为「片段重述」(Segment Rephrasing, SR)。具体来说,随机采样剧本的某些片段,用 GPT3.5 以自然语言将其重述。相比于结构化,经过重述后的游戏剧本会具有更加丰富的语言表达,更加难以理解。
这一个过程作者还利用了一个小技巧,即在经过重述后的数据上训练的同时,采样一定比例的标准化数据,目的是减轻模型的灾难性遗忘。作者发现这有助于提高最终的稳定性。
以上三个阶段,预热、标准、多样,对应了课程学习的三种难度等级。从训练的角度来看,它对应着模型从标准化到指令化的迁移。
实验结果
作者选择了扑克牌作为测试的游戏,并设计了两部分的实验来验证 IDGE 的性能。
模拟器数据
第一部分测试数据来自于扑克牌模拟器。作者借助模拟器,生成了一组测试集,涵盖了总共 10 种扑克牌游戏的变体,分别是 Texas hold’em、5-card draw、Omaha、Short-deck hold’em、2-to-7 triple draw、A-to-5 triple draw、2-to-7 single draw、Badugi、Badeucey、以及 Badacey。
和常见的准确率不同的是,作者汇报的是每局游戏的成功率(sucess rate)。每一种类的游戏连续玩 20 局,如果一局游戏中引擎的预测全部正确,那么成功率就 + 1。结果如下:
结果证明,核心集的预热以及最后的重述,都十分利于模型的训练。
值得注意的是,作者挑选的是 CodeLLaMA-7b/13b 来进行的实验。他发现经过程序语言预训练的模型表现要优于自然语言预训练的模型。为此,他给出的解释是:程序语言和 IDGE 的标准化数据类似,都是高度结构化的,因此 code-pre-trained LLMs 会更加擅长 IDGE。
作者还发现了一个有趣的现象,就是通过 prompt 驱动的 GPT3.5 和 GPT4 在这个任务上的成功率是 0。由此,作者做了进一步分析,将所有局的游戏状态按照功能进行分类,得到了一个重组后测试集。
按照状态分类后,各个模型的准确率如下:
结果发现 GPT3.5/4 的数学能力表现出色(prize 指代的是计算奖池的功能)。但是,作者发现他们对牌的处理很差,例如在发牌(deal)上,准确率一直是 0。作者猜测,如今的大语言模型在训练时很少会遇到引擎的高精度数据,因此表现不佳。这些子功能上的错误累计,最终会以木桶原理的方式影响引擎整体的性能。
玩家手写数据
为了进一步验证引擎在真实场景下的表现,作者团队邀请了几名真人玩家,让他们自行发挥创意,每人用自然语言编写一个新的游戏规则。
总共产出了如下 5 个剧本:
可以看到,从剧本 1 到剧本 5 的难度逐渐提升。剧本 5 非常具有挑战性,定义了一个全新的 6 牌游戏,随即新出现了两个全新的 6 牌组合,三对(Three Pair)以及大葫芦(Big House)。
在用户为 IDGE 编写游戏剧本时,还能够通过手写几个样例,来提高引擎对剧本理解的准确性。表现如下:
可以看到,对于剧本 1 至剧本 4,模型在零样本或少样本,能够取得非常不错的成绩。
然而对于剧本 5,模型显得理解起来出现了困难。对于这种情况,作者给出的解决方法是,用户自适应!具体来说,在用户游玩 IDGE 的时候,若发现模型给出错误解,手动纠正结果再送给模型。此时模型会收到一对「好」和「坏」的样本,作者利用 DPO 进一步更新模型的参数。用户可以持续进行这一过程,直到引擎性能令其满意为止。
从结果来看,对于剧本 4,引擎需要 8 个样本,在测试集上达到 100% 的准确率。而对于剧本 5,引擎收集了 23 个样本后,达到 100% 的准确率。
这提供了给了游戏制作者和玩家们一个全新的思路:根据玩家自己的游戏反馈,定制一个私有化可定制的的个人游戏引擎!
总结与展望
本文基于大语言模型提出了一种全新的游戏引擎概念,Instruction-Driven Game Engine, IDGE。作者将游戏引擎定义为了一种自回归式的状态预测,Next State Prediction,并且提出了一种课程学习的训练过程。同时,作者还提出了 IDGE 的一种可能的应用形态,自适应型的个人游戏引擎,这或将成为未来联结游戏开发者和玩家之间的全新闭环。
作者相信这种游戏引擎适用于所有类型的游戏,但是,目前大规模应用 IDGE 还有以下限制:
- 推理延迟:大语言模型的推理很缓慢,导致目前的 IDGE 不适合于实时类的游戏,例如 RTS。
- 上下文窗口:当游戏变得更加复杂,一个游戏状态会带来大量的字符数,以此来满足独立性假设,这将对大语言模型的长期理解能力和 KV 缓存带来挑战。
- 游戏数据的缺乏:目前大部分商业游戏的数据都是私有化的,为此,作者将研究重点放在了扑克牌上。
作者们还相信,关于推理延迟和上下文窗口的瓶颈渐渐会随着 LLM 相关技术的突破而被解决;而关于游戏数据的问题,作者呼吁更多公司开放游戏 API 来方便促进 AI 研究。
#数据增强2
这次盘点了计算机视觉各大主流任务上的数据增强策略
随着深度学习在计算机视觉的广泛应用,以卷积神经网络为代表的深度学习模型取得了突破性的进展。然而,直至今日,尽管提出了以 ViT 为代表的新一代视觉网络架构,但数据问题仍然是构建深度学习模型最常见的挑战之一。在实际的应用场景中,足量且高保真的优质数据集通常是可遇不可求的,一方面费钱费时费力不说,由于隐私保护和极端概率问题,数据集的获取变得尤为困难。因此,一种低成本且有效的方法便是利用数据增强来减少对训练数据的依赖,从而帮助开发人员更好更快地构建高精度的 AI 模型。
数据增强的定义
数据增强通常是依赖从现有数据生成新的数据样本来人为地增加数据量的过程。这包括对数据进行不同方向的扰动处理或使用深度学习模型在原始数据的潜在空间(latent space)中生成新数据点从而人为的扩充新的数据集。
这里我们需要区分两个概念,即增强数据和合成数据:
- 合成数据:指在不使用真实世界图像的情况下人工生成数据,合成数据可由
GAN
或者现如今大火的AGI
技术Diffusion Model
产生; - 增强数据:从原始图像派生而来,并进行某种较小的几何变换(例如翻转、平移、旋转或添加噪声等)或者色彩变换(例如亮度、对比度、饱和度或通道混洗等),以此来增加训练集的多样性。
数据增强的作用
省钱 · 省时 · 省心
在实际的应用场景中,数据集的采集、清洗和标注在大多数情况下都是一个非常昂贵且费时费力且乏味的事情。有了数据增强技术,一方面可以减轻相关人员的工作量,另一方面也可以帮助公司削减运营开支。此外,有些数据由于涉及到各种隐私问题可能用钱都买不到,又或者一些异常场景的数据几乎是极小概率时间,这时候数据增强的优势便充分的体现出来了。
提升模型性能
众所周知,卷积神经网络对平移、视点、大小或光照均具有不变性。因此,CNN 能够准确地对不同方向的物体进行分类。在深度学习中,CNN 通过对输入图像进行卷积运算来学习图像中的不同特征,从而在计算机视觉任务上表现非常出色。随着 ViT 的提出,一系列 Vision Transformer 模型被提出并被广泛地应用。然而,无论是 CNN 还是 Transformer,均离不开数据的支持。特别是,当数据量较小时 CNN 容易过拟合,Transformer 则无法学习到良好的表征。
数据增强的方式
数据增强方式大致可分为两类:基础数据增强和高级数据增强。
Image data augmentation taxonomy
基础数据增强方法
Image Manipulation
图像处理(Image Manipulation)是指在图像中对其位置或颜色所做的更改:
- 位置操作是通过调整像素的位置来进行的;
- 颜色操作是通过改变图像的像素值来进行的。
Overview of the geometric data augmentations
首先介绍下几何数据增强(Geometric Data Augmentation
),它是指对图像几何形状所做的更改。几何指的是位置,比如以一定角度移动等。这种技术改变了图像中像素值的位置,例如旋转、平移和剪切。主要包含以下三种:
- Rotation
旋转,其让图像在 0 到 360 度之间旋转。此处旋转度数是一个超参数,应该根据实际需要选择。举个例子,就像大家最熟悉的 MNIST
一样,我们不能旋转 180 度,不然数字 6 旋转 180 就变成 9,这就离谱了。
- Translation
平移,它是另一种几何类型的数据增强,通过向上、向下、向右或向左移动图像以提供不同的视图。
- Shearing
错切,其字面意思是沿轴扭曲图像。错切是一种数据增强技术,可以将图像的一部分向一个方向移动,而另一部分则向相反方向移动。从技术上讲,它分为两类,即沿x轴切和y轴切。对于 x 轴,图像的顶部沿一个方向移动,底部沿完全相反的方向移动。而在 y 轴中,图像的左侧部分沿一个方向移动,右侧部分沿相反方向移动。
Overview of the non-geometric data augmentations
其次,我们为大家介绍下非几何数据增强(Non-Geometric Data Augmentations
),这种增强方式侧重于图像的视觉外观而不是其几何形状。例如噪声注入、翻转、裁剪、调整大小和色彩空间操作是均是非几何增强技术的范畴。下面介绍一些经典的方法:
- Flipping
翻转,它是一种水平或垂直翻转图像的数据增强技术,几乎会应用在许多视觉任务上。一般来说,我们常用的是水平翻转,垂直翻转在大多数情况下会导致目标歧义,例如一个人翻转过来就很不协调和自然,当然还是那句话,根据你的实际应用场景调整。
- Cropping and resizing
裁剪,属于另一种数据增强技术,常用作预处理增强。使用随机裁剪或中心裁剪作为数据增强。该技术会减小图像的大小,然后执行调整大小以匹配图像的原始大小,同时不会平滑图像的标签。
- Noise Injection
注入噪声是另一种数据增强技术,它有助于神经网络学习稳健的特征,对抵御对抗性攻击非常有帮助。
- Color Space
一般来说,图像通常是由 RGB 三颜色通道组成的。这里如果我们单独操纵每个通道值以控制亮度也是一种数据增强方式,有时也称为光度增强。这种增强有助于避免模型偏向 lightning 条件。执行颜色空间增强的最简单方法是隔离任何通道并添加 2 个填充任何随机值或 0 或 255 的通道。颜色空间常用于照片编辑应用程序,即用于控制亮度或暗度。
- Jitter
扰动,是一种通过随机改变图像的亮度、对比度、饱和度和色调的数据增强方式。对于这四个是超参数,我们应仔细选择它们的取值范围。例如,如果我们不小心多度提高了肺部疾病检测的X光图像亮度,这会使肺部在X光中变白混杂,对疾病诊断实际是没有帮助的。
- Kernel Filters
这是一种用来锐化或模糊图像的数据增强方式。一开始,我们可以滑动大小为 n x n 的窗口 Kernel 或高斯模糊过滤器和边缘过滤器的矩阵。高斯模糊滤镜可以使图像变得更加模糊,而边缘滤镜则使图像的水平或垂直边缘锐化。
紧接着,我们继续介绍第三种基于图像擦除的数据增强方式(Image Erasing Data Augmentations
):
Overview of the Mixup, Cutout, and CutMix
- Cutout[1]
Cutout
是通过在训练期间随机擦除子区域并在图像中填充 0 或 255 的一种数据增强技术。
- Random erasing[2]
Random erasing examples for different tasks
Random erasing
是一种像剪切一样随机擦除图像中子区域的一种增强方式。但它也随机决定是否屏蔽,并决定屏蔽区域的纵横比和大小。例如,我们可以在人脸识别任务中,通过这项数据增强技术来模拟戴口罩的效果。
- Hide-and-Seek[3]
捉迷藏(Hide-and-Seek
)数据增强的关键思想是将图像划分为随机大小的均匀正方形,并随机删除随机数量的正方形。当重要信息被隐藏时,它迫使神经网络学习相关特征。在每个epoch,它都会给出图像的不同视图。
An example of Hide-and-Seek augmentation
- GridMask[4]
最后,我们向大家介绍基于网格掩码的数据增强方式。先前的方法尝试解决随机删除可能会存在完全擦除对象或删除上下文信息区域的问题。为了在这些问题之间进行权衡,GridMask
创建统一的掩码,然后将其应用于图像,如下图所示:
GridMask augmentation
此图显示了 GridMask 增强的过程,具体的做法是生成一个掩码,然后将其与输入图像相乘。
Image Mixing Data Augmentations
图像混合数据增强在过去几年一直是一个热门话题。图像混合数据增强是关于将图像与其他图像或相同图像混合。在本文中,我们将其大致分为两类,即单图像混合(Single image mixing
)增强和非单图像混合(Non-single image mixing
)增强。
首先,第一部分我们先介绍下基于单图像混合的数据增强方式。单一图像混合技术顾名思义便是仅使用一个图像,并从不同的视角对其进行处理。最近在单图增强方面做了很多工作,比如LocalAugment
、SelfAugmentation
、SalfMix
等,下面分别为大家介绍下。
- Local Augment[5]
An example of Global and Local Rotation Image
Local Augment
,即局部增强的原理是将图像切分成小块,并在每个小块上应用不同类型的数据增强,目的是潜在地改变目标偏差属性,但产生显着的局部特征,如上图所示。虽然这种增强并不主宰全局结构,但提供了非常多样化的图像特征,这对于神经网络以更通用的方式学习局部特征至关重要。
- Self Augmentation[6]
An example of self augmentation
在 Self Augmentation
中,图像的随机区域会被裁剪并随机粘贴到图像中,以提高小样本学习的泛化能力。
- SalfMix[7]
SalfMix
提出的背景主要是关注是否可以泛化基于单图像混合增强的神经网络?为此,其思想是找到图像的第一个显着部分来决定应该删除哪个部分以及应该复制哪个部分。
Conceptual comparison between SalfMix method and other single image-based data augmentation methods
如上图所示,SalfMix 是通过显着性图将图像中显著的区域裁剪出来并放入非显着区域。
- KeepAugment[8]
This image shows the example of KeepAugment with other augmentations
引入 KeepAugment
是为了防止分布偏移降低神经网络的性能。KeepAugment 的想法是通过保留图像的显着特征和增强非显着区域来提高保真度。其中,被保留的特征进一步允许在不改变分布的情况下增加多样性。
- YOCO[9]
An example of YOCO augmentation
YOCO
,即You Only Cut Once,它可以从部分信息中识别对象并提高增强的多样性,从而鼓励神经网络表现得更好。YOCO 制作了两张图像,每张都应用了一个增强,然后将每张图像连接成一张图像。YOCO 易于实现,且不会引入任何参数,同时也易于使用。
- Cut-Thumbnail[10]
Comparison between existing data augmentation methods with CutThumbnail
Cut-Thumbnail
,即缩略图,是一种新颖的数据增强,它将图像调整到一定的小尺寸,然后用调整后的图像随机替换图像的随机区域,旨在减轻网络的形状偏差。Cutthumbnail 的优点是它不仅保留了原始图像,而且在调整后的小图像中保持全局。
Cut-Thumbnail
此图像显示了缩略图的缩小图像示例。其方式是将图像缩小到一定尺寸 112×112 或 56×56 后,尽管丢失了很多局部细节,但图像中的目标(狗)仍然可以识别。
最后一部分我们向大家介绍非单图像的混合数据增强(Non-Single Image Mixing Data Augmentations)方式,这块涉及的内容比较丰富,包括大家所熟悉的 Mixup、CutMix、CopyPaste 等混合增强技术,下面让我们一起看看吧!
Overview of the Mixup, Cutout, and CutMix
- Mixup[11]
Mixup
是根据混合因子(alpha)来混合任意两个随机图像,这些图像的相应标签也以相同的方式混合。混合数据增强不仅在准确性方面而且在鲁棒性方面都可持续地提高了性能。
- CutMix[12]
CutMix
解决了信息丢失和区域丢失问题。它的灵感来自 Cutout,其中任何随机区域都用 0 或 255 填充,而在 cutmix 中,不是用 0 或 255 填充随机区域,而是用另一个图像的补丁填充该区域。相应地,它们的标签也根据混合的像素数按比例混合。
- SaliencyMix[13]
An example of SaliencyMix augmentation
SaliencyMix
基本上解决了 Cutmix 的问题,并认为用另一个补丁填充图像的随机区域并不能保证补丁具有丰富的信息,因此混合未保证补丁的标签会导致模型学习关于图像的不必要信息 修补。为了解决这个问题,SaliencyMix 首先选择图像的显着部分并将其粘贴到随机区域或另一幅图像的显着或非显着区域。
SaliencyMix data augmentation procedure
上面这张图展示了该方法的实现过程。
- Puzzle Mix[14]
Puzzle Mix 提出了一种拼图混合数据增强技术,该技术侧重于灵活地使用图像的显着信息和基本统计数据,目的是打破神经网络对现有数据增强的误导监督。
A visual comparison of the mixup methods.
uzzle Mix
确保包含足够的目标类信息,同时保留每个样本的局部统计信息。
- SnapMix[15]
SnapMix
是一种基于语义比例的混合数据增强,它利用类激活图来降低标签噪声水平。SnapMix 根据实际参与增强图像的显着像素创建目标标签,确保增强图像和混合标签之间的语义对应。
A visual Comparison of Mixup, CutMix, and SnapMix
该图给出了一个基本示例,可以看出,与 CutMix 和 Mixup 相比,SnapMix 生成的标签在视觉上更符合混合图像的语义结构。
- FMix[16]
FMix
也是一种混合样本数据增强(MSDA),利用随机二分类掩码。这些随机二分类掩码是通过对从傅立叶空间获得的低频图像应用阈值来获取的。一旦获得掩码,一个颜色区域将应用于其中一个输入,另一个颜色区域将应用于另一个输入。整体流程如下图所示:
Example masks and mixed images from CIFAR-10 for FMix
- MixMo[17]
MixMo
侧重于通过子网络学习多输入多输出。该方法的主要动机是采用更可靠的机制代替直接的隐藏求和操作。MixMo 的具体做法是将 M 个输入嵌入到共享空间中,将它们混合并将它们传递到更深的层进行分类。
This image shows the overview of MixMo augmentation
- StyleMix[18]
StyleMix
针对以前的方法问题,即不区分内容和样式特征。为了解决这个问题提出了两种方法 styleMix 和 StyleCutMix,这是第一个非常详细地分别处理图像的内容和样式特征的工作,并且它在流行的基准数据集上显示出令人印象深刻的性能。
- RandomMix[19]
RandomMix
可用于提高模型的泛化能力,它从一组增强中随机选择混合增强并将其应用于图像,使模型能够查看不同的样本。整体演示如下图所示:
An illustrative example of RandomMix
- MixMatch[20]
MixMatch
是一种应用于半监督学习的数据增强技术,其将单个图像增加 K 次并将所有 K 个图像传递给分类器,对它们的预测进行平均,最后,通过调整它们的分布温度项来增强它们的预测。
Diagram of the label guessing process used in MixMatch
- ReMixMatch[21]
ReMixMatch
是混合匹配的扩展,通过引入分布对齐和增强锚定使先前的工作变得高效。分布对齐任务是使未标记数据的预测边缘分布接近 ground truth 的边缘分布,并鼓励未标记数据的预测边缘分布接近 ground truth 标签的边缘分布。增强锚定将输入的多个强增强版本提供给模型,并鼓励每个输出接近同一输入的弱增强版本的预测。
ReMixMatch
ReMixMatch 使用弱增强图像(中间绿色部分)的预测来预测同一图像(图中蓝色部分)的强增强。
- FixMatch[22]
FixMatch
通过在有限的标记数据上进行训练,然后使用经过训练的模型将标签分配给未标记数据。Fixmatch 首先将伪标签分配给概率高于某个阈值的未标记图像。该模型被迫对未标记图像的强增强版本进行预测,以使用交叉熵损失将其预测与伪标签相匹配。
FixMatch
- AugMix[23]
AugMix
是一种简单有效的数据增强,可减少训练和测试(未见)数据分布之间的差距。AugMix 操作以相应的随机增强幅度执行,最后,所有这些图像被合并以生成一个新图像,该图像广泛探索图像周围语义等效的输入空间。
AugMix
如上图所示,在三个分支中分别进行了三个操作,最后,将所有图像混合生成新图像,这有利于提升模型的鲁棒性。
- Copy-Paste[24]
Copy-Paste]
只是将一个图像的掩码实例复制并粘贴到另一个图像,其实现起来非常简单,但效果出众,特别是对于小目标检测来说。当然,我们也可以采用 BBox 级的实例来实现。
Copy-Paste
上图展示了两个图像的实例以不同的比例相互粘贴。
- Mixed-Example[25]
如今,最先进的非标签保留数据增强技术已经使用两个示例的线性组合显示出有希望的结果。Mixed-Example
集中讨论两个问题:
- 为什么这些方法有效?
- 若通过提出新的增强,这种线性组合重要吗?
Mixed-Example
上图给出了改进的混合示例执行的线性方法和广义增强的视觉比较。
- RICAP[26]
RICAP
,即随机图像裁剪和修补,是一种新的数据增强技术,它切割和混合四张图像而不是两张图像,并且图像的标签也被混合。
A conceptual explanation of the RICAP data augmentation
- CutBlur[27]
CutBlur
探索和分析了现有的超分辨率数据增强技术,并提出了另一种新的数据增强技术,通过切割高分辨率图像块并粘贴到相应的低分辨率图像,反之亦然。Cutblur 在超分辨率方面表现出色。
A visual comparison between High resolution, low resolution and CutBlur
下面是它的实现原理示意图:
An Schematic illustration of CutBlur operation
- ResizeMix[28]
ResizeMix
是一种将数据与保留的对象信息和真实标签混合的数据增强方法,其通过直接以四种不同的方式剪切和粘贴源数据以针对图像。这里,四种不同的方式,包括显着部分、非部分、随机部分或调整源图像大小来修补,它主要解决了两个问题:• 如何从源图像中获取补丁?• 将源图像的补丁粘贴到目标图像的什么位置?
ResizeMix
此外,ResizeMix 发现显着性信息对于促进混合数据扩充并不重要。
- ClassMix[29]
ClassMix
是一种用于半监督学习的基于分割的数据增强方法。传统的数据增强对语义分割并不像图像分类那样有效。ClassMix 通过在考虑对象边界的同时利用网络预测,通过混合未标记样本来扩充训练样本。
ClassMix
- CDA[30]
CDA
,即 Context Decoupling Augmentation
,是一种用于弱监督语义分割的上下文解耦增强技术,从而解决 WSSS 领域传统数据技术性能不佳的问题,这些通过增加相同上下文数据语义样本不会在对象区分中贡献太多价值。例如,对于图像分类任务来说,目标识别是由于目标本身及其周围环境,这不鼓励模型只关注当前目标,而要结合上下文。
为了打破这一点,CAD 使特定对象出现的位置多样化,并引导网络打破对象和上下文信息之间的依赖关系。在这种情况下,它还提供增强和网络焦点到对象实例而不是对象实例和上下文信息的方式。
CDA
- ObjectAug[31]
ObjectAug
是一种用于语义分割的对象级增强,解决了混合图像级数据增强策略的问题,以前的策略无法用于分割,因为对象和背景是耦合的,其次对象的边界由于它们与背景的固定语义联系而没有被增强。为了缓解这个问题,首先,它借助语义标签将对象和背景从图像中分离出来,然后使用翻转和旋转等流行的数据增强技术对每个对象进行增强。由于这些数据增强而导致的像素变化可以使用图像修复来恢复。最后,对象和背景耦合以创建增强图像,从而有效的提升分割的性能。
ObjectAug
高级数据增强
高级数据增强的一个典型代表便是自动数据增强,其目标是从训练数据中找到数据增强策略。它将寻找最佳增强策略的问题转化为离散搜索问题,由搜索算法和搜索空间组成,主要包含四部分:
- 基于强化学习的数据增强(
Reinforcement learning data augmentation
) - 基于非强化学习的数据增强(
Non-Reinforcement learning data augmentation
) - 基于风格迁移的数据增强(
Neural Style Transfer
) - 基于特征空间的数据增强(
Feature space data augmentations
)
下面简单介绍下这两部分。
基于强化学习的数据增强
- AutoAugment[32]
AutoAugment
的目标是通过自动搜索策略找到最好的数据扩充而不是通过手动进行数据扩充。为了解决这个限制,其设计了搜索空间并具有由许多子策略组成的策略。每个子策略都有两个参数,一个是图像处理函数,第二个是概率和大小。这些子策略是使用强化学习作为搜索算法找到的,整体流程如下所示:
AutoAugment
- Fast Autoaugment[33]
Fast Autoaugment
解决了 AutoAugment 需要花费大量时间才能找到最佳的数据增强策略的问题。该方法的解决方案是通过利用基于密度匹配的高效搜索策略找到更优的数据扩充,从而减少了高阶训练时间。
An overall procedure of augmentation search by Fast AutoAugment algorithm
- Faster AutoAugment[34]
Faster AutoAugment
旨在非常高效地找到有效的数据增强策略,其基于可区分的增强搜索策略。此外,它不仅为许多具有离散参数的转换操作估计梯度,而且还提供了一种有效选择操作的机制。最终,它引入了一个训练目标函数,旨在最小化原始分布和增广分布之间的距离,该函数也是可微的。需要注意的是,其增强的参数是在反向传播期间更新的,整体流程图定义如下:
An Overview of the Faster AutoAugment augmentation
- RAD[35]
RAD
,即增强数据强化学习,其易于插入有效提升了强化学习算法的性能。RAD 主要考虑两个问题:
- 学习数据效率;
- 新环境的泛化能力;
此外,它表明传统的数据增强技术使 RL 算法能够在基于像素的控制和基于状态的控制方面胜过复杂的 SOTA 任务,下面是它的总体流程图:
An overview of different augmentation investigated in RAD
- MARL[36]
MARL
,即多代理强化学习,是一种基于多代理协作的局部补丁自动增强方法,这是第一个使用强化学习找到补丁级别数据增强策略的方法。MARL 首先将图像分成小块,然后共同为每个小块找到最佳数据增强策略.
An Illustration of different automated augmentation policies for MARL
- LDAS[37]
LDAS
建议使用自动增强来学习目标检测的最佳策略。它解决了目标检测增强的两个关键问题:
- 分类学习策略不能直接应用于检测任务,如果应用几何增强,它会增加处理边界框的复杂性;
- 与设计新的网络架构相比,数据增强增加的价值要少得多,因此受到的关注较少,但应谨慎选择用于目标检测的增强
下图展示了基于此数据扩充的一些子策略:
Different data augmentation sub-policies explored
- [Scale-Aware Automatic Augmentation](https://arxiv.org/abs/2103.17220 "Scale-Aware Automatic Augmentation"
Example of scale-aware search space which includes image level and box-level augmentation
- ADA[38]
ADA
提供了一种系统的方法来从目标检测的角度找到数据增强的最佳对抗性扰动,该方法基于数据的博弈论解释,即纳什均衡。纳什均衡提供了最佳边界框预测器和数据扩充的最佳设计。最优对抗性扰动是指 ground truth 的最差扰动,它迫使框预测器从最困难的样本分布中学习。
Adversarial augmentation
从上图可以看出,ADA 偏向于选择尽可能与 GT 不同但又包含关键对象特征的边界框。
- Deep CNN Ensemble[39]
Deep CNN Ensemble
提出了一种新的 R-CNN 模型变体,在训练和评估方面进行了两个核心修改。首先,它使用几个不同的 CNN 模型作为 R-CNN 中的集成器,其次,它通过从 Microsoft COCO 数据集中选择与 PASCAL VOC 一致的子集,巧妙地用 Microsoft COCO 数据增强 PASCAL VOC 训练示例。原理图如下所示:
The proposed schematic diagram
- RADA[40]
通过对抗性学习可以获取稳健而准确的目标检测,先前方法展示了当对目标检测任务进行微调时分类器性能从不同的数据增强中获得增益,并且在准确性和稳健性方面的性能没有提高。RADA
提供了一种探索对抗性样本的独特方法,有助于提高性能。为此,它在目标检测器的微调阶段通过探索对抗性样本来增强示例,这被认为是依赖于模型的数据增强。
首先,它从检测器分类和定位层中选择更强的对抗样本,这些样本会随着检测器的变化而变化,以确保增强策略保持一致。该方法在不同目标检测任务的准确性和鲁棒性方面显示出显着的性能提升:
RADA
上图分别展示了 RADA 分别提高了目标检测器在干净图像上的准确性、检测器对自然损坏的鲁棒性以及对跨数据集域偏移的鲁棒性。
- PTDA[41]
PTDA
,即 Pespective Transformation Data Augmentation,同样也是一种用于目标检测的新数据增强,简称为透视变换,它可以生成以不同角度捕获的新图像。因此,它模仿图像,就好像它们是在相机无法捕获这些图像的特定角度拍摄的一样。该方法在多个目标检测数据集上显示出有效性。
- DADA[42]
DADA
,Deep Adversarial Data Augmentation,即深度对抗性数据增强,它将数据增强被表述为训练类条件和监督 GAN 的问题。此外,它还引入了新的鉴别器损失,目的是保证数据扩充是真实的,并且扩充样本被迫平等参与并在寻找决策边界时保持一致。
基于非强化学习的数据增强
- RandAugment
以前的最佳增强方法大都是一些使用强化学习或一些复杂的学习策略,因此需要花费大量时间才能找到合适的增强方法和确定增强因子。这些方法消除了单独搜索阶段的障碍,这使得训练更加复杂,从而增加了计算成本开销。为了打破这一点,RandAugment
是一种新的数据增强方法,比 AutoAugment 简单又好用。主要思想是随机选择变换,并调整它们的大小:
Example images augmented by RandAugment
基于风格迁移的数据增强
基于风格迁移的数据增强是一种独特的数据增强方式,可以在不改变高层语义的情况下将一幅图像的艺术风格转移到另一幅图像。它为训练集带来了更多多样性。这种神经风格迁移的主要目标是从两张图像生成第三张图像,其中一张图像提供纹理内容,另一张图像提供高级语义内容。下面介绍一些常见的应用。
- STaDA[43]
STaDA
,Style Transfer as Data Augmentation,顾名思义便是基于风格迁移的数据增强方法,这是一种彻底评估了不同的 SOTA 神经风格转移算法作为图像分类任务的数据增强。此外,它还将神经风格迁移算法与传统的数据增强方法相结合,下面给出相关的示意图:
Overview of the original image and two stylized images by STaDA
- NSTDA[44]
NSTDA
,Neural Style Transfer as Data Augmentation,是一种将神经风格迁移作为改进 COVID-19 诊断分类的数据增强方法。这项工作显示了循环生成对抗网络的有效性,该网络主要用于神经风格迁移,增强 COVID-19 负 x 射线图像以转换为正 COVID 图像以平衡数据集并增加数据集的多样性。该方法充分表明了使用 Cycle GAN 增强图像可以提高几种不同 CNN 架构的性能。
Overview of generating synthetic covid images from the healthy category
- SA[45]
这项工作提出了一种新的数据增强,称为基于风格神经转移的风格增强。SA
随机化颜色、对比度和纹理,同时在训练期间保持形状和语义内容。这是通过选择任意样式传输网络来随机化样式并从多元正态分布嵌入中获取目标样式来完成的。它提高了三个不同任务的性能:分类、回归和域适应。
Overview of Style augmentation applied to an image
从上图可以明显的看出,基于 SA 的数据增强方式可以将形状保留下来,但样式(包括颜色、纹理和对比度)是随机的。
- StyPath[46]
StyPath
是一种用于稳健组织学图像分类的风格迁移数据增强策略,旨在减少偏见的风格。
StyPath
- AS[47]
这项工作介绍了一种基于深度神经网络的人工系统,可生成具有高感知质量的艺术图像。AS
创建神经嵌入,然后使用嵌入来分离图像的风格和内容,最后再重新组合目标图像的内容和风格以生成艺术图像。
Overview of the styled image by neural algorithm
基于特征空间的数据增强
基于特征空间的数据增强首先将图像转换为嵌入或表示,然后对图像的嵌入执行数据增强,最后再向大家介绍下这部分内容。
- Dataset Augmentation in Feature Space[48]
这项工作首先使用编码器-解码器来学习表示,然后在表示上应用不同的变换,例如添加噪声、插值或外推。所提出的方法已经显示出静态和顺序数据的性能改进。
Overview of interpolation and extrapolation between handwritten characters
- Feature Space Augmentation for Long-Tailed Data
该方法提出了基于特征空间中的新数据增强,以解决长尾问题并提升代表性不足的类样本。所提出的方法首先在类激活图的帮助下将类特定特征分为通用特征和特定特征。代表性不足的类样本是通过将代表性不足的类的类特定特征与来自其他混淆类的类通用特征注入而生成的。这使得数据多样化,也解决了代表性不足的类别样本的问题。
Left: limited but well-spread data. Right: Without sufficient data
- Adversarial Feature Augmentation for Unsupervised Domain Adaptation[49]
生成对抗网络在无监督域适应中显示出可喜的结果,以学习与源域无法区分的目标域特征。这项工作扩展了 GAN 以强制特征提取器成为域不变的,并通过特征空间中的数据增强来训练它,称为特征增强。总的来说,该工作探索了 GAN 在特征层面的数据增强。
- FeatMatch[50]
FeatMatch 提出了一种新的 SSL 特征空间数据增强方法,其灵感来自基于图像的 SSL 方法,该方法结合了图像增强和一致性正则化。基于图像的 SSL 方法仅限于传统的数据增强。为了打破这一目标,基于特征的 SSL 方法从复杂的数据扩充中产生了不同的特征。一个关键点是,这些高级数据增强利用了通过聚类提取的类内和类间表示的信息。所提出的方法仅在 min-Imagenet 上显示出显着的性能增益,例如在 miniImageNet 上绝对增益 17.44%,而且还显示了对分布外样本的鲁棒性。此外,图像级和特征级增强和一致性之间的差异如下图所示:
An overview of featMatch augmentation applied on images and features
References
- [1]Advanced Data Augmentation Approaches: https://arxiv.org/pdf/2301.02830.pdf
- [2]Cutout: https://arxiv.org/abs/1708.04552
- [3]Random erasing: https://arxiv.org/abs/1708.04896
- [4]Hide-and-Seek: https://arxiv.org/abs/1811.02545
- [5]GridMask: https://arxiv.org/abs/2001.04086
- [6]Local Augment: https://ieeexplore.ieee.org/document/9319662
#任务损失/梯度优化
本次是从loss和gradient方面,优化多任务模型,缓解负迁移或跷跷板的问题。
工作中,有使用到多任务模型,但实际使用时,会面临负迁移、跷跷板等现象。
除了从模型角度优化,这里介绍从loss和gradient方面的优化策略。阿里云云栖号的一篇文章[1]总结的很好,多目标优化策略主要关注三个问题:
1. Magnitude(Loss量级):Loss值有大有小,出现取值大的Loss主导的现象,怎么办?
2. Velocity (Loss学习速度):任务有难有易,Loss学习速度有快有慢,怎么办?
3. Direction(Loss梯度冲突):多个Loss的反向梯度,更新方向冲突,出现翘翘板、负迁移现象,怎么办?
为了解决以上问题,本文分享以下8种方法:
Uncertainty Weighting
论文: Kendall, A., Gal, Y., & Cipolla, R. (2018). Multi-task learning using uncertainty to weigh losses for scene geometry and semantics. In Proceedings of the IEEE conference on computer vision and pattern recognition
def UW_Loss(labels, preds,
log_vars,
device="gpu:1"):
"""Uncertainty Weighting
Kendall, A., Gal, Y., & Cipolla, R. (2018). Multi-task learning using uncertainty to weigh losses
for scene geometry and semantics. In Proceedings of the IEEE conference on computer vision and
pattern recognition(pp. 7482-7491).
"""
assert len(preds) == labels.shape[1]-1
assert len(loss_weights) == labels.shape[1]-1
labels = labels.to(device)
# 计算各环节的ce
# ['click','cart', 'order']
loss1 = nn.functional.binary_cross_entropy(preds[0], labels[:,0])
loss2 = nn.functional.binary_cross_entropy(preds[1], labels[:,1])
loss3 = nn.functional.binary_cross_entropy(preds[2], labels[:,2])
losses = [loss1, loss2, loss3]
for i, log_var in enumerate(log_vars):
log_var = log_var.to(device)
losses[i] = (1/2) * (torch.exp(-log_var[0])**2) * losses[i] + torch.log(torch.exp(log_var[0])+1)
loss = sum(losses)
return loss, losses
MGDA
论文: Sener, O., & Koltun, V. (2018). Multi-task learning as multi-objective optimization. *Advances in neural information processing systems*, *31*.
代码: https://github.com/isl-org/MultiObjectiveOptimization
据[2]解释,作者将MTL看作一个带约束优化问题,求解过程相当于寻找帕累托最优过程。假定固有有一群任务和可分配的任务损失权重,从一种分配状态到另一种状态的变化中,在没有使任何任务境况变坏的前提下,使得至少一个任务变得更好,这就达到了帕累托最优化。
MTL的优化目标函数:
第二个条件,是让每个任务独立的参数梯度为0,直接对每个任务独立分支的部分上,各自做梯度下降即可。而第一个条件是要找到一个帕累托最优点 (即最好的alpha组合),使得共享层参数梯度为0。这边作者使用了Frank-Wolfe算法。
虽然Frank-Wolfe求解器有效率和质量,但我们需要对每个任务t计算其在共享层的参数梯度,用于反向传播,因此要T次反向传播后,才能前向传播1次。考虑到后向传播比前向传播耗时,本文提出一个更有效的办法,只需要1次反向传播。先把任务t的预测函数做个变换:从x为自变量,delta_sh和delta_t为参数,变换到以下,以表征函数作为自变量,delta_t为参数。而表征函数内部又是由x为自变量,delta_sh为参数。
源码上看,先看:MGDA先对共享层和任务独立层,获取梯度和反向传播。
而MGDA-UB是冻结共享层的反向传播,先通过共享层获取表征向量,再对任务独立层算梯度和反向传播,最后基于任务独立层的梯度,算出alpha后,计算共享层的损失,进而反向传播。
GradNorm
论文: Chen, Z., Badrinarayanan, V., Lee, C. Y., & Rabinovich, A. (2018, July). Gradnorm: Gradient normalization for adaptive loss balancing in deep multitask networks. In *International conference on machine learning* (pp. 794-803). PMLR.
代码: https://github.com/hav4ik/Hydra/blob/master/src/applications/trainers/gradnorm.py
该文章[3]写的很详细,建议直接阅读它。GradNorm是基于不同任务的学习速度调整任务权重,学习速度越快,权重越小。
每个任务的学习速度反值r为:
其中alpha为调整力度,它越大,调整力度越大。GradNorm整个训练流程为:
for step, batch in enumerate(train_loader):
con_feats = batch['features'].float().to(device)
targets = batch['targets'].float().to(device)
preds = model(con_feats) # 模型训练
loss, task_loss, multi_losses = model.loss(targets, preds, loss_weights=loss_weights, device=device) # 计算损失
# 获得第一轮的任务损失
if epoch == 0 and step == 0:
initial_task_loss = task_loss.data.cpu().detach().numpy()
optimizer.zero_grad() # 梯度清空
loss.backward(retain_graph = True) # 计算梯度
# 重置L_grad对w的梯度
model.weights.grad.data = model.weights.grad.data * 0.0
# 获取共享层最后一层网络权重W
W = model.get_last_shared_layer()
# 计算每个任务的G^i_W(t)
norms = []
for i in range(len(task_loss)):
# Loss对W求导 * w -> Gradnorm
gn = torch.autograd.grad(task_loss[i], W.parameters(), retain_graph = True)
norms.append(torch.norm(torch.mul(model.weights[i], gn[0])))
norms = torch.stack(norms)
# 计算均值Gradnorm
mean_norm = np.mean(norms.data.cpu().detach().numpy())
# 计算学习速度反值r
loss_ratio = task_loss.data.cpu().detach().numpy() / initial_task_loss
inv_train_rate = loss_ratio / np.mean(loss_ratio)
# 计算L_grad
const = torch.tensor(mean_norm * (inv_train_rate ** alpha), requires_grad = False)
gn_loss = torch.sum(torch.abs(norms - const.to(device)))
# 计算l_grad对w的梯度(即GradNorm Loss的梯度)
model.weights.grad = torch.autograd.grad(gn_loss, model.weights)[0]
# 共同反向传播更新 l_grad对w的梯度 和 网络参数
optimizer.step()
epoch_trn_loss += loss.cpu().detach().numpy()
for i in range(len(labels)-1):
epoch_trn_multi_loss[i] += np.round(multi_losses[i].cpu().detach().numpy(),4)
train_history[i].append(multi_losses[i].cpu().detach().numpy())
# 收集个任务的w、Gradnorm和GradNorm Target
weight_history[i].append(model.weights.data[i].clone())
gn_history[i].append(norms[i])
const_history[i].append(const[i])
epoch_trn_loss = round(epoch_trn_loss/(step+1),4)
# renormalize the loss weights after each epoch
norm_coeff = (len(labels)-1) / torch.sum(model.weights.data, dim = 0)
model.weights.data = model.weights.data * norm_coeff
DWA
论文: Liu, S., Johns, E., & Davison, A. J. (2019). End-to-end multi-task learning with attention. In *Proceedings of the IEEE/CVF conference on computer vision and pattern recognition* (pp. 1871-1880).
DWA全称是Dynamic Weight Average,受到GradNorm的启发,它也通过考虑每个任务的损失改变,去学习平均不同训练轮数下各任务的权重。GradNorm需要接触网络内部梯度,而DWA提出只要任务的损失数值,所以实施起来更简单。作者把任务k的权重lambda_k定义如下:
w_k计算损失相对衰减率,越小,说明学习速度越快。我们要减少其重要度,为此,喂入softmax获取各任务的权重,这样w_k越小,权重越小,即近期训练过程中学习速度快的任务,要给低的重要度。T越大,权重越趋近于1,因此任务权重更平均,所以T调大,有利于让各任务的权重更均匀。乘上K是为了确保各任务的权重之和为K,保证权重在同一量纲下缩放。DWA的缺点是容易受损失量级大的任务主导[3]。另外,前2轮w_k初始化为1。
# dynamic weight averaging
loss_weights = np.ones((model_params['total_epoch'], len(labels)))
avg_task_loss = np.zeros((model_params['total_epoch'], len(labels)))
for epoch in range(model_params['total_epoch']):
# 前2轮w_k初始化为1
if epoch == 0 or epoch == 1:
pass
# 算权重
else:
sum_w = []
for i in range(len(labels)):
w = avg_task_loss[epoch - 1, i] / avg_task_loss[epoch - 2, i]
sum_w.append(np.exp(w / T))
loss_weights[epoch] = [len(labels) * w / np.sum(sum_w) for w in sum_w]
model.train()
for step, batch in enumerate(train_loader):
# model training code
# save loss in each epoch 每epoch结束追加loss
avg_task_loss[epoch] = [task_loss / len(train_loader) for task_loss in epoch_trn_multi_loss]
PE-LTR
论文: Lin, X., Chen, H., Pei, C., Sun, F., Xiao, X., Sun, H., ... & Jiang, P. (2019, September). A pareto-efficient algorithm for multiple objective optimization in e-commerce recommendation. In *Proceedings of the 13th ACM Conference on recommender systems* (pp. 20-28).
代码: https://github.com/weberrr/PE-LTR/blob/master/PE-LTR.py](https://github.com/weberrr/PE-LTR/blob/master/PE-LTR.py
本文是在阿里电商LTR (Learing to Rank) 场景下,提出用帕累托最优算法找到各任务适合的权重,跟前面提到的Multi-Objective Optimization的思路有些相似。直接看训练过程:
绿色部分:定义输入。初始化各任务权重为1/K,各任务目标的值约束边界。
橙色部分:定义输出。首轮先用初始权重加权求和多任务损失。
红色部分:批次更新。随机梯度下降更新模型参数,用PECsolver求解各任务的权重,加权求和多任务损失。
先定义损失函数:
简单来说,利用KKT条件来进行求解,放松条件求解w,然后考虑原约束调节进一步收紧解集。[4],涉及数学细节,感兴趣可阅读原文。
def pareto_step(w, c, G):
"""
ref:http://ofey.me/papers/Pareto.pdf
K : the number of task
M : the dim of NN's params
:param W: # (K,1)
:param C: # (K,1)
:param G: # (K,M)
:return:
"""
GGT = np.matmul(G, np.transpose(G)) # (K, K)
e = np.mat(np.ones(np.shape(w))) # (K, 1)
m_up = np.hstack((GGT, e)) # (K, K+1)
m_down = np.hstack((np.transpose(e), np.mat(np.zeros((1, 1))))) # (1, K+1)
M = np.vstack((m_up, m_down)) # (K+1, K+1)
z = np.vstack((-np.matmul(GGT, c), 1 - np.sum(c))) # (K+1, 1)
hat_w = np.matmul(np.matmul(np.linalg.inv(np.matmul(np.transpose(M), M)), M), z) # (K+1, 1)
hat_w = hat_w[:-1] # (K, 1)
hat_w = np.reshape(np.array(hat_w), (hat_w.shape[0],)) # (K,)
c = np.reshape(np.array(c), (c.shape[0],)) # (K,)
new_w = ASM(hat_w, c)
return new_w
def ASM(hat_w, c):
"""
ref:
http://ofey.me/papers/Pareto.pdf,
https://stackoverflow.com/questions/33385898/how-to-include-constraint-to-scipy-nnls-function-solution-so-that-it-sums-to-1
:param hat_w: # (K,)
:param c: # (K,)
:return:
"""
A = np.array([[0 if i != j else 1 for i in range(len(c))] for j in range(len(c))])
b = hat_w
x0, _ = nnls(A, b)
def _fn(x, A, b):
return np.linalg.norm(A.dot(x) - b)
cons = {'type': 'eq', 'fun': lambda x: np.sum(x) + np.sum(c) - 1}
bounds = [[0., None] for _ in range(len(hat_w))]
min_out = minimize(_fn, x0, args=(A, b), method='SLSQP', bounds=bounds, constraints=cons)
new_w = min_out.x + c
return new_w
loss_weights = np.full(len(labels)-1, 1/(len(labels)-1)) # (K,)
w_constraint = np.full((len(labels)-1, 1), 0.) # (K, 1)
for epoch in range(model_params['total_epoch']):
model.train()
for step, batch in enumerate(train_loader):
con_feats = batch['features'].float().to(device)
targets = batch['targets'].float().to(device)
preds = model(con_feats) # 模型训练
loss, task_loss, multi_losses = model.loss(targets, preds,
loss_weights=loss_weights,
device=device) # 计算损失
optimizer.zero_grad() # 梯度清空
loss.backward(retain_graph=True) # 计算梯度
# G: (K, m)
grads = []
for l in task_loss:
grad = []
optimizer.zero_grad()
l.backward(retain_graph=True)
for param in model.parameters():
if param.grad is not None:
grad.append(param.grad.view(-1).cpu().detach().numpy())
grads.append(np.hstack(grad))
G = np.vstack(grads)
loss_weights = pareto_step(len(labels)-1, w_constraint, G)
optimizer.step() # 梯度回传
HTW
论文: Kongyoung, S., Macdonald, C., & Ounis, I. (2020). Multi-task learning using dynamic task weighting for conversational question answering.
在现有的MTL权重分配方法中,对所有任务都是一视同仁,但其实存在一些业务场景是有主次任务之分。HTW (Hybrid Task Weighting) 则是分别对主任务和辅助任务分别使用:
- 主任务:Abridged Linear Schedule。设置一个step阈值,t_tao = T/10,即前10%的训练step是用于主任务的warm-up (任务权重=当前step数t/总step数T),后90%的steps,主任务的权重为1。这里warm-up的目的应该是让模型训练初期能从辅助任务中学习到一些有利于主任务的信息,然后后期再专心学习主任务。这里step=epoch总数*train_loader的循环step数;
- **辅助任务:Loss-Balanced Task Weighting (LBTW)**。对于每个batch,任务的权重lambda是step=t下的loss除以首轮下的loss,即某任务学习速度越快,它的权重越趋向于0。另外,引入alpha=0.5用于平衡任务权重。
整个训练流程如下:
# 记录首轮loss
if step == 0:
initial_task_loss = task_loss
loss = 0
mutil_losses = []
# 对辅助任务算权重,并加权辅助任务的loss
for i in range(len(task_loss) - 1):
loss_weights[i] = (task_loss[i] / initial_task_loss[i]) ** alpha
loss += loss_weights[i] * task_loss[i]
mutil_losses.append(loss_weights[i] * task_loss[i])
# 对主任务算权重,并加权主任务的loss
if step_count <= step_threshold:
loss_weights[-1] = step_count / total_step
step_count += 1
else:
loss_weights[-1] = 1.0
loss += loss_weights[-1] * task_loss[-1]
mutil_losses.append(loss_weights[-1] * task_loss[-1])
PCGrad
论文: Yu, T., Kumar, S., Gupta, A., Levine, S., Hausman, K., & Finn, C. (2020). Gradient surgery for multi-task learning. *Advances in Neural Information Processing Systems*, *33*, 5824-5836.
代码: https://github.com/chenllliang/Gradient-Vaccine/blob/17fa758fdd4f87475ee2847db6fc0a013631fee3/fairseq/fairseq/optim/pcgrad.py
如果两个梯度在方向上存在冲突,就把任务i的梯度投影到具有冲突梯度的任何其他任务j的梯度的法向量平面上。如下图所示,若任务i和任务j的余弦相似度是正值,如图(d),不相互冲突,那任务i和j保持各自原有梯度,做更新。若如图(a),梯度方向有相互冲突,对于任务i的梯度,就把它投影在任务j梯度的法向量上,如图(b),作为任务i的新梯度去更新。对于任务j就反之,如图(c)。
投影计算方式如下[5]:
如上图所示,gi和gj有冲突,所以要把gi投影在gj的法向量平面上作为任务i的新梯度 (即蓝色虚线)。假设绿色向量为a*gj,基于向量的加法三角形法则,可以得到蓝色虚线x=gi+a*gj。之后做以下计算,便可得到a和蓝色虚线向量 (即任务i的新梯度):
整体训练流程如下:
# Compute gradient projections.
def proj_grad(grad_task):
"""计算投影梯度"""
for k in range(num_tasks):
inner_product = tf.reduce_sum(grad_task*grads_task[k])
proj_direction = inner_product / tf.reduce_sum(grads_task[k]*grads_task[k])
grad_task = grad_task - tf.minimum(proj_direction, 0.) * grads_task[k]
return grad_task
GradVac
论文: Wang, Z., Tsvetkov, Y., Firat, O., & Cao, Y. (2020). Gradient vaccine: Investigating and improving multi-task optimization in massively multilingual models. *arXiv preprint arXiv:2010.05874*.
代码: https://github.com/chenllliang/Gradient-Vaccine
PCGrad只在梯度之间的余弦相似度为负值时生效,这导致PCGrad在训练过程中的表现是非常稀疏的,如下面的左图,而真实情况,存在不少任务梯度之间是正余弦相似度,但它们却没被PCGrad考虑,于是作者提出GradVac。
论文附录E有详细推导过程:
整个训练过程如下:
总结
总结如下:
#梯度下降算法の全新思路
约翰霍普金斯大学应用数学与统计学助理教授 Benjamin Grimmer 提出了理解梯度下降算法的全新思路。
在机器学习的世界中,最优化问题非常重要,它们能使世界变得更好。最优化问题旨在寻求完成某件事情的最佳方式,比如手机 GPS 计算达到目的地的最短路线,旅游网站搜索与行程相匹配的最便宜的航班。同时,机器学习应用通过分析数据模式进行学习,并试图为任何给定的最优化问题提供最准确和最人性化的答案。
对于简单的最优化问题,找到最佳解决方案只是一个算术问题。1847 年,法国数学家奥古斯丁 - 路易・柯西(Augustin-Louis Cauchy)研究了一个相当复杂的例子 —— 天文计算。在那时他开创了一种常见的优化方法,也就是现在的梯度下降,它是优化方法中最经典和最简单的一阶方法之一。
如今,得益于其较低复杂度和简单操作,大多数机器学习程序都极其依赖梯度下降方法,其他领域也用它分析数据和解决工程问题。一百多年来,数学家们一直在完善梯度下降方法。然而上个月的一篇论文表明,关于梯度下降方法的基本假设可能是错误的。
这篇论文为《Provably Faster Gradient Descent via Long Steps》,唯一作者为约翰霍普金斯大学应用数学与统计学助理教授 Benjamin Grimmer。他对于自己的发现感到非常惊讶,就像直觉被打破一样。
他的反直觉结果表明,如果长期以来被认可的、找到给定问题最佳答案的规则被打破,则梯度下降的速度可以实现近 3 倍提升。再具体一点:他认为梯度下降算法可以通过包含意想不到的大步长(large step size)来更快地工作,这与研究人员长期以来所认为的相反。
论文地址:https://arxiv.org/pdf/2307.06324.pdf
虽然这一理论上的进展可能不适用于机器学习解决更棘手的问题,但可以促使研究人员重新考虑对梯度下降的理解。
MIT 的一名优化研究员 Shuvomoy Das Gupta 对此表示,「事实证明,我们并没有完全理解梯度下降背后的理论。现在,这项研究让我们更接近理解梯度下降的作用了。」
本文通过一种计算机辅助分析技术,在平滑凸优化中建立了可以证明更快的梯度下降收敛速度。其中,作者分析了一次多次迭代的整体效果而非大多数一阶方法分析中使用的典型单次迭代归纳,从而允许非恒定步长策略。
结果表明,更大的步长在短期内增加了目标值,但长期内实现了可证明的、更快的收敛。此外通过简单的数值验证,作者还提出了证明更快 O (1/T log T) 梯度下降率的一个猜想。
具体地讲,作者的证明基于性能估计问题(PEP)思路,它将计算或限制给定算法的最坏情况问题实例作为半定规划(Semidefinite Program, SDP)来处理。通过相关 SDP 可行解的存在,作者证明了应用非恒定步长模式后的下降保证,从而获得更快收敛保证。
在具体操作中,设计可证明的更快非恒定步长梯度下降方法相当于寻找具有很大平均步长值的直接(straightforward)步长模式。证明给定的模式很简单,可以利用半定规划来完成,参见定理 3.1。
下表 1 展示了越来越快的收敛保证的直接步长模式,其中每个模式都使用计算机生成的、精确算术半定规划解决方案进行了验证。未来的工作将确定更大步长的直接模式和其他可处理的非恒定、周期性大步长策略。
但是,寻找长的、直接步长模式 h 很困难,所有直接模式的集合都是非凸的,导致局部搜索常常没有结果。如表 1 所示,长度 t = 2^m − 1 的模式是通过重复 t = 2^m−1 − 1 两次而创建的,中间添加了一个新的长步,并手动缩短长度 2^m−1 − 1 子模式中的长步。作者表示,这种递归模式与以往研究中的二次极小化的循环和分形切比雪夫模式具有强相似性,还没有证明它们之间的联系。
作者表示,其方法与宾夕法尼亚大学优化研究员 Jason Altschuler 首次提出的方法非常相似,后者建立了长度为 2 或 3 的重复步长模式,并向最小化器更快收缩,实现平滑、强凸的最小化。
更细节的内容请参阅原论文。
从小步长到大步长,突破长度限制
我们知道,尽管没人能证明步长越小越好,但几十年来该领域的传统观点一直是采用小步长。这意味着在梯度下降方程中,步长不大于 2。
随着计算机辅助技术的进步,优化理论家已经开始测试更极限的技术。比如最近发表在《数学编程》期刊上的一项工作,Das Gupta 和其他研究者要求计算机为仅限 50 步的算法找到最佳步长,这是一种元优化问题。他们发现,最佳 50 步的长度变化很大,序列中一个步骤的长度几乎达到了 37,远高于长度 2 的典型上限。
论文地址:https://link.springer.com/article/10.1007/s10107-023-01973-1
这一结果表明,优化研究人员遗漏了一些东西。因此,出于好奇,Grimmer 将 Das Gupta 的数值结果转化为了更普遍的定理。为了突破 50 步的任意上限,他探索了可重复序列的最佳步长,每次重复都更接近最佳答案。Grimmer 让计算机进行了数百万次步长序列的排列,从而找到那些最快收敛到答案的序列。
Grimmer 发现,最快的序列总是有一个共同点,即中间的一步总是很大,其大小取决于重复序列中的步骤数。对于 3 步序列,大步的长度为 4.9;对于 15 步序列,算法建议步长为 29.7;对于测试中最长的 127 步序列,中间的最大步长为 370。最终的结果表明,序列达到最佳点的速度是连续小步长速度的近三倍。
理论虽新颖,但无法改变当前使用方式
法国帕莱索理工学院优化研究员 Aymeric Dieuleveut 表示,这种循环方法代表了一种不同的梯度下降思维方式。他说道,「直觉告诉我,我不应该一步一步地思考问题,而是应该连续思考多个步骤。我认为很多人都忽略了这一点。」
不过,虽然这些见解可能会改变研究人员对梯度下降的看法,但可能不会改变这项技术目前的使用方式。毕竟,Grimmer 的论文只关注光滑函数和凸函数,光滑函数没有尖锐弯曲,凸函数的形状像一个碗,底部只有一个最优值。这些函数在理论上是最基础的,但在实践中却不那么重要。机器学习研究人员使用的优化程序通常要复杂得多。
蒙特利尔大学优化与机器学习研究员 Gauthier Gidel 表示,一些经过改进的技术可以使 Grimmer 的大步长方法更快,但这些技术需要付出额外的运行成本。因此人们一直希望常规梯度下降法能在步长的正确组合下胜出。遗憾的是,这项新研究的三倍提速还远远不够。
Gidel 提出自己的疑问,「虽然表明情况略有改善,但我想真正的问题是:我们真的能缩小这个差距吗?」
这些结果还提出了另一个令本文作者彻夜难眠的理论之谜。为什么步长的理想模式都具有如此对称的形状?不仅最大的一步总是恰好在中间,而且它的两边也会出现同样的模式:继续放大并细分序列,会得到一个「几乎分形的模式」,大的步长被小的步长包围。这种重复暗示着,一种潜在的结构正在支配最佳解决方案,目前还没有人能够解释这种结构。
但本文作者至少还抱有希望,「这个谜题,如果我破解不了,别人也会破解的。」
原文链接:https://www.quantamagazine.org/risky-giant-steps-can-solve-optimization-problems-faster-20230811/
#Occupancy Prediction比赛方案总结
CVPR2023的Occupancy Prediction比赛的前五名开源方案分析总结。
第一次参加CVPR的比赛,没有太多的比赛经验,以此文来总结一下大佬们开源出来的比赛方案,并提出一些自己的思考,欢迎评论区进行交流。
Occupancy Prediction任务描述
3D Occupancy Prediction(Occ)是Telsa在2022 AI Day里提出的检测任务,任务的提出是认为此前的3D目标检测所检测出的3D目标框,不足描述一般物体(数据集中没有的物体),在此任务中,则把物体切分成体素进行表达,要求网络可以在3D体素空间中,预测每个体素的类别,可以认为是语义分割在3D体素空间的扩展任务,具体预测图如下图所示。
来源:https://github.com/NVlabs/FB-BEV
在本次比赛中,Occ数据集基于Nuscenes数据集进行构建,要求选手在仅使用图像这个模态的情况下,对200x200x16的3D体素空间的占据情况进行预测,其中评价指标采用MIoU,并且将仅对图像中的可视范围中的预测结果进行评估:
更详细的规则可以看看官方的GitHub:
https://github.com/CVPR2023-3D-Occupancy-Prediction/CVPR2023-3D-Occupancy-Prediction
Baseline介绍
在比赛中,一共有两个Baseline可供选择,一个是官方提供的基于BEVFormer框架的实现,另一个则是基于BEVDet框架实现的,也分别代表了在3D目标检测现在主流的两个实现路线,LSS和Transfromer。
两种Baseline都将原来输入检测头的特征,从BEV空间拉伸成200x200x16的3D体素空间,然后接上一个简单的语义分割头,来对3D占据的结果进行预测,具体性能表现如下表所示:
Method | mIoU |
BEVFormer-R101 | 23.67 |
BEVDet-R50-256x704 | 36.1 |
BEVDet-R50-384x704 | 37.3 |
BEVDet-R50-Longterm-384x704 | 39.3 |
BEVDet-STBase-512x1024 | 42.0 |
从官方及开源的Baseline中可以发现几个比较明显的提分方法:
更大的输入分辨率
利用更多的时序信息
使用更先进的Backbone来提取特征
其中官方的BEVFormer之所以和BEVDet差距比较大的原因在于,其在训练时没有使用mask camera,也就是其会计算图像可视范围外的损失,而BEVDet在训练时是不计算的,可以从第五名的消融实验中看出此原因。
接下来,将对前五名开源方法进行介绍,如有说的不对的地方,请在评论区指正!
FB-OCC: 3D Occupancy Prediction based on Forward-Backward View Transformation
第一名团队来自NVIDIA,其整体构建的框架并没有采用LSS和BEVFormer,而是基于NVIDIA自己开发的一套框架FB-BEV,目前其代码还为开源,也没有详细的论文介绍FB-BEV。下面,将从网络结构的设计,网络模型的扩大以及预训练的应用和后处理部分进行介绍
本次比赛的开源论文如下:
https://opendrivelab.com/e2ead/AD23Challenge/Track_3_NVOCC.pdf
网络结构设计
下面是个人对FB-BEV及FB-OCC网络的初步理解,欢迎在评论区交流。
对于BEV空间的生成,可以认为LSS是前向生成的过程,在前向推理时通过深度的估计,就可以生成一个粗略的BEV特征,而BEVFormer则是通过BEV queries的形式来生成BEV特征,在前向时这个BEV queries是未知的,是人为随意定义的,其BEV特征真正的生成,是通过反向传播模型学习来的。
(a)LSS生成lift生成BEV空间;(b)BEVFormer使用BEV queries生成BEV空间
而FB-BEV则是结合了两者的优劣,设计了既包含前向又包含反向的BEV空间特征生成方法:由于LSS方法中对于深度估计是离散的,故其生成的3D空间特征也是较为稀疏的,而BEVFormer中BEV queries就不存在这个问题,但原先随机初始化的BEV queries会存在不好优化的问题,故FB-BEV利用LSS中生成的3D体素空间,来作为BEV queries的初始值,使其可以更好的优化,最后将两部分的特征进行融合,使网络对于3D空间有更好的精细化描述,其具体结构如下图所示。
FB-OCC结构图,F-VTM表示前向BEV生成,类似LSS,B-VTM则表示反向BEV生成,类似BEVFormer
在最后,作者利用了多尺度的预测融合的预测方式,来设计占据检测头,具体结构如下图:
Occupancy Head结构图
扩大模型及预训练应用
使用更好更大的模型,无疑是增加网络性能最简单粗暴的方法,但过大的模型有可能会在Nuscenes上造成过拟合等问题,最后,作者利用前段时间霸榜各大榜单的InterImage-H来作为他们的Backbone,而为了更好的应用InterImage-H,作者还将其在原先在COCO的预训练基础上,在object365上也进行了预训练,使其更好的应用在此任务上。
但就这么应用预训练模型,仅仅是Backbone层面的,对于网络的感知能力提升其实并没有很大,于是作者就想将网络在Nuscenes上进行深度估计的预训练,但单纯的深度估计任务的训练,又会导致预训练模型中的权重偏向于此任务,同样不利于感知任务,于是就将网络在深度估计和2D语义分割联合任务中进行预训练来达到提升预训练模型感知能力的效果。
但Nuscenes数据集是没有提供图片的2D语义分割标签的,所以作者就利用了最近很火的SAM来进行自动标注,并利用Nuscenes中检测框和点云分割的标签来生成更加精确的mask,预训练示意图如下图所示:
深度估计及2D语义分割联合预训练图
(其实这里我个人认为如果嫌麻烦,可以使用深度估计和3D目标检测任务或者2D目标检测任务进行联合训练,来达到差不多的效果,但由于2D语义分割其实和3D占据任务很相似,所以有可能效果会更好)
后处理
后处理中,和一些经典比赛中的策略不同的是,作者在TTA中还加入了时序的TTA操作,具体操作个人猜测就是在前向时使用不同数量的时序帧来TTA。
另外,作者观察到在同一个场景下,网络对于远处的识别效果并不如近景好,所以可以把近处中静止的物体预测结果固定起来,当车辆走到远处时,原来近景就变成了远景,则可以将静止的物体预测结果进行替换。
最后其融合结果在测试集上达到54.19%效果,在本次比赛也是毫无对手了,个人认为其对于预训练模型的思考相比于网络的结构设计而言,更值得学习和思考。
MiLO: Multi-task Learning with Localization Ambiguity Suppression for Occupancy Prediction
第二名团队来自42dot自动驾驶公司,其网络框架则整体采用了BEVDet进行开发。由于其对网络结构的改进不大,所以主要从以下两部分进行介绍,分别是多任务训练和后处理设计。
本次比赛的开源论文如下:
https://opendrivelab.com/e2ead/AD23Challenge/Track_3_42dot.pdf
多任务训练
这里多任务的训练思想其实和第一名对于预训练模型的应用目的是一样的,就是为了更好的优化网络,由于BEVDet整体框架在多个视角下进行变换(2D,2D-3D, 3D),如果只在最后的输出特征进行监督训练,难以很好的对底层的网络进行优化,这个问题在PANet中同样提到过。于是作者在2D的FPN部分,引入新的分支来做2D的语义分割任务,来监督2D部分网络的优化,而2D-3D和3D则采用了和BEVDet相同的深度监督以及3D占据任务监督。
在FPN后接入两层ResNet去做2D语义分割,并利用此特征来更新FPN的特征,送入2D-3D网络
这里作者并没有使用第一名中较为复杂的方法生成2D图像中的语义分割标签,而是直接把点云分割的标签投影到图像空间中,并且计算loss时也只会对这些点进行计算。
后处理
作者注意到从图像中进行定位是比较模糊的,如下图所示,在一定区域内确实是预测到了行人,但其预测的具体位置却是模糊的。
作者然后分析了自己的预测结果,设置了6种不同距离,并观察6种不同距离上的mIoU表现,发现有些类别,如bicycle和motorcycle等,在最远处的mIoU几乎等于0。于是作者根据推理观察和在验证集上的测试等,为6种不同的距离设置了不同的阈值,若预测的分数低于此阈值,则将其类别设置为free类,来缓解此问题。
最后其结果在测试集上达到了52.45%的成绩,由1、2名的成功,不论是对于2D语义分割的预训练还是引入多任务训练,2D任务的引入,可以更好的优化此任务下的网络。
UniOcc: Unifying Vision-Centric 3D Occupancy Prediction with Geometric and Semantic Rendering
第三名团队来自小米汽车,其在不使用标签数据,单模型的情况下拿到51.27%的成绩,可以认为别人只是来玩玩的而已了。其并没有拘泥于LSS或者BEVFormer的框架形式,而是针对此任务提出一些plug-and-play的东西来提升网络效果。
本次比赛的开源论文如下:
https://opendrivelab.com/e2ead/AD23Challenge/Track_3_UniOcc.pdf
其把3D占据任务认为是一种渲染问题,尝试使用NeRF的思路进行解决,并最后利用Teacher-Student的训练思路来对模型进行训练,在这里重点讲讲如何把3D占据认为转为NeRF的过程。
NeRF
NeRF处理过程
而由于计算资源的限制,NeRF并不能在一条光线上采样过多的点,但有时候,有些地方的点能提供的信息很少,甚至是空的,不利于网络的建模,比较理想的采样方法是在实体上点密集的地方多采样,所以提出了一种分层的采样方式,也可以认为是粗粒度和细粒度同时进行的采样方式:其首先先随机的在光线上进行采样,进行粗粒度的估计,而后根据估计结果,在密度较高的地方进行重新采样,得到细粒度的估计,而优化时则是粗粒度和细粒度同时进行优化,其细粒度得到的颜色值如下:
From Occupancy to NeRF
UniOcc整体框图
其中 βk=zk+1−zk\beta_{k}=z_{k+1}-z_{k}\beta_{k}=z_{k+1}-z_{k} ,也就是两个采样点直接的距离,通过几何信息和语义信息的渲染,则可以得到预测的3D占据情况。(本人对NeRF的理解还不是很好,有可能这里有讲解问题的地方)
Multi-Scale Occ: 4th Place Solution for CVPR 2023 3D Occupancy Prediction Challenge
第四名来自上汽 AI LAB,其整体框架设计采用BEVDet的设计思路,主要提出利用多尺度信息来进行训练和预测以及一种解耦头的预测方法。
本次比赛的开源论文如下:
https://opendrivelab.com/e2ead/AD23Challenge/Track_3_occ-heiheihei.pdf
多尺度网络结构设计
其网络多尺度的设计,参考了SurroundOcc设计,其利用FPN建立多尺度的特征,然后利用不同尺度的特征去生成不同大小空间的3D体素特征,在这里使用了50x50x4,100x100x8和200x200x16这三个大小的体素空间,最后利用3D UNet的形式去融合不同尺度的特征来预测3D占据情况,训练时不同尺度的信息都将计算loss。
解耦头设计
由于在此任务中,存在比较明显的类别不平衡问题,Free类别在训练集中就占据了96%的数量,为了解决此问题,作者将预测头进行解耦,分为是否是Free类的二分类头,还有其他16个类别的语义分割头两部分。二分类头采用BCE作为损失函数,而语义分割头则采用Focal loss来作为损失函数,最后总的损失函数如下:
OccTransformer: Improving BEVFormer for 3D camera-only occupancy prediction
第五名团队来自哈工大,其网络结构整体采用BEVFormer的设计思路,其网络设计主要在头部进行了3D UNet的改进,其他部分改动不大,不过其方法是所有方法中唯一使用了额外数据增强和结合3D目标检测进行后处理的方法。
本次比赛的开源论文如下:
https://opendrivelab.com/e2ead/AD23Challenge/Track_3_occ_transformer.pdf
数据增强
为了使模型发掘更多局部特征,作者对图像进行了cutout的数据增强操作来增强图像。
(其实这里我在比赛初期也尝试使用过额外的数据增强,但我们的框架整体借鉴于BEVDet,但在BEVDet论文中也谈及,单纯的在图像空间做数据增强,而不在BEV空间做增强,反而会降低网络的性能,所以一些尝试都失败了,在这里cutout等数据增强,也许也仅适用于BEVFormer框架)
模型融合后处理
作者发现,在动态物体上,3D目标检测的效果要好于3D占据任务的表现。所以作者利用StreamPETR去生成3D检测框,并将检测框转换成3D占据的形式。具体为,根据不同类别,设置不同的阈值,选择高置信度的检测框,并在框内生成间距为 ttt 的点云,并对点云进行体素化,然后根据预测的类别打上语义标签,最后,将此结果和Occ网络的预测结果进行融合。
总结
最后前10名榜单如下
#Occ一百问问题1
一个关于说从入门到精通的入门的点。就occupancy的数据格式而言,PPT讲了它是基于体素。但是如果我想修改occupancy到其他设备要改这个范围跟格子大小的时候,应该怎么改呢?这个xyz具体是怎么组织的,位置索引里是中心点还是端点?这些都没有提过。
修改范围和格子大小,是在config里面直接改就行,xyz的组织方式,如果是自己生成数据的话,要先确定xyz轴的坐标范围,以及voxel size,这样就能唯一确定一帧对应的体素数量。然后按一定顺序去存储和读取voxel的占用和语义信息,注意存储和读取保持一致。比如沿着z方向一层层读取x-y平面的voxel,x-y平面又从x和y坐标最小的地方开始(举个例子,不一定要这样保存)
问题2
相机我可以理解为体素投影到图像上只学习能投影上的,lidar的话如果不是机械雷达该怎么算呢?
标签是如何标注的?地面真相标签的占用来自累积LiDAR扫描与人类的注释,我们注释的占用在自我坐标系。如果一个体素反映了一个LiDAR点,那么它被分配为与LiDAR点相同的语义标签;如果激光雷达光束通过空气中的体素,则体素被设置为自由的;否则,我们将体素设置为未知,或未观察到的。这是由于LiDAR的稀疏性或体素被遮挡,例如被墙遮挡。在数据集中,【mask_lidar】是一个0-1的二进制掩码,其中0表示未观察到的体素。
问题3
请问一下,我在运行surroundocc训练指令的时候找不到chamfer这个包,但是我安装的时候现在安装了这个包,然后我pip list也没找到这个包,好像是按照在python里面了,我去找了网上的方法说重新编译,但是我编译了几次都不行,然后我尝试直接pip安装这个包,但是好像只能通过代码来安装,pip也失败了。
chamfer是算chamfer distance的,衡量occupancy预测和真值之间的距离,我看surroundocc里面有,你代码库本身编译了吗?docs/install.md里面有说明
问题4
可以解答一下,关于3D语义分割和Occupancy两种评价方式的区别吗,真值的区别,以点来评价还是以体素来评价
3D语义分割:评价通常基于点级别,即评估模型对每个点的分类准确性。
Occupancy:评价是基于体素级别,即评估模型在确定每个体素是否被占据方面的准确性,3D语义分割:真值通常是针对每个点的标签,这些标签代表了每个点属于的类别。
Occupancy:真值在这种情况下通常是基于体素,每个体素或者点云块儿被标记为占据或空闲。
问题5
以激光雷达语义分割结果生成真值的多模态occ和ssc的具体区别在哪里,有没有加visible mask吗?我的意思是如果把free作为一个语义的话这两个任务是不是都是在对所有体素进行分类,还有一个问题想请教一下小助教,就是一个scene里面往往激光雷达也只能扫到一部分,那么这样一辆车可能也就只有四分之三的体素标记为车,这样在大量数据的训练下网络能补全出完整的车辆吗?
主要区别在于输出的信息类型,occ通常只关注是否有物体占据空间,ssc还要求提供占据空间物体的具体类别,只是侧重点不同,3D检测中如果“free”作为一个类别,那么空区域就会被分为“free”,occ中是先把“free”区域定义为0,然后附上颜色,还取决于你模型的架构,一般都是学习到部分可见车辆的典型特征,后面就是要么更具之前的学习类容推断出不可见部分,要么就是前后帧关联推断这一帧
问题6
请问将bevfusion的3d检测头替换为占用和语义头可行吗?
这个本来就可以,那你直接把占据空间压缩成BEV空间就可以了,语义本来就有
问题7
这些OCC真值,和nuScenes里面的点云标注文件的区别是不是只是稠密跟稀疏的区别,那在训练的时候,还会读取nuScenes里面的bin文件吗,那如果我不生成GT,直接把nuScenes里面的bin转成npy当做OCC真值来训练可以吗?我还想问如果想输出密集的占用预测,是不是应该用带语义分割的雷达点云数据合并生成密集的占用真值作为监督?
也行,不过nuscenes本来就稀疏,再加上单帧,指标有多高不好说,针对surroundocc吗,针对nuscenes,那怎么转成npy真值呀,OpenOccupancy能转吗,npy不就一种格式么,想怎么转都行,bin文件格式搞清楚,写个脚本就行。可以的,这样预测准确性可以提高,但是也要取决于你真值生成得是否准确。
问题8
能不能把3d occ的算法几何头和语义头分开训练呢?如果几何头训练完换一个场景还能进行准确的占用预测吗?课程里面提到3d occ的一个优势是把几何和语义解耦开,老师能不能具体解释一下这句话?
没有见过分开训练的,但是见过解耦开,分两个分支设计模型的,几何分支,语义分支。SSC领域的论文很好的探讨了这个问题 你可以从头看一下,你可以简单理解,我说的解耦的意思是:原本是由一个层同时学习几何和语义特征 ,现在我用一个层专门学习几何特征 一个层专门学习语义特征 这两个层是并行的 然后将学到的两种特征做融合 这就是所谓解耦,群公告里有我整理的OCC paper list,OCC仓库:
https://github.com/autodriving-heart/Awesome-occupancy-perception
问题9
单目和环视的occ除了输入不同以外方法上有什么区别吗?
没什么本质区别,输入的不同,单目由于信息量更少,还有就是训练数据少,比较难做,前视上作为辅助用的多,也可以取个折中,比如用3目,三个前方的相机。
问题10
SurroundOcc在计算loss的时候,需要修改occ_size吗,如果换了范围的话,改了范围之后维度不对了,转真值的时候我也改了范围的,不知道训练的时候,除了配置文件要改范围,还有没有其他地方要改,老师给的数据
没了,mmdet的代码,写得好的话就是应该只改配置文件和脚本,高度模块化了,需要修改一下volume,和occ_size要对应修改
问题11
请问一下,怎么把surroundocc的可视化调大一点,那个画板空一大片,调小了voxel也跟着小,有什么方法能把可视化的体素调大点
MeshLab
问题12
Occ的优化是从哪些方面做的?
各种加数据,纯视觉bev这种方法,弱点就在于augmentation不是那么好加,所以很吃数据
问题13
想请教一下每个视角的可视化改怎么做呢?或者有没有什么项目也是这样做的。我现在得到了npz文件用open3d可视化只能拖拽了看,没法得到每个视角的occ结果
写脚本,可视化之后固定视角继续播放,你可以设置先打卡一个文件,调整到对应的视角,然后关闭并保存视角参数,随后连续播放
问题14
想请教一下有没有用3d occ和激光雷达点云做融合的方案
openoccupancy
问题15
请问有没有轻量实时的occ模型,想把这个当做base code
可以去看看suroundocc、bevdet4d_occ或者openoccupancy的camera-only,单阶段的那个
问题16
关于占用网络,有没有类似nuScenes Tasks那样的Leaderboard?
OpenOccupancy: A Large Scale Benchmark for Surrounding Semantic Occupancy Perception
问题17
两位老师早上好,我这边是做封闭场景重型机械的应用,目前用的是纯Lidar的方案,想在Lidar的基础上把Occ链路打通,所以有些问题想请教
问题:1. 老师课程中提及,Occ如果把voxel size无限缩小, 那就是和点云是同一表示, 请教一下老师, 如此看来, 纯视觉Occ和点云的栅格化地图有什么区别?
2. 纯视觉Occ是否能提供障碍物的深度信息/类别信息? 课程中老师提及汽车做行车安全不需要知道障碍物类别,只需要知道能不能撞,几何有没有占用. 那如果对不同的障碍物避障逻辑不同(比如人是直接刹停,其他车辆选择绕障),Occ是否可以满足这个需求?
3. Lidar+Camera的Occ方案 和 纯视觉Occ方案相比 有哪些优势?
4. Lidar+Camera的Occ方案 和 点云语义分割/点云目标检测 相比有哪些优势?
回复:
1.Occ表示该格子被占据的概率,点云栅格化地图每个栅格保存的是 Height 信息或点的数量,直接表示场景结构
2.纯视觉Occ能提供障碍物的深度信息/类别信息,这些信息一般都来自数据集的真值训练
2.1对不同的障碍物避障逻辑不同,这类问题归为控制类,个人认为,比如校车旁边支出来一个”停“的牌子,后期可以更具特有因素归为车体的voxel里面
3.Lidar的距离数据可以帮助校正和验证视觉算法估计的Occ概率,Lidar不依赖光照,当视觉算法在光照不足等情况下效果下降时,可以利用Lidar的数据进行补偿
4.1Occ方案更全面表示复杂环境,Occ提供了对空间结构和语义的整体表达,更适合规划导航,点云方法存在遮挡区域等空洞
4.2点云分割/检测需要后续处理来链接单个/多个检测,而Occ则减少了后续处理的工作量
4.3但是点云分割/检测可以提供更细粒度的语义理解
问题18
想请教一下SSC和3D Occ之间的差异
SSC关注精确补全图像背后的完整3D结构和表面细节,需要大量带精确3D ground truth的数据进行监督训练。而Occ更简单,只关心空间占据情况,对表面形状和细节建模较少,更易获得的2D监督信号进行训练,SSC之前了解过,实时性的需要是不是不满足,这点我没有深究下去!
问题19
最近在看openocc模型,作者把lidar camera融合的过程中是不是并没有用lidar做深度监督呢,感觉是直接把两个模型特征相加,两个传感器的特征相互没有关系,那如果其中一个分支预测出现偏差,这种自适应融合能够纠正吗?
对,虽然LiDAR和相机的特征在融合过程中没有直接的深度监督关系,但通过特征融合,两种传感器的信息可以相互补充和增强,从而提高周围占据感知的性能,你从他的实验就能看出如果其中一个分支的预测出现偏差,自适应融合模块无法自动纠正这种偏差,相加的方式只是简单地将两个分支的特征进行叠加,而不会对特征进行调整或修正,它的作用是通过整合多模态特征来提高周围占据感知的性能。
问题20
occupancy 数据集只能通过segmentation 结果生成吗?在工程上,怎么让标注人员标注呢?先将点云生成voxel,然后再标注吗?
1,现在基本都是根据segmentation 结果生成
2,你可以让标注人员标注体素单元中指定占用或非占用来进行标注
3,用SAM标注图像,然后相机和点云做配准,投影到点云体素上
问题21
想问下目前主机厂对于Occupancy Prediction持什么态度,目前的进展是什么,实测的话一般部署在什么设备上?
实测部署在orin上,这个是必然要上的
问题22
做深度学习,两块12g的2060好,还是1块12g的3060好
3060,你两个卡还要买双x16的卡槽的主板,且3060的Ampere架构,CUDA核心数量是3584个,而RTX 2060只有1920个,而且很多现在代码有cuda版本限制,你买20系列的还要去改cuda代码适应你的版本
问题23
请问,我又同一区域不同尺度的点云(无人机获取的30m与50m),需要制作高精度地图,我应该先进行点云拼接呢,还是单独先作点云语义分割呢?
建议先进行点云拼接,然后再进行语义分割,拼接的目的是将来自同一区域但不同尺度的点云数据合并成一个统一的、连续的点云模型,可以确保在进行语义分割时,所有相关数据都被考虑在内,从而提高分割的准确性和地图的完整性,当然你要多考虑点云数据的质量、密度以及拼接和分割算法的性能
问题24
大家知道自动驾驶落地的定位技术常用的有哪些啊,尤其是传感器只有GPS,imu和双目的话
gPTP 提供精准时钟,RTK service ,底盘也许有里程计GVINS了解下,大疆的livox激光雷达几千块钱,也可以考虑,VIO的性能还是挺有限的,ORB-SLAM3是比较好的了!
问题25
特斯拉这种类似mesh的车机渲染是occ后处理嘛?大概多高分辨率能有这个效果呀?
个人觉得是学的sdf,光occ后处理达不到这个效果
#神经网络~损失函数分布の可视化神器
这里使用了一系列可视化方法探索了神经损失函数的结构,以及loss landscape对泛化的影响,提出了一种基于 "Filter Normalization" 的简单可视化方法。当使用这种归一化时,最小化的锐度与泛化误差有很高的相关性,这种展示的可视化结果非常清晰。
论文名称:Visualizing the Loss Landscape of Neural Nets
论文地址:https://arxiv.org/pdf/1712.09913.pdf
训练一个神经网络,需要最小化一个高维非凸损失函数——这一任务在理论上很难,但在实践中有时很容易。简单的梯度下降方法通常可以找到全局的最小值 (训练损失为零或接近零)。然而,这种较容易训练好一个网络的行为却并不普遍,神经网络的可训练性高度依赖于网络架构设计的选择、优化器的选择、变量初始化和各种因素。而且,这些选择对于潜在的 loss landscape 的影响尚不清楚。
因此,本文从神经网络损失函数分布可视化的角度,想研究以下几个问题:
为什么我们能够最小化高度非凸神经损失函数?
为什么得到的最小值这个结果具有泛化性?
不同的神经网络网络架构如何影响损失函数分布 (loss landascape),以及训练的超参数参数如何影响损失函数分布?
具体而言,本文的贡献是:
本文提出一种基于 "Filter Normalization" 的简单可视化方法。当使用这种归一化时,最小化的锐度与泛化误差有很高的相关性,这种展示的可视化结果非常清晰。
本文观察到,当网络变得足够深时,神经网络的 loss landscape 会迅速从接近凸的状态过渡到高度混乱的状态。这种从凸到混沌行为的转变伴随着泛化误差的急剧下降,并最终导致整个网络可训练性的下降。
本文观察到,残差连接促进了 loss landscape 更加平坦,并阻止了向混沌行为的过渡,这有助于解释为什么残差连接对于训练极深的网络是必要的。
本文通过计算在局部极小值附近 Hessian 矩阵的的最小 (最负) 特征值来定量测量非凸性,并将结果可视化为 heatmap。
本文研究了 SGD 优化轨迹的可视化,也解释了可视化这些轨迹时出现的困难。
损失函数可视化基础
一维的线性插值可视化方法
首先,一维线性插值方法去可视化神经网络的非凸性 (non-convexities) 是很困难的,这就导致了损失函数在最小化轨迹上似乎缺乏局部最小值。一些损失函数具有非凸性,而这些非凸性与不同网络架构之间的泛化差异相关。而且,一维线性插值方法不考虑 Batch Normalization 或者网络中的不变性对称性。因此,由一维线性插值方法产生的插值结果可能具有误导性。
二维的线性插值可视化方法
以上方法的问题
那么以上的一维,二维的线性插值可视化方法不好在哪了呢?虽然以上这两种在随机方向移动一个小距离,并绘制函数值的绘图方法很简单,但它无法捕捉损失函数的固有几何形状,并且不能用于比较两个不同的最小化器或两个不同的神经网络模型的几何形状。这是因为网络权重的比例不变性 (scale invariance) 。当使用 ReLU 非线性激活函数时,如果将网络中某一层的权重乘以10,并将下一层的权重除以10,网络输出将保持不变。当使用 BN 时,同理也存在这种不变性。
那么网络权重的比例不变性 (scale invariance) 对于以上的一维,二维的线性插值可视化方法有哪些影响呢?
具有较大权重的神经网络可能具有平滑且缓慢变化的损失函数:比如说,如果权重的幅值比1大得多,那么将权重扰动一个单位对网络性能的影响很小。但是如果权重远小于1,那么同样的单位扰动可能会产生很大的影响,使损失函数对权重扰动显得相当敏感。
Filter Normalization
基于以上一维和二维的线性插值可视化方法的缺点,本文提出一种叫做 Filter Normalization 的可视化方法。这种方法的思想也是基于以上的一维,二维的线性插值可视化方法。
以上方法问题的核心其实就来自于 "单位扰动" ,即:
对于权重幅值较大的神经网络而言,一个单位的扰动对它没啥作用,即使得 loss 的改变几乎可以忽略不计,那么它就更可能具有一个平滑且缓慢变化的 loss landscape。
对于权重幅值较小的神经网络而言,一个单位的扰动对它会产生很大的影响,使得 loss 发生灾难性的改变,使得 loss landscape 对权重扰动显得相当敏感。
作者在下一节证明了经过滤波器归一化的图的锐度与泛化误差有很好的相关性,而没有滤波器归一化的图可能非常具有误导性。
可视化实验:Loss landscape 尖锐,扁平的困境
在上一节中,我们提到有的神经网络具有平滑且缓慢变化的 loss landscape (称为 sharp minimizer),而有的具有剧烈变化的 loss landscape (称为 flat minimizer)。在本节中,将通过一些实验结果阐明:sharp minimizer 和 flat minimizer 的泛化性有什么关系?
在这里呢,作者探讨了 sharp minimizer 和 flat minimizer 的区别。
下图 1(b) 和 1(e) 表示使用 weight decay 或者禁用 weight decay 时训练过程中权值范数的变化。当禁用权值衰减时,权值范数在训练过程中不受约束地稳定增长。
下图 1(c) 和 1(f) 表示训练过程中权值分布直方图。可以看到,当大 Batch Size 使用零权重衰减时,得到的权重往往比小 Batch Size 的情况要小。而通过添加 weight decay 可以扭转这种影响。出现这种规模上的差异的原因很简单:较小的 Batch Size 比大的 Batch Size 导致每个周期的权重更新更多,因此权重衰减的收缩效应 (它对权重的范数施加了惩罚) 更明显。
图1:不同 Batch Size 线性插值的可视化结果:(a) 和 (d) 是按照线性插值的做法,绘制中间参数训练和测试数据集上的损失函数值。(b) 和 (e) 表示使用 weight decay 或者禁用 weight decay 时训练过程中权值范数的变化。(c) 和 (f) 表示训练过程中权值分布直方图
把以上可视化实验再用 Filter Normalization 方法做一遍
在上一节中,作者表明:使用传统的一维线性插值方法得到的结论是:sharp minimizer 和 flat minimizer 的泛化性没什么关系。 在本小节中,作者把以上可视化实验再用 Filter Normalization 方法做一遍。如下图2所示,可视化结果仍然显示了小 Batch Size 和大 Batch Size 最小值之间的锐度差异,但这些差异比在非归一化图中出现的差异要微妙得多。
作者还使用两个随机方向和等高线图来可视化这些结果。用小 Batch Size 和非零权重衰减获得的权重比锐利的大 Batch Size 最小化具有更宽的轮廓。现在我们看到曲线的锐度与模型的泛化性之间很好地相关。大 Batch Size 产生视觉上更尖锐的最小值 (尽管不是很明显),但测试误差更高。
图2:不同 Batch Size 使用滤波器归一化 1D 和 2D 的可视化结果
究竟什么使得神经网络可训练?一些 Loss Surfaces 非凸结构的发现
大量经验表明,似乎有些神经结构比其他的更容易最小化。例如,使用 Skip Connection,ResNet 使得我们可以训练非常深的神经网络结构,而没有 Skip Connection 的相同的神经网络结构是不可训练的。而且,一个网络是否可以得到良好的训练很大程度上取决于训练开始时的初始参数。
作者使用可视化方法,对神经结构进行了实证研究,以探索为什么损失函数的非凸性在某些情况下似乎是有问题的。希望回答以下问题:
损失函数是否具有显著的非凸性?
如果非凸性存在,为什么它们在所有情况下都可以训练?
为什么有些网络架构容易训练?
为什么结果对初始化如此敏感?
实验设置
作者考虑以下3种网络架构:
ResNet20/56/110
VGG-like 模型,没有残差连接
Wide ResNets
所有模型都在 CIFAR-10 数据集上使用 Nesterov 动量 SGD 训练,Batch Size 大小为128,权重衰减为0.0005,持续300个 Epochs。学习率初始化为 0.1,在第150、225和275个 Epoch 下降10倍。使用滤波器归一化的可视化方法,作者对架构如何影响 loss landscape 进行了一些观察。
模型深度的影响
如下图3所示,可以看到,当不使用残差连接时,网络深度对神经网络的 loss landscape 有显著的影响。比如当深度为20时,不使用残差连接的 ResNet-20-NS 有较好的表现,这并不太令人惊讶,因为用于 ImageNet 的原始VGG 网络有19层,也可以有效地训练。但是,随着网络深度的增加,VGG 类网络的损失面自发地从 (近) 凸过渡到混沌。ResNet-56-NS 具有显著的非凸性和大区域,其中梯度方向 (与图中描绘的等高线正常) 不指向中心的最小值。而且,随着向某些方向移动,损失函数会变得非常大。ResNet-110-NS 显示出更明显的非凸性,当我们在图中所示的各个方向移动时,它变得非常陡峭。
图3:Wide-ResNet-56 有残差连接 (上) 和无残差连接 (下) 的 loss landscape,k=2 意思是每层滤波器数量乘以2
有无残差连接的影响
残差连接对损失函数的 loss landscape 有显著的影响。在上图3中可以看到,随着深度的增加,残差连接阻止了向混沌行为的过渡。残差连接的影响似乎对深的网络架构最为重要。对于更浅的网络 (ResNet-20 和 ResNet-20-NS),残差连接的影响不明显。如下图4所示是 ResNet-56 有无残差连接的 loss landscape 对比,图5所示是 ResNet-110 无残差连接和 DenseNet 121 层的 loss landscape 对比。
图5:ResNet-110 无残差连接和 DenseNet 121 层的 loss landscape 对比
模型宽度的影响
图6:Wide-ResNet-56 有残差连接 (上) 和无残差连接 (下) 的 loss landscape,k=2 意思是每层滤波器数量乘以2
网络初始化的影响
在图3中看到的一个有趣的性质是,网络的 loss landscape 似乎都可以分成两种区域:一种是损失函数值相对较低,loss landscape 的凸性很好;一种是损失函数值相对较高,loss landscape 的凸性很差。这种混沌和凸区域的划分可能解释了良好初始化策略的重要性。
如果一个神经网络模型的 loss landscape 很平坦,那么初始化的位置很可能位于具有 "良好表现" 的损失函数区域,可能永远不会出于非凸的部分。相反,如果一个神经网络模型的 loss landscape 很陡峭,那么初始化的位置很可能由于梯度不足导致增加优化的难度。
图3和图6都表明,loss landscape 对泛化性有显著的影响。混沌,陡峭的 loss landscape (没有残差连接的深度网络) 导致更糟糕的训练和测试误差,而更凸的景观具有更低的误差值。
总结
本文提出一种基于 "Filter Normalization" 的简单可视化方法。当使用这种归一化时,最小化的锐度与泛化误差有很高的相关性,这种展示的可视化结果非常清晰。本文观察到,当网络变得足够深时,神经网络的 loss landscape 会迅速从接近凸的状态过渡到高度混乱的状态。这种从凸到混沌行为的转变伴随着泛化误差的急剧下降,并最终导致整个网络可训练性的下降。本文观察到,残差连接促进了 loss landscape 更加平坦,并阻止了向混沌行为的过渡,这有助于解释为什么残差连接对于训练极深的网络是必要的。本文通过计算在局部极小值附近 Hessian 矩阵的的最小 (最负) 特征值来定量测量非凸性,并将结果可视化为 heatmap。本文研究了 SGD 优化轨迹的可视化,也解释了可视化这些轨迹时出现的困难。
#TOAST
在只微调一小部分参数的情况下超越fine-tuning,LoRA,VPT等方法!
本文作者提出了自上而下的注意力引导(TOAST),一种新的迁移学习算法,它可以冻结预先训练的骨干模型,选择与任务相关的特征输出,并将这些特征反馈到模型中,以引导注意力关注特定任务的特征。仅通过重新聚焦注意力,TOAST在多个迁移学习基准测试中取得了最先进的结果,而只需调整很少的参数。
论文题目:TOAST: Transfer Learning via Attention Steering
中文译名:TOAST:通过注意力引导的迁移学习
论文链接:https://arxiv.org/pdf/2305.15542
GitHub链接:https://github.com/bfshi/TOAST
我们发现在一个下游任务上微调大模型时,目前的方法(fine-tuning,LoRA,prompt tuning等等)往往无法将模型的attention聚焦在和下游任务相关的信息上。比如下方图1(b),我们把一个pretrained ViT迁移到下游的鸟类分类任务,却发现微调后得到的attention往往非常杂乱,这有可能会对模型在下游任务上的表现有影响。
迁移学习需要将预训练好的模型适应新的下游任务。然而,作者观察到,当前的迁移学习方法通常无法关注与任务相关的特征。在这项工作中,作者探索了重新聚焦模型注意力以进行迁移学习。作者提出了自上而下的注意力引导(TOAST),这是一种新的迁移学习算法,它可以冻结预先训练的骨干模型,选择与任务相关的特征输出,并将这些特征反馈到模型中,以引导注意力关注特定任务的特征。仅通过重新聚焦注意力,TOAST在多个迁移学习基准测试中取得了最先进的结果,而只需调整很少的参数。与完全微调、LoRA和提示调优相比,TOAST在各种细分类图像上(例如FGVC上平均准确率81.1% → 86.2%)性能都大大提高。在语言生成方面,TOAST还优于完全微调的Alpaca和Vicuna模型 。
模型简介
首先使用ImageNet预训练的ViT,并使用不同的迁移学习算法将其转移到下游鸟类分类中。在这里,将这些模型的注意力图可视化。每个注意力图在ViT的最后一层中的不同头部之间进行平均。(a) TOAST方法能够将预先训练的骨干的注意力重新集中在特定任务的特征上,从而大幅提高下游性能。(b) 先前的迁移学习方法,如微调、LoRA和VPT,未能专注于与任务相关的对象,从而实现了次优性能。
在这项工作中,作者表明重新聚焦注意力是迁移学习的关键。作者提出了自上而下的注意力引导(TOAST),这是一种新的迁移学习方法,它通过将注意力重新聚焦到任务相关特征来学习新任务。这是通过自上而下的注意力模块实现的,该模块允许模型以适应任务的方式调整其注意力。自上而下的注意力模块获取来自骨干网络的输出特征,选择与任务相关的特征,然后将这些特征反馈到骨干网络中的每个自注意力层。这些自上而下的信号将增强每层中的任务相关特征,并且带有增强特征的前馈骨干网络再次运行,实现对任务相关信号的更强注意力。在迁移到不同的下游任务时,TOAST简单地冻结预训练骨干网络,并调整自上而下的注意力模块以将注意力引导到特定任务的信号(图1(a))。
值得注意的是,仅通过重新聚焦注意力,TOAST在各种迁移学习基准测试中取得了最先进的结果。与完全微调、LoRA和VPT相比,TOAST显著提高了FGVC细分类上的性能(例如,在平均准确率上比完全微调提高了5%)。TOAST还优于完全微调的Alpaca和Vicuna模型,用于指令遵循语言生成。这些观察加强了作者的观点,即重新聚焦注意力是迁移学习的关键,并为该领域的未来探索提供了启发。
算法设计流程
论文提出了自上而下注意力引导(TOAST),这是一种新的迁移学习方法,它给预训练模型添加一个自上而下的注意力模块,并只在迁移到下游任务时调整自上而下的注意力。论文首先简要介绍自上而下注意力(第3.1节),然后描述TOAST的详细流程(第3.2节)。注意,尽管TOAST适用于不同的模型体系结构,如transformer和Convnets,但在下面的讨论中,论文假设是一个transformer骨干网络。
自上而下注意力transformer的预备知识
transformer模型通常是自下而上的,即它的注意力仅取决于输入,因此,它通常会突出输入信号中的所有显著特征。与自下而上注意力相反,自上而下注意力具有根据高层目标或任务调整注意力的能力,即它只关注与任务相关的特征,同时忽略其他特征。
图2
本设计遵循图2(a)所示的自上而下注意力设计。具体来说,对于一个纯前馈transformer,论文添加一个特征选择模块和一个反馈路径用于自上而下注意力。网络推理包含四个步骤:(i)输入经过前馈路径获得初始输出,(ii)选择输出中的对当前工作有用的特征,(iii)选择的特征通过反馈路径发送回每个自注意力模块,(iv)再次运行前馈传递,但每个自注意力都接收附加的自上而下输入。通过这种方式,任务相关信息在每个层中被增强,实现自上而下注意力。
在网络中,前馈路径是一个常规transformer,其余部分如下所述:
自上而下注意力引导
给定一个预训练transformer,TOAST随机初始化一个自上而下的注意力模块,并遵循两阶段流程:(i)在通用公共数据集(例如视觉的ImageNet或语言的OpenWebText)上预调整自上而下的注意力以获得更好的初始化,(ii)在下游任务上调整自上而下的注意力。在两阶段中,论文冻结预训练骨干网络,仅调整自上而下的注意力模块(图2(a))。
预调整阶段。 由于自上而下的注意力模块是随机初始化的,因此直接在下游任务上调整可能会导致次优性能。为此,论文提出先在通用公共数据集(如ImageNet或OpenWebText)上预调整自上而下的注意力以获得更好的初始化。在预调整过程中,除了常规的有监督或无监督损失之外,论文还添加了的变分损失,它鼓励反馈路径从输出重构输入,作为反馈权重的正则化。
TOAST中的注意力重新聚焦分析
图3
从相似的角度,我们来解释来为什么TOAST比其他基准模型性能优越。如图3所示,对于鸟类分类,TOAST明确关注前景鸟,而其他方法要么具有关注噪声,要么完全忽略前景对象。在汽车分类中,TOAST倾向于集中在车头灯和徽标上,这有助于区分不同品牌的汽车,而其他方法具有更少可解释性并且容易被噪声干扰。
效果展示
图像分类效果展示:
语言生成效果展示:
结论
这项工作的灵感来自于经验性观察到以前的迁移学习方法通常无法关注与任务相关的信号,这可能导致下游任务的次优性能。论文展示了重新聚焦注意力方法是实现更好迁移学习性能的关键。论文提出了自上而下的注意力引导(TOAST),它通过将注意力引导到特定任务的特征来迁移到新任务。具体来说,TOAST冻结预训练骨干网络,并在下游任务上调整附加的自上而下注意力模块以引导注意力。与以前的基线相比,TOAST能够在细分类视觉分类以及指令遵循语言生成上实现最先进的结果,同时仅调整很小一部分参数。
#关于迁移学习~~
最近阅读了一篇名为《TOAST:Transfer Learning via Attention Steering》的论文,论文中,作者使用了一个迁移学习模型,既可以实现图像分类算法的迁移,又可以实现文本生成算法的迁移,令人振奋的是:这两种迁移都展示了惊艳的效果。
迁移学习的概念
迁移学习是指在一个领域(源领域)学习到的知识,用来帮助另一个领域(目标领域)的学习,从而减少目标领域所需的数据量和训练时间。
传统的机器学习方法往往需要大量的数据和时间来从零开始学习,这样既不高效也不灵活。相反,迁移学习可以借鉴已经存在的模型的能力,利用已有的相关知识,加速和优化新问题的解决。传统机器学习方法和迁移学习方法对比如下图所示。
(图片来源:A Comprehensive Hands-on Guide to Transfer Learning with Real-World Applications in Deep Learning,Dipanjan (DJ) Sarkar)
迁移学习的分类
(1)根据源领域和目标领域之间的关系,分为同构迁移学习和异构迁移学习。
同构迁移学习是指源领域和目标领域具有相同的特征空间和标签空间,只是数据分布不同。也就是说,它们的数据具有相同的属性和类别,只是数据分布不同。例如,从一个图像分类任务迁移到另一个图像分类任务,如果它们都使用相同的像素值作为特征,且都有相同的类别标签,那么就是同构迁移学习。同构迁移学习的主要挑战是如何处理源领域和目标领域之间的概率分布差异,即如何处理数据之间分布的差异。
异构迁移学习是指源领域和目标领域具有不同的特征空间或标签空间,或者两者都不同。也就是说,它们的数据具有不同的属性或类别。例如,从一个文本分类任务迁移到一个图像分类任务,如果它们使用不同的特征表示方法,如词向量和像素值,且有不同的类别标签,那么就是异构迁移学习。异构迁移学习的主要挑战是如何建立源领域和目标领域之间的特征映射或标签对应关系,即处理不同数据之间的语义的差异。
(2)根据所要迁移的知识类型,分为基于实例的迁移学习、基于特征的迁移学习、基于模型的迁移学习、基于关系的迁移学习和基于对抗的迁移学习。
基于实例的迁移学习是指利用特定的权重调整策略,从源领域中选择部分实例作为目标领域训练集的补充的方法。这种方法的假设是源领域和目标领域中存在一部分相似或相关的实例,在这部分实例上,源领域和目标领域的数据分布是一致或接近的。这种方法通常适用于独立同分布的数据,即每个数据点都是独立生成的。这种方法的优点是方法简单,容易实现;缺点是权重选择与相似度的度量过于依赖经验,且源域与目标域的数据分布往往不同。因此对差异稍大的数据集泛化能力较差。
基于特征的迁移学习是指寻找或构造一个共享的特征空间,使得源领域和目标领域在该空间中具有相似的数据分布,从而减少数据分布不匹配带来的负面影响的方法。这种方法的假设是源领域和目标领域存在一部分公共的特征,在这部分公共特征上,源领域和目标领域的数据分布是一致或相近的。这种方法通常适用于领域适应,也就是源领域和目标领域具有相同的标签空间,但是不同的特征空间或特征分布。例如,在文本分类中,可以利用词嵌入或主题模型等方法,将不同语言或不同风格的文本映射到一个共享的语义空间中,从而进行跨语言或跨风格的文本分类。这种方法的优点是对大多数方法适用,效果好;缺点是难以求解,容易发生过拟合。
基于模型的迁移学习是指利用源领域已经训练好的模型或参数来初始化或约束目标领域的模型,从而提高目标领域学习效果的方法。这种方法的假设是源领域和目标领域在模型层面有共同的知识,可以通过共享模型或参数来实现知识转移。这种方法通常适用于任务迁移学习,也就是源领域和目标领域具有相同的特征空间和标签空间,但是不同的任务。例如,在图像分类中,可以利用在大规模数据集上预训练好的卷积神经网络模型,通过微调或剪枝等方法来适应新的图像分类任务 。这种方法优点是可以充分利用模型之间存在的相似性;缺点是模型参数不易收敛。
基于关系的迁移学习是指利用源领域和目标领域之间的关系知识来进行知识迁移的方法。这种方法的假设是源领域和目标领域中,数据之间的联系关系是相同或相似的,可以通过类比或推理等方式来实现知识转移。这种方法通常适用于非独立同分布的数据,即每个数据点都与其他数据点存在关联。例如,在推荐系统中,可以利用用户和物品之间的评分矩阵,将一个域中的用户或物品映射到另一个域中,从而进行跨域推荐。这种方法的优点是可以处理源域和目标域之间分布差异较大的情况,可以处理类别不平衡的问题,并且对少量标注数据也能取得不错的效果;缺点是需要构建类别之间的关系网络,关系提取不准确会对迁移产生负面影响,计算关系网络的空间和时间复杂度较高。
基于对抗的迁移学习是指利用生成对抗网络(GAN)或其他对抗性技术来缩小源域和目标域之间的差异,从而提高目标域学习效果的方法。这种方法的假设是“为了有效的迁移,良好的表征应该是对主要学习任务的区别性,以及对源域和目标域的不加区分。”基于对抗性的深度迁移学习是指在生成对抗性网络 (GAN)的启发下,引入对抗性技术 ,寻找既适用于源域又适用于目标域的可迁移表达。它基于这样的假设:“为了有效的迁移,良好的表征应该是对主要学习任务的区别性,以及对源域和目标域的不加区分。”例如,在图像转换中,可以利用CycleGAN等方法,将一个域中的图像风格转换为另一个域中的图像风格。这种方法的优点是可自动适应不同分布,无需目标域标注;缺点是训练稳定性差,难以收敛,效果不稳定。
迁移学习的应用
为了帮助大家更好地理解迁移学习,这里举了两个常见的例子 ^ v ^
图像分类:图像分类是指根据图像的内容,将其分为不同的类别,如猫、狗、飞机等。图像分类是计算机视觉中的一个基本任务,但是对于一些特定的领域,如医学图像、卫星图像等,可能没有足够的标注数据来训练一个有效的分类器。这时,可以利用迁移学习,将一个在大规模通用数据集(如ImageNet)上训练好的分类器,迁移到目标领域上,通过微调或者特征提取等方法,来提高目标领域的分类效果。例如,使用迁移学习将在ImageNet上训练好的ResNet模型迁移到医学图像上,实现肺炎检测、皮肤癌诊断等工作。
自然语言处理:自然语言处理(NLP)是指让计算机理解和生成自然语言(如中文、英文等)的技术。NLP涉及很多子任务,如情感分析、机器翻译、文本摘要等。由于不同的语言或者不同的领域(如新闻、社交媒体、法律等)有着不同的语法和语义规则,因此需要大量的数据来训练一个通用的NLP模型。迁移学习可以帮助解决这个问题,通过将一个在大量文本上预训练好的NLP模型(如BERT、GPT等),迁移到目标语言或者目标领域上,通过微调或者适配等方法,来提高目标任务的效果。例如,使用迁移学习将在英文文本上预训练好的BERT模型迁移到中文文本上,实现命名实体识别、情感分析等任务。
迁移学习的常见模型
基于实例的迁移学习:TrAdaBoost1、BIW2等。
基于特征的迁移学习:TCA3、DAN4等。
基于模型的迁移学习:fine-tuning5、LwF等。
基于模型的迁移学习:GraphMix、MetaMIML等。基于对抗的迁移学习:DANN、CycleGAN等。迁移学习的优势
迁移学习的主要优势可归纳如下:
提高模型泛化能力:迁移学习通过从相关任务中获取先验知识,可以提高模型在目标任务上泛化的能力,避免从头训练。
减少标注数据依赖:迁移学习可以在目标任务标注数据不足时,利用源任务的知识提高模型性能,减少对大规模标注数据的依赖。
加速模型训练:基于预训练模型的迁移学习可以跳过模型初始化和预训练过程,直接进行微调,大大加速模型的训练。
提高性能上限:迁移学习通过引入外部信息,可以使模型超越仅从目标任务数据中学习的性能上限。
扩展模型应用范围:迁移学习训练出的模型可以超越源数据集和目标数据集,应用到更广泛的领域。
更好引导特征学习:迁移学习可以更好地引导模型学习任务相关的特征表示,并抑制无关特征的负面影响。
算法实例详解
下面,我将根据不同的模型分类,分别提供对应的代码详解。
实例迁移
直接重用源域数据,可以对源域样本进行重新加权,使其分布适应目标域。
# 源域数据
source_data = [图片数据]
# 目标域数据
target_data = [图片数据]
# 计算源域数据在目标域中的权重
weights = compute_weight(source_data, target_data)
# 加权源域数据
weighted_source_data = [w * img for w, img in zip(weights, source_data)]
# 合并源域和目标域数据进行训练
combined_data = target_data + weighted_source_data
特征迁移
使用源域模型提取特征,转移到目标模型中。
# 源域模型
source_model = pretrain_model()
# 固定源域模型参数
source_model.trainable = False
# 提取源域模型最后一层前的特征
target_features = source_model(target_data)
# 目标模型,将源域特征作为输入
target_model = tf.keras.models.Sequential()
target_model.add(tf.keras.layers.InputLayer(input_shape=target_features.shape[1:]))
target_model.add(tf.keras.layers.Dense(num_classes))
# 训练
target_model.compile(optimizer='adam', loss='categorical_crossentropy')
target_model.fit(target_features, target_labels)
参数迁移
初始化目标模型的参数为源模型的参数。
# 源域模型
source_model = pretrain_model()
# 目标模型,结构与源域模型相同
target_model = Model()
# 初始化目标模型的参数
target_model.set_weights(source_model.get_weights())
# 训练
target_model.compile(optimizer='adam', loss='categorical_crossentropy')
target_model.fit(target_data, target_labels)
关系迁移
建模源域和目标域之间的相关性,加入目标模型的损失函数中。
# 源域数据
source_data = [图片数据]
# 目标域数据
target_data = [图片数据]
# 源域模型
source_model = Model()
# 目标模型
target_model = Model()
# 相关性损失
correlation_loss = compute_correlation_loss(source_model, target_model)
# 目标域损失
target_loss = compute_target_loss(target_model)
# 总损失
total_loss = target_loss + λ * correlation_loss
# 训练
target_model.compile(loss=total_loss)
target_model.fit(target_data, target_labels)
模式迁移
在目标模型中加入正则项,使其学习到源模型的部分特征模式。
# 源域模型
source_model = pretrain_model()
# 目标模型
target_model = Model()
# 定义模式正则项
pattern_reg = compute_pattern_reg(target_model, source_model)
# 目标域损失
target_loss = compute_target_loss(target_model)
# 总损失
total_loss = target_loss + λ * pattern_reg
# 训练
target_model.compile(loss=total_loss)
target_model.fit(target_data)
多任务迁移
同时优化源域任务和目标域任务的损失。
# 源域模型
source_model = Model()
# 源域数据
source_data = [图片数据]
# 目标模型
target_model = Model()
# 目标域数据
target_data = [图片数据]
# 源域任务损失
source_loss = compute_source_loss(source_model, source_data)
# 目标域任务损失
target_loss = compute_target_loss(target_model, target_data)
# 多任务损失
total_loss = source_loss + target_loss
# 训练
model.compile(loss=total_loss)
model.fit(source_data + target_data)
对抗迁移
使用对抗训练,使模型适应目标域。
# 源域数据
source_data = [图片数据]
# 目标域数据
target_data = [图片数据]
# 特征提取器
feature_extractor = Model()
# 源域判别器
source_discriminator = Discriminator()
# 目标域判别器
target_discriminator = Discriminator()
# 对抗损失
adversarial_loss = compute_adversarial_loss(feature_extractor, source_discriminator) + compute_adversarial_loss(feature_extractor, target_discriminator)
# 训练
model.compile(loss=adversarial_loss)
model.fit(source_data + target_data)
从图像分类到目标检测的实战
最后,我用训练好的ResNet50作为被迁移源对象,在其基础上增加目标检测模块,之后在PASCAL VOC数据集进行训练,实现目标检测任务的迁移学习。
具体代码如下:
import tensorflow as tf
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.layers import Conv2D, Flatten, Dense
# 加载预训练模型作为特征提取器
feature_extractor = ResNet50(weights='imagenet',include_top=False)
# 冻结预训练模型所有层
for layer in feature_extractor.layers:
layer.trainable = False
# 构建检测模型
inputs = tf.keras.Input(shape=(224, 224, 3))
x = feature_extractor(inputs)
x = Conv2D(filters=256, kernel_size=3)(x)
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x) # 10个检测目标
model = tf.keras.Model(inputs=inputs, outputs=predictions)
# 编译模型
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 加载PASCAL VOC数据并训练
voc_data = # 加载PASCAL VOC数据集
model.fit(voc_data, voc_labels, epochs=5)
这里我们加载了在ImageNet上预训练的ResNet50作为特征提取器,冻结了其权重不更新。然后在它之上构建了一个新的卷积和全连接层来进行目标分类。这样通过迁移ResNet50提取的图像特征,可以减少目标检测模型对大量标注数据的需求。只需要小量样本训练全连接分类层即可。这种做法属于迁移学习中的特征迁移和Fine Tuning技术,是目标检测领域中非常常用的迁移学习实践。
迁移学习的前景
多源迁移学习的探索:现有方法主要基于单一源域进行迁移,未来可研究如何有效集成多个源域的信息。
异构迁移学习的发展:研究如何在源域和目标域特征空间、分布差异大的情况下进行有效迁移。
迁移学习理论的完善:加强对迁移学习内在机理的理解,建立更统一完备的理论指导框架。
迁移学习算法的优化:提出更有效的迁移学习算法,缩小理论和实践的差距。