CLIP:多模態領域革命者

CLIP:多模態領域革命者

當前的內容是梳理《Transformer視覺系列遨遊》系列過程中引申出來的。目前最近在AI作畫這個領域 Transformer 火的一塌糊塗,AI畫畫效果從18年的 DeepDream[1] 噩夢中驚醒過來,開始從2022年 OpenAI 的 DALL·E 2[2] 引來插畫效果和聯想效果都達到驚人效果。雖然不懂,但是這個話題很吸引ZOMI,於是就著這個領域內容來看看有什麼好玩的技術點。

但是要了解:Transformer 帶來AI+藝術,從語言開始遇到多模態,碰撞藝術火花 這個主題,需要引申很多額外的知識點,可能跟 CV、NLP 等領域大力出奇蹟的方式不同,AI+藝術會除了遇到 Transformer 結構以外,還會涉及到 VAE、ELBO、Diffusion Model等一系列跟數學相關的知識。


Transformer + Art 系列中,今天新挖一個 CLIP 的坑,多模態不是一個新鮮的瓜,隨著 AI 的發展,多模態已經成為一種趨勢,而 CLIP 就是在多模態領域裡邁出了重要的一步。其具有非常好的遷移學習能力,預訓練好的模型可以在任意一個視覺分類數據集上取得不錯的效果,而且是 Zero-shot(不需要對新數據集重新訓練,就能得到很好的結果)。

OpenAI 財大氣粗力大磚飛搞出了 CLIP,在400M的影像-文本對數據上,用最樸素的對比損失訓練雙塔網路,利用text資訊監督視覺任務自訓練,對齊了兩個模態的特徵空間,本質就是將分類任務化成了圖文匹配任務,效果可與全監督方法相當。在近 30 個數據集上 zero-shot 達到或超越主流監督學習性能。Let’s dive in!

CLIP:《Learning Transferable Visual Models From Natural Language Supervision》

多模態

模態(modal)是事情經歷和發生的方式,我們生活在一個由多種模態(Multimodal)資訊構成的世界,包括視覺資訊、聽覺資訊、文本資訊、嗅覺資訊等等,當研究的問題或者數據集包含多種這樣的模態資訊時我們稱之為多模態問題,研究多模態問題是推動人工智慧更好的了解和認知我們周圍世界的關鍵。

通常主要研究模態包括”3V”:即Verbal(文本)、Vocal(語音)、Visual(視覺)。

多模態發展歷史

實際上,多模態學習不是近幾年才火起來,而是近幾年因為深度學習使得多模態效果進一步提升。下面梳理一下從1970年代起步,多模態技術經歷的4個發展階段,在2012後迎來 Deep Learning 階段,在2016年後進入目前真正的多模態階段。

  • 第一階段為基於行為的時代(1970s until late 1980s),這一階段主要從心理學的角度對多模態這一現象進行剖析。
  • 第二階段基於計算的時代(1980 – 2000),這一階段主要利用一些淺層的模型對多模態問題進行研究,其中代表性的應用包括視覺語音聯合識別,多模態情感計算等等。
  • 第三階段基於交互的時代,這一階段主要主要從交互的角度入手,研究多模態識別問題,其中主要的代表作品包括蘋果的語音助手Siri等。
  • 第四階段基於深度學習的時代,促使多模態研究發展的關鍵促成因素有4個,1)更大規模的多模態數據集;2)更強大的算力(NPU/GPU/TPU);3)強大的視覺特徵抽取能力;4)強大的語言特徵抽取能力。

多模態核心任務

多模態機器學習的核心任務主要包括表示學習,模態映射,模態對齊,模態融合,協同學習。

表示學習

表示學習(Representation):主要研究如何將多個模態數據所蘊含的語義資訊,數值化為實值向量,簡單來說就是特徵化。

單模態的表示學習負責將資訊表示為電腦可以處理的數值向量或者進一步抽象為更高層的特徵向量 Feature;而多模態表示學習通過利用多模態之間的互補性,剔除模態間的冗餘性,從而學習到更好的特徵 Feature。

