稳健性(robustness)
/ roh-BUST-ness /
稳健性,指的是当现实条件比实验室里更乱时,模型仍能把活干好的能力。一个脆弱的模型,就像一个把模拟考考得满分、却一遇到换种问法就当场僵住的尖子生。一个稳健的模型,能应付现实世界扔来的种种变化:一张模糊的照片、一种它没训练过的口音、一句带错别字的话、一个雨天里的传感器读数。它不必完美——它需要的是:在那些合理但陌生的输入上,崩得优雅、崩得稀少。
稳健性有好几种各不相同的「口味」,人们常把它们搅在一起。对自然变化(噪声、光照、天气)的稳健,不同于对蓄意攻击(即对抗那一类)的稳健;而这又不同于对分布偏移的稳健——也就是整批数据的「人口构成」逐渐漂离了模型当初训练的样子。一个模型可能对其中一种坚如磐石,对另一种却不堪一击;所以光说「稳健」几乎毫无意义,除非你讲清楚:对什么稳健。
稳健性之所以重要,是因为测试集在某种意义上会「骗人」。一个只用「长得像训练数据」的数据来打分的模型,会拿到一张过分好看的成绩单。可一旦它撞上部署时那种货真价实的多样性,准确率可能悄无声息地跌落悬崖。正因如此,成熟的团队在把模型托付给任何要紧之事之前,会拿被扰动的、被偏移的、最坏情况的输入去对它做压力测试——也正因如此,单单一个头条式的准确率数字,几乎说明不了这套系统在真实世界里会如何表现。
ImageNet-C 是一个基准:它拿普通的测试图像,施加15种日常常见的「损坏」——雾、运动模糊、JPEG压缩、雪——每种分五个严重等级。许多在干净图像上能拿到90%以上的模型,在这些被损坏的版本上会丢掉四分之一甚至更多的准确率,由此暴露出:那个头条数字里,有多大一部分其实仰仗于照片本身一尘不染。
「损坏」基准,揭示了「干净测试准确率」与「真实世界耐用度」之间的鸿沟。
对光秃秃一个「稳健」要当心。永远要追问:对什么稳健?又是怎么衡量的?一个被加固到能扛住像素级对抗噪声的模型,照样可能在光照的一点简单变化、或换了一家医院的扫描仪面前彻底崩盘。稳健性不是一个你往上拧的旋钮;它是一族彼此分立的性质,每一种都需要各自的检验。