【深度學習】深刻理解多模態模型CLIP

CLIP(Contrastive Language-Image Pretraining) 是由 OpenAI 提出的一個多模態模型,旨在學習視覺和語言的聯合表示,能夠通過圖像和文本之間的對比學習來實現圖像和文本之間的緊密聯系。CLIP 模型可以通過自然語言描述理解和處理圖像,解決了傳統視覺模型無法直接處理文本描述的問題。它將視覺信息和語言信息結合在一個共享的潛在空間中,使得模型能夠進行跨模態的檢索、生成和理解。

論文原文:Learning Transferable Visual Models From Natural Language Supervision

1. CLIP模型結構

????????CLIP 的關鍵思想是通過訓練兩個編碼器(圖像和文本編碼器)使得相對應的圖像和文本在同一潛在空間中盡可能接近,而不相關的圖像和文本盡可能遠離。文本經過Text Encoder得到文本的向量表示,圖片經過Image Encoder得到圖片的向量表示,分別通過線性投射層,投射到共同的多模態線性空間里,即一個共享的公共子空間,在這個線性空間里面, 通過對比學習的方法,最大化正確圖像-文本對在該子空間內的相似度,并最小化錯誤圖像-文本對的相似度,從而優化出一個能夠有效捕捉跨模態語義關系的公共子空間。拉近配對文本的圖片和向量,而讓不配對的文本和圖片向量盡可能地遠。CLIP 是一個基于對比學習的框架,通常包括以下兩部分:

  • 圖像編碼器(Image Encoder):圖像編碼器通常使用卷積神經網絡(CNN)或視覺Transformer(ViT)作為基礎網絡架構,負責提取圖像的特征表示。圖像編碼器的輸出是圖像的潛在空間表示。
  • 文本編碼器(Text Encoder):文本編碼器通常使用Transformer架構,負責將文本(如描述圖像的自然語言)轉換為相應的潛在表示。文本編碼器的輸出是文本的潛在空間表示。

????????CLIP 一個最重要的能力就是可以實現 zero-shot 分類,在之前的分類模型中(如ResNet),訓練1000個類別,預測就是這1000個類別的概率,無法拓展,新增類別還得重新訓練重新標注太麻煩了。CLIP就把圖像數據做成預訓練模型,直接實現零樣本分類,有新的類別來了,也不需要進行再次訓練,利用文本的監督信號訓練一個遷移能力強的視覺模型。具體步驟如下:

  • 加載模型和準備數據:加載預訓練的 CLIP 模型的圖像和文本特征編碼器,準備要分類的圖像和自然語言描述的類別標簽,如 A photo of a {object}(將其中的 object 替換成所有的類別標簽,如 dog)。
  • 編碼圖像和文本:使用 CLIP 模型的圖像和文本特征編碼器將圖像和標簽文本編碼為向量。
  • 計算相似度并分類:計算圖像向量與所有標簽文本嵌入之間的余弦相似度,選擇相似度最高的標簽作為結果。

?2. 訓練過程

????????CLIP 的訓練目標是最大化圖像和文本對之間的相似性,同時最小化不相關的圖像和文本對之間的相似性。為了實現這一目標,CLIP使用了對比損失(Contrastive Loss),具體來說,它通過以下方式進行訓練:

  • 對于每一對圖像和文本(例如,圖像及其描述,利用prompt進行零樣本訓練),CLIP模型計算圖像編碼器和文本編碼器輸出的向量之間的余弦相似度。
  • 在訓練過程中,CLIP通過最大化正確圖像和文本對之間的相似性(即正確圖像和其描述的文本)來優化模型。
  • 訓練時,CLIP將來自不同圖像和文本的相似度進行對比,確保相似的圖像-文本對在潛在空間中接近,而不相關的圖像-文本對則被拉遠。