那在表示學習中主要包括兩大研究方向:

  1. 聯合表示(Joint Representations):將多個模態的資訊一起映射到一個統一的多模態向量空間。(CLIP 和 DALL·E 使用簡單的聯合表示,不過效果出奇的贊)。
  2. 協同表示(Coordinated Representations):將多模態中的每個模態分別映射到各自的表示空間,但映射後的向量之間滿足一定的相關性約束(例如線性相關)。

下游任務

上面講的是表示學慣用於提取多模態的特徵,有了特性後在機器學習領域接著就是下游任務對特徵進行理解(學術上也叫做內容理解),典型的下游任務包括視覺問答、視覺推理、視覺聯合推理、影像檢索、影片檢索。

  1. 視覺問答(Visual Question Answering,VQA):根據給定的圖片提問,從候選中選擇出正確的答案,VQA2.0 中從 COCO 圖片中篩選了超過100萬的問題,訓練模型來預測最常見的3129個回答,其本質上可以轉化成一個分類問題。

  1. 視覺推理(Visual Reasoning,VR):視覺推理相對視覺問答更為複雜, 其可以分解為兩個子任務視覺問答(Q->A)和選出答案的原因(QA->R), 除了回答的問題需要用自然語言表達具有挑戰性的視覺問題外, 模型還需要解釋為什麼作出這樣的回答, 其最開始由華盛頓大學提出, 同時發布的 VCR 數據集包含 11 萬的電影場景和 29 萬的多項選擇問題。

  1. 檢索任務(Index Task):主要包括文本檢索圖片或者圖片檢索文本,檢索任務應該不用加以過多的解釋了,比較好理解,就是以文搜圖或者以圖搜文。下面圖中就是Google 以圖搜文的服務,當然包括華為手機裡面的截圖識字,淘寶拼多多的以文搜圖等身邊很多諸如此類的服務啦。

CLIP演算法原理

CLIP 不預先定義影像和文本標籤類別,直接利用從互聯網爬取的 400 million 個image-text pair 進行圖文匹配任務的訓練,並將其成功遷移應用於30個現存的電腦視覺分類。簡單的說,CLIP 無需利用 ImageNet 的數據和標籤進行訓練,就可以達到 ResNet50 在 ImageNet數據集上有監督訓練的結果,所以叫做 Zero-shot。

CLIP(contrastive language-image pre-training)主要的貢獻就是利用無監督的文本資訊,作為監督訊號來學習視覺特徵。

CLIP 作者先是回顧了並總結了和上述相關的兩條表徵學習路線:

  1. 構建image和text的聯繫,比如利用已有的image-text pair數據集,從text中學習image的表徵;
  2. 獲取更多的數據(不要求高品質,也不要求full labeled)然後做弱監督預訓練,就像Google使用的JFT-300M數據集進行預訓練一樣(在JFT數據集中,類別標籤是有雜訊的)。具體來說,JFT中一共有18291個類別,這能教模型的概念比ImageNet的1000類要多得多,但儘管已經有上萬類了,其最後的分類器其實還是靜態的、有限的,因為你最後還是得固定到18291個類別上進行分類,那麼這樣的類別限制還是限制了模型的zero-shot能力。

這兩條路線其實都展現了相當的潛力,前者證明 paired image-text 可以用來訓練視覺表徵,後者證明擴充數據能極大提升性能,即使數據有noise。於是high-level上,CLIP 作者考慮從網上爬取大量的 image-text pair 以擴充數據,同時這樣的 pairs 是可以用來訓練視覺表徵的。作者隨即在互聯網上採集了4億個 image-text 對,準備開始訓練模型。

數據準備

那這4億image-text數據怎麼整?

4億訓練數據數據用的是影像-文本(image-text)對是從網路上獲取的。具體的方式是準備50k 個 text query,每個 query 抓至多 20k 張圖,共 400m 個 pair 對。50k 個query 的來源是,先準備一個 base query list,由 Wikipedia 高頻片語成,然後做bi-gram 形成一些高頻片語,再補充一些 Wikipedia 高頻文章名稱和 WordNet 同義片語。每個 query 至多20k張圖是考慮到了類別平衡。

