国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

多模態(tài)表征—CLIP及中文版Chinese-CLIP:理論講解、代碼微調(diào)與論文閱讀

這篇具有很好參考價值的文章主要介紹了多模態(tài)表征—CLIP及中文版Chinese-CLIP:理論講解、代碼微調(diào)與論文閱讀。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

我之前一直在使用CLIP/Chinese-CLIP,但并未進(jìn)行過系統(tǒng)的疏導(dǎo)。這次正好可以詳細(xì)解釋一下。相比于CLIP模型,Chinese-CLIP更適合我們的應(yīng)用和微調(diào),因為原始的CLIP模型只支持英文,對于我們的中文應(yīng)用來說不夠友好。Chinese-CLIP很好地彌補(bǔ)了這方面的不足,它使用了大量的中文-文圖對進(jìn)行訓(xùn)練,與CLIP模型架構(gòu)完全一致。

下面我將從4部分對本篇章進(jìn)行講解,

  1. 講解CLIP的主要內(nèi)容

  2. 講解Chinese-CLIP的主要內(nèi)容;

  3. CLIP/Chinese-CLIP代碼微調(diào);

  4. CLIP/Chinese-CLIP論文重點閱讀

CLIP: https://arxiv.org/abs/2103.00020
Github: https://github.com/OpenAI/CLIP

Chinese-CLIP: https://arxiv.org/abs/2211.01335
Github:https://github.com/OFA-Sys/Chinese-CLIP

1.CLIP模型

CLIP全名Contrastive Language-Image Pretraining,在2021年由OpenAI提出,其核心理念為圖文對比學(xué)習(xí)預(yù)訓(xùn)練,是一種多模態(tài)學(xué)習(xí)模型,旨在將圖像和文本進(jìn)行關(guān)聯(lián),它可以快速實現(xiàn)圖文特征相似度計算、跨模態(tài)檢索、零樣本圖片分類等任務(wù)。

與傳統(tǒng)的視覺模型不同,CLIP的預(yù)訓(xùn)練數(shù)據(jù)并非標(biāo)注的圖像數(shù)據(jù),而是從網(wǎng)絡(luò)上大量采集的弱監(jiān)督圖文對數(shù)據(jù),即我們常說的圖片和標(biāo)題(字幕)。CLIP收集了4億規(guī)模的圖文對數(shù)據(jù),旨在通過預(yù)訓(xùn)練建模圖像與文本的聯(lián)系。相比傳統(tǒng)復(fù)雜的交互式的多模態(tài)預(yù)訓(xùn)練,CLIP的模型極為簡單,即我們常說的雙塔模型,分別包括圖像塔和文本塔。圖像塔負(fù)責(zé)提取圖像表征,一般為Vision Transformer,即常說的ViT,文本塔則負(fù)責(zé)提取文本特征,使用經(jīng)典Transformer架構(gòu)。

1.1.CLIP模型架構(gòu)

改變chinese clip的參數(shù),VLM多模態(tài)論文閱讀/源碼解析,論文閱讀,人工智能,多模態(tài),VLM,語言模型,圖像處理

上圖是CLIP模型的架構(gòu)以及訓(xùn)練思路,采用了對比學(xué)習(xí)的思想。預(yù)訓(xùn)練網(wǎng)絡(luò)的輸入是文字和圖片的配對,每一張圖像都有一小句解釋性文字。將文字和圖片分別通過一個編碼器,得到向量表示。這里的文本編碼器是Bert,而圖片編碼器是resnet或者是vit。

可以看出,CLIP的架構(gòu)其實是非常簡單的,就是兩個編碼器組合起來通過對比學(xué)習(xí)來訓(xùn)練,但是它無監(jiān)督訓(xùn)練了4億+的<Image,text>,通過大數(shù)據(jù)堆疊出來了模型的性能以及Zero-shot能力。

1.2.CLIP訓(xùn)練

CLIP執(zhí)行訓(xùn)練的具體步驟如下

  1. 輸入的text和Image分別經(jīng)過各自的Encoder處理成特征向量;

  2. 構(gòu)建關(guān)系矩陣,矩陣中的每一個元素都是每一個Image特征向量和其他Text特征向量的余弦相似度。該矩陣中主對角線的元素都是匹配的(圖像和文本特征完全對應(yīng)),其他地方的元素并不匹配。

  3. 主對角線的余弦相似度盡可能最大,其他地方的余弦相似度盡可能最小。

通過例子說明:

假設(shè)一個批次中有32個<Image,text>,即文本-圖像對:

  1. 這個32個Image [ I 1 , I 2 , . . . , I 32 ] [I_1,I_2,...,I_{32}] [I1?,I2?,...,I32?]和32個Text [ T 1 , T 2 , . . . , T 32 ] [T_1,T_2,...,T_{32}] [T1?,T2?,...,T32?]分別經(jīng)過圖像編碼器VIT和文本編碼器Bert,從而得到32個Image Embedding和32個Text Embedding
  2. 32個Image Embedding與32個Text Embedding兩兩配對,組成了一個32*32的余弦相似性矩陣(計算Loss使用)。
  3. 使用對稱交叉熵?fù)p失作為其優(yōu)化目標(biāo),這種類型的損失最小化了圖像到文本的方向以及文本到圖像的方向。在計算對比損失時,CLIP認(rèn)為在矩陣中只有對角線上的Image與Text組成的對是正樣本,其余都是負(fù)樣本,即正確的嵌入對 < I 1 , T 1 > , < I 2 , T 2 > <I_1,T_1>, <I_2,T_2> <I1?,T1?>,<I2?,T2?>(其中 i=j)的余弦相似度被最大化。以對比方式,不相似對 < I 1 , T 2 > , < I 1 , T 3 > , . . . <I_1,T_2>, <I_1,T_3>,... <I1?,T2?>,<I1?,T3?>,...(其中 i≠j)的余弦相似性被最小化。

為什么使用對比損失,即對稱交叉熵?fù)p失作為模型訓(xùn)練的損失函數(shù)?

由于訓(xùn)練數(shù)據(jù)規(guī)模龐大,訓(xùn)練過程非常耗時,因此必須改進(jìn)訓(xùn)練策略以提高效率。采用對比學(xué)習(xí)進(jìn)行訓(xùn)練的一個重要原因是出于對訓(xùn)練效率的考慮。如下圖所示,最下面的藍(lán)線代表類似GPT2這種需要進(jìn)行預(yù)測的任務(wù),可以看到其訓(xùn)練速度最慢。中間的黃線代表一種詞袋模型的方式,不需要逐字逐句地進(jìn)行文本預(yù)測,文本已經(jīng)被抽象成特征,相應(yīng)的約束也得以放寬,從而將訓(xùn)練速度提高了3倍。進(jìn)一步放寬約束,不再預(yù)測單詞,而是轉(zhuǎn)為判斷圖片-文本對,也就是綠色的線,即對比學(xué)習(xí)的方法,這樣一來訓(xùn)練效率又可以一下子提高至4倍。

論文還給出了關(guān)鍵部分的偽代碼

# extract feature representations of each modality
I_f = image_encoder(I) #[n,d_il  可以是ResNet or Vision Transformer
T_f = text_encoder(T) #[n,d_t]  可以是 CBOW(Continuous Bag-Of-Words) or Text Transformer

# joint multimodal embedding [n, d_e]
I_e = L2_normalize(np.dot(I_f, W_i),axis=1)  # normal里面是投射,學(xué)習(xí)如何從單模態(tài)到多模態(tài)。
T_e = L2_normalize(np.dot(T_f, w_t),axis=1)  # 這里用了線性投射層

# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)

# symmetric loss function
labels = np.arange(n)
loss_i = cross.entropy_loss(logits, labels,axis=0)
loss_t = cross.entropy_loss(losits,iatels,axis=1)
loss = (loss_i + loss_t) / 2
  1. 首先,對圖片和文本進(jìn)行特征提取,分別得到圖像特征表示(I_f)和文本特征表示(T_f)??梢允褂肦esNet或者Vision Transformer來提取圖像特征,使用CBOW或者Text Transformer來提取文本特征。

  2. 接著,通過投影層將圖像特征和文本特征映射到一個共享的多模態(tài)嵌入空間,得到投影后的圖像嵌入(I_e)和文本嵌入(T_e)。這里使用了線性投影層,W_i和w_t分別是圖像和文本的投影矩陣。

  3. 然后,通過計算兩個嵌入之間的余弦相似度得到一個相似度矩陣(logits),其中t是一個縮放參數(shù)。余弦相似度的計算函數(shù)np.dot(I_e, T_e.T)表示將圖像嵌入和文本嵌入轉(zhuǎn)置后做點積。

  4. 最后,使用對比損失函數(shù)來尋來你多模態(tài)嵌入。損失函數(shù)包括兩部分:對圖像嵌入的損失(loss_i)和對文本嵌入的損失(loss_t)。損失函數(shù)使用交叉熵?fù)p失函數(shù)來計算,labels是一個包含了0到n-1的數(shù)組,表示每個樣本的類別。最終的總損失(loss)是兩部分損失的均值。

1.3.CLIP預(yù)測/部署/應(yīng)用

1.3.1.CLIP預(yù)測

CLIP的預(yù)測是需要對文本端進(jìn)行一定處理,例如在做圖像分類時,我們要分類的類別是一個個的單詞,然而CLIP預(yù)訓(xùn)練時候的文本端采用的是句子進(jìn)行訓(xùn)練。所以在預(yù)測的時候也要和預(yù)訓(xùn)練階段保持對齊,具體做法:

通過提示模板對文本端進(jìn)行改造,對于一個dog,就構(gòu)造成 A photo of a {dog},然后將這個改造后的提示送入到Text Encoder中進(jìn)行特征提取。

官方代碼中也給出了一部分提示模板樣例,例如:

templates = [
    'a photo of a {}.',
    'a photo of the {}.',
    'a photo of my {}.',
    'i love my {}!',
    'a photo of my dirty {}.',
    'a photo of my clean {}.',
    'a photo of my new {}.',
    'a photo of my old {}.',
    'a photo of a person {}.',
    'a video of a person {}.',
	 ...
     ...
]

1.3.2.CLIP部署

CLIP環(huán)境安裝:

conda create -n clip python=3.9
activate clip
 
pip install torch==1.9.0
pip install torchaudio==0.9.0
pip install torchvision==0.10.0
 
pip install ftfy regex tqdm
pip install git+https://github.com/openai/CLIP.git

CLIP權(quán)重下載:

_MODELS = {
"RN50":"https://openaipublic.azureedge.net/clip/models/afeb0e10f9e5a86da6080e35cf09123aca3b358a0c3e3b6c78a7b63bc04b6762/RN50.pt",   "RN101":"https://openaipublic.azureedge.net/clip/models/8fa8567bab74a42d41c5915025a8e4538c3bdbe8804a470a72f30b0d94fab599/RN101.pt",
  "RN50x4":"https://openaipublic.azureedge.net/clip/models/7e526bd135e493cef0776de27d5f42653e6b4c8bf9e0f653bb11773263205fdd/RN50x4.pt",
    "RN50x16": "https://openaipublic.azureedge.net/clip/models/52378b407f34354e150460fe41077663dd5b39c54cd0bfd2b27167a4a06ec9aa/RN50x16.pt",
    "RN50x64": "https://openaipublic.azureedge.net/clip/models/be1cfb55d75a9666199fb2206c106743da0f6468c9d327f3e0d0a543a9919d9c/RN50x64.pt",
    "ViT-B/32": "https://openaipublic.azureedge.net/clip/models/40d365715913c9da98579312b702a82c18be219cc2a73407c4526f58eba950af/ViT-B-32.pt",
    "ViT-B/16": "https://openaipublic.azureedge.net/clip/models/5806e77cd80f8b59890b7e101eabd078d9fb84e6937f9e85e4ecb61988df416f/ViT-B-16.pt",
    "ViT-L/14": "https://openaipublic.azureedge.net/clip/models/b8cca3fd41ae0c99ba7e8951adf17d267cdb84cd88be6f7c2e0eca1737a03836/ViT-L-14.pt",
    "ViT-L/14@336px": "https://openaipublic.azureedge.net/clip/models/3035c92b350959924f9f00213499208652fc7ea050643e8b385c2dac08641f02/ViT-L-14-336px.pt",
}

1.3.3.CLIP應(yīng)用

圖文相似度計算:

import torch
import clip
from PIL import Image

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)

image = preprocess(Image.open("CLIP.png")).unsqueeze(0).to(device)
text = clip.tokenize(["a diagram", "a dog", "a cat"]).to(device)

with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)
    
    logits_per_image, logits_per_text = model(image, text)
    probs = logits_per_image.softmax(dim=-1).cpu().numpy()

print("Label probs:", probs)  # prints: [[0.9927937  0.00421068 0.00299572]]

圖文檢索(Top-k):

import torch
import clip
from PIL import Image

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)

image = preprocess(Image.open("CLIP.png")).unsqueeze(0).to(device)
text = clip.tokenize(["a diagram", "a dog", "a cat","a yellow dog","a running dog"]).to(device)

with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)
    
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(3)
print(values,indices)

對于其他的應(yīng)用可以自行去探索,比如我也將這個CLIP/Chinese-CLIP應(yīng)用在圖像或者文本端的召回:

from PIL import Image

def compute(item_emb_1,item_emb_2):
    norm1 = np.linalg.norm(item_emb_1)
    norm2 = np.linalg.norm(item_emb_2)
    s = sum([a * b for a, b in zip(item_emb_1, item_emb_2)])
    return s

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)

image = [preprocess(Image.open("CLIP1.png")).unsqueeze(0).to(device),preprocess(Image.open("CLIP2.png")).unsqueeze(0).to(device)]
text = clip.tokenize(["a diagram", "a dog", "a cat","a yellow dog","a running dog"]).to(device)

with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)
    
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)

scores_img=compute(img_embedding[0].numpy().tolist(),img_embedding[1].numpy().tolist())
print(scores)

2.Chinese-CLIP

Chinese-CLIP是一次極其樸素的開源,沒錯就是CLIP的漢化,旨在推動中文社區(qū)多模態(tài)發(fā)展,

原始的CLIP模型基于英文圖文語料,不能用于中文的圖文表征提取場景。Chinese-CLIP以英文CLIP視覺側(cè)參數(shù)和中文Roberta參數(shù),作為模型初始化值。 基于大規(guī)模原生中文圖文數(shù)據(jù),實現(xiàn)了CLIP模型的中文化版本,從而滿足對中文版本的需求,這也是我之前一直在用的~

為什么要做中文CLIP—雖然大家關(guān)注CLIP基本都關(guān)注它學(xué)習(xí)圖像信息的能力,但其實它的成功也離不開對文本的學(xué)習(xí)。 我們在應(yīng)用的時候總不能直接將中文文本翻譯成英文來做多模態(tài)的檢索或相似度計算吧?這樣會大大影響精度,以后大家都去用英文的了,沒有人來發(fā)展中文模型的能力了,所以我覺得這是值得做的,不論是科研還是實際應(yīng)用中。

2.1.Chinese-CLIP模型

Chinese-CLIP延續(xù)了CLIP的模型架構(gòu),使用了不同的訓(xùn)練方式以及全新的中文數(shù)據(jù)集,即在雙流架構(gòu)和對比學(xué)習(xí)的支持下,能夠有效地整合中文的圖像和文本信息到一個共享的嵌入空間,并擁有處理多模態(tài)數(shù)據(jù)的能力。初始階段以預(yù)訓(xùn)練的方式設(shè)定了兩種編碼器:一種是CLIP的視覺編碼器,另一種是中文版的RoBERTa文本編碼器。
改變chinese clip的參數(shù),VLM多模態(tài)論文閱讀/源碼解析,論文閱讀,人工智能,多模態(tài),VLM,語言模型,圖像處理

Chinese-CLIP執(zhí)行訓(xùn)練的具體步驟如下:

主要思想是凍結(jié) image encoder(凍結(jié)所有的參數(shù))使用 LiT 讓 text encoder 能夠從 OpenAI 的 CLIP 的基礎(chǔ)視覺模型中讀出高質(zhì)量的表示,然后將這些表示遷移到需要的數(shù)據(jù)域中。

第一階段:凍結(jié) image encoder 的所有參數(shù),只訓(xùn)練 text encoder,這一動作是基于一個假設(shè):訓(xùn)練好的 vision backbone 已經(jīng)有很強(qiáng)的能力來抽取視覺特征了。第一階段的訓(xùn)練直到對下游任務(wù)沒有明顯的提升而結(jié)束;

第二階段,讓 image encoder 的參數(shù)參與訓(xùn)練,這樣一來image encoder的參數(shù)就可以學(xué)習(xí)中文圖片數(shù)據(jù)集了。

Chinese-CLIP使用的數(shù)據(jù)集:

大規(guī)模的中文image-text-pairs(約 2 億規(guī)模),其中包括來自 LAION-5B 中文子集、Wukong 的中文數(shù)據(jù)、以及來自 COCO、Visual Genome 的翻譯圖文數(shù)據(jù)等

2.2.Chinese-CLIP部署

Chinese-CLIP環(huán)境安裝:

  1. 通過pip安裝:
pip install cn_clip
  1. 從源代碼安裝:
https://github.com/OFA-Sys/Chinese-CLIP.git #先下載源碼
cd Chinese-CLIP
pip install -e .

Chinese-CLIP權(quán)重下載:

Chinese-CLIP目前開源5個不同規(guī)模,其模型信息見下表:

改變chinese clip的參數(shù),VLM多模態(tài)論文閱讀/源碼解析,論文閱讀,人工智能,多模態(tài),VLM,語言模型,圖像處理

https://github.com/OFA-Sys/Chinese-CLIP中給出了下載的鏈接,可以根據(jù)需求自行下載,我用的CN-CLIP(VIT-L/14@336px)效果已經(jīng)很不錯了

2.3.Chinese-CLIP應(yīng)用

圖文特征向量計算以及相似度計算:

import torch 
from PIL import Image

import cn_clip.clip as clip
from cn_clip.clip import load_from_name, available_models
print("Available models:", available_models())  
# Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = load_from_name("ViT-B-16", device=device, download_root='./')
model.eval()
image = preprocess(Image.open("examples/pokemon.jpeg")).unsqueeze(0).to(device)
text = clip.tokenize(["杰尼龜", "妙蛙種子", "小火龍", "皮卡丘"]).to(device)

with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)
    # 對特征進(jìn)行歸一化,請使用歸一化后的圖文特征用于下游任務(wù)
    image_features /= image_features.norm(dim=-1, keepdim=True) 
    text_features /= text_features.norm(dim=-1, keepdim=True)    

    logits_per_image, logits_per_text = model.get_similarity(image, text)
    probs = logits_per_image.softmax(dim=-1).cpu().numpy()

print("Label probs:", probs)  # [[1.268734e-03 5.436878e-02 6.795761e-04 9.436829e-01]]

可以發(fā)現(xiàn)和CLIP是一樣,所以CLIP可以實施的應(yīng)用,在Chinese-CLIP同樣適用,只需要將依賴庫以及相應(yīng)的model轉(zhuǎn)換一下就可以了,省下的應(yīng)用方向就省略不寫了

3.CLIP/Chinese-CLIP模型微調(diào)

CLIP的源代碼中并沒有提供微調(diào)訓(xùn)練的程序,可以自行手動碼,其實結(jié)構(gòu)很簡單,損失函數(shù)的形式也給出了,即:

# symmetric loss function
labels = np.arange(n)
loss_i = cross.entropy_loss(logits, labels,axis=0)
loss_t = cross.entropy_loss(losits,iatels,axis=1)
loss = (loss_i + loss_t) / 2

但是里面的訓(xùn)練細(xì)節(jié),例如分布式、warmup步數(shù)、學(xué)習(xí)率、訓(xùn)練步數(shù)等等一些加速訓(xùn)練的手段剛接觸的人很難些的出來,你以為那就沒有辦法了嗎!

No No No,Chinese-CLIP源碼給出了我們訓(xùn)練源碼,我們可以使用Chinese-CLIP的微調(diào)源碼去執(zhí)行CLIP或者Chinese-CLIP,以應(yīng)用我們想要微調(diào)的數(shù)據(jù)。

但是Chinese-CLIP微調(diào)源碼比較復(fù)雜,涉及了很多,不想看的可以跳過,下面我詳解一下Chinese-CLIP微調(diào)~

Chinese-CLIP的訓(xùn)練代碼位于Chinese-CLIP/cn_clip/training/main.py

3.1.微調(diào)所需要的參數(shù)

