再說到語義標簽之前在博文[1,2]中曾經(jīng)簡單地介紹過語義標簽(semantic label)與多模態(tài)模型之間的一些關(guān)系,為了對這個話題有著更全面的了解,請讀者先移步[1,2]對語義標簽進行簡單了解。在[1]的最后,我們談到
這些任務(wù)都是需要很高層次的語義標注才能實現(xiàn)的。通常來說,此時人工標注能做到的就是給定一個圖片,讓多個人以相近的標準去進行描述,然后形成圖文對<image, text#1, text#2...text#n>,讓模型進行學(xué)習(xí)
作為語義標簽中最為切實可行的方案,對圖片進行文字描述(caption)是可行的,而且互聯(lián)網(wǎng)上也存在著海量這樣的數(shù)據(jù)。通常來說,這類型的數(shù)據(jù)如Fig 1.1所示。
Fig 1.1 圖片-文本對的形式的多模態(tài)數(shù)據(jù)集,常用于進行預(yù)訓(xùn)練。通常對于一張圖片,會有一個以上的文本描述。
在CLIP[3]這篇工作中,作者提出了對比圖文預(yù)訓(xùn)練 (Contrastive Language-Image Pretraining)方法對從網(wǎng)絡(luò)中收集到的4億(400M)條圖文對進行預(yù)訓(xùn)練,因此這個工作也是采用語義標簽對模型進行預(yù)訓(xùn)練的經(jīng)典例子。在這個過程中,值得注意的是作者團隊采用了巨大的batch size,一個batch size竟達到了32,768,當(dāng)然這也需要巨量的算力資源。這種“大力出奇跡”的做法,使得CLIP模型的zero-shot能力驚人地出色,在眾多數(shù)據(jù)集中甚至超過了采用全監(jiān)督的SOTA方法。我們接下來的篇幅主要看看CLIP的模型設(shè)計,訓(xùn)練策略以及最主要的,作者團隊在論文中的實驗結(jié)果和分析。
對比圖文預(yù)訓(xùn)練 CLIPCLIP的模型結(jié)構(gòu)并沒有特別多值得注意的地方,其采用的是經(jīng)典的雙塔結(jié)構(gòu),對于圖片域和文本域有著不同的圖片編碼器(Image Encoder)和文本編碼器(Text Encoder)。其中文本編碼器采用了經(jīng)典的Transformer結(jié)構(gòu)[4],而圖片編碼器則采用了兩種:第一種是改進后的ResNet,作者選擇用基于注意力的池化層去替代ResNet的全局池化層,此處的注意力機制同樣是與Transformer類似的多頭QKV注意力;作者同樣采用ViT結(jié)構(gòu)[5]作為第二種圖片編碼器進行實驗。本文用表示文本編碼器,
表示圖片編碼器,
表示一個batch的圖片,而
表示一個batch的文本,那么有:
通過線性映射層將圖片特征和文本特征
都映射到相同的嵌入特征維度
? ,那么有:
為了保證數(shù)值尺度的一致性,對其進行L2標準化,即是:
那么有:
Fig 2.1 CLIP的負樣本采樣,采用了in-batch負采樣的方法。其CLIP模型也是經(jīng)典的雙塔結(jié)構(gòu)。此時如Fig 2.1所示,對圖片嵌入特征和文本嵌入特征進行矩陣相乘。那么形成的打分矩陣上,對角線上都是配對的正樣本對打分,而矩陣的其他元素,則是由同個batch內(nèi)的圖片和不配對的文本(相反亦然)組成的負樣本。這種策略可以形成個負樣本。整個過程可以用公式(2.5)描述。
而后只需要對的每一行和每一列求交叉熵損失,并且加和起來即形成了總損失了。其中每一行可以視為是同個圖片,與同個batch內(nèi)其他所有樣本對的文本進行組合構(gòu)成的負樣本對形成的損失,而每一列自然就是同個文本,對于每個圖片進行組合而構(gòu)成的損失了。整個過程如下面的偽代碼所示。
# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter
# extract feature representations of each modality
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
# joint multimodal embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
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(logits, labels, axis=1)
loss = (loss_i + loss_t)/2
CLIP的模型結(jié)構(gòu)和正負樣本組成策略并不復(fù)雜,其負樣本構(gòu)成方式是經(jīng)典的batch negative方式,也即是從batch內(nèi)部去構(gòu)成負樣本,而CLIP的貢獻點在于采用了海量的圖文對數(shù)據(jù)和超大batch size進行預(yù)訓(xùn)練,并不在于其模型結(jié)構(gòu)。我們看一下CLIP是如何去進行zero-shot任務(wù)的。如Fig 2.2所示,考慮到大部分的數(shù)據(jù)集的標簽都是以單詞的形式存在的,比如“bird”,“cat”等等,然而在預(yù)訓(xùn)練階段的文本描述大多都是某個短句,為了填補這種數(shù)據(jù)分布上的差別,作者考慮用“指示上下文”(guide context)對標簽進行擴展。以Fig 2.2為例子,可以用a photo of a <LABEL>.作為文本端的輸入,其中的<LABEL>恰恰是需要預(yù)測的zero-shot標簽。
Fig 2.2 將CLIP應(yīng)用到zero-shot中,需要文本端采用“指示上下文”的形式。
考慮到以單詞作為標簽存在多義的情況,比如在Oxford-IIIT Pet dataset 數(shù)據(jù)集中boxer表示斗牛犬,而在其他數(shù)據(jù)集中則可能表示拳擊運動;在ImageNet中,crane同時表示了起重機和鶴。這種詞語的多義顯然對是因為缺少對標簽的上下文描述導(dǎo)致的。為了解決這種問題,作者在指示上下文中添加了一些提示標簽類型的詞語,比如A photo of a <LABEL>, a type of pet.。作者將這個方法稱之為“prompt engineering”。在合適地選取了不同的指示上下文,并且將其打分進行ensemble之后。作者發(fā)現(xiàn)這些Tricks竟能在zero-shot實驗上提高5個絕對百分位,如Fig 2.3所示。
Fig 2.3 采用了prompt engineering和ensemble之后,可以在zero-shot指標上提高5個絕對百分位。
這個說明了通過指示上下文,提供標簽的上下文信息可以有效地提高zero-shot效果。在zero-shot這塊,作者也做了充足的實驗。首先作者通過和經(jīng)過強監(jiān)督學(xué)習(xí)的Resnet-50提取的特征對比,任務(wù)都是分類任務(wù),因此作者基于Resnet-50和CLIP提取出的特征,只是訓(xùn)練了最后的分類器,分類結(jié)果如Fig 2.4所示??梢园l(fā)現(xiàn)僅僅通過無監(jiān)督的對比學(xué)習(xí)預(yù)訓(xùn)練得到的特征,即便是和強監(jiān)督模型特征相比也是不分伯仲的。同時可以發(fā)現(xiàn),zero-shot CLIP在一些動作識別任務(wù)中,比如Kinetics 700,UCF 101中有著比較大的提高,作者認為這可能是因為目前的文本描述中有很多以動詞,動作為中心的句子導(dǎo)致的。
Fig 2.4 CLIP的zero-shot性能,與Resnet-50的特征進行對比。
作者同樣將CLIP應(yīng)用在了few-shot中,如Fig 2.5所示,橫坐標是few-shot中的X-ways,指的是用多少有標注的樣本進行Linear Probe的分類器訓(xùn)練(這個過程中僅僅采用了預(yù)訓(xùn)練模型的特征,而線性分類器需要重新訓(xùn)練)。從圖中可以發(fā)現(xiàn)zero-shot CLIP大概相當(dāng)于 4-ways few-shot CLIP的結(jié)果,而顯然的,Linear Probe CLIP比其他few-shot基線模型有著更為優(yōu)秀而穩(wěn)定的表現(xiàn),領(lǐng)先了有10多個絕對百分點。這個實驗同時也揭露了zero-shot和few-shot的區(qū)別,在監(jiān)督學(xué)習(xí)中模型需要基于標簽學(xué)習(xí)出相同類別樣本的共同特征,不同類樣本的差別,因此通常都需要更多的標注數(shù)據(jù)才能達到較理想的效果。如果沒有太多的標注數(shù)據(jù)提供類別的上下文信息,那么性能可能比zero-shot還差。而且,從預(yù)訓(xùn)練中學(xué)習(xí)到的概念可能是很通用的,比如一張圖中可能有很多視覺實體,如果不提供一定的標注去聲明任務(wù)需要注意的視覺實體,那么就無法完成任務(wù)。而zero-shot由于是直接學(xué)習(xí)概念,并且和概念進行對比,似乎就不會存在這個問題。
Fig 2.5 few-shot CLIP與其他few-shot基線模型的對別。
筆者的個人啟示基于雙塔結(jié)構(gòu)的CLIP模型在數(shù)據(jù)量足夠的情況下,可以在預(yù)訓(xùn)練階段學(xué)習(xí)到很多通用的視覺語義概念,并且給下游任務(wù)提供非常大的幫助。受限于端到端的方式,目前的負樣本數(shù)量仍然是受限于mini batch size的大小,在MoCo中給出了一個可行的解決方案[6,7]。這種預(yù)訓(xùn)練方式能在大規(guī)模的商業(yè)搜索,推薦廣告系統(tǒng)中廣泛應(yīng)用,值得我們研究。
Reference
[1]. https://fesian.blog.csdn.net/article/details/114958239
[2]. https://fesian.blog.csdn.net/article/details/118256321
[3]. Radford, A., Kim, J. W., Hallacy, C., Ramesh, A., Goh, G., Agarwal, S., … & Sutskever, I. (2021). Learning transferable visual models from natural language supervision. arXiv preprint arXiv:2103.00020.
[4]. Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones,L., Gomez, A. N., Kaiser, ?., and Polosukhin, I. Attention is all you need. In Advances in neural information processing systems, pp. 5998–6008, 2017
[5]. Dosovitskiy, Alexey, Lucas Beyer, Alexander Kolesnikov, Dirk Weissenborn, Xiaohua Zhai, Thomas Unterthiner, Mostafa Dehghani et al. “An image is worth 16x16 words: Transformers for image recognition at scale.” arXiv preprint arXiv:2010.11929 (2020).
[6]. https://fesian.blog.csdn.net/article/details/119515146
[7]. He, K., Fan, H., Wu, Y., Xie, S., & Girshick, R. (2020). Momentum contrast for unsupervised visual representation learning. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 9729-9738).