網路模型

多模態的網路模型採用雙塔結構,即一個 image encoder 和一個 text encoder。image encoder 是 ResNet 的改進版(添加了多個 stem 層和 attention pooling)或直接使用 Vision Transformer (ViT);text encoder 基於 GPT-2 的 transformer。兩個 encoder 的輸出相同維度的向量(假設 n 都為1024)。

CLIP流程

回答 CLIP 的流程最好的答案可能就是下面這張圖。很直觀,有三個階段:

  1. Contrastive pre-training:對比預訓練階段,使用image-text對進行對比學習訓練。
  2. Create dataset classifier from label text:提取預測類別文本特徵。
  3. Use for zero-shot prediction:進行 Zero-Shot 推理預測。

  1. 階段一 Contrastive pre-training

在預訓練階段,對比學習十分靈活,只需要定義好 正樣本對 和 負樣本對 就行了,其中能夠配對的 image-text 對即為正樣本。具體來說,先分別對影像和文本提特徵,這時影像對應生成 I1、I2 … In 的特徵向量(Image Feature),文本對應生成 T1、T2 … Tn 的特徵向量(Text Feature),中間對角線為正樣本,其餘均為負樣本。

這樣的話就形成了 n 個正樣本,n^2 – n 個負樣本。一旦有了正負樣本,模型就可以通過對比學習的方式訓練起來了,完全不需要手工的標註。當然,自監督的訓練需要大量的數據,OPENAI 在數據準備階段階段使用的數據對在4億的數量級。

在同一個batch裡面算對比損失。由於4億對 image-text pairs 訓練數據巨大,訓練是個十分耗費時間的事情,所以必須對訓練策略進行一些改進以提升訓練效率。

採用對比學習進行訓練的一個重要原因也是考慮到訓練效率。圖中最下面的藍線表示像 GPT2 這種預測型的任務(NLP預測型的任務是指,現在已經有一張圖片拉,去預測圖片對應的描述),可以看到是最慢的。中間黃線是指一種 bag of words 的方式,不需要逐字逐句地去預測文本,文本已經抽象成特徵,相應的約束也放寬了,這樣做訓練速度提高了 3 倍。接下來進一步放寬約束,不再去預測單詞,而是去判斷 image-text pairs 是否一對,也就是綠色線的對比學習方法,效率進一步提升 4 倍。

  1. 階段二 Create dataset classifier from label text

CLIP最牛逼的地方在於,基於400M數據上學得的先驗,僅用數據集的標籤文本,就可以得到很強的影像分類性能。現在訓練好了,然後進入前向預測階段,通過 prompt label text 來創建待分類的文本特徵向量。

首先需要對文本類別進行一些處理,ImageNet 數據集的 1000 個類別,原始的類別都是單詞,而 CLIP 預訓練時候的文本端出入的是個句子,這樣一來為了統一就需要把單詞構造成句子,怎麼做呢?可以使用 「A photo of a {object}.」 的提示模板 (prompt template) 進行構造,比如對於 dog,就構造成 「A photo of a dog.」,然後再送入 Text Encoder 進行特徵提取。

具體地,用模板填空(promot)的方式從類別標籤生成文本。將得到的文本輸入Text Encoder。

openai_imagenet_template = [
    lambda c: f'a bad photo of a {object}.',
    lambda c: f'a photo of many {object}.',
    lambda c: f'a sculpture of a {object}.',
    lambda c: f'a photo of the hard to see {object}.',
    lambda c: f'a low resolution photo of the {object}.',
    ......
    lambda c: f'a toy {object}.',
    lambda c: f'itap of my {object}.',
    lambda c: f'a photo of a cool {object}.',
    lambda c: f'a photo of a small {object}.',
    lambda c: f'a tattoo of the {object}.',
]
  1. 階段三 Zero-shot prediction

最後就是推理見證效果的時候,對於測試圖片,選擇相似度最大的那個類別輸出。

