自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

可解釋性CLIP:架構(gòu)解釋及其在分割中的應用

人工智能
可解釋性是人工智能模型的關(guān)鍵話題之一。最近的復雜人工智能傾向于成為一個黑盒算法,使得人類難以理解人工智能為何提供這些結(jié)果。

可解釋性是人工智能模型的關(guān)鍵話題之一。最近的復雜人工智能傾向于成為一個黑盒算法,使得人類難以理解人工智能為何提供這些結(jié)果。最近,我讀了一篇論文,“通過增強開放詞匯任務的可解釋性進行CLIP手術(shù)”[1],主要關(guān)于CLIP的可解釋技術(shù)。盡管這篇論文展示了CLIP的極佳可解釋性,但很少有博客對此進行解釋。因此,我將在這篇博客中介紹CLIP_Surgery的架構(gòu)及其應用。

快速回顧CLIP

CLIP是由OpenAI[2]開發(fā)的改變游戲規(guī)則的人工智能之一。得益于其獨特的架構(gòu),它能夠進行零樣本圖像分類。架構(gòu)如下所示:

CLIP具有圖像和文本編碼器,用于創(chuàng)建圖像和文本嵌入。訓練數(shù)據(jù)是圖像和文本對,例如帶有文本“一只狗的照片”的狗的圖像。它利用對比預訓練來對齊圖像和文本嵌入,如果圖像和文本是一對,則對齊,如果不是一對則不進行對齊。為了直觀理解,讓我們考慮以下示例。在這個示例中,我們使用三個圖像和文本對(上圖中的N = 3)。

圖像和文本編碼器輸出的嵌入維度始終是(1,512),每個圖像和文本都是如此。在這個示例中,我們有維度為(3,512)的圖像和文本嵌入。使用嵌入的余弦相似度,我們可以計算相似度矩陣,如上圖中的矩陣。在對比預訓練中,CLIP利用這個相似度矩陣來對齊匹配對(=對角線元素)使其相似,而其他對(=其他元素)則變得不相似。具體來說,論文[2]中的偽代碼過程如下:

# 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

計算圖像和文本嵌入的余弦相似度后,它們應用交叉熵損失,使得相似度矩陣中的對角線元素變?yōu)橐?,其他元素變?yōu)榱?。作者稱這種計算為對比損失。CLIP僅通過這種對比損失進行訓練。

對于零樣本分類,過程如下。首先,我們輸入n個候選文本并獲得維度為(n,512)的嵌入。接下來,我們計算目標圖像嵌入和候選文本嵌入之間的相似性。最后,我們可以選擇最相似的候選作為類別。不是很簡單嗎?

這個過程簡單直觀,但我們需要用數(shù)百萬的圖像和文本對以及數(shù)百個GPU來訓練CLIP。從原始論文中,他們使用了非常大的小批量大小32,768,并在592個V100 GPU上訓練了18天。因此,許多公司將這個模型作為基礎模型,而不是從頭開始訓練。

CLIP手術(shù)算法的解釋 

CLIP手術(shù)主要是為了增強CLIP結(jié)果的可解釋性而開發(fā)的。令人驚訝的是,CLIP手術(shù)可以在沒有任何額外訓練的情況下可視化對應標簽的激活圖。由于其良好的激活圖可視化,這種技術(shù)可以應用于“分割任何事物”,這是分割任務的基礎模型。我將在后面的章節(jié)中介紹應用。

作者徹底檢查了注意力層,以實現(xiàn)無需訓練的良好可解釋性。請參見下圖。

左側(cè)顯示了原始CLIP的注意力層,而右側(cè)顯示了CLIP手術(shù)的注意力層。他們明確指出,查詢-鍵自注意力激活了與標簽相對應的相反語義區(qū)域。另一方面,值-值自注意力可以只關(guān)注語義區(qū)域。這是什么意思?下圖顯示了查詢-鍵自注意力和值-值自注意力的激活圖可視化。

如您所見,查詢鍵自注意力除了目標標簽區(qū)域外,還可視化了不相關(guān)的區(qū)域。相反,值-值自注意力可以專注于相應的目標標簽區(qū)域?;趯嶒灒樵?鍵自注意力可能導致特征圖混淆。請注意,這一事實是啟發(fā)式的,并非由數(shù)學定理推導出來。

此外,他們意識到激活圖在所有標簽中具有冗余特征。請參見下圖。

