AIGC神器CLIP:技術詳解及應用示例

Baihai_IDP發表於2023-01-15

編者按:上一期,我們介紹了Diffusion模型的發展歷程、核心原理及其對AIGC發展的推動作用。本期,我們將共同走進另一項AI重要突破——CLIP,著名的DALLE和Stable Diffusion均採用了CLIP哦。

Nikos Kafritsas的這篇文章,為我們詳細介紹了CLIP是如何工作的,同時提供一些編碼示例。

以下是譯文,Enjoy!

作者 | Nikos Kafritsas

編譯 | 嶽揚

afbde0d18fac6348557d9813406d7008.png

圖片生成自白海科技“湧現AIGC引擎”

最近有兩項人工智慧的突破性成果:DALLE[1]和Stable Diffusion[2],它們有什麼共同點?
它們都使用CLIP[3]架構的元件。因此,如果你想要了解這些模型是如何工作的,需要首先了解什麼是CLIP。
CLIP可以用來幹些什麼?為什麼它是人工智慧領域的一個重要的里程碑?
讓我們來深入瞭解一下吧!

CLIP 概述

CLIP是Constastive Language-Image Pretraining的縮寫。其是一個開源的、多模式的、zero-shot的模型。如果提供一張影像和一段文字描述,該模型可以預測與該影像最相關的文字描述,而不需要為某個特定任務進行最佳化。
讓我們來分析一下上面這個段描述:

  • 開源的:該模型是由OpenAI構建並開源的。在後文可以看到如何使用它的教程。
  • 多模式的:多模式架構利用了不止一個領域來學習特定的任務。CLIP同時結合了自然語言處理和計算機視覺等多個領域的技術。
  • zero-shot:zero-shot學習是一種對未見過的標籤進行歸納的方法,並且我們不需要專門訓練如何對它們進行分類。例如,ImageNet模型只能被訓練來識別1000個特定的類別,而CLIP不受這種限制。
  • Constastive Language:這種技術使得CLIP能理解相似的表徵彼此應該靠近,而不相似的應該相距甚遠。這將在後文的例子中表示出來。
    關於CLIP的一些有趣的事實:
  • CLIP是用多達4億對圖文資料來進行訓練的。而ImageNet資料集僅包含120萬張圖片。
  • 的CLIP模型在256個V100 GPU上訓練了兩個星期。如果按照AWS Sagemaker上的計費標準,這將花費至少20萬美金!
  • 型使用32,768張圖片的minibatch進行訓練。
    CLIP in Action:
    為了演示一下CLIP的作用,稍後本文會更詳細地展示一個編碼的例子。
    首先,我們從Unsplash選擇一張免費的圖片。
    bc0424e68d03d9c7a09d6e36c60a3bbf.png
    Photo by Андрей Курган on Unsplash

接下來,我們為CLIP提供以下文字提示:

‘a girl wearing a beanie’.

‘a girl wearing a hat’.

‘a boy wearing a beanie’.

‘a girl riding a bike’.

‘a dog’.

很明顯,第一個關於對影像的描述更準確。

CLIP能夠自主找到哪個文字提示最佳地描述影像,上述過程是透過分配歸一化的機率實現的。
fa96b39329f29a65f2bbc43cee37dfbe.png

透過上圖可以知道,CLIP成功定位了最適合的影像描述。
另外,CLIP可以準確地識別它以前從未見過的物體種類和個體。
如果你有一個龐大的影像資料集,並且你想把這些影像標記為特定的類別,CLIP能夠自動為你做這件事。
接下來,我們將說明CLIP是如何工作的。

CLIP 架構

CLIP使用了來自其他成功深度學習模型架構的新穎想法,並引入了一些創新性的想法。
讓我們從第一部分開始,對比式無監督預訓練(Contrastive Pre-training)。

2.1 對比式無監督預訓練

圖1展示了對比式無監督預訓練過程的概況。

假設我們有N個影像與它們各自的描述集合,例如:<image1, text1>, <image2, text2>, <imageN, textN>。