參數(shù)設(shè)置位于:Chinese-CLIP/cn_clip/training/params.py

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--train-data",type=str,required=True, help="Path to the LMDB directory with training data split")
    parser.add_argument("--val-data",type=str,default=None,help="Path to the LMDB directory with validation data split, default to None which disables validation",)
    parser.add_argument("--num-workers", type=int, default=4, help="The number of workers for training dataloader.")
    parser.add_argument("--valid-num-workers", type=int, default=1, help="The number of workers for validation dataloader (if making validation).")
    parser.add_argument("--logs",type=str,default="./logs/",help="Where to store logs. Use None to avoid storing logs.",)
    parser.add_argument("--name",type=str,default="train_clip",help="Optional identifier for the experiment when storing logs. Otherwise use current time.",)
    parser.add_argument("--log-interval", type=int, default=10, help="How often to log loss info.")
    parser.add_argument("--report-training-batch-acc", default=False,action="store_true", help="Whether to report training batch accuracy.")
    parser.add_argument("--batch-size", type=int, default=64, help="Batch size for training per GPU.")
    parser.add_argument( "--valid-batch-size", type=int, default=64, help="Batch size for validation per GPU.")
    parser.add_argument("--max-steps", type=int, default=None, help="Number of steps to train for (in higher priority to --max_epochs).")
    parser.add_argument("--max-epochs", type=int, default=32, help="Number of full epochs to train for (only works if --max_steps is None).")
    parser.add_argument("--valid-step-interval", type=int, default=None, help="The step interval for validation (default to None which disables validation between steps).")
    parser.add_argument("--valid-epoch-interval", type=int, default=1, help="The epoch interval for validation (default to 1, set None to disable validation between epochs).")
    parser.add_argument("--context-length", type=int, default=52, help="The maximum length of input text (include [CLS] & [SEP] tokens). Default to 52.")
    parser.add_argument("--lr", type=float, default=None, help="Learning rate.")
    parser.add_argument("--beta1", type=float, default=None, help="Adam beta 1.")
    parser.add_argument("--beta2", type=float, default=None, help="Adam beta 2.")
    parser.add_argument("--eps", type=float, default=None, help="Adam epsilon.")
    parser.add_argument("--wd", type=float, default=0.2, help="Weight decay.")
    parser.add_argument("--warmup", type=int, default=500, help="Number of steps to warmup for.")
    parser.add_argument("--use-bn-sync",default=False, action="store_true", help="Whether to use batch norm sync.")
    parser.add_argument("--use-augment",default=False,action="store_true", help="Whether to use image augment.")
    parser.add_argument("--skip-scheduler",action="store_true",default=False, help="Use this flag to skip the learning rate decay.",)
    parser.add_argument("--save-epoch-frequency", type=int, default=1, help="How often to save checkpoints by epochs.")
    parser.add_argument("--save-step-frequency", type=int, default=-1, help="How often to save checkpoints by steps.")
...
...

參數(shù)解釋:

  • 分布式

    • WORKER_CNT: 訓(xùn)練的機(jī)器個數(shù)
    • GPUS_PER_NODE: 每個機(jī)器上的GPU個數(shù)
  • 訓(xùn)練/驗證數(shù)據(jù)

    • train-data: 訓(xùn)練數(shù)據(jù)LMDB目錄,
    • val-data: 驗證數(shù)據(jù)LMDB目錄,指定為None時,則不進(jìn)行訓(xùn)練過程中的驗證。
    • num-workers: 訓(xùn)練集數(shù)據(jù)處理(DataLoader)的進(jìn)程數(shù),默認(rèn)為4。
    • valid-num-workers: 驗證集數(shù)據(jù)處理(DataLoader)的進(jìn)程數(shù)(如果進(jìn)行驗證),默認(rèn)為1。
  • 訓(xùn)練超參數(shù)

    • vision-model: 指定視覺backbone, 從 ["ViT-B-16", "ViT-L-14", "ViT-L-14-336", "ViT-H-14", "RN50"]選擇。

    • text-model: 指定文本backbone, 從 ["RoBERTa-wwm-ext-base-chinese", "RoBERTa-wwm-ext-large-chinese", "RBT3-chinese"]選擇。

    • context-length: 文本輸入序列長度。

    • warmup: warmup步數(shù)。

    • batch-size: 訓(xùn)練時單卡batch-size。(請保證訓(xùn)練樣本總數(shù) > batch-size * GPU數(shù),至少滿足1個訓(xùn)練batch)

    • lr: 學(xué)習(xí)率。

    • wd: weight decay。

      (具體參考github中給出的細(xì)節(jié))

參數(shù)的設(shè)置

可以參考位于run_scripts/muge_finetune_vit-b-16-rbt-base.sh中給出的超參數(shù)

然后可以執(zhí)行run_scripts/muge_finetune_vit-b-16-rbt-base.sh以進(jìn)行微調(diào),下面的介紹可以選擇不看,如果對源碼中的細(xì)節(jié)感興趣,想了解分布式,凍結(jié)等操作的可以看一下

3.2.Train源碼解析