如您所見,冗余區(qū)域在跨標簽的相同位置出現(xiàn)。因此,他們想出了一個主意,即通過移除所有標簽中的共同激活區(qū)域來移除冗余特征。

他們是如何實現(xiàn)的?具體來說,官方實現(xiàn)如下:

# weights to restrain influence of obvious classes on others
# (batch_size, 1, 512) @ (the number of labels, 512).T = (batch_size, 1, the number of labels)
prob = image_features[:, :1, :] @ text_features.t()
# prob has (batch_size, 1, the number of labels)
prob = (prob * 2).softmax(-1)
# w has (batch_size, 1, the number of labels)
w = prob / prob.mean(-1, keepdim=True)

# element-wise multiplied features
# b is batch_size
# n_t is the number of labels
# n_i is the number of tokens (=197)
# c is the feature dimension (=512)
b, n_t, n_i, c = image_features.shape[0], text_features.shape[0], image_features.shape[1], image_features.shape[2]
# feats has (batch_size, n_i, n_t, c)
feats = image_features.reshape(b, n_i, 1, c) * text_features.reshape(1, 1, n_t, c)
feats *= w.reshape(1, 1, n_t, 1)
# redundant_feats has (batch_size, n_i, n_t, c)
redundant_feats = feats.mean(2, keepdim=True) # along cls dim
feats = feats - redundant_feats

# sum the element-wise multiplied features as cosine similarity
# similarity has (batch_size, n_i, n_t)
similarity = feats.sum(-1)

為了更好地演示,我為代碼中的每次計算添加了維度大小轉(zhuǎn)換?,F(xiàn)在,讓我們一步一步地弄清楚。

第一個模塊計算權(quán)重向量,以保持每個類別的影響相等。首先,我們從圖像嵌入中提取類別標記。在變換器架構(gòu)中,類別標記是標記維度中的第一個。請注意,類別標記應該包含有關(guān)所有其他標記的信息(如果您不熟悉視覺變換器,可以參考這篇博客[5])。然后,我們計算余弦相似度并獲得相似度矩陣。接下來,我們將相似度矩陣的值轉(zhuǎn)換為標簽維度上的概率,并獲取權(quán)重矩陣。

在第二個模塊中,我們計算除了冗余特征之外的特征矩陣。首先,我們計算圖像和文本嵌入的逐元素特征矩陣。直觀地說,跨標簽的激活區(qū)域在這張圖中將具有更高的值,如上圖所示。因此,我們可以通過在標簽上計算平均值從特征矩陣中獲得冗余特征。從原始特征矩陣中減去冗余特征后,我們可以獲得純凈的特征矩陣。

在最后一個模塊中,我們通過沿特征維度對特征矩陣求和來獲得相似度矩陣。

對于特征圖可視化,我們需要將相似度矩陣歸一化、重塑和插值到輸入圖像大?。梢陨院髾z查使用附加代碼的實現(xiàn))作為后處理。下圖顯示了CLIP手術(shù)的結(jié)果。

如您所見,它可以捕獲與標簽相對應的語義區(qū)域。您可以感受到這種可視化的強大之處。

到目前為止,我們已經(jīng)看到了CLIP手術(shù)的詳細算法。在最后一節(jié)中,我們將檢查其對現(xiàn)實世界數(shù)據(jù)的能力及其應用。

應用:檢查現(xiàn)實世界數(shù)據(jù)的能力以及為“分割任何事物”提供點 

在最后一節(jié)中,我將指導您了解CLIP手術(shù)在現(xiàn)實世界數(shù)據(jù)和“分割任何事物”(SAM)中的應用。讓我們深入了解它們!

1.環(huán)境設置

作為第一步,您需要設置一個環(huán)境。我使用了ubuntu20.04、cuda11.7和Python3.10環(huán)境。首先,我使用conda創(chuàng)建虛擬環(huán)境。

conda create --name sam python==3.10 -y
conda activate sam
conda install pip
## optional: To avoid install libraries on the local environment, 
## check the which pip will be used to store libraries
which pip
# I use /opt/conda/envs/sam/bin/pip in my enviornment.

接下來,您需要按照官方說明安裝Pytorch和torchvision。您可以安裝與您的環(huán)境相對應的版本。例如,下面的命令是我的案例。

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

然后,您需要使用以下命令安裝SAM存儲庫和模型權(quán)重。

pip install git+https://github.com/facebookresearch/segment-anything.git
wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth

您還需要安裝CLIP手術(shù)存儲庫。

git clone https://github.com/xmed-lab/CLIP_Surgery.git