對比式無監督預訓練的目的是同時訓練影像編碼器和文字編碼器,產生影像嵌入[I1, I2 ... IN]和文字嵌入[T1, T2 ... TN],其方式為:

正確的<image-text>嵌入對<I1,T1>, <I2,T2>(其中i=j)的餘弦相似度是最大的。

以對比的方式,不相似的對<I1,T2>, <I1,T3>...<Ii,Tj>(其中i≠j)的餘弦相似性最小。

d7958d527a6458ca916938c193727bd0.png

圖1:CLIP的對比式無監督預訓練步驟

讓我們看看每一步都發生了些什麼...

  1. 首先接收N個<image-text>對。
  2. 碼器是一個標準的Transformer模型,進行了GPT2風格的修改[4]。影像編碼器可以是ResNet或Vision Transformer[5]。
  3. atch中的每個影像,影像編碼器都會計算一個影像向量。比如第一幅影像對應於I1向量,第二幅對應於I2向量,以此類推。每個向量的大小為de(de是潛在維度的大小)。因此,這一步的輸出是N * de矩陣。
  4. 同樣地,文字描述被壓縮成文字嵌入[T1, T2 ... TN],產生一個N * de矩陣。
  5. 最後,我們將這些矩陣相乘,計算每張圖片和文字描述之間的成對餘弦相似度。這將產生一個N * N矩陣,如圖1所示。
  6. 我們的目標是使對角線上的餘弦相似度最大化,這些是正確的<image-text>對。以對比的方式,非對角線元素的相似度應該最小化(例如,I1影像由T1描述,而不是由T2、T2、T3等描述)。

A few extra remarks:

  • 該模型使用對稱的交叉熵損失函式作為其最佳化目標。這種型別的損失函式既能最佳化影像到文字的方向,也能有最佳化文字到影像的方向(對比損失函式矩陣同時保持<I1,T2>和<I2,T1>的餘弦相似度)。
  • 對比式無監督預訓練並不是全新的。在以前的其他模型中就有使用它,並在之後被CLIP[6]改造。

2.2 Zero-Shot 分類

現在我們已經對影像和文字編碼器進行了預訓練,這就說明已經準備好了進行Zero-Shot分類。

The baseline

首先,需要了解在Pre-Transformer時代是如何實現Zero-Shot分類的?這其實很簡單[7]。

首先下載一個高效能的預訓練過的CNN,比如ResNet,用它進行特徵提取,得到影像特徵。

然後,將這些特徵作為一個標準分類器(如Logistic Regression)的輸入。分類器是以有監督的方式進行訓練的,其中影像標籤是目標變數(圖2)。

如果你選擇了K-shot learning,那麼在分類階段的訓練集應該只包含每個類別的K個例項。

當K<10時,該任務被稱為few-shot classification learning。相應地,對於K=1,我們稱之為one-shot classification learning。如果我們使用所有可用的資料,這就是一個完全有監督的模型(老式的方法)。

8ae5df600120a5e9aef2f7a60c968b36.png

圖2:帶有特徵提取的影像分類(圖片來自本文作者)

注意上文的關鍵詞 “有監督的”——分類器應該事先知道類別標籤。使用影像提取器與分類器配對,也被稱為線性探測評估(linear probing evaluation)。

CLIP的競爭優勢

CLIP如何進行Zero-Shot分類的過程顯示在圖3中。

c119e8dcfe61c816d76a7490e619c71b.png

圖3:使用CLIP的Zero-Shot分類

同樣,這個過程也很簡單明瞭。

首先,我們提供一組文字描述,如一張狗或貓吃冰淇淋的照片(任何我們認為最能描述一張或多張影像的內容)。這些文字描述被編碼為文字嵌入。

然後,我們對影像做同樣的事情——影像被編碼成影像嵌入。

最後,CLIP計算影像嵌入和文字嵌入之間的成對餘弦相似度。具有最高相似度的文字提示被選擇為預測結果。