Chinese-CLIP/cn_clip/training/main.py

  1. 解析參數(shù):調(diào)用了一個叫做parse_args的函數(shù),解析并獲取命令行傳入?yún)?shù),并將其存儲在args變量中。

    args = parse_args()
    
  2. 設(shè)置分布式訓(xùn)練環(huán)境:首先根據(jù)環(huán)境變量設(shè)置本地設(shè)備的排名、所使用的CUDA設(shè)備,并將其存儲在args變量中。然后初始化分布式訓(xùn)練組,使用了NCCL作為后端,最后獲取當(dāng)前進(jìn)程的rank和整個訓(xùn)練環(huán)境的world_size,并將其存儲在args變量中。

    args.local_device_rank = int(os.environ["LOCAL_RANK"])
    torch.cuda.set_device(args.local_device_rank)
    args.device = torch.device("cuda", args.local_device_rank)
    dist.init_process_group(backend="nccl")
    args.rank = dist.get_rank()
    args.world_size = dist.get_world_size()
    
  3. 設(shè)置輸出路徑:使用當(dāng)前時間生成一個時間戳,并根據(jù)時間戳設(shè)置日志文件的路徑和檢查點的路徑。如果當(dāng)前進(jìn)程是主進(jìn)程,會根據(jù)參數(shù)創(chuàng)建對應(yīng)的目錄。

    time_suffix = strftime("%Y-%m-%d-%H-%M-%S", gmtime())
    args.log_path = os.path.join(args.logs, args.name, "out_{}.log".format(time_suffix))
    
    args.checkpoint_path = os.path.join(args.logs, args.name, "checkpoints")
    if is_master(args):
        for dirname in [args.checkpoint_path]:
            if dirname:
                os.makedirs(dirname, exist_ok=True)
    
  4. 檢查精度參數(shù):用于確保args.precision的取值在指定范圍內(nèi),即’amp’、‘fp16’或’fp32’

    assert args.precision in ['amp', 'fp16', 'fp32']
    
  5. 設(shè)置日志記錄:設(shè)置了日志級別,并初始化了日志隊列,進(jìn)而進(jìn)行了一些日志記錄的準(zhǔn)備工作。

    args.log_level = logging.DEBUG if args.debug else logging.INFO
    log_queue = setup_primary_logging(args.log_path, args.log_level, args.rank)
    setup_worker_logging(args.rank, log_queue, args.log_level)
    
  6. 構(gòu)建CLIP模型:這里根據(jù)傳入的參數(shù),拼接了視覺模型和文本模型的配置文件路徑,然后加載并解析了視覺模型和文本模型的配置文件,將其存儲在model_info中,最后將args.use_flash_attention設(shè)置到model_info中。最后構(gòu)建了CLIP模型實例,并傳入了model_info中的參數(shù)

    vision_model_config_file = Path(__file__).parent.parent / f"clip/model_configs/{args.vision_model.replace('/', '-')}.json"
    text_model_config_file = Path(__file__).parent.parent / f"clip/model_configs/{args.text_model.replace('/', '-')}.json"
    
    with open(vision_model_config_file, 'r') as fv, open(text_model_config_file, 'r') as ft:
        model_info = json.load(fv)
        if isinstance(model_info['vision_layers'], str):
            model_info['vision_layers'] = eval(model_info['vision_layers'])
        for k, v in json.load(ft).items():
            model_info[k] = v
    model_info['use_flash_attention'] = args.use_flash_attention
    
    model = CLIP(**model_info)
    
  7. 加載預(yù)訓(xùn)練權(quán)重:加載預(yù)訓(xùn)練的CLIP模型權(quán)重和BERT模型權(quán)重,用于fine-tuning或推理過

    if args.clip_weight_path is not None:
        assert os.path.exists(args.clip_weight_path), "Pretrained CLIP weight not exists!"
    if args.bert_weight_path is not None:
        assert os.path.exists(args.bert_weight_path), "Pretrained BERT weight not exists!"
    load(model, clip_path=args.clip_weight_path, bert_path=args.bert_weight_path, use_flash_attention=args.use_flash_attention)
    
  8. 檢查32精度:首先檢查精度參數(shù)是否為"amp"或"fp32",如果是的話,則調(diào)用convert_models_to_fp32函數(shù),將模型參數(shù)轉(zhuǎn)換為32位浮點數(shù)。并將模型移動到對應(yīng)的GPU設(shè)備上

    if args.precision == "amp" or args.precision == "fp32":
        convert_models_to_fp32(model)
    model.cuda(args.local_device_rank)
    
  9. 檢查16精度:如果精度參數(shù)是"fp16",則調(diào)用convert_weights函數(shù),將模型中的權(quán)重轉(zhuǎn)換為半精度浮點數(shù)。

    if args.precision == "fp16":
        convert_weights(model)
    
  10. 梯度檢查點:如果選擇了梯度檢查點,則首先確保所使用的PyTorch版本不小于1.8.0,然后調(diào)用set_grad_checkpointing函數(shù)激活梯度檢查點功能,并記錄日志信息。

    if args.grad_checkpointing:
        assert not torch_version_str_compare_lessequal(torch.__version__, "1.8.0"), \
            "Currently our grad_checkpointing is not compatible with torch version <= 1.8.0."
        model.set_grad_checkpointing()
        logging.info("Grad-checkpointing activated.")
    
  11. FlashAttention:如果選擇了使用FlashAttention,則先確保FlashAttention庫已安裝,然后記錄日志表示正在使用FlashAttention。

    if args.use_flash_attention:
        assert importlib.util.find_spec("flash_attn"), "flash_attn is not installed."
        logging.info("Using FlashAttention.")
    
  12. BatchNorm:如果選擇使用同步的BatchNorm操作,則調(diào)用函數(shù)將模型轉(zhuǎn)換為同步BatchNorm形式

    if args.use_bn_sync:
        model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model)
    
  13. 凍結(jié)視覺模型:如果選擇凍結(jié)視覺編碼器(args.freeze_vision),則將視覺編碼器的參數(shù)設(shè)置為不可訓(xùn)練。如果視覺模型是ResNet-50(args.vision_model為’RN50’),還將BatchNorm層的運(yùn)行均值和方差設(shè)置為評估模式,以防止在訓(xùn)練過程中更新這些統(tǒng)計信息。記錄日志信息表示視覺編碼器在訓(xùn)練期間被凍結(jié)。

    if args.freeze_vision:
        for k, v in model.visual.named_parameters():
            v.requires_grad = False
        if args.vision_model in ['RN50']:
            for m in model.visual.modules():
                if isinstance(m, torch.nn.BatchNorm2d):
                    m.eval()
        logging.info("The visual encoder is freezed during training.")
    
  14. 初始化數(shù)據(jù):使用get_data函數(shù)初始化數(shù)據(jù)集

    data = get_data(args, epoch_id=0, max_txt_length=args.context_length)
    
  15. 初始化數(shù)據(jù)集、優(yōu)化器、學(xué)習(xí)率調(diào)度器和梯度縮放器,為模型的訓(xùn)練做準(zhǔn)備:

    if args.train_data is None:
        optimizer = None
        scheduler = None
    else:
        optimizer = optim.AdamW(
            [
                {"params": gain_or_bias_params, "weight_decay": 0.},
                {"params": rest_params, "weight_decay": args.wd},
            ],
            lr=args.lr,
            betas=(args.beta1, args.beta2),
            eps=args.eps,
        )
        num_batches = data["train"].dataloader.num_batches
        if args.max_steps is not None:
            args.max_epochs = ceil(args.max_steps * args.accum_freq / num_batches)
        else:
            assert args.max_epochs is not None and args.max_epochs > 0
            args.max_steps = (num_batches // args.accum_freq) * args.max_epochs
        total_steps = args.max_steps
        scheduler = cosine_lr(optimizer, args.lr, args.warmup, total_steps)
    
  16. 加載檢查點權(quán)重:加載檢查點文件中保存的模型權(quán)重,并根據(jù)需要對模型進(jìn)行相應(yīng)的操作。如果指定了使用 flash_attention,會對模型進(jìn)行調(diào)整。然后會加載模型的狀態(tài)字典并恢復(fù)模型的狀態(tài)。如果不指定重置數(shù)據(jù)偏移,會恢復(fù)訓(xùn)練的起始 epoch 和步數(shù),并重新加載相應(yīng)的數(shù)據(jù)集和數(shù)據(jù)加載器。如果不指定重置優(yōu)化器,會恢復(fù)優(yōu)化器的狀態(tài)

     if args.resume is None:
            latest_path = os.path.join(args.checkpoint_path, f"epoch_latest.pt")
            if os.path.isfile(latest_path):
                args.resume = latest_path
        if args.resume is not None:
            if os.path.isfile(args.resume):
                logging.info(
                    f"=> begin to load checkpoint '{args.resume}'"
                )
                checkpoint = torch.load(args.resume, map_location="cpu")
                sd = {k: v for k, v in checkpoint["state_dict"].items() if "bert.pooler" not in k}
                resize_pos_embed(sd, model, prefix="module.")
                if args.use_flash_attention:
                    sd = convert_state_dict(sd)
                model.load_state_dict(sd)
                if not args.reset_data_offset:
                    start_epoch = checkpoint["epoch"]
                    steps = checkpoint["step"]
                    data = get_data(args, epoch_id=start_epoch,max_txt_length=args.context_length)
                if not args.reset_optimizer and optimizer is not None:
                    optimizer.load_state_dict(checkpoint["optimizer"])
                    logging.info("=> optimizer state is restored from the checkpoint")
                logging.info(f"=> loaded checkpoint '{args.resume}' (epoch {checkpoint['epoch']} @ {steps} steps)")
            else:
                logging.info("=> no checkpoint found at '{}'".format(args.resume))
    
  17. 進(jìn)行訓(xùn)練狀態(tài):遍歷每個 epoch,每個 epoch 內(nèi),首先判斷當(dāng)前進(jìn)程是否為主進(jìn)程(通過 is_master(args) 函數(shù)來判斷)。如果不是主進(jìn)程,打印當(dāng)前 epoch 的信息。如果使用了知識蒸餾(distillation)的方法(args.distllation=True),則調(diào)用 train 函數(shù)來進(jìn)行模型訓(xùn)練,并傳入額外的參數(shù) teacher_model。否則,只調(diào)用 train 函數(shù)進(jìn)行模型訓(xùn)練。train 函數(shù)會返回每個 epoch 中進(jìn)行的訓(xùn)練步數(shù) num_steps_this_epoch。

    for epoch in range(start_epoch, args.max_epochs):
         if is_master(args) == 0:
                logging.info(f'Start epoch {epoch + 1}')
         if args.distllation:
                num_steps_this_epoch = train(model, data, epoch, optimizer, scaler, scheduler, args, steps, teacher_model)
         else:
                num_steps_this_epoch = train(model, data, epoch, optimizer, scaler, scheduler, args, steps)
    
    • train(model, data, epoch, optimizer, scaler, scheduler, args, steps, teacher_model):(代碼簡單,不細(xì)致講解了)將模型設(shè)置為訓(xùn)練模式,并根據(jù)需要凍結(jié)視覺部分的參數(shù)。獲取訓(xùn)練數(shù)據(jù)集的dataloader和sampler。定義圖像和文本的交叉熵?fù)p失函數(shù)。設(shè)置每個epoch的批次數(shù),并迭代訓(xùn)練數(shù)據(jù)。對每個batch進(jìn)行訓(xùn)練:對圖像和文本進(jìn)行前向傳播計算損失。根據(jù)訓(xùn)練精度設(shè)置是否采用混合精度訓(xùn)練。更新模型參數(shù),并進(jìn)行相關(guān)的記錄和日志輸出。在特定的訓(xùn)練步驟進(jìn)行驗證集的評估,并保存模型參數(shù)。返回該epoch訓(xùn)練的步數(shù)。
    def train(model, data, epoch, optimizer, scaler, scheduler, args, global_trained_steps):
        model.train()
        if args.freeze_vision:
            freeze_vision_bn(args, model)
        dataloader, sampler = data['train'].dataloader,  data['train'].sampler
        loss_img = nn.CrossEntropyLoss()
        loss_txt = nn.CrossEntropyLoss()
        loss_img = loss_img.cuda(args.local_device_rank)
        loss_txt = loss_txt.cuda(args.local_device_rank)
        if sampler is not None:
            sampler.set_epoch(epoch)
        num_batches_per_epoch = dataloader.num_batches
        data_iter = iter(dataloader)
        end = time.time()
        epoch_trained_steps = 0
        for i in range(global_trained_steps - num_batches_per_epoch * epoch, num_batches_per_epoch):
            batch = next(data_iter)
            step = num_batches_per_epoch * epoch + i
            if step >= args.max_steps:
                logging.info("Stopping training due to step {} has reached max_steps {}".format(step, args.max_steps))
                return epoch_trained_steps
            scheduler(step)
            optimizer.zero_grad()
            images, texts, eos_indices = batch
            images = images.cuda(args.local_device_rank, non_blocking=True)
            texts = texts.cuda(args.local_device_rank, non_blocking=True)
            eos_indices = eos_indices.cuda(args.local_device_rank, non_blocking=True)
            data_time = time.time() - end
            m = model.module
            # with automatic mixed precision.
            if args.precision == "amp":
                with autocast():
                    total_loss, acc = get_loss(model, images, texts, loss_img, loss_txt, args)
                    scaler.scale(total_loss).backward()
                    scaler.step(optimizer)
                scaler.update()
            else:
                total_loss, acc = get_loss(model, images, texts, loss_img, loss_txt, args)
                total_loss.backward()
                optimizer.step()
                ....
    
  18. 驗證數(shù)據(jù):如果指定了驗證數(shù)據(jù)集(args.val_data 不為 None)和驗證間隔(args.valid_epoch_interval 不為 None),并且當(dāng)前 epoch 是驗證的時間點((epoch + 1) % args.valid_epoch_interval == 0),則調(diào)用 evaluate 函數(shù)對模型進(jìn)行驗證。如果沒有使用閃躲注意力(flash attention),直接調(diào)用 evaluate 函數(shù);否則,在使用了半精度訓(xùn)練(fp16)的情況下,使用 torch.cuda.amp.autocast() 上下文管理器來運(yùn)行 evaluate 函數(shù),以確保模型在 GPU 上運(yùn)行。如果還存在下一個 epoch(epoch + 1 < args.max_epochs),則重新加載下一個 epoch 的數(shù)據(jù)集和數(shù)據(jù)加載器。

    steps += num_steps_this_epoch
    if args.val_data is not None and args.valid_epoch_interval is not None and (
            (epoch + 1) % args.valid_epoch_interval) == 0:
        assert "val" in data, "Error: Valid dataset has not been built."
        if not args.use_flash_attention:
            evaluate(model, data, epoch, args, steps)
        else:
            with torch.cuda.amp.autocast():
                evaluate(model, data, epoch, args, steps)
    if epoch + 1 < args.max_epochs:
        data = get_data(args, epoch_id=epoch + 1, max_txt_length=args.context_length)
    

4.CLIP/Chinese-CLIP論文閱讀

4.1.CLIP Paper

Abstract

最先進(jìn)的計算機(jī)視覺系統(tǒng)經(jīng)過訓(xùn)練,可以預(yù)測一組固定的預(yù)定對象類別。這種受限的監(jiān)督形式限制了它們的通用性和可用性,因為要指定任何其他視覺概念都需要額外的標(biāo)記數(shù)據(jù)。直接從原始文本中學(xué)習(xí)圖像是一種很有前途的替代方法,它可以利用更廣泛的監(jiān)督來源。 我們證明,**預(yù)測哪張圖片配哪條標(biāo)題這一簡單的預(yù)訓(xùn)練任務(wù)是一種高效、可擴(kuò)展的方法,可以在從互聯(lián)網(wǎng)上收集的 4 億對(圖像、文本)數(shù)據(jù)集上從頭開始學(xué)習(xí) SOTA 圖像表征。**預(yù)訓(xùn)練完成后,**自然語言將被用來引用所學(xué)到的視覺概念(或描述新概念),從而實現(xiàn)模型向下游任務(wù)的零轉(zhuǎn)移。**我們在 30 多個不同的現(xiàn)有計算機(jī)視覺數(shù)據(jù)集上進(jìn)行了基準(zhǔn)測試,研究了這種方法的性能,這些數(shù)據(jù)集涵蓋了 OCR、視頻中的動作識別、地理定位以及多種類型的細(xì)粒度對象分類等任務(wù)。 該模型可以無縫轉(zhuǎn)移到大多數(shù)任務(wù)中,而且無需進(jìn)行任何特定數(shù)據(jù)集的訓(xùn)練,就能與完全受監(jiān)督的基準(zhǔn)模型相媲美。例如,我們在 ImageNet zero-shot 上的準(zhǔn)確率與原始 ResNet-50 不相上下,而無需使用它所訓(xùn)練的 128 萬個訓(xùn)練示例中的任何一個。我們將在 https://github.com/OpenAI/CLIP 上發(fā)布我們的代碼和預(yù)訓(xùn)練模型權(quán)重。

1. Introduction and Motivating Work

在過去幾年中,直接從原始文本中學(xué)習(xí)的預(yù)訓(xùn)練方法給 NLP 帶來了革命性的變化。自回歸和掩碼語言建模等與任務(wù)無關(guān)的目標(biāo)在計算能力、模型容量和數(shù)據(jù)方面已經(jīng)跨越了許多數(shù)量級,能力穩(wěn)步提高。作為標(biāo)準(zhǔn)化輸入輸出接口的 "文本到文本"的發(fā)展,使任務(wù)無關(guān)架構(gòu)能夠零距離傳輸?shù)较掠螖?shù)據(jù)集,不再需要專門的輸出頭或數(shù)據(jù)集特定定制。像 GPT-3 這樣的旗艦系統(tǒng)現(xiàn)在在許多任務(wù)中都具有定制模型的競爭力,同時幾乎不需要特定數(shù)據(jù)集的訓(xùn)練數(shù)據(jù)。