最后,您需要安裝幾個包。您可以通過pip以“pip install <library>”的格式安裝它們。

tqdm==4.66.5
ftfy==6.2.3
matplotlib
opencv-python
regex

現(xiàn)在,您已經(jīng)完成了環(huán)境設置。

2.CLIP手術(shù)對Flickr30k數(shù)據(jù)集的能力

首先,我想檢查CLIP手術(shù)對現(xiàn)實世界數(shù)據(jù)的能力,使用Flickr30k數(shù)據(jù)集[4]。因此,我將比較CLIP和CLIP手術(shù)激活圖。我稍后會附上使用的代碼。下圖是比較的結(jié)果。

如您所見,原始CLIP無法精確檢測對象,但當對象存在時,CLIP手術(shù)可以檢測與標簽相對應的對象。然而,當對象不存在時,例如貓和植物,CLIP手術(shù)仍然存在問題。這個問題的一個原因是后處理中的最小-最大歸一化。當激活圖中只有不相關(guān)區(qū)域時,最小-最大歸一化可能會增強它們值之間的差異。為了解決這個問題,我們可以在最小-最大歸一化之前簡單地添加一個閾值。在Flickr數(shù)據(jù)集的情況下,相關(guān)區(qū)域值的閾值是0.1以上,這是通過相似度圖的直方圖檢查的。結(jié)果如下所示。

多虧了閾值,我們可以移除不相關(guān)的區(qū)域。閾值可能根據(jù)數(shù)據(jù)集而變化;因此,我們應該使用直方圖檢查并找到該值。

3.為“分割任何事物”提供點

由于激活圖可視化的精確性,CLIP手術(shù)可以應用于“分割任何事物”的點提供器。供您參考,SAM是Meta在2023年開發(fā)的分割基礎模型之一。下圖顯示了架構(gòu)。

SAM的分割能力令人難以置信。然而,它不是通過帶有標簽的分割數(shù)據(jù)集訓練的,所以我們需要在指定對象時提供一些點、邊界框或掩碼。正如您所猜,這些類型的注釋非常耗時。在這里,CLIP手術(shù)幫助我們自動找到點。讓我們看看如何在實際實現(xiàn)中結(jié)合CLIP手術(shù)和SAM。

為了為SAM生成點,我們對激活圖進行下采樣并對值進行排序以選擇相關(guān)區(qū)域。在官方實現(xiàn)中,他們使用維度為(7 x 7)的激活圖來找到最相關(guān)的區(qū)域。當目標對象不存在時也存在問題,所以我稍微修改了原始實現(xiàn),添加了一個閾值。結(jié)果如下所示。

橙色點指的是與標簽相關(guān)的點,而藍色點代表標簽的負點。如您所見,它可以以相當準確的精度檢測目標標簽坐標。請注意,點的準確性來自CLIP的能力。因此,如果CLIP不理解目標,它無法準確提供目標點。我將附上在此應用中使用的Jupyter筆記本。

詳細代碼可以參考鏈接:https://gist.github.com/tanukon/55715b577a32998f3417e7cea268c658#file-clip_surgery_experiment-ipynb

責任編輯:趙寧寧 來源: 小白玩轉(zhuǎn)Python
相關(guān)推薦

2025-01-13 08:13:18

2023-03-07 16:48:54

算法可解釋性

2019-08-29 18:07:51

機器學習人工智能

2024-05-28 08:00:00

人工智能機器學習

2023-05-04 07:23:04

因果推斷貝葉斯因果網(wǎng)絡

2022-06-14 14:48:09

AI圖像GAN

2021-01-08 10:47:07

機器學習模型算法

2024-12-20 08:07:45

2022-04-13 15:10:22

AI決策

2025-03-10 08:34:39

2024-08-05 09:30:00

2021-01-25 21:41:59

人工智能深度學習自動駕駛

2019-11-08 10:17:41

人工智能機器學習技術(shù)

2009-12-07 16:25:13

PHP解釋性模板Php

2020-11-11 12:15:31

AI人工智能可解釋性

2022-02-07 15:49:15

人工智能機器學習技術(shù)

2018-05-23 10:23:18

數(shù)據(jù)系統(tǒng)機器學習

2019-03-28 09:26:26

數(shù)據(jù)科學模型機器學習

2023-10-10 09:31:35

自動駕駛技術(shù)

2023-08-15 10:04:40

點贊
收藏

51CTO技術(shù)棧公眾號