LLM大模型:LLaVa多模態圖片檢索原理

第七子007發表於2024-08-08

  訓練安全垂直領域的LLM,會用到很多著名安全論壇(52pojie\kanxue\xianzhi\freebuf等)、部落格的資料,這些資料100%都有很多圖片(文不如圖嘛,圖片比文字更直觀,更容易表達業務意義),之前微調LLM只能使用文字,圖片只能丟棄,非常可惜,需要利用多模態的技術充分提取圖片資訊!

   1、以前做傳統的資料探勘、機器學習,人為尋找各種資料特徵,然後清洗、歸一化,再透過專門的特徵工程(相關係數、卡方檢驗、資訊增益等)找到明顯的特徵,最後用分類器/迴歸器+顯著特徵一起解決業務問題!深度學習興起後,以前人工手動處理特徵的方式落後啦,可以直接透過DNN、RNN、LSTM等方式提取和轉換特徵,然後使用embedding的形式表示;特徵或embedding的質量,決定了最終任務效果的下限!只要特徵構造的好,最終任務的下限就非常高!對於文字,可以透過transformer的encoder提取特徵,其對應的圖片可以透過CNN等提取特徵,但CNN和transformer明顯是兩個不同的模型,提取的embedding明顯不是一個語義空間的,直接對比兩個embedding明顯屬於驢唇不對馬嘴!此時就需要把這兩個embedding想辦法在新的矩陣空間中儘可能接近,甚至重合,這就叫align vector!圖示如下:單模態的模型分別提取文字、不同圖片、聲音的embedding,然後需要在新空間內做alignment對齊!

  2、既然是alignment,第一步肯定是embedding啦!文字求embedding的方式前面做RAG的時候已經很熟悉了,常見的有M3E、bge等模型,那圖片了?常見的有CNN、VIT等,求出embedding後是怎麼對齊的了?openAI是這麼幹的(https://openai.com/index/clip/) CLIP (Contrastive Language–Image Pre-training):openAI收集了大量(號稱有400Million的圖片-文字對)的文字和圖片配對的資料(當然肯定有匹配錯誤的噪音):

  • text用類似bert的LLM對文字做encoding,得到embedding;同時用CNN或vit對圖片做encoder,得到embedding
  • 每批次取一定數量的資料對(比如2000對),兩方面的embedding分別做dot product,形成2000*2000的矩陣
  • 矩陣對角線的值都是正確匹配的,非對角線都是錯誤匹配,所以對角線的值要比非對角線的值越大越好;具體使用的是noise contrastive estimation loss方法,簡稱 InfoNCE loss;k為類別個數, log 裡面的分母疊加項是包括了分子項的。分子是正例對的相似度,分母是正例對+所有負例對的相似度。最小化 infoNCE loss,就是去最大化分子的同時最小化分母,也就是最大化正例對的相似度,最小化負例對的相似度。

  • 最後一步就是根據loss做back proporgation,分別調整text encoder和Image encoder的引數了

  整個圖示如下:

  訓練完成後,一段text和一張圖片是否匹配了?分別透過text ecndoer和image encoder求出embedding,然後各自求dot product,找到最大的那個即可!這不就是文字檢索圖片麼

 clip模型一旦訓練完成,就具備zero-shot能力了;被整合到其他下游任務中後,本身是不需要再次微調的(訓練資料400Million對,見多識廣啦)

  3、clip已經能圖文互相檢索了,但是還有個缺陷:沒法生成文字,只能根據文字和影像互相檢索!如果進一步要求根據影像生成詳細的文字描述、回答關於影像的複雜問題了?clip就無能為力了!clip可以提供text和image的embedding,僅此而已,要想生成圖片的文字描述,最終還是要依靠transformer的encdoer部分啦,也就是大家理解的GPT!LLaVa的架構如下:

  

  (1)最底層是vision encoder,就是對圖片做encoding,這裡使用的就是clip中的vit模型對Xv image編碼得到Zv!同樣:Xq這種query文字也用clip的text encoder(就是transformer的encoder)編碼

  (2)提取的圖片embedding Zv需要和Xq的embedding對齊,所以這裡額外乘以矩陣W做projection,得到Hv,就和Xq的embedding Hq對齊啦;projector可以是簡單的linear線性變換,也可以是稍微複雜的2層神經網路MLP!MLP因為加入了啟用函式,能擬合更多的非線性特徵,理論上的效果要比linear好,但是計算更復雜!

    

  (3)根據上述得到的Hv和Hq已經可以做圖文檢索了,但是沒法生成text,下一步需要想辦法融合Hv和Hq,經過language model生成text啦!

    • 還記得transformer麼?初衷本是用來做翻譯的,有嚴格的匹配資料,所以有encoder和decoder。encoder的K和decoder的Q相乘,得到權重係數,再對V加權,藉此讓decoder的中間embedding融合encoder的最終輸出。由於這種attention機制的Q和K、V分別來自encoder和decoder,所以叫cross attention!理論上講:pre-train有image和text的配對資料,也可以使用decoder做corss attention的方式吸收Hv和Hq的資訊

      

      剛開始我天真的以為LLaVa會使transformer的decoder架構,用cross attention的方式吸收clip的 image和text資訊後生成text,直到後來看了LLaVa的原始碼後發現是我自己YY了......

    • transformer庫中的LLaVa模型的modeling_llava.py中的 _merge_input_ids_with_image_features 方法定義了text和image的融合方式,先說結論:直接concat

      

      原始碼特意給了註釋:text做tokenize的時候,給image留個位置;這個位置後續用image的embedding來補上!所以整個就是簡單粗暴的首尾拼接!比如下圖:value都是圖片的embedding,就這樣拼接起來!

  (4)網路架構設計完畢,就是pre-train和fine-tune了!最底層是clip,本身是經過400Mlillion配對資料訓練出來的,是“見過大世面”的、具備zero-shot的能力,沒必要調整了!

  • pre-train階段只改projection W,整個網路就能正常使用,適用於通用任務;
  • 對於垂直領域的專用任務,還是要fine-tune的,這是調整就不僅限於projection W了,也要微調Language Model(可以用LoRA減少計算量)

思考總結:

  1、萬物皆可embeddiing:認識怎麼識別物理世界事務的了?本質還是透過事務的各種特徵區分的,所以機器學習和AI最核心的方式也是透過構造好的強特徵去識別事務的,所以不論是傳統的特徵工程feather engineering,還是DNN、LSTM、transformer的encoder,各種複雜的操作最終的目的無一例外都是構造特徵!一旦強特徵構造完成,整個任務已經完成了80%

  2、多模態的核心:不同的單模態都可以把物理世界的客觀事務做embedding,但每個單模態都是在自己的空間做BP,所以多個單模態之間是沒法直接做比對的,每個單模態都需要進一步透過矩陣乘法的方式統一到相同的語義空間後,再使用Constrastive learning、cross attention、concat等方式對齊後,再做各種下游任務 ;

  3、矩陣乘法:本質是把向量轉換到新的空間,下游各種任務(分類、迴歸、相似度等)在新的空間解決

參考:

1、https://www.bilibili.com/video/BV1ff421q7sC/?p=2&spm_id_from=pageDriver&vd_source=241a5bcb1c13e6828e519dd1f78f35b2

2、https://llava-vl.github.io

3、https://www.bilibili.com/video/BV1br421K7zu/?spm_id_from=333.337.search-card.all.click&vd_source=241a5bcb1c13e6828e519dd1f78f35b2 LLaVA為什麼效果好?

4、https://www.bilibili.com/video/BV1nw4m1S7nZ/?spm_id_from=333.337.search-card.all.click&vd_source=241a5bcb1c13e6828e519dd1f78f35b2 LLaVA原始碼解讀

5、https://openai.com/index/clip/

相關文章