這些結(jié)果表明,在網(wǎng)絡(luò)規(guī)模的文本集合中,現(xiàn)代預(yù)訓(xùn)練方法可獲得的監(jiān)督總量超過了高質(zhì)量的人群標(biāo)簽 NLP 數(shù)據(jù)集。然而,在計算機(jī)視覺等其他領(lǐng)域,在人群標(biāo)簽數(shù)據(jù)集(如 ImageNet)上預(yù)訓(xùn)練模型仍然是標(biāo)準(zhǔn)做法。 直接從網(wǎng)絡(luò)文本中學(xué)習(xí)的可擴(kuò)展預(yù)訓(xùn)練方法能否在計算機(jī)視覺領(lǐng)域帶來類似的突破?先前的工作令人鼓舞。

20 多年前,Mori 等人(1999 年)通過訓(xùn)練一個模型來預(yù)測與圖像配對的文本文檔中的名詞和形容詞,探索改進(jìn)基于內(nèi)容的圖像檢索。Quattoni 等人(2007 年)證明,通過在分類器的權(quán)重空間中進(jìn)行流形學(xué)習(xí),可以學(xué)習(xí)到數(shù)據(jù)效率更高的圖像表征,而這些分類器是為預(yù)測與圖像相關(guān)的標(biāo)題中的單詞而訓(xùn)練的。Srivastava & Salakhutdinov(2012 年)在低級圖像和文本標(biāo)簽特征的基礎(chǔ)上,通過訓(xùn)練多模態(tài)深度玻爾茲曼機(jī)探索了深度表征學(xué)習(xí)。 Joulin 等人(2016 年)對這一研究方向進(jìn)行了更新,證明了為預(yù)測圖像標(biāo)題中的單詞而訓(xùn)練的 CNN 可以學(xué)習(xí)有用的圖像表征。他們將 YFCC100M 數(shù)據(jù)集(Thomee 等人,2016 年)中圖片的標(biāo)題、描述和標(biāo)簽元數(shù)據(jù)轉(zhuǎn)換成了詞袋多標(biāo)簽分類任務(wù),結(jié)果表明,預(yù)訓(xùn)練 AlexNet(Krizhevsky 等人,2012 年)來預(yù)測這些標(biāo)簽所學(xué)習(xí)到的表征在轉(zhuǎn)移任務(wù)中的表現(xiàn)與基于 ImageNet 的預(yù)訓(xùn)練類似。隨后,Li 等人(2017 年)將這一方法擴(kuò)展到預(yù)測單個單詞之外的短語 ngram,并展示了他們的系統(tǒng)通過根據(jù)學(xué)習(xí)到的視覺 ngram 詞典對目標(biāo)類別進(jìn)行評分并預(yù)測得分最高的類別,從而實現(xiàn)向其他圖像分類數(shù)據(jù)集零距離轉(zhuǎn)移的能力。VirTex (Desai & Johnson,2020)、ICMLM (Bulent Sariyildiz 等人, 2020) 和 ConVIRT (Zhang 等人, 2020) 采用了更新穎的架構(gòu)和預(yù)訓(xùn)練方法,最近展示了基于轉(zhuǎn)換器的語言建模、遮蔽語言建模和對比目標(biāo)從文本中學(xué)習(xí)圖像表征的潛力

使用自然語言監(jiān)督進(jìn)行圖像表征學(xué)習(xí)雖然是令人興奮的概念證明,但仍然很少見。 這可能是因為在常見基準(zhǔn)上的表現(xiàn)遠(yuǎn)低于其他方法。 例如,Li 等人(2017 年)在零鏡頭設(shè)置下,在 ImageNet 上只達(dá)到了 11.5% 的準(zhǔn)確率,這遠(yuǎn)遠(yuǎn)低于當(dāng)前技術(shù)水平的 88.4% 的準(zhǔn)確率。它甚至低于經(jīng)典計算機(jī)視覺方法 50% 的準(zhǔn)確率。相反,范圍更窄但目標(biāo)更明確的弱監(jiān)督使用卻提高了性能。Mahajan 等人(2018 年)的研究表明,預(yù)測 Instagram 圖像上的 ImageNet 相關(guān)標(biāo)簽是一項有效的預(yù)訓(xùn)練任務(wù)。Kolesnikov 等人(2019 年)和 Dosovitskiy 等人(2020 年)也通過預(yù)訓(xùn)練模型來預(yù)測 JFT-300M 數(shù)據(jù)集的嘈雜標(biāo)簽類別,在更廣泛的傳輸基準(zhǔn)集上取得了巨大的收益。

這一研究方向代表了當(dāng)前從有限的有監(jiān)督 "金標(biāo)簽 "中學(xué)習(xí)和從幾乎無限量的原始文本中學(xué)習(xí)的實用中間路線。然而,這并不是沒有妥協(xié)。自然語言由于其通用性,能夠表達(dá)更廣泛的視覺概念,因此也能監(jiān)督更廣泛的視覺概念。這兩種方法都使用靜態(tài)軟最大分類器進(jìn)行預(yù)測,缺乏動態(tài)輸出機(jī)制。這嚴(yán)重削弱了它們的靈活性,也限制了它們的 "零點 "能力。

這些弱監(jiān)督模型與最近直接從自然語言學(xué)習(xí)圖像表征的探索之間的一個關(guān)鍵區(qū)別在于規(guī)模。Mahajan 等人(2018 年)和 Kolesnikov 等人(2019 年)在數(shù)百萬到數(shù)十億張圖像上對其模型進(jìn)行了長達(dá)數(shù)年的加速訓(xùn)練,而 VirTex、ICMLM 和 ConVIRT 則在一到二十萬張圖像上進(jìn)行了為期數(shù)天的加速訓(xùn)練。在這項工作中,我們縮小了這一差距,研究了在大規(guī)模自然語言監(jiān)督下訓(xùn)練的圖像分類器的行為。借助互聯(lián)網(wǎng)上大量公開可用的此類數(shù)據(jù),我們創(chuàng)建了一個包含 4 億對(圖像、文本)數(shù)據(jù)的新數(shù)據(jù)集,并證明了從頭開始訓(xùn)練的簡化版 ConVIRT(我們稱之為 CLIP,即對比語言-圖像預(yù)訓(xùn)練)是一種高效的自然語言監(jiān)督學(xué)習(xí)方法。

我們研究了 CLIP 的可擴(kuò)展性,訓(xùn)練了一系列 8 個模型,計算量幾乎達(dá)到 2 個數(shù)量級,并觀察到傳輸性能是計算量的平穩(wěn)可預(yù)測函數(shù)。我們發(fā)現(xiàn),CLIP 與 GPT 系列類似,能在預(yù)訓(xùn)練期間學(xué)會執(zhí)行一系列任務(wù),包括 OCR、地理定位、動作識別等。我們在 30 多個現(xiàn)有數(shù)據(jù)集上對 CLIP 的零點轉(zhuǎn)移性能進(jìn)行了基準(zhǔn)測試,發(fā)現(xiàn)它可以與之前的特定任務(wù)監(jiān)督模型相媲美。我們還通過線性探針表示學(xué)習(xí)分析證實了這些發(fā)現(xiàn),并表明 CLIP 優(yōu)于最佳的公開 ImageNet 模型,同時計算效率更高。此外,我們還發(fā)現(xiàn),CLIP 模型的零鏡頭比同等準(zhǔn)確度的監(jiān)督 ImageNet 模型更穩(wěn)健,這表明對任務(wù)無關(guān)模型的零鏡頭評估更能代表模型的能力。

2. Approach

改變chinese clip的參數(shù),VLM多模態(tài)論文閱讀/源碼解析,論文閱讀,人工智能,多模態(tài),VLM,語言模型,圖像處理

2.1. Natural Language Supervision

我們的方法的核心是通過自然語言中的監(jiān)督來學(xué)習(xí)感知。正如導(dǎo)言中所討論的,這完全不是一個新想法,但是用于描述這一領(lǐng)域工作的術(shù)語多種多樣,甚至似乎相互矛盾,而且所述動機(jī)也各不相同。Zhang 等人(2020 年)、Gomez 等人(2017 年)、Joulin 等人(2016 年)和 Desai & Johnson(2020 年)都介紹了從與圖像配對的文本中學(xué)習(xí)視覺表征的方法,但他們將自己的方法分別描述為無監(jiān)督、自監(jiān)督、弱監(jiān)督和監(jiān)督。

我們要強(qiáng)調(diào)的是,這些方法的共同點不在于所使用的特定方法的任何細(xì)節(jié),而在于將自然語言作為一種訓(xùn)練信號。所有這些方法都是從自然語言監(jiān)督中學(xué)習(xí)的。雖然早期的工作在使用主題模型和 n-gram 表示時與自然語言的復(fù)雜性進(jìn)行了斗爭,但深度上下文表示學(xué)習(xí)的改進(jìn)表明,我們現(xiàn)在擁有了有效利用這一豐富監(jiān)督來源的工具。

與其他訓(xùn)練方法相比,從自然語言中學(xué)習(xí)有幾個潛在的優(yōu)勢。與用于圖像分類的標(biāo)準(zhǔn)眾包標(biāo)簽相比,自然語言監(jiān)督更容易擴(kuò)展,因為它不要求注釋采用經(jīng)典的 “機(jī)器學(xué)習(xí)兼容格式”,如典型的1-of-N多數(shù)票 “黃金標(biāo)簽”。相反,基于自然語言的方法可以被動地學(xué)習(xí)互聯(lián)網(wǎng)上大量文本中包含的監(jiān)督信息。與大多數(shù)無監(jiān)督或自監(jiān)督學(xué)習(xí)方法相比,從自然語言中學(xué)習(xí)還有一個重要優(yōu)勢,即它 "不僅僅 "學(xué)習(xí)一種表征,而且還將該表征與語言聯(lián)系起來,從而實現(xiàn)靈活的零點轉(zhuǎn)移。在下面的小節(jié)中,我們將詳細(xì)介紹我們所采用的具體方法。

2.2. Creating a Sufficiently Large Dataset