當然,我們也可以輸入一張以上的影像。CLIP巧妙地快取了輸入的文字嵌入,所以它們不必為其餘的輸入影像重新進行計算。

這就是CLIP端到端的工作方式。

尋找資料的問題

CLIP使用多達30個公共資料集進行預訓練。用大量的資料擬合一個大型語言模型是很重要的。

然而,很難找到具有成對的包含影像和文字描述的強大資料集。大多數公共資料集,如CIFAR,是隻有一個單詞作為標籤的影像——這些標籤是目標類別。但是CLIP使用了完整的文字描述。

為了克服這種差異,作者並沒有排除這些資料集。相反,他們進行了一些特徵工程的工作。單詞標籤(如bird或car)被轉換為句子:一張狗的照片或一張鳥的照片。在Oxford-IIIT Pets資料集上,作者使用了這樣的提示:一張{label}的照片,一種寵物的型別。

關於預訓練技術的其他資訊,請檢視原始論文[3]。

CLIP在人工智慧領域的影響

文初,我們稱CLIP是人工智慧界的一個里程碑,現在來看看為什麼。

4.1 Zero-Shot 分類器的卓越效能

CLIP是一個zero-shot分類器,所以首先針對小樣本學習(few-shot learning)模型測試CLIP是非常有意義的。
因此,作者測試了CLIP與由高質量預訓練模型(如ResNet)上的線性分類器組成的模型。
結果顯示在圖4中。

351f300429ef1eb31a308661eabb7828.png
圖4:CLIP的效能與其他模型在小樣本分類方面的對比

CLIP明顯優於其他分類器!

另外,CLIP還能夠與16-shot線性分類器BiT-M的效能相媲美。換句話說,BiT-M的分類器必須在每類至少16個例子的資料集上進行訓練才能與CLIP的得分相匹配——而CLIP都不需要進行微調就能達到同樣的得分。

有趣的是,作者將CLIP作為一個linear probe(指訓練的時候把預訓練好的模型權重凍住,直接用其提取特徵,然後只是去訓練最後的 fc 分類頭)進行評估。他們只用CLIP的影像編碼器來獲取影像特徵,並將其送入一個線性分類器,就像其他模型一樣。不過即使有這樣的設定,CLIP的小樣本學習能力也很突出。

4.2 對分佈遷移的非並行魯棒性

分佈遷移是個大問題,特別是對於生產環境中的機器學習系統。

注:你可能認為分佈遷移是概念漂移,儘管技術上它們不一樣。

分佈遷移是一種現象,當一個模型所訓練的資料隨著時間的推移而變化時,就會出現這種現象。因此,隨著時間的推移,模型的效率會下降,預測的準確性會降低。

事實上,出現分佈遷移並不是什麼令人意外的事情,它一定會發生。問題是,如何儘早發現這種現象,以及需要採取什麼措施來 “重新校準” 你的模型?這並不容易解決,會受到許多因素的影響。
幸運的是,關於人工智慧的研究方向開始朝向研究建立對分佈漂移有彈性的模型。

這就是為什麼作者要對CLIP的穩健性進行測試。測試結果顯示在圖5中。

efef302145f95bb8afcc985576c0fc30.png

圖5:CLIP與ResNet在分佈漂移方面的效能表現

下面介紹關於CLIP的兩個重要點:

  • CLIP在ImageNet上實現了與SOTA ResNet模型相同的準確度,儘管CLIP是一個zero-shot模型。
  • 除了原始的ImageNet之外,還有類似的資料集作為分佈遷移的基準,不過似乎ResNet在這些資料集上很吃力。然而,CLIP可以很好地處理未知的影像。事實上,該模型在ImageNet的所有變化中都保持著同樣的準確度。

4.3 計算效率

在GPT-2之前,計算效率高在某種程度上被認為是理所當然的。
如今,在一個模型需要用數百個價值高達八千美元的GPU來訓練的時代,計算效率問題需要嚴肅對待。
CLIP是一個更有利於計算的架構。取得成功的部分原因是CLIP使用了一個視覺變換器作為預設的影像編碼器元件。比較結果顯示在圖6中。