? ? ? ? 假設一個批次中有64個文本圖像對,此時我們會同時獲得64個圖片和64個文本,首先我們從64個文本圖像對中取出一個文本圖像對,成對的文本圖像對是天然的正樣本,它們是配對的。而對于這個樣本的文本來講,其它63個圖像都為負樣本,它們是不配對的;而對于這個樣本的圖像來講,其它63個文本都為負樣本,它們是不配對的。在這個批次中,64個文本圖像對,可以獲得的圖像embedding和文本embedding為:

visual_embedding ?? ?[64, embedding_size]
text_embedding?? ??? ?[64, embedding_size]

????????我們使用visual_embedding 叉乘 text_embedding,得到一個[64, 64]的矩陣,那么對角線上的值便是成對特征內積得到的,如果visual_embedding和對應的text_embedding越相似,那么它的值便越大。我們選取[64, 64]矩陣中的第一行,代表第1個圖片與64個文本的相似程度,其中第1個文本是正樣本,我們將這一行的標簽設置為1,那么我們就可以使用交叉熵進行訓練,盡量把第1個圖片和第一個文本的內積變得更大,那么它們就越相似。每一行都做同樣的工作,那么[64, 64]的矩陣,它的標簽就是[1,2,3,4,5,6……,64],在計算機中,標簽從0開始,所以實際標簽為[0,1,2,3,4,5……,63]。這樣的一種學習方式也是一種無監督學習方法——對比學習,通過構造正負樣本對來學習數據的有效表示。正樣本對是圖像和它的文本描述,而負樣本對是任意不相關的圖像和文本。模型通過計算圖像和文本的相似性來訓練,學習如何將視覺和語言信息映射到一個共同的潛在空間中。

? ? ? ? 在CLIP模型訓練,batchsize設置為32768,由于CLIP的數據量足夠大,圖片編碼器和文本編碼器都沒有進行預訓練,圖片唯一做的數據增強就是隨即裁剪。

3. 模型推理過程?

????????CLIP在圖像分類中并不依賴固定的標簽集,而是可以接受任意文字描述作為標簽,從而實現開放標簽分類。模型可以根據輸入的文本描述對圖像進行分類,這在現實應用中更具靈活性,也更符合人類的推理習慣。在推理時,首先輸入一句話進行文本encoder編碼,然后把文本embedding之后進行圖片映射。

????????給定一張圖片,如何利用預訓練好的網絡去做分類呢?給網絡一堆分類標簽,比如cat, dog, bird,利用文本編碼器得到向量表示。然后分別計算這些標簽與圖片的余弦相似度;最終相似度最高的標簽即是預測的分類結果。但相比于單純地給定分類標簽,給定一個句子的分類效果更好,這也就是prompt engineering,如一種句子模板?A photo of a ...,后面填入分類標簽。這種句子模板叫做提示prompt。預訓練時模型看到的大多是句子,如果在推理時突然變成單詞,效果肯定會下降。

? ? ? ? 在推理過程中,從前的分類網絡類別數量是固定的,最后一層是跟著 softmax 的全連接層進行不同類別的概率預測;如果要更改類別數量,就要更換最后一層,并且預測的內容是固定的,不能超過訓練集的類別范圍。但對于 CLIP 來說,提供給網絡的分類標簽不僅數量不固定,內容也是自由的。如果提供兩個標簽,那就是一個二分類;如果提供1000個標簽,那就是1000分類問題。標簽內容可以是常規的分類標簽,也可以是一些冷門的分類標簽,擺脫了事先定好的分類標簽

????????CLIP 在 16 個數據集上優于 ResNet50,但在衛星圖像分類、淋巴轉移檢測和合成場景計數等復雜任務中表現較差。這表明 CLIP 預訓練的特征編碼器并不能在所有任務中都表現出色,特別是在與訓練數據分布差異較大的領域仍有明顯不足。

總結

CLIP 是一個非常強大的多模態學習模型,通過對比學習方法將圖像和文本映射到一個共享的潛在空間中,能夠在無需特定訓練的情況下進行跨模態檢索、生成和理解。其跨領域的能力使得它在許多視覺和語言任務中都能表現出色,具有廣泛的應用前景。

參考資料:

大模型技術之 CLIP (Contrastive Language-Image Pre-training) 簡介 - 知乎?

多模態模型學習1——CLIP對比學習 語言-圖像預訓練模型_clip模型-CSDN博客

多模態模型之CLIP詳解 - 知乎

跟李沐讀論文系列——CLIP - 知乎

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62685.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62685.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62685.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 聊天界面鍵盤、表情切換絲滑

1、我們在聊天頁面時候,往往會遇到,鍵盤、表情、其他選擇切換時候頁面會出現掉下來再彈起問題,這是因為,我們切換時候,鍵盤異步導致內容View高度變化,頁面掉下來后,又被其他內容頂起這種很差視覺…

Nginx 緩存系統 proxy_cache詳解

系列文章目錄 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 例如:第一章 Python 機器學習入門之pandas的使用 提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目…

mysql時間戳格式化yyyy-mm-dd

格式化到 年月日 # 將時間換成列名就行;當前是秒級時間戳,如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

PDFMathTranslate,PDF多語言翻譯,批量處理,學術論文,雙語對照(WIN/MAC)

分享一個非常實用的PDF文檔翻譯項目——PDFMathTranslate。作為一個經常逛GitHub的開發者,我總喜歡翻看各種項目附帶的論文,雖然大多時候是瞎研究,但卻樂在其中。該項目能夠完美保留公式、圖表、目錄和注釋,對于需要閱讀外文文獻的…

網絡藥理學:(待更)Alphafold3和批量分子動力學模擬(Desmond、AutoMD)

批量動力學模擬 注意全都需要在類linux平臺上進行 安裝Desmond模塊: https://github.com/Wang-Lin-boop/Schrodinger-Script 安裝AutoMD模塊: Wang-Lin-boop/CADD-Scripts: Scripts for virtual screening, cross docking and protein relax using Sc…

爬蟲基礎之代理的基本原理

在做爬蟲的過程中經常會遇到一種情況,就是爬蟲最初是正常運行、正常抓取數據的,一切看起來都是那么美好,然而一杯茶的工夫就出現了錯誤,例如 403 Forbidden,這時打開網頁一看,可能會看到“您的IP訪問頻率太…

第十七屆山東省職業院校技能大賽 中職組“網絡安全”賽項資源任務書樣題③

第十七屆山東省職業院校技能大賽 中職組“網絡安全”賽項資源任務書樣題③ 模塊A 基礎設施設置與安全加固(200分)A-1 登錄安全加固(Windows, Linux)A-2 Nginx安全策略(Linux)A-3日志監控(Windows)A-4中間件…

鯤鵬麒麟安裝Kafka-v1.1.1

因項目需要在鯤鵬麒麟服務器上安裝Kafka v1.1.1,因此這里將安裝配置過程記錄下來。 環境說明 # 查看系統相關詳細信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

群控系統服務端開發模式-應用開發-登錄退出發送郵件

一、登錄成功發送郵件 在根目錄下app文件夾下controller文件夾下common文件夾下&#xff0c;修改Login.php&#xff0c;代碼如下 <?php /*** 登錄退出操作* User: 龍哥三年風水* Date: 2024/10/29* Time: 15:53*/ namespace app\controller\common; use app\controller\Em…

[游戲開發] Unity中使用FlatBuffer

什么是FlatBuffer 官網&#xff1a; GitHub - google/flatbuffers: FlatBuffers: Memory Efficient Serialization LibraryFlatBuffers: Memory Efficient Serialization Library - google/flatbuffershttps://github.com/google/flatbuffers 為什么用FloatBuffer&#xff0c…

MySQL其一,概念學習,可視化軟件安裝以及增刪改查語句

目錄 MySQL 1、數據庫的概念 2、數據庫分類 3、MySQL的安裝 4、安裝過程中的問題 DataGrip的使用&#xff1a; SQLynx的使用&#xff1a; 5、編寫SQL語句 6、DDL語句 7、DML 新增數據&#xff1a; 刪除數據&#xff1a; 修改數據&#xff1a; MySQL SQL其實是一門…