現(xiàn)有工作主要使用三個數(shù)據(jù)集:MS-COCO、Visual Genome和 YFCC100M。雖然 MS-COCO 和 Visual Genome 是高質(zhì)量的人群標(biāo)簽數(shù)據(jù)集,但按照現(xiàn)代標(biāo)準(zhǔn),它們的規(guī)模較小,每個數(shù)據(jù)集約有 100,000 張訓(xùn)練照片。相比之下,其他計算機(jī)視覺系統(tǒng)是在多達(dá) 35 億張 Instagram 照片上進(jìn)行訓(xùn)練的。YFCC100M 有 1 億張照片,是一個可能的替代方案,但每張圖片的元數(shù)據(jù)都很稀少,而且質(zhì)量參差不齊。許多圖像使用自動生成的文件名,如 20160716 113957.JPG 作為 “標(biāo)題”,或包含相機(jī)曝光設(shè)置的 “描述”。經(jīng)過過濾,只保留具有自然語言標(biāo)題和/或英文描述的圖片后,數(shù)據(jù)集縮小了 6 倍,只有 1,500 萬張照片。這與 ImageNet 的規(guī)模大致相同。

自然語言監(jiān)督的一個主要動機(jī)是互聯(lián)網(wǎng)上公開的大量此類數(shù)據(jù)。由于現(xiàn)有數(shù)據(jù)集不能充分反映這種可能性,因此僅考慮這些數(shù)據(jù)集的結(jié)果會低估這一研究領(lǐng)域的潛力。為了解決這個問題,我們構(gòu)建了一個新的數(shù)據(jù)集,其中包含從互聯(lián)網(wǎng)上各種公開來源收集的 4 億對(圖像、文本)數(shù)據(jù)。為了盡可能廣泛地涵蓋視覺概念,我們在構(gòu)建過程中搜索了(圖像、文本)對,其文本包括一組 500,000 個查詢中的一個。我們通過在每個查詢中包含多達(dá) 20,000 個(圖片、文本)配對來大致平衡結(jié)果的類別。結(jié)果數(shù)據(jù)集的總字?jǐn)?shù)與用于訓(xùn)練 GPT-2 的 WebText 數(shù)據(jù)集相似。我們將該數(shù)據(jù)集稱為 WIT,代表 WebImageText。

2.3. Selecting an Efficient Pre-Training Method

最先進(jìn)的計算機(jī)視覺系統(tǒng)需要使用大量計算。Mahajan 等人(2018 年)訓(xùn)練他們的 ResNeXt101-32x48d 需要 19 個 GPU 年,Xie 等人(2020 年)訓(xùn)練他們的 Noisy Student EfficientNet-L2 需要 33 個 TPUv3 核年。考慮到這兩個系統(tǒng)都是為了預(yù)測 1000 個 ImageNet 類別而訓(xùn)練的,因此從自然語言中學(xué)習(xí)一組開放的視覺概念似乎是一項艱巨的任務(wù)。在努力的過程中,我們發(fā)現(xiàn)訓(xùn)練效率是成功擴(kuò)展自然語言監(jiān)督的關(guān)鍵,因此我們根據(jù)這一指標(biāo)選擇了最終的預(yù)訓(xùn)練方法。
改變chinese clip的參數(shù),VLM多模態(tài)論文閱讀/源碼解析,論文閱讀,人工智能,多模態(tài),VLM,語言模型,圖像處理

我們最初的方法與 VirTex 類似,從頭開始聯(lián)合訓(xùn)練圖像 CNN 和文本轉(zhuǎn)換器,以預(yù)測圖像的標(biāo)題。然而,我們在有效擴(kuò)展這種方法時遇到了困難。在圖 2 中,我們看到一個 6,300 萬參數(shù)的轉(zhuǎn)換器語言模型(其計算量已是 ResNet-50 圖像編碼器的兩倍)在學(xué)習(xí)識別 ImageNet 類別時,比預(yù)測相同文本的詞袋編碼的簡單基線慢三倍。

這兩種方法都有一個關(guān)鍵的相似之處。由于與圖像同時出現(xiàn)的描述、評論和相關(guān)文本種類繁多,因此這是一項艱巨的任務(wù)。最近在圖像對比性表征學(xué)習(xí)方面的研究發(fā)現(xiàn),對比性目標(biāo)能比同等的預(yù)測性目標(biāo)學(xué)習(xí)到更好的表征。其他研究發(fā)現(xiàn),雖然圖像生成模型可以學(xué)習(xí)高質(zhì)量的圖像表征,但與具有相同性能的對比模型相比,它們所需的計算量要高出一個數(shù)量級。注意到這些發(fā)現(xiàn)后,我們探索訓(xùn)練一個系統(tǒng)來解決可能更容易的代理任務(wù),即只預(yù)測哪個文本作為一個整體與哪個圖像配對,而不預(yù)測該文本的確切單詞。從相同的字袋編碼基線開始,我們將預(yù)測目標(biāo)換成了圖 2 中的對比目標(biāo),并觀察到零鏡頭傳輸?shù)?ImageNet 的效率提高了 4 倍。

改變chinese clip的參數(shù),VLM多模態(tài)論文閱讀/源碼解析,論文閱讀,人工智能,多模態(tài),VLM,語言模型,圖像處理

給定一批 N N N個(圖片、文本)配對,CLIP 經(jīng)過訓(xùn)練可預(yù)測 N × N 個可能的(圖片、文本)配對中哪一個實際出現(xiàn)。為此,CLIP 會學(xué)習(xí)一個具有高點互信息的詞組,以及超過一定搜索量的所有維基百科文章的名稱。通過聯(lián)合訓(xùn)練圖像編碼器和文本編碼器,多模態(tài)嵌入空間將批次中 N 個真實配對的圖像和文本嵌入的余弦相似度最大化,同時將 N 2 ? N N^2 - N N2?N 個錯誤配對的嵌入的余弦相似度最小化。我們在這些相似性得分上優(yōu)化對稱交叉熵?fù)p失。圖 3 中包含了 CLIP 核心實現(xiàn)的偽代碼。據(jù)我們所知,這種批量構(gòu)建技術(shù)和目標(biāo)最早是作為多類 N 對損失(multi-class N-pair loss Sohn,2016 年)引入深度度量學(xué)習(xí)領(lǐng)域的,后來被 Oord 等人(2018 年)作為 InfoNCE 損失推廣到對比性表征學(xué)習(xí)中,最近又被 Zhang 等人(2020 年)調(diào)整用于醫(yī)學(xué)成像領(lǐng)域的對比性(文本、圖像)表征學(xué)習(xí)。

由于我們的預(yù)訓(xùn)練數(shù)據(jù)集規(guī)模很大,因此過擬合不是主要問題,而且與 Zhang 等人(2020 年)的實現(xiàn)相比,CLIP 的訓(xùn)練細(xì)節(jié)也有所簡化。我們從頭開始訓(xùn)練 CLIP,不使用 ImageNet 權(quán)重初始化圖像編碼器,也不使用預(yù)訓(xùn)練權(quán)重初始化文本編碼器。我們不使用表征和對比嵌入空間之間的非線性投影,這一改變由 Bachman 等人(2019)引入,并由 Chen 等人(2020b)推廣。 我們只使用線性投影將每個編碼器的表征映射到多模態(tài)嵌入空間。 我們沒有注意到兩個版本在訓(xùn)練效率上的差異,并推測非線性投影可能只在自監(jiān)督表征學(xué)習(xí)方法中與當(dāng)前圖像的細(xì)節(jié)共同適應(yīng)。我們還刪除了 Zhang 等人(2020)的文本轉(zhuǎn)換函數(shù) tu,因為 CLIP 預(yù)訓(xùn)練數(shù)據(jù)集中的許多(圖像、文本)對都只有一句話。我們還簡化了圖像轉(zhuǎn)換函數(shù) tv。從調(diào)整大小的圖像中隨機(jī)裁剪方形圖像是訓(xùn)練過程中使用的唯一數(shù)據(jù)增強(qiáng)方法。最后,控制 softmax 中對數(shù)范圍的溫度參數(shù) τ 在訓(xùn)練過程中直接優(yōu)化為對數(shù)參數(shù)化的乘法標(biāo)量,以避免變成超參數(shù)。

2.4. Choosing and Scaling a Model

我們?yōu)閳D像編碼器考慮了兩種不同的架構(gòu)。對于第一種,我們使用 ResNet-50(He 等人,2016a)作為圖像編碼器的基礎(chǔ)架構(gòu),因為它被廣泛采用,性能也得到了驗證。我們利用 He 等人(2019)的 ResNetD 改進(jìn)和 Zhang(2019)的反斜矩形-2 模糊池化對原始版本進(jìn)行了幾處修改。我們還用注意力匯集機(jī)制取代了全局平均匯集層。注意力匯集以單層 "變換器式 "多頭 QKV 注意的形式實現(xiàn),其中查詢以圖像的全局平均匯集表示為條件。對于第二種架構(gòu),我們使用最近推出的視覺轉(zhuǎn)換器(ViT)(Dosovitskiy 等人,2020 年)進(jìn)行實驗。我們緊跟他們的實現(xiàn)方法,只做了一些小的修改,即在變換器之前為組合的補(bǔ)丁和位置嵌入添加額外的歸一化層,并使用略有不同的初始化方案。

文本編碼器是一個 Transformer(Vaswani 等人,2017 年),采用了 Radford 等人(2019 年)中描述的架構(gòu)修改。我們使用一個具有 6300 萬個參數(shù)的 12 層 512 寬模型,其中有 8 個注意頭,作為基本尺寸。轉(zhuǎn)換器在文本的小寫字節(jié)對編碼(BPE)表示法上運(yùn)行,詞匯量為 49152 個。為提高計算效率,最大序列長度上限為 76。文本序列用[SOS]和[EOS]標(biāo)記括起來,轉(zhuǎn)換器最高層在[EOS]標(biāo)記處的激活被視為文本的特征表示,該特征表示經(jīng)過層歸一化處理,然后線性投射到多模態(tài)嵌入空間中。在文本編碼器中使用了屏蔽自注意,以保持使用預(yù)訓(xùn)練語言模型進(jìn)行初始化的能力,或?qū)⒄Z言建模作為一個輔助目標(biāo)添加進(jìn)去,不過這方面的探索將作為未來工作的一部分。

以往的計算機(jī)視覺研究通常通過單獨(dú)增加寬度(Mahajan 等人,2018 年)或深度(He 等人,2016 年a)來擴(kuò)展模型,而對于 ResNet 圖像編碼器,我們采用了 Tan & Le(2019 年)的方法,該方法發(fā)現(xiàn)在寬度、深度和分辨率上分配額外計算量的效果優(yōu)于僅在模型的一個維度上分配計算量的效果。Tan 和 Le(2019 年)調(diào)整了 EfficientNet 架構(gòu)中分配給每個維度的計算量比例,而我們則采用了一個簡單的基線,即在增加模型的寬度、深度和分辨率時平均分配額外的計算量。對于文本編碼器,我們只將模型的寬度縮放至與 ResNet 寬度的計算增幅成比例,而完全不縮放深度,因為我們發(fā)現(xiàn) CLIP 的性能對文本編碼器的容量不太敏感。

2.5. Training