在推理階段,無論來了張什麼樣的圖片,只要扔給 Image Encoder 進行特徵提取,會生成一個一維的圖片特徵向量,然後拿這個圖片特徵和 N 個文本特徵做餘弦相似度對比,最相似的即為想要的那個結果,比如這裡應該會得到 「A photo of a guacamole.」,

以上就是 CLIP 演算法流程的總覽,可以看到 CLIP 在一次預訓練後,可以方便的遷移到其他視覺分類任務上進行 Zero-shot 的預測。這也是 DALL·E 在最後階段使用 CLIP 的原因啦。

具體演算法與實驗

演算法部分因為網路模型流程設計比較簡單,因此演算法偽程式碼也非常簡單。另外 CLIP 這篇論文一共48頁,從第6頁開始後面都是實驗部分,所以想寫好論文實驗部分,可以重點看看 CLIP 的實驗部分,很有參考價值哦!

演算法實現

其中重點是分別計算出影像和文本的 embedding 特徵 I_e 和 T_e,通過矩陣乘法 dot 得到餘弦相似度。接下來就是對稱損失函數(symmetric loss function),而損失函數則採用對比學習常用的 InfoNCE。

對比損失函數的分子部分鼓勵正例相似度越高越好,也就是在表示空間內距離越近越好;而分母部分,則鼓勵任意負例之間的向量相似度越低越好,也就是距離越遠越好。t 是溫度係數超參,用來調節數據在單位超球面上的分布均勻性。這樣,在優化過程中,通過 InfoNCE 損失函數指引,就能訓練模型,以達成我們期望的目標,將成對的 image-text 映射到空間中接近的地方,和將非成對的 image-text 在表示空間內盡量推遠。

重點實驗

下面挑選了一些重點實驗部分的結論來看看 CLIP的效果。

  1. Zero-shot CLIP v.s. Linear Probe on ResNet50

從圖中可以看到,在不同的數據集上,CLIP 對比通用的 ResNet50 精度超過的有16/27,已經很強了,因為CLIP是zero-shot的,即沒有用下游任務的數據,而linear probed ResNet50用了下游數據進行finetune邏輯回歸分類器的參數。

 

  1. Prompt engineering and ensembling

作者默認prompt模板是:”A photo of a {label}.”,但作者發現這樣的模板還是有點粗糙,可以考慮加一些context比如 “A photo of a {label}, a type of pet.”。對於不同類型任務,作者做了一些手動的、特定的label prompt工程。

從另一個角度,一張圖的text描述其實有很多種的,只要text的核心語義和image相同就行,那麼我們還可以做一些ensemble,比如ensemble一下”A photo of a big {label}.”和”A photo of a small {label}.”。

可以從實驗結果發現,採用 Prompt engineering + ensembling 的效果比只用沒有上下文的類別名好得多。

  1. Few-shot CLIP v.s. SOTA (ImageNet) SSL methods

作者實驗分析使用了20個數據集,每個類至少有16個示例。結果看到,Zero-shot CLIP 的性能和4-shot CLIP差不多,Few-shot CLIP的performance遠高於之前的SOTA模型(BiT-M/SimCLRv2/ResNet)。

  1. How many shots is needed for achieving zero-shot performance

Few-shot (linear probing) CLIP (保持CLIP encoder 參數fixed,加一層邏輯回歸分類器微調)平均需要 20.8-shots 才能 match zero-shot CLIP 性能。這裡相當於保持了 the same CLIP feature space 上,觀察 few-shot finetuning 和zero-shot 的性能差異。這裡其實說明通過自然語言學到的視覺概念比少量樣本 finetune 學到的好。

  1. Linear probing CLIP performance

這裡不再是few-shot linear probing了,而是全量數據的linear probing,我們來看下其跟zero-shot性能的對比,實際上兩者的性能是正相關的,此外,大部分情況下linear probing的性能要好不少。

6. Robustness to Natural Distribution Shift

作者在ImageNet的7個shift datasets上觀察各模型的平均性能,遷移應用於ImageNet的分類任務的,可以看到,不僅達到ResNet101的效果,且泛化能力遠遠強於有標籤監督學習。

