JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

影像分類與 ImageNet

機器如何學會說出一張圖片裡有什麼,為什麼 2012 年的一場比賽重塑了整個領域,以及一個在數百萬張照片上訓練出來的網路,如何被廉價地改造去辨識它從未見過的東西。

你能向一張圖片提出的最簡單問題

在你能就一張影像向電腦提出的所有問題中,最基礎的也是研究最多的:「這是一張什麼的圖片?」你給機器看一張照片,它回傳一個詞——貓、消防車、黃金獵犬。這就是 影像分類,現代電腦視覺最先在這項任務上得到驗證,至今仍以它為基準。上一篇你已經認識了「影像即張量」;這裡我們要問的是:拿到這個張量之後,究竟該拿它*做什麼*。

從機制上看,分類就是一套披著視覺外衣的、我們熟悉的 監督學習。輸入的 特徵 是一格格像素數字組成的網格;標籤 則是從設計者預先選定的固定清單中取出的一個類別。網路的任務,是把這張網格變成一個分數向量——每個類別一個分數——再由 softmax 把這些分數轉成加和為一的機率。預測的類別,無非就是得分最高的那一項。

為什麼像素是一種殘酷的輸入

一個誘人的念頭,是把像素網格攤平成一長串數字,餵給普通的全連接網路。人們試過;效果很差。一張不大的 224×224 彩色影像就有十五萬多個數字,僅第一層就要數以億計的 權重——這是成本失控、又會帶來慘烈 過擬合 的配方。更糟的是,這種網路把左上角的像素和正中央的像素當作毫不相干的坐標,於是一隻貓往右移了三個像素,看上去就成了一個全新的輸入。

解法就是你早先認識的 卷積神經網路:讓一個小小的濾波器在影像上滑動,從而把同一個圖案偵測器在各處反覆使用,一層層地堆疊出 先是邊緣、再是紋理、再是部件、最後是整體物體。這條內建的假設——一個有用的圖案,無論出現在哪裡都同樣有用——是一種強有力的 歸納偏置,恰恰正是對自然照片做分類所需要的。像素不再是一張扁平的清單,而成了網路可以推理其上的一張空間地圖。

ImageNet 與 2012 年的地震

若沒有一個東西來證明這一切,上述一切都無從證明。2000 年代後期,李飛飛與合作者建起了 ImageNet:約一千四百萬張照片,每張都被人工標註進 WordNet 層級所組織的數萬個類別之一。其巧思與其說在演算法,不如說在 標註——成群的眾包工人,以任何學術 資料集 都未曾達到的規模為影像貼標籤。一項年度競賽,即 ImageNet 大規模視覺辨識挑戰賽,在約一百二十萬張訓練圖、共一千個類別的子集上評判各系統。

多年來,獲勝者都是精雕細琢、由人手工設計的流水線,進展緩慢如爬。直到 2012 年,一個名為 AlexNet 的網路——由 Alex Krizhevsky、Ilya Sutskever 與 Geoffrey Hinton 打造——以令整個領域震驚的優勢奪冠:它的 top-5 錯誤率降到約 16%,而次優者還停在 26% 附近。這裡沒有哪一招獨門絕技。它就是一個深度卷積網路,在兩塊消費級 GPU 上訓練,用了 ReLU 激活、用 Dropout 對抗過擬合、並施以大量 影像增強。教訓在於:各樣配料終於同時到齊了——足夠的資料、足夠的算力,以及一個結構對路的模型。

遷移學習:不要從零開始

2012 年最深遠的後果,不在那個奪冠的分數——而在那個訓練好的網路最終被發現「內含」了什麼。一個學會區分一千個 ImageNet 類別的網路,在這一路上,必然學到了普遍有用的視覺機件:邊緣偵測器、紋理偵測器、形狀與部件偵測器。那些靠前和居中的層,根本無關乎「狗性」;它們關乎的是*看見*這件事本身。這正是 遷移學習 的許諾:在一個大任務上學到的特徵,可以被複用到另一個不同的、更小的任務上。

在實踐中,這就是視覺領域天天上演的工作流。你拿來一個骨幹網路——它在 ImageNet 上的 預訓練 早已完成、可免費下載——砍掉它最後那個一千路的分類頭,再裝上一個為你自己的類別準備的小小新頭部——比如十種皮膚病變。然後你做 微調:在你那幾千張帶標籤的影像上訓練,常常把靠前的層凍結、只調整靠後的層。一項曾經需要一百萬張圖和一整片 GPU 農場的任務,如今用單張顯卡、幾千張圖就能成功。

backbone = load_pretrained("resnet_imagenet")   # features, learned once
freeze(backbone.early_layers)                   # keep generic edge/texture detectors
backbone.head = NewHead(num_classes=10)         # your task: 10 skin lesions
for images, labels in your_small_dataset:       # only a few thousand examples
    loss = cross_entropy(backbone(images), labels)
    update(backbone.head, backbone.late_layers) # adjust the top, not the bottom
五行程式碼看懂遷移學習:複用預訓練骨幹,替換頭部,輕量微調。

有一個較新的轉折值得點名。在卷積之外,視覺 Transformer 把一張影像切成小塊、當作詞元來對待,套用你在語言模型裡見過的同一套注意力機件。視覺 Transformer 能夠勝過 CNN——但主要是在以真正海量的資料集做預訓練時,因為它內建的空間偏置更少、必須從資料中把它學出來。對多數日常專案而言,一個微調過的卷積骨幹仍是一個強而廉價的 基線;越大並不自動越好。

排行榜藏起來的東西

看到 95% 的準確率,就假定模型「理解」了影像,這很容易。它並沒有。一個分類器優化的,是其訓練集中一切與標籤相關的東西,而這往往包括沒人想要的 捷徑——一個本該辨識肺炎的模型,可能在悄悄地讀取是哪家醫院的掃描儀拍的這張 X 光片,只因為某家醫院收治的病人病得更重。這就是「學會了疾病」與「學會了一條 偽相關」之間的區別。高測試準確率並不能證明學到的是對的東西;它只能證明測試集也共享了那條捷徑。

ImageNet 本身就攜帶 資料集偏差:它偏向於西方的、由網際網路拍攝的物體,於是在它上面訓練的分類器,對西式婚紗的辨識遠好過對世界許多地方傳統服飾的辨識。模型對 分佈漂移 也很脆弱——光照、相機或背景的些微變化,就能把在實驗室裡看似完美的準確率打到谷底。這並不意味著分類壞掉了;它意味著排行榜上的一個數字,是評估的開端,而非終點。誠實的從業者要問的,不只是「有多準?」,而是「對誰準,又是靠讀取什麼而準?」

退後一步,這條弧線就清楚了。分類給了這個領域一個乾淨、可計分的問題;ImageNet 給了它規模大到讓 深度學習 終於划算的資料;而遷移學習,把那一次昂貴的勝利,變成了如今整個社群據以構建的一座可複用的地基。本階梯接下來的篇章會補上分類所缺的本領——定位物體、分割場景、生成影像——但它們每一個,都站在這項任務教會機器去看的那些表徵之上。