我們訓(xùn)練了一系列 5 個 ResNets 和 3 個視覺轉(zhuǎn)換器。 對于 ResNets,我們訓(xùn)練了一個 ResNet-50、一個 ResNet-101,然后又訓(xùn)練了 3 個 ResNet-101,它們遵循 EfficientNet 風(fēng)格的模型縮放,計算量大約是 ResNet-50 的 4 倍、16 倍和 64 倍。它們分別稱為 RN50x4、RN50x16 和 RN50x64。對于視覺轉(zhuǎn)換器,我們訓(xùn)練了 ViT-B/32、ViT-B/16 和 ViT-L/14。我們對所有模型進(jìn)行了 32 次歷時訓(xùn)練。我們使用 Adam 優(yōu)化器(Kingma & Ba,2014 年),對所有非增益或偏置的權(quán)重進(jìn)行解耦權(quán)重衰減正則化,并使用余弦計劃對學(xué)習(xí)率進(jìn)行衰減。在對基線 ResNet- 50 模型進(jìn)行 1 個歷時訓(xùn)練時,采用網(wǎng)格搜索、隨機(jī)搜索和手動調(diào)整相結(jié)合的方法設(shè)置初始超參數(shù)。由于計算上的限制,對于較大的模型,則采用啟發(fā)式調(diào)整超參數(shù)??蓪W(xué)習(xí)的溫度參數(shù)τ被初始化為相當(dāng)于(Wu 等,2018 年)的 0.07,并被剪切以防止對數(shù)縮放超過 100,我們發(fā)現(xiàn)這是防止訓(xùn)練不穩(wěn)定所必需的。我們使用了 32,768 個超大迷你批次,并使用混合精度來加速訓(xùn)練并節(jié)省內(nèi)存。為節(jié)省額外內(nèi)存,使用了梯度檢查點、半精度亞當(dāng)統(tǒng)計(Dhariwal 等人,2020)和半精度隨機(jī)舍入文本編碼器權(quán)重。嵌入相似度的計算也是分片進(jìn)行的,單個 GPU 僅計算其本地批次嵌入所需的成對相似度子集。最大的 ResNet 模型 RN50x64 在 592 個 V100 GPU 上的訓(xùn)練耗時 18 天,而最大的 Vision Transformer 在 256 個 V100 GPU 上的訓(xùn)練耗時 12 天。對于 ViT-L/14,我們還以更高的 336 像素分辨率進(jìn)行了一次額外的預(yù)訓(xùn)練,以提高性能,這與 FixRes 類似。我們將此模型命名為 ViT-L/14@336px。除非另有說明,本文中以 "CLIP "報告的所有結(jié)果都使用了我們認(rèn)為性能最佳的這一模型。

4.2.Chinese-CLIP Paper

Abstract

視覺語言基礎(chǔ)模型的巨大成功推動了計算機(jī)視覺和多模態(tài)表征學(xué)習(xí)的研究和應(yīng)用。在這項工作中,我們提出了中文 CLIP 的兩階段預(yù)訓(xùn)練方法,即第一階段用鎖定圖像調(diào)諧訓(xùn)練模型,第二階段用對比調(diào)諧訓(xùn)練模型。具體而言,我們開發(fā)了 5 個不同規(guī)模的中文 CLIP 模型,參數(shù)從 7,700 萬到 9.58 億個不等,并在收集的大規(guī)模中文圖像-文本對數(shù)據(jù)集上對它們進(jìn)行了預(yù)訓(xùn)練。我們的綜合實驗證明,中文 CLIP 可以在 MUGE、Flickr30K-CN 和 COCO-CN 上的零點學(xué)習(xí)和 ffnetuning 設(shè)置中實現(xiàn)最先進(jìn)的性能,并且根據(jù) ELEVATER 基準(zhǔn)的評估,它能夠在零點圖像分類中實現(xiàn)有競爭力的性能。我們已經(jīng)發(fā)布了我們的代碼、模型和演示 。

1 Introduction

從 NLP 預(yù)訓(xùn)練的興起開始,基礎(chǔ)模型就吸引了多個研究領(lǐng)域的關(guān)注?;A(chǔ)模型從大規(guī)模無監(jiān)督或弱監(jiān)督數(shù)據(jù)中學(xué)習(xí),是下游模型的基礎(chǔ)。多模態(tài)表征學(xué)習(xí)中基礎(chǔ)模型的一個里程碑是 CLIP。與傳統(tǒng)的生成式預(yù)訓(xùn)練不同,CLIP 是一種基于對比學(xué)習(xí)的模型,它是在一個大規(guī)模數(shù)據(jù)集上進(jìn)行預(yù)訓(xùn)練的,該數(shù)據(jù)集包括從網(wǎng)絡(luò)上收集的約 4 億個圖像-文本對數(shù)據(jù)。盡管方法簡單,但 CLIP 不僅在視覺語言檢索方面取得了優(yōu)異的成績,更重要的是,它作為視覺基礎(chǔ)模型,在一系列數(shù)據(jù)集的零鏡頭圖像分類中表現(xiàn)出了最先進(jìn)的性能。CLIP 建立了視覺與語言之間的聯(lián)系,改變了多模態(tài)表征學(xué)習(xí)和計算機(jī)視覺領(lǐng)域的研究。

改變chinese clip的參數(shù),VLM多模態(tài)論文閱讀/源碼解析,論文閱讀,人工智能,多模態(tài),VLM,語言模型,圖像處理

盡管如此,要有效地將跨模態(tài)預(yù)訓(xùn)練模型轉(zhuǎn)移到另一種語言中仍有困難,原因有幾個。首先,學(xué)習(xí)如何對語言原生視覺和語言數(shù)據(jù)的分布進(jìn)行建模對轉(zhuǎn)換至關(guān)重要。雖然 CLIP 在大多數(shù)情況下都是一個強(qiáng)大的基礎(chǔ)模型,但我們發(fā)現(xiàn),帶有機(jī)器翻譯功能的 CLIP 很難在中國本地的跨模態(tài)檢索基準(zhǔn)測試中表現(xiàn)出色。圖 1 顯示了原始 CLIP 和我們的中文 CLIP 在所有模型尺度上的巨大性能差距。我們認(rèn)為,兩個編碼器從語言原生圖像和文本中學(xué)習(xí)是至關(guān)重要的。其次,以前的中文多模態(tài)預(yù)訓(xùn)練方法的性能受到幾個因素的制約。從頭開始預(yù)訓(xùn)練需要收集大規(guī)模的高質(zhì)量語言特定圖像文本對數(shù)據(jù)集,類似于 OpenAI CLIP 的網(wǎng)絡(luò)圖像文本(WIT)。雖然通過 CLIP 初始化和鎖定圖像調(diào)整(Locked-Image Tuning)可以實現(xiàn) CLIP 到中文數(shù)據(jù)的快速轉(zhuǎn)換,但視覺編碼器仍然無法從語言特定域中學(xué)習(xí)圖像信息。

因此,我們提出了中文 CLIP,一個基于公開的中文圖像-文本配對數(shù)據(jù)進(jìn)行預(yù)訓(xùn)練的特定語言視覺語言基礎(chǔ)模型。此外,我們?nèi)匀皇褂门c OpenAI CLIP 相同的架構(gòu)。為了高效地將跨模態(tài)基礎(chǔ)模型移植到中文數(shù)據(jù)中,我們開發(fā)了一種兩階段預(yù)訓(xùn)練方法,該方法也適用于其他視覺語言基礎(chǔ)模型,如 ALIGN、Florence 等。在這項工作中,我們以 CLIP 為例。具體來說,我們首先用預(yù)訓(xùn)練模型初始化兩個編碼器,即 CLIP 的視覺編碼器和 RoBERTa-wwm-Chinese 的文本編碼器(Cui et al.)在第 1 階段,我們凍結(jié)圖像編碼器,僅使用 LiT 優(yōu)化文本編碼器;在第 2 階段,我們使用對比度調(diào)整 2 訓(xùn)練兩個編碼器。這樣,新模型可以通過初始化和 LiT 繼承基礎(chǔ)模型,并通過對比度調(diào)整有效地轉(zhuǎn)移到語言特定數(shù)據(jù)。

我們在3個中文跨模態(tài)檢索數(shù)據(jù)集上評估了中文CLIP,包括MUGE 2、Flickr30K-CN和COCOCN。實驗結(jié)果表明,在零鏡頭學(xué)習(xí)和fInetuning兩種設(shè)置下,大尺寸和超大尺寸中文CLIP在這3個數(shù)據(jù)集上都達(dá)到了最先進(jìn)的性能。此外,我們還在 ELEVATER 基準(zhǔn)的 "野外圖像分類 "賽道上評估了零鏡頭圖像分類的能力。

在分類數(shù)據(jù)集上,與最先進(jìn)的方法相比,中文 CLIP 的性能極具競爭力,并優(yōu)于中文基線。此外,我們還提供了英偉達(dá) TensorRT 和 ONNX 模型用于部署,其推理速度比 Pytorch 模型快 2 到 10 倍。

簡而言之,我們的貢獻(xiàn)在于:

  • 我們提出了中文 CLIP,它是在我們收集的大規(guī)模中文圖像-文本對數(shù)據(jù)上預(yù)訓(xùn)練的 CLIP 的簡單實現(xiàn),我們還提出了一種兩階段預(yù)訓(xùn)練方法,以實現(xiàn)較高的預(yù)訓(xùn)練效率和改進(jìn)的下游性能。
  • 中文 CLIP 在零點學(xué)習(xí)和ffnetuning 設(shè)置下的跨模態(tài)檢索中取得了最先進(jìn)的性能,在零點圖像分類中取得了具有競爭力的性能。

2 Method

基于大規(guī)模弱監(jiān)督數(shù)據(jù)的簡單視覺語言對比預(yù)訓(xùn)練的 CLIP是多模態(tài)表征學(xué)習(xí)的重要基礎(chǔ)模型。它可以直接用于跨模態(tài)檢索,其圖像編碼器可以作為視覺骨干。在這項工作中,我們提出通過在大規(guī)模中文多模態(tài)數(shù)據(jù)上預(yù)訓(xùn)練視覺語言模型來建立語言特定的 CLIP 模型。下面,我們將詳細(xì)介紹中文 CLIP 的方法設(shè)計和實現(xiàn)。

2.1 Data