總結

CLIP 可以說是開闢了 CV+NLP 的多模態表徵學習新時代。後面Google的ALIGN,微軟的Florence,商湯 DeCLIP,快手 EfficientCLIP 都是研究相類似的任務。雖然 CLIP 在小部分任務上 zero-shot 精度一般,但是 CLIP 在多模態的 Encoders 能提供簡單而又強大的視覺先驗的表徵能力。下面分開數據、精度、流程三方面來提出一些疑問和思考,希望能夠幫助到更多的人去思考進一步值得研究的問題。

數據方面

論文中關於 400Million 的龐大數據集並沒有提及太多(我其實很想看到他的數據集,畢竟AI是個數據驅動的時代)。如何在較小數據集上(例如Conceptual Caption,或者實驗室的MEP-3M)保證學習結果值得探索。

CLIP的訓練數據是從網上採集的,這些image-text pairs不確定做了哪些 data clear 和 de-bias,由於訓練集的限制,可能會出現很多社會性偏見(social biases)問題,比如對不同種族性別年齡的傾向。

精度方面

CLIP 的 zero-shot 精度雖然總體上比 supervised baseline ResNet-50 要好,但其實在很多任務上比不過 SOTA methods,因此 CLIP 的 transfer learning有待挖掘。

CLIP 在 fine-grained 分類(花/車的分類)、抽象的任務(如計算圖中 object 的個數)以及預訓練時沒見過的task(如分出相鄰車輛的距離等任務 zero-shot 的精度有待提升。

Zero-shot CLIP 在真正意義上的 out-of-distribution data 上精度不好,比如在OCR中。儘管CLIP zero-shot classifier 能在很廣泛的任務上 work,但究其本質CLIP 還是在有限的類別中進行對比、推理,而不能像 image caption 那樣完全的flexible 地生成新的概念(如:詞),這是 CLIP 功能上的缺陷,CLIP 終究不是生成模型。

流程方法

CLIP的方法論上也存在幾個缺陷:在訓練和挑選 CLIP 模型時,作者採用在幾個數據的validation performance 來做指導,這其實是不準確的,因為它不能完全代表 CLIP 的 zero-shot 性能。如果,設計一套框架來 evaluate zero-shot performance 對於之後的研究是很重要的。

很多視覺任務很難用文本來進行表示,如何用更高效的 few-shot learning 方法優化 CLIP 也很重要。BTW,CLIP 仍然沒有解決深度學習 poor data efficiency 的問題,結合 CLIP 和 self-training 可能是一個能提高 data efficiency 的方向。

雖然說 CLIP 是多模態時代的一個引領者,但究其本質仍然是Image-level的,如果是 Image-level的能不能將這個範式拓展成 dense prediction(object detection, semantic segmentation)的預訓練能力呢?如果不是,那麼更多模態的引入如何實現多模態數據的表徵?

由於image encoder的監督資訊來自且僅來自text encoder,它對文字的理解能力也就約束了影像特徵的學習。提升text encoder能不能帶來image encoder的提升?CLIP的text encoder能不能學到一些單模態Bert無法學到的東西?

引用

[1] 多模態定義與歷史

[2] 極智AI | 多模態領域先行者 詳解 CLIP 演算法實現

[3] 2021.02【CLIP】Learning Transferable Visual Models From Natural Language Supervision

[4] 【多模態】CLIP模型

[5] CLIP論文 | Learning Transferable Visual Models From Natural Language Supervision

[6] CLIP:Learning Transferable Visual Models From Natural Language Supervision

[7] 【CLIP系列Paper解讀】CLIP: Learning Transferable Visual Models From Natural Language Supervision

[8] Radford, Alec, et al. “Learning transferable visual models from natural language supervision.” International Conference on Machine Learning. PMLR, 2021.

[9] Suzuki, Keisuke, et al. “A deep-dream virtual reality platform for studying altered perceptual phenomenology.” Scientific reports 7.1 (2017): 1-11.