c29cd4f7fb2e15b7413c8862f7cc30dd.png
圖6:針對不同模型,每張影像的浮點運算數量比較

顯然,與其他模式相比,CLIP能夠更好地利用硬體資源。這也代表在雲服務(如AWS Sagemaker)上訓練時能夠節省更多費用。此外,圖6顯示,與其他模型相比,CLIP在硬體操作與準確性得分方面具備更好的可擴充套件性。

還有一個資料效率的問題。作者表明,在zero-shot的情況下,CLIP比類似的模型資料效率更高。但是,他們沒有解決CLIP在預訓練階段的資料效率問題。然而,對於這種情況我們可能做不了什麼,因為CLIP使用兩種型別的Transformers——而Transformers從本質上來說是對資料要求很高的模型。

4.4 人們對文轉圖模型的研究興趣得到增加

CLIP的成功引發了人們對文轉圖模型的興趣,並推廣了對比式無監督預訓練方法。
除了DALLE和Stable Diffusion,我們可以把CLIP作為GANs中的一個判別器。
此外,伴隨著CLIP的釋出也出現很多基於CLIP的論文,擴充套件了該模型的功能,如DenseCLIP[8]和CoCoOp[9]。

微軟也釋出了X-CLIP[10],一個用於影片理解的CLIP擴充套件新框架。

Bonus Info:推薦一個類似於Pictionary的應用程式,叫做paint.wtf,使用CLIP對你的繪畫進行排名。

如何使用CLIP - 編碼示例

接下來,我們將展示如何透過HugginFaces庫來使用CLIP。

首先,我們從Unsplash選擇3張圖片,我們在前文使用了第1張。
bc0424e68d03d9c7a09d6e36c60a3bbf.png

Photo by Андрей Курган on Unsplash

7a2e307c8da7c4067c02ec5209cbd52a.png

Photo by Richard Brutyo on Unsplash

95b2ca1fa1dbaf4ae8294c791be5b4a0.png

Photo by Oscar Sutton on Unsplash

我們將使用以下庫:

import transformers
import datasets
import numpy as np
import pandas as pd
import torch
from PIL import Image
import requests

from transformers import CLIPTokenizerFast, CLIPProcessor, CLIPModel

接下來,我們載入CLIP模型的權重、tokenizer影像處理模組:

device = "cuda" if torch.cuda.is_available() else "cpu"
model_id = "openai/clip-vit-base-patch32"

# we initialize a tokenizer, image processor, and the model itself
tokenizer = CLIPTokenizerFast.from_pretrained(model_id)
processor = CLIPProcessor.from_pretrained(model_id)
model = CLIPModel.from_pretrained(model_id).to(device)

另外,我們在Python中載入上面那些來自Unsplash的圖片:

urls=['https://images.unsplash.com/photo-1662955676669-c5d141718bfd?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80',
'https://images.unsplash.com/photo-1552053831-71594a27632d?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=662&q=80',
'https://images.unsplash.com/photo-1530281700549-e82e7bf110d6?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=688&q=80']

images=[Image.open(requests.get(i, stream=True).raw)  for i in urls]

最後,我們給CLIP為這些圖片提供一些文字提示。這樣做的目的是讓CLIP把3張來自Unsplash的圖片分類為特定的文字描述。請注意,其中一個文字描述是具有誤導性的,讓我們看看這樣是否可以混淆模型。

text_prompts=["a girl wearing a beanie", "a boy wearing a beanie", "a dog", "a dog at the beach"]
inputs = inputs = processor(text=text_prompts, images=images, return_tensors="pt", padding=True)

outputs = model(**inputs)
logits_per_image = outputs.logits_per_image 
probs = logits_per_image.softmax(dim=1)
pd.DataFrame(probs.detach().numpy()*100, columns=text_prompts, index=list(['image1','image2', 'image3'])).style.background_gradient(axis=None,low=0, high=0.91).format(precision=2)