CLIP 成功的關(guān)鍵之一應(yīng)該是用于預(yù)訓(xùn)練的大規(guī)模數(shù)據(jù)集。根據(jù)CLIP重新實施的實驗,擴(kuò)大數(shù)據(jù)規(guī)模和延長訓(xùn)練過程可以持續(xù)提高模型在零點學(xué)習(xí)中的性能。今年,最新的多模態(tài)預(yù)訓(xùn)練模型悟空和R2D2在一個包含1億對圖像-文本的公共數(shù)據(jù)集和一個包含2.5億樣本的內(nèi)部數(shù)據(jù)集上進(jìn)行了預(yù)訓(xùn)練,其中只發(fā)布了2300萬樣本的子集。為了便于重新實施,我們的目標(biāo)是在盡可能多的公開數(shù)據(jù)上對中文 CLIP 進(jìn)行預(yù)訓(xùn)練,因此我們重點收集高質(zhì)量的公開數(shù)據(jù)集。我們從最新的 LAION-5B中提取中文數(shù)據(jù)(帶 "zh "標(biāo)記),并從悟空數(shù)據(jù)集中收集數(shù)據(jù)。然而,由于鏈接不可用的問題,我們只能分別從 LAION-5B 和悟空中收集到約 1.08 億個樣本和 7200 萬個樣本。此外,我們還添加了經(jīng)典英文多模態(tài)數(shù)據(jù)集的翻譯數(shù)據(jù),包括 Visual Genome和 MSCOCO,其中測試集已被刪除。最后,我們構(gòu)建了一個包含約 2 億個圖像-文本對的中文多模態(tài)預(yù)訓(xùn)練數(shù)據(jù)集。

下面說明了數(shù)據(jù)預(yù)處理的過程。 對于來自 LAION-5B 的部分?jǐn)?shù)據(jù),我們刪除了由 mCLIP計算的 CLIP 分?jǐn)?shù)低于 0.26 的樣本。 此外,我們還刪除了標(biāo)題中包含內(nèi)部黑名單中的詞語的樣本。黑名單中包含與廣告、圖片名稱等相關(guān)的詞語。我們會刪除太短(少于 5 個字符)或太長(超過 50 個字符)的樣本。對于圖片,我們將其大小調(diào)整為:大多數(shù)情況下為 224 × 224,ViT-L/14@336px 為 336 × 336。

2.2 Pretraining Method

中文 CLIP 模型的預(yù)訓(xùn)練有多種設(shè)計方案。最簡單的方法之一應(yīng)該是從頭開始預(yù)訓(xùn)練,即隨機(jī)初始化圖像和文本編碼器。 然而,我們假設(shè)其性能將受到當(dāng)前預(yù)訓(xùn)練數(shù)據(jù)的數(shù)量和質(zhì)量的限制。為了充分利用現(xiàn)有預(yù)訓(xùn)練模型的優(yōu)勢,我們在初始化模型時,圖像編碼器使用了 CLIP正式版本中的預(yù)訓(xùn)練檢查點權(quán)重,文本編碼器使用了 RoBERTa-wwm-ext 和 RBT3為了使模型適應(yīng)引入的預(yù)訓(xùn)練數(shù)據(jù),可以使用 "對比調(diào)諧 "對其進(jìn)行預(yù)訓(xùn)練,這與將 CLIP 轉(zhuǎn)移到下游檢索數(shù)據(jù)的方法類似。與 "對比調(diào)諧 "相比,“鎖定圖像調(diào)諧”(LiT)在下游傳輸中表現(xiàn)出更好的性能。

改變chinese clip的參數(shù),VLM多模態(tài)論文閱讀/源碼解析,論文閱讀,人工智能,多模態(tài),VLM,語言模型,圖像處理

在這項工作中,我們提出了一種兩階段預(yù)訓(xùn)練方法,如圖 2 所示。其核心思想是首先利用 LiT 使文本編碼器從 OpenAI CLIP 的基礎(chǔ)視覺模型中讀出高質(zhì)量的表示然后將整個模型轉(zhuǎn)移到引入的預(yù)訓(xùn)練數(shù)據(jù)域中。僅用 LiT 對中文 CLIP 進(jìn)行預(yù)訓(xùn)練是不夠的,因為圖像編碼器需要學(xué)習(xí)中文數(shù)據(jù)集的圖像信息,并對這些數(shù)據(jù)的分布進(jìn)行建模。在兩階段預(yù)訓(xùn)練之前,我們首先用預(yù)訓(xùn)練的模型對兩個編碼器進(jìn)行初始化。在第一階段,我們通過在預(yù)訓(xùn)練期間凍結(jié)圖像編碼器的參數(shù)來 "鎖定 "圖像編碼器。我們只對文本編碼器進(jìn)行視覺語言對齊的預(yù)訓(xùn)練,這是基于這樣一個假設(shè),即帶有預(yù)訓(xùn)練權(quán)重的視覺骨干已經(jīng)是一個強(qiáng)大的視覺基礎(chǔ)模型。我們對其進(jìn)行預(yù)訓(xùn)練,直到下游任務(wù)的性能沒有明顯改善為止,即使我們延長預(yù)訓(xùn)練的進(jìn)度。 然后,我們切換到第二階段,通過優(yōu)化圖像編碼器來 "解鎖 "圖像編碼器。 在第二階段,我們繼續(xù)進(jìn)行預(yù)訓(xùn)練,不凍結(jié)任何參數(shù),以便圖像編碼器能夠?qū)W習(xí)中文網(wǎng)站圖像數(shù)據(jù)分布的建模。在消融研究中,我們討論了預(yù)訓(xùn)練檢查點的初始化和預(yù)訓(xùn)練方法對下游性能的影響。實驗結(jié)果表明,兩階段預(yù)訓(xùn)練方法的效果優(yōu)于從頭開始預(yù)訓(xùn)練或直接從預(yù)訓(xùn)練模型進(jìn)行調(diào)優(yōu)。文章來源地址http://www.zghlxwxcb.cn/news/detail-839996.html

到了這里,關(guān)于多模態(tài)表征—CLIP及中文版Chinese-CLIP:理論講解、代碼微調(diào)與論文閱讀的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • WordPress語言切換(例如中文版和英文版轉(zhuǎn)換)

    首先打開網(wǎng)站根目錄下的 wp-config.php ,然后搜索 define(\\\'WPLANG\\\' ? 就可以快速定位到語言設(shè)置那里 比如簡體中文版默認(rèn)為: 復(fù)制代碼 代碼如下: define(\\\'WPLANG\\\', \\\'zh_CN\\\'); 如果要改為英文版,只需修改為: 復(fù)制代碼 代碼如下: define(\\\'WPLANG\\\', \\\'\\\'); 需要注意的是 ,WordPress官方英文版不包含

    2023年04月23日
    瀏覽(32)
  • 中文版ChatGPT:智能中文聊天機(jī)器人

    中文版ChatGPT:智能中文聊天機(jī)器人

    2017年,AlphaGo在與世界冠軍柯潔的人機(jī)大戰(zhàn)中獲勝,引發(fā)了人們對人工智能的激烈討論。 如果說,對于AlphaGo,人們更多是圍觀者的角色,而最新的人工智能爆款程序ChatGPT,更多人已經(jīng)參與其中,上線短短兩個月內(nèi),ChatGPT收獲了一億用戶。而且此刻,國內(nèi)版的ChatGPT也已經(jīng)正式

    2024年02月12日
    瀏覽(97)
  • idea中文版插件

    idea中文版插件

    首先點擊左上角的File-Settings 進(jìn)入設(shè)置 進(jìn)入Settings后點擊Plugins,在搜索框輸入Chinese language pack,點擊install安裝插件 下載成功后,點擊installed,找到下載的漢化插件,點擊Restart IDE,重啟應(yīng)用此插件。 重啟后的頁面 如果需要回到英文狀態(tài),只需要來到Plugins,找到已經(jīng)安裝的插

    2024年02月16日
    瀏覽(19)
  • chatgpt 中文版免費(fèi)訪問

    chatgpt 中文版免費(fèi)訪問

    最近 chatgpt 太火了,用起來十分方便。 chatgpt 是一種基于人工智能技術(shù)的語言模型,可以通過分析用戶輸入的自然語言文本或語音,理解用戶的意圖并作出相應(yīng)的回應(yīng)。它被設(shè)計用于各種應(yīng)用場景,例如智能客服、語音助手、智能家居控制、智能醫(yī)療、智能金融等領(lǐng)域。它可

    2024年02月01日
    瀏覽(22)
  • BeeWare官方教程中文版

    BeeWare官方教程中文版

    BeeWare官方教程 中文文檔下載地址 以下內(nèi)容為按照教程在windows平臺測試。 如果你使用Windows系統(tǒng),可以從python官網(wǎng)獲取官方安裝包??梢允褂?.7之后的任何穩(wěn)定版本的Python。建議避免使用阿爾法,貝塔和其他已經(jīng)發(fā)布的候選版本。 在Windows系統(tǒng)上構(gòu)建BeeWare 需要: Git,一種分

    2024年02月05日
    瀏覽(23)
  • ChatGPT 插件清單(中文版)

    整理了一份插件清單,部分插件可能已下線,也可能不在列表中。除了這份清單外,還整理了一份:超級牛逼的學(xué)習(xí)指南 歡迎大家轉(zhuǎn)發(fā)、收藏、點贊支持!謹(jǐn)防失聯(lián)! 插件名稱 功能 基本提示 高級提示 KeyMate.AI搜索 使用AI驅(qū)動的自定義搜索引擎查找網(wǎng)頁 “搜索關(guān)于可再生能

    2024年02月06日
    瀏覽(23)
  • Windows Postman中文版

    Windows Postman中文版

    下載安裝Postman 安裝中文包 下載Postman 最新版本下載 官方下載頁面 下載鏈接:Win64 Win32 歷史版本下載 請把下面鏈接的\\\"版本號\\\"替換為指定的版本號,例如:9.12.2 Windows64位 https://dl.pstmn.io/download/version/版本號/win64 Windows32位 https://dl.pstmn.io/download/version/版本號/win32 下載對應(yīng)版本

    2024年02月14日
    瀏覽(25)
  • Jmeter如何設(shè)置中文版

    Jmeter如何設(shè)置中文版

    第一步:找到 apache-jmeter-5.4.3bin目錄下的?jmeter.properties? 第二步:打開 三,ctr+f 輸入language=en,注釋掉,增加以行修改如下 四,ctr+s 保存修改內(nèi)容,重新打開jmeter就可以了

    2024年02月10日
    瀏覽(16)
  • ChatGPT指令大全(中文版)

    我想讓你扮演講故事的角色。您將想出引人入勝、富有想象力和吸引觀眾的有趣故事。它可以是童話故事、教育故事或任何其他類型的故事,有可能吸引人們的注意力和想象力。根據(jù)目標(biāo)受眾,您可以為講故事環(huán)節(jié)選擇特定的主題或主題,例如,如果是兒童,則可以談?wù)搫游?/p>

    2023年04月11日
    瀏覽(23)
  • RFC4861 中文版下

    路由器常量: 主機(jī)常量: 節(jié)點常量: 在第 4 節(jié)的消息格式中定義了其他協(xié)議常量。 所有協(xié)議常量可能會在未來版本中進(jìn)行更改。 本規(guī)范中的常量可以被描述 IPv6 在不同鏈路層上運(yùn)行的特定文檔所覆蓋。 此規(guī)則允許鄰居發(fā)現(xiàn)在性能特性差異很大的各種鏈路上運(yùn)行。 鄰居發(fā)現(xiàn)受到

    2024年02月03日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包