現(xiàn)有的計算機視覺系統(tǒng)用來預測一組固定的預訂對象類別,比如ImageNet數(shù)據(jù)集有1000類,CoCo數(shù)據(jù)集有80類。這種受限的監(jiān)督形式限制了模型的通用性和可用性。使用這種方法訓練好的模型對訓練過程中出現(xiàn)的對象類別有很好的識別效果,但是對訓練過程中未出現(xiàn)的類別,識別效果很差。直接從圖像的原始文本中學習是一種很有潛力的選擇,這樣可以獲得更多的監(jiān)督信號。OpenAI從互聯(lián)網(wǎng)上收集
4億(圖像,文本)對
,基于此數(shù)據(jù)集,訓練一個預測哪一個文本描述當前哪一個圖像的預訓練任務, 此任務取得了SOTA的圖像表示。預訓練之后,可以通過自然語言匹配視覺概率從而實現(xiàn)zero-shot的遷移。
模型
CLIP算法的核心是利用自然語言包含的監(jiān)督信號來訓練視覺模型。相比于其他的訓練方法,從自然語言中學習具有以下兩個優(yōu)勢。首先,相比于標準的有標簽圖像分類數(shù)據(jù)集,這種方法無需標注,就很容易擴展數(shù)據(jù)集;其次,圖像和文字配對訓練,學習到的特征不單單是一個視覺特征,而是多模態(tài)的特征,有助于zero-shot的遷移學習。
圖像和文本的配對訓練需要一個足夠大的數(shù)據(jù)集,然而現(xiàn)有的數(shù)據(jù)集要么數(shù)據(jù)量不夠,要不標注質量太差,為了解決這個問題,OpenAI他們從互聯(lián)網(wǎng)上的各種公開來源公收集了4億(圖像,文本)對。
最近視覺領域的算法訓練都需要巨大的計算量。 在ImageNet數(shù)據(jù)集上訓練ResNeXt101-32x48d模型需要19個GPU年,訓練Noisy Student EfficientNet-L2模型需要33個TPUv3 core-years。那么從自然語言中直接學習視覺概念的開放集合這一任務所需要的計算資源令人望而生畏。經(jīng)過一些列的努力,他們發(fā)現(xiàn)訓練效率對多模型預訓練是至關重要的。
最初的方法,與VirTex相似,聯(lián)合訓練一個圖像CNN和文本transformer去預測圖像所對應的文本。然而,一個6300萬參數(shù)的transformer語言模型,比ResNet-50圖像編碼器多了兩倍的計算量,學習識別ImageNet類別的速度比一個更簡單預測同一文本的BOW編碼器慢了三倍。它們試圖預測每張圖片所附文本的確切單詞,這種做法顯然是比較困難的。對于一張圖片來說,可以有不同的描述。比如下面一張圖,你可以描述“有一只狗在草地上”,也可以描述“這是一張小狗的圖片”,還可以描述“一條小黑狗伸著小舌頭”等等。
最近在圖像對比表征學習方面的工作發(fā)現(xiàn),contrastive objectives可以比同等的predictive objective學習更好的表征,而且其他工作發(fā)現(xiàn),圖像的生成模型相比同性能的對比模型相比,需要更多的計算量才能夠學習到高質量的圖像表示。基于此,將文本看做一個整體,而不是一個個單詞,與圖像進行配對。將基準BOW編碼器的預測性的目標函數(shù)替換成對比性的目標函數(shù),訓練效率提高了4倍。
訓練
下圖是CLIP的偽代碼。CLIP包含兩個編碼器,一個圖像編碼器和一個文本編碼器,圖像編碼器的輸入形式是 [ n , h , w , c ] [n,h,w,c] [n,h,w,c], n n n是批次大小, h , w , c h,w,c h,w,c是圖像的大小,比如 224 × 224 × 3 224 \times 224 \times 3 224×224×3;文字編碼器的輸入形式是 [ n , l ] [n,l] [n,l],由于是圖像文本對,所以文本編碼器中的批次是與圖像編碼器中的批次是一樣的, l l l是序列長度。圖像編碼器可以是深度卷積網(wǎng)絡,也可以是Transformer;文本編碼器可以是CBOW,也可以是Text Transformer。
圖像輸入和文本輸入分別進入圖像編碼器和文本編碼器之后,得到相應的特征表示;然后后接一個歸一化的操作。歸一化操作時,牽涉到線性投射層 n p . d o t ( I f , W i ) np.dot(I_f, W_i) np.dot(If?,Wi?)和 n p . d o t ( T f , W t ) np.dot(T_f, W_t) np.dot(Tf?,Wt?)。線性投射層將每個編碼器的表示映射到多模態(tài)嵌入空間。歸一化操作后得到用于對比的特征 I e I_e Ie?和 T e T_e Te?。接下來,計算 n n n個圖像的特征和 n n n個文本的特征的余弦相似性。偽代碼中的余弦相似性值為 l o g i t s logits logits,logits的形狀大小為 n × n n \times n n×n,然后logits與分別與圖像和文本的gt標簽做交叉熵目標函數(shù),最后的損失函數(shù)為對稱損失函數(shù)。gt的計算使用了arrange 函數(shù),labels的取值為 1 , 2 , 3 , 4 , 5 , ? ? , n 1,2,3,4,5, \cdots ,n 1,2,3,4,5,?,n,CLIP的正樣本標簽為對角線上的元素。
OpenAI收集了4億圖像文本對,數(shù)據(jù)量過于巨大,所以圖像編碼器和文本編碼器無預訓權重。由于文本是被當做一個句子,所以文本編碼器對文本無增強操作;圖像編碼器中的圖像增強方式也僅僅使用了resize和隨機裁減。溫度參數(shù) τ \tau τ,控制softmax中l(wèi)ogits的范圍,在訓練過程中直接被優(yōu)化為標量,而不是作為一個超參數(shù)。
推理
當使用訓練好的CLIP模型進行推理時,首先需要使用clip.load()
加載模型,然后分別對圖像和文本進行前處理。文字前處理是對數(shù)據(jù)集中的所有類別進行prompt engineering處理,將每個類別轉換成句子,clip.tokenize()
將句子長度padding到77個token長度。下面的代碼中,圖像選取了CIFAR100數(shù)據(jù)集中的其中一張。接下來,將圖像和文字分別喂入圖像編碼器和文字編碼器,提取圖像特征和文字特征,分別將圖像特征和文字特征正則化之后,計算圖像特征和文字特征之間的相似度,并對相似度進行softmax操作。
# 下面代碼使用CLIP進行zero shot預測,從CIFAR-100數(shù)據(jù)集中挑選一張圖片,預測這張圖像最有可能與此數(shù)據(jù)集中100個標簽中哪一個標簽最相似。
import os
import clip
import torch
from torchvision.datasets import CIFAR100
# Load the model
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load('ViT-B/32', device) # 加載模型,返回的preprocess中包含一個torchvision transform依次執(zhí)行Resize,CenterCrop和Normalization等操作。
# Download the dataset
cifar100 = CIFAR100(root=os.path.expanduser("~/.cache"), download=True, train=False)
# Prepare the inputs
image, class_id = cifar100[3637]
image_input = preprocess(image).unsqueeze(0).to(device) # 圖像前處理
text_inputs = torch.cat([clip.tokenize(f"a photo of a {c}") for c in cifar100.classes]).to(device) # 文字前處理
# Calculate features
with torch.no_grad():
image_features = model.encode_image(image_input) # 圖像編碼器提取輸入圖像的特征
text_features = model.encode_text(text_inputs) # 文字編碼器提取輸入文字的特征
# Pick the top 5 most similar labels for the image
image_features /= image_features.norm(dim=-1, keepdim=True) # 正則化
text_features /= text_features.norm(dim=-1, keepdim=True) # 正則化
similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1) #計算圖像特征與文字特征之間的相似度
values, indices = similarity[0].topk(5)
# Print the result
print("\nTop predictions:\n")
for value, index in zip(values, indices):
print(f"{cifar100.classes[index]:>16s}: {100 * value.item():.2f}%")
The output will look like the following (the exact numbers may be slightly different depending on the compute device):
Top predictions:
snake: 65.31%
turtle: 12.29%
sweet_pepper: 3.83%
lizard: 1.88%
crocodile: 1.75%
大多數(shù)標準的圖像分類只會使用標簽的數(shù)字id來注釋圖像,并包含一個將這些數(shù)字id映射回其英文名稱的文件。這樣就導致一個最常見的問題就是多義性。當類的名稱作為唯一的信息提供給CLIP的文本編碼器時,由于缺乏上下文,它無法區(qū)分詞義。在某些情況下,同一個單詞的多個含義可能做為不同的類包含在同一數(shù)據(jù)集中。比如在ImageNet數(shù)據(jù)集中,建筑起重機和飛行的鶴。而且,在CLIP的預訓練數(shù)據(jù)集中,與圖像配對的文本中只有一個單詞的情況是相對罕見的。通常,文本都是一個描述圖像的完整句子。為了彌合這一分布差距,作者團隊發(fā)現(xiàn)使用提示模板“A photo of a {label}”是一個很好的選擇,有助于指定文本是關于圖像的內容。與僅使用標簽文本的基線模型相比,通常會提升性能。
在官方提供的Prompt_Engineering_for_ImageNet.ipynb中,ImageNet數(shù)據(jù)集總共包含1000個類,CLIP團隊陸陸續(xù)續(xù)地提供了80個提示模板。
實驗
與Visual N-Grams 相比較
Visual N-Grams是17年的工作,它是首個將零樣本遷移到現(xiàn)有圖像分類數(shù)據(jù)集的算法。它使用一般預處理模型研究zero shot到標準圖像分類數(shù)據(jù)集的遷移。
下表展示了Visual N-Grams和CLIP在三個數(shù)據(jù)集上的性能對比。在ImageNet數(shù)據(jù)集上,CLIP模型在沒有使用這128萬標注數(shù)據(jù)的前提下,將準確率從Visual N-Grams的11.5%提升到76.2%。在aYahoo和SUN數(shù)據(jù)集上,CLIP模型相比于Visual N-Grams模型的性能有所提升。
CLIP與Visual N-Grams比較相似,但是17年的時候,transformer還沒有出世,上述的比較,主要是為了了解CLIP的性能。
分布Shift的魯棒性
2015年時,深度學習模型在ImageNet測試數(shù)據(jù)集的性能超過人類,但是這些模型仍然會犯一些簡單的錯誤,我們戲稱為人工智障。我們知道,深度學習模型的訓練和測試數(shù)據(jù)集遵從獨立同分布IID假設,這樣就導致模型對分布外的數(shù)據(jù)分類性能較差。最常見的一個解釋就是:深度學習模型非常善于找到其訓練數(shù)據(jù)集中的一些相關性和模式,而這些相關性和模式實際上是偽造的,不適用于其他分布,導致模型在其他數(shù)據(jù)集上的性能大幅下降。為了使模型泛化性能更好,有一些學者在研究分布外OOD(out-of-distribution)分類問題。
CLIP模型從一個不同于以往的角度研究這個問題,它在一個非常大的數(shù)據(jù)集上通過自然語言監(jiān)督進行訓練模型,能夠實現(xiàn)zero-shot的高性能。直觀上說,zero-shot 模型由于沒有針對某個分布進行訓練,它不能夠學習到僅在特定分布上保持的虛假的相關性和模式,因此,zero-shot模型應當具有更高的魯棒性。
ImageNetV2、ImageNet Sketch、ObjectNet, ImageNet Adversarial 和 ImageNet Rendition這幾個數(shù)據(jù)集,為ImageNet數(shù)據(jù)集的分布偏移。訓練集為ImageNet數(shù)據(jù)集訓練得到的模型,在這五個數(shù)據(jù)集上的表現(xiàn)都低于在ImageNet測試數(shù)據(jù)集上的性能;而zero-shot CLIP模型則取得較好的性能,如下圖所示,尤其實在ImageNet-R數(shù)據(jù)集上,有51.2%的性能提升。文章來源:http://www.zghlxwxcb.cn/news/detail-445311.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-445311.html
不足
- Zero-shot的CLIP比基于ResNet-50特征的線性分類器相比具有優(yōu)勢,但在很多任務上,仍遜色于SOTA模型。
- CLIP在細分類數(shù)據(jù)集上表示不好;CLIP不擅長處理抽象任務,比如數(shù)一數(shù)圖像中物體的個數(shù);CLIP對一些不包含預訓練集中的新型任務,表現(xiàn)也不好, 比如對一張圖像中到最近汽車的距離進行分類。
- 對于一些真正的分布外的數(shù)據(jù),CLIP的泛化性能很差。
- CLIP本質上還是在有限的類別中進行推理,相比于image caption直接能生成新的輸出,還是具有局限性的。一個值得嘗試的簡單想法是將對比和生成目標進行聯(lián)合訓練,整合CLIP的有效性和caption模型的靈活性。
- CLIP仍然沒有解決深度學習中的poor data efficiency問題。CLIP與自監(jiān)督和自訓練結合訓練會是一個提高數(shù)據(jù)效率方面的方向。
- CLIP 雖然一直強調zero-shot,但是在訓練過程中,也反復以數(shù)據(jù)集的validation performance指導CLIP的表現(xiàn),并不算真實的zero shot。如果能夠創(chuàng)造一個驗證zero-shot的遷移能力的新數(shù)據(jù)集,將會解決這種問題。
- 4億圖像文本對,不論圖像和文本都是從網(wǎng)上爬下來的。而是這些圖像文本對沒有進行過濾和處理,難,難免會攜帶一些社會性偏見。
- 很多復雜的任務和視覺概念很難僅僅通過文本指定。未來的工作需要進一步開發(fā)一種將CLIP強大的zero shot性能與few shot學習相結合的方法。
參考
- Learning Transferable Visual Models From Natural Language Supervision
- CLIP blog
- openai/CLIP
到了這里,關于CLIP 論文解讀的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!