該模型成功地對這3幅影像進行了分類!
需要注意兩點:

  • CLIP可以理解多個實體以及它們在每張影像中的行為。
  • CLIP給每張圖片分配了最具體的描述。例如,我們可以把第二張圖片描述為 “一隻狗”和 “一隻在海灘上的狗”。然而,模型正確地決定 “一隻狗” 能夠更好地描述第二幅影像,因為那裡沒有海灘。
    完整樣例:https://jovian.ai/nkafr/clip

侷限性和未來的工作

雖然CLIP是一種顛覆性的模式,但仍然有改進的空間。作者指出了可以取得進一步進展的方面:

  • 準確率得分:CLIP是最先進的zero-shot分類器,它能夠直接挑戰那些因為特定任務而訓練出來的模型。事實上,CLIP與ImageNet上有監督的ResNet101的準確率相匹配,這是十分驚人的。不過,還有有監督的模型能夠取得更高的分數。作者說因為CLIP具備優秀的可擴充套件性,它以後可能會取得更高的分數,但這需要天文數字的計算機資源。
  • 多義詞:作者指出,CLIP受到多義詞的影響。有時,由於缺乏上下文,該模型無法區分一些詞的含義。記住,我們在前面提到,有些圖片只用一個類別標籤而不是文字提示來進行標記。作者提供了一個例子。在Oxford-IIIT Pet資料集中,“boxer”這個詞指的是一種狗的品種,但其他影像“boxer”是運動員。在這個例子,罪魁禍首是資料的質量,而不是模型本身。
  • 特定任務的學習:雖然CLIP可以區分複雜的影像,但該模型在一些瑣碎的任務中卻面臨失敗。例如,CLIP在手寫數字識別任務上很吃力(圖7)。作者將這種型別的任務識別吃力的現象歸因於訓練資料集中缺乏手寫數字。

1f1314999de27e7e1c6504857b1a50d3.png

圖7:使用CLIP進行手寫數字識別

Closing Remarks 結語

毫無疑問,CLIP是人工智慧領域的一個重要模型。

從本質上講,CLIP為新一代的文轉圖模型鋪平了道路,徹底改變了人工智慧研究方向。別忘了,這個模型是開源的。

但是CLIP仍然有很多改進的空間。在整篇論文中,作者暗示CLIP的許多問題是由於較低質量的訓練資料造成的。

END

參考資料

Aditya Ramesh et al. Hierarchical Text-Conditional Image Generation with CLIP Latentshttps://arxiv.org/pdf/2204.06... (April 2022)

Robin Rombach et al. High-Resolution Image Synthesis with Latent Diffusion Modelshttps://arxiv.org/pdf/2112.10... (April 2022)

Alec Radford et al. Learning Transferable Visual Models From Natural Language Supervisionhttps://arxiv.org/pdf/2103.00... (Feb 2021)

Alec Radford et al. Language Models are Unsupervised Multitask Learnershttps://d4mucfpksywv.cloudfro... (2019)

Dosovitskiy et al. An Image is Worth 16x16 Words: Transformers for Image Recognition at Scalehttps://arxiv.org/abs/2010.11929 (2020)

Yuhao Zhang et al. CONTRASTIVE LEARNING OF MEDICAL VISUAL REPRESENTATIONS FROM PAIRED IMAGES AND TEXThttps://arxiv.org/pdf/2010.00... (2020)

Tian, Y et al. Rethinking few-shot image classification: a good embedding is all you need?https://arxiv.org/pdf/2003.11... (2020)

Yongming Rao et al. DenseCLIP: Language-Guided Dense Prediction with Context-Aware Promptinghttps://arxiv.org/abs/2112.01518

Kaiyang Zhou et al. Conditional Prompt Learning for Vision-Language Modelshttps://openaccess.thecvf.com... (Mar 2022)

Bolin Ni et al. Expanding Language-Image Pretrained Models for General Video Recognitionhttps://arxiv.org/abs/2208.02816 (August 2022)

原文連結 : https://towardsdatascience.co...

相關文章