05 在 Linux 使用 AXI DMA

DMA簡介 DMA 是一種采用硬件實現存儲器與存儲器之間或存儲器與外設之間直接進行高速數據傳輸的技術&#xff0c;傳輸過程無需 CPU 參與&#xff08;但是CPU需要提前配置傳輸規則&#xff09;&#xff0c;可以大大減輕 CPU 的負擔。 DMA 存儲傳輸的過程如下&#xff1a; CPU 向…

linux 安裝 vsftpd 服務以及配置全攻略,vsftpd 虛擬多用戶多目錄配置,為每個用戶配置不同的使用權限

linux 安裝 vsftpd 服務以及配置全攻略&#xff0c;vsftpd 虛擬多用戶多目錄配置&#xff0c;為每個用戶配置不同的使用權限。 linux 安裝 vsftpd 服務以及配置全攻略 FTP 是 File Transfer Protocol 的簡稱&#xff0c;用于 Internet 上的控制文件的雙向傳輸。同時&#xff0…

SQL語句在MySQL中如何執行

MySQL的基礎架構 首先就是客戶端&#xff0c;其次Server服務層&#xff0c;大多數MySQL的核心服務都在這一層&#xff0c;包括連接、分析、優化、緩存以及所有的內置函數&#xff08;時間、日期、加密函數&#xff09;&#xff0c;所有跨存儲引擎功能都在這一層實現&#xff1…

ragflow連不上ollama的解決方案

由于前期wsl默認裝在C盤&#xff0c;后期部署好RagFlow后C盤爆紅&#xff0c;在連接ollama的時候一直在轉圈圈&#xff0c;問其他人沒有遇到這種情況&#xff0c;猜測是因為內存不足無法加載模型導致&#xff0c;今天重新在E盤安裝wsl 使用wsl裝Ubuntu Win11 wsl-安裝教程 如…

力扣-漢明距離

1.兩個整數之間的 漢明距離 指的是這兩個數字對應二進制位不同的位置的數目。 給你兩個整數 x 和 y&#xff0c;計算并返回它們之間的漢明距離。 看到這題&#xff0c;當然想到了按位異或^,并且c內置了計算二進制數中1數量的函數__builtin_popcount() class Solution { publ…

關于成功插入 SQLite 但沒有數據的問題

背景 技術棧&#xff1a;SpringBoot Mybatis-flex SQLite 項目中集成了SQLite&#xff0c;配置如下&#xff1a; spring:datasource:url: jdbc:sqlite::resource:db/project.dbdriver-class-name: org.sqlite.JDBC在進行測試時&#xff0c;使用Mybatis-flex往表中插入數據&…

C#常見錯誤—空對象錯誤

System.NullReferenceException&#xff1a;未將對象引用設置到對象的實例 在C#編程中&#xff0c;System.NullReferenceException是一個常見的運行時異常&#xff0c;其錯誤信息“未將對象引用設置到對象的實例”意味著代碼試圖訪問一個未被初始化或已被設置為null的對象的成…

沁恒CH32V208藍牙串口透傳例程:修改透傳的串口;UART-CH32V208-APP代碼分析;APP-CH32V208-UART代碼分析

從事嵌入式單片機的工作算是符合我個人興趣愛好的,當面對一個新的芯片我即想把芯片盡快搞懂完成項目賺錢,也想著能夠把自己遇到的坑和注意事項記錄下來,即方便自己后面查閱也可以分享給大家,這是一種沖動,但是這個或許并不是原廠希望的,盡管這樣有可能會犧牲一些時間也有哪天原…

Scala的隱式對象

Scala中&#xff0c;隱式對象&#xff08;implicit object&#xff09;是一種特殊的對象&#xff0c;它可以使得其成員&#xff08;如方法和值&#xff09;在特定的上下文中自動可用&#xff0c;而無需顯式地傳遞它們。隱式對象通常與隱式參數和隱式轉換一起使用&#xff0c;以…