天天看點

為什麼Embedding模型在大語言模型中很重要?

作者:騰訊技術工程

作者:kaili

随着大型語言模型的發展,以ChatGPT為首,湧現了諸如ChatPDF、BingGPT、NotionAI等多種多樣的應用。公衆大量地将目光聚焦于生成模型的進展之快,卻少有關注支撐許多大型語言模型應用落地的必不可少的Embedding模型。本文将主要介紹為什麼Embedding模型在大語言模型中十分重要、目前主流的Embedding訓練方法,以及我們關于Embedding模型初步探索的一些思考。

一、Embedding技術簡介及曆史概要

在機器學習和自然語言進行中,Embedding模型是指将高次元的資料(例如文字、圖檔、視訊)映射到低次元空間的過程。簡單來說,embedding向量就是一個N維的實值向量,它将輸入的資料表示成一個連續的數值空間中的點。本文主要關注文本embedding。

為什麼Embedding模型在大語言模型中很重要?

Embedding重要的原因在于它可以表示單詞或者語句的語義。實值向量的embedding可以表示單詞的語義,主要是因為這些embedding向量是根據單詞在語言上下文中的出現模式進行學習的。例如,如果一個單詞在一些上下文中經常與另一個單詞一起出現,那麼這兩個單詞的嵌入向量在向量空間中就會有相似的位置。這意味着它們有相似的含義和語義。

Embedding的概念可以追溯到20世紀中葉,Harris提出了分布式語義理論。到20世紀80年代,人們開始嘗試用神經網絡來學習單詞的embedding表示。自2010年以來,随着深度學習技術的發展,先後出現了以Word2Vec、GloVe、FastText為代表的靜态向量Embedding和使用ELMo、GPT、BERT為代表生成上下文相關的動态向量embedding,後者可以更好地捕捉單詞的語義和上下文資訊。

二、Embedding在大模型中的價值

如前文所述,也是被我們熟知的,embedding向量包含語義資訊,含義越相近的單詞,embedding向量在空間中的位置也越相近。實值向量embedding可以通過從大量的資料中學習單詞的語義和上下文資訊,進而可以進行向量運算和在不同自然語言處理任務中共享和遷移。

然而,這是Embedding之前的價值。在大語言模型時代,Embedding又有什麼新的價值呢?

這要從類ChatGPT模型的缺陷說起。盡管它們能力強大,但目前依然存在以下幾點問題:

  • 訓練資料不實時(如ChatGPT是基于2021年9月之前的資料訓練),重新訓練成本過高,不現實
  • 輸入文本長度有限制,通常限制在幾千到數萬個tokens之間
  • 無法通路不能公開的文檔

對此,OpenAI釋出了一篇文檔,說明如何基于embedding使用兩步搜尋的方式來解決GPT無法處理長文本和最新資料的問題。兩步搜尋,即先搜尋文本庫以查找相關的文本部分,再将檢索到的文本部分添加到類ChatGPT模型的輸入中,擷取回複。

以一個代表性的應用來說明,當我們想讓大模型根據我們給定的pdf文檔進行問題回複時,就可以對超長pdf進行分塊,擷取每個分塊内容的embedding,并使用向量資料庫存儲。接下來,當你提出問題“xxx在文檔中是如何實作的?”時,就可以使用你的問題embedding,去資料庫中檢索得到與問題embedding相似度最高的pdf内容塊embedding。最終把檢索得到的pdf内容塊和問題一起輸入模型,來解決新知識和超長文本輸入的問題。

是以,盡管目前的讨論熱度不高,但embedding模型的探索對于大語言模型的落地是必不可少的。

三、主流Embedding訓練方法

前面提到,OpenAI早已提出了基于Embedding的搜尋方案來解決長文本輸入和最新資料的問題。自然而然,OpenAI也有一套未公開訓練細節的Embedding方案:text-embedding-ada-002。這是OpenAI的二代Embedding模型,僅使用了一個模型就能同時完成三種下遊任務:文本搜尋,文本相似度和代碼搜尋。相較于一代模型分成了五個模型來完成上述三種任務,二代模型簡化為了單一模型,且在中文和英文任務上都表現出較好的性能。

在本章中,我們将梳理一些主流的Embedding訓練方法。近年來,Sentence Embedding的相關工作大多基于BERT-like models。從基于Decoder結構的模型中擷取Embedding,隻有少數的研究和公開代碼。OpenAI所發表的Embedding論文的訓練細節也不甚清楚。是以,在本章中,我們主要梳理基于BERT-like models的Sentence Embedding的一些代表性方法。對于基于Decoder結構模型擷取Embedding的探索的思考,我們将在第四章中進行讨論。

在BERT前時代,一般采用word2vec訓練出的word embedding結合pooling政策進行句向量表征。在BERT時代,人們借助預訓練語言模型的固有優勢,先是采用BERT模型的[CLS]向量作為句向量表征,而後Sentence-BERT又巧妙地使用孿生網絡模型的架構來擷取句向量,後續又相繼出現BERT-Flow、BERT-Whitening、SimCSE、R-Drop、ESimCSE等工作。其中,被大家較為熟知的就是BERT-whitening和SimCSE,之後便有大量的工作以對比學習為主線思路,在構造正負樣本對的資料層面和訓練層面進行了改進。本章節主要對該類方法進行一個簡要概括。

由于近期的Sentence Embedding工作多圍繞對比學習展開,我們首先來回憶一下對比學習的基礎。

對比學習背景

對比學習就是「以拉近相似資料,拉遠不相似資料為目标,有效地學習資料表征」。給定一個pair對樣本集合, 其中和為相似樣本,優化目标一般采用通過in-batch negetives交叉熵損失函數,如下:

為什麼Embedding模型在大語言模型中很重要?

其中,和為和的句向量表示,N為訓練過程中batch的大小,為向量和餘弦相似度,為溫度超參。

經典方法

近年來,自SimCSE橫空出世後,句嵌入領域也引起了一小波研究熱潮。在本小節,我們主要對SimCSE相近時期的三篇工作(SimCSE、ESimCSE、CoSENT)進行了相對詳細的梳理,并簡單總結了後續部分代表工作。

SimCSE

為什麼Embedding模型在大語言模型中很重要?

SimCSE算是句嵌入領域最出圈的工作之一了。

它分為兩個版本:

  • 無監督版本SimCSE:正樣本來自于對同一個句子應用不同的dropout mask所産生的兩個相近的表示,負例則使用in-batch negatives;
  • 有監督版本的SimCSE,則基于NLI資料集構造正負樣本,正例取蘊含關系的句子對,負例取沖突關系的句子對(難負例)和in-batch negatives。

以上就是SimCSE的核心思想,簡單有效,同時很有啟發意義,引領了句嵌入技術後續一波研究熱潮。

ESimCSE

為什麼Embedding模型在大語言模型中很重要?

ESimCSE分别從正負樣本建構的角度對SimCSE進行了改進。

(1)正例對的建構方法:

由于SimCSE是通過調節dropout率建構的正例對,長度是一樣大的,負例則長度不等,這會使得模型傾向于判斷相同或相似長度的句子在表達上更相近。

為了緩解這個問題,ESimCSE選擇在句子中随機重複一些單詞,這可以在改變句子長度的同時,而不改變其語義。

(2)負例對的建構方法:

在對比學習中,理論上負對越多,對之間的比較就越好。ESimCSE也遵從了這一思想,但并沒有直接強硬開大batch size,而是維護了一個隊列,重用前面緊接的mini-batch的編碼嵌入來擴充負對,并使用了動量編碼器。具體做法是:由于排隊句子嵌入來自前面的mini-batch,可以取其參數的移動平均來保持動量更新模型,并利用動量模型生成排隊句子嵌入。當使用動量編碼器時,關閉dropout,來縮小訓練和預測之間的差距。 編碼器的參數和動量更新編碼器的參數進行更新,按以下公式計算:

為什麼Embedding模型在大語言模型中很重要?

為動量系數參數。注意,隻有參數通過反向傳播更新。這裡我們引入來為隊列生成句子嵌入,因為動量更新可以使比進化得更平穩。是以,盡管隊列中的嵌入是由不同的編碼器編碼的(在訓練期間的不同“步驟”中),但這些編碼器之間的差異可以很小。

CoSENT

早期的Sentence-BERT存在訓練、預測不一緻和調優困難的問題。但如果直接優化預測目标cos值,效果往往又特别差。難道直接優化cos值的方案就沒有出頭之日了嗎?

有幸的是,答案是不會。蘇劍林老師提出了一種CoSENT方案,一個優化cos值的損失函數:

記為所有正樣本對集合,為所有負樣本對集合,那麼我們希望對于任意的正樣本對和負樣本對,都有

為什麼Embedding模型在大語言模型中很重要?

其中,是它們各自的句向量。說白了,我們隻希望正樣本對的相似度大于負樣本對的相似度,至于大多少,模型自己決定就好。事實上語義相似度常見的評價名額spearman也是一樣,它隻依賴于預測結果的相對順序,而不依賴于具體的值。

針對這類需求,可以用到Circle Loss理論裡邊的公式作為解決方案:

為什麼Embedding模型在大語言模型中很重要?

簡單來說,就是如果最終希望實作,那麼就往log裡邊加入一項。對應我們這裡的場景,我們可以得到損失函數:

為什麼Embedding模型在大語言模型中很重要?

其中是一個超參數。上述公式本質上是一個為排序設計的損失函數,同樣适用于多分類的資料,寫成更通用的形式:

為什麼Embedding模型在大語言模型中很重要?

也就是說,隻要我們認為樣本對(i,j)的真實相似度應該大于(k,l)的真實相似度,就可以往log裡邊加入;換句話說,隻要我們能夠為樣本對設計順序,就可以使用CoSENT方案。

對于NLI資料而言,它有“蘊含”、“中立”、“沖突”三種标簽,我們自然可以認為兩個“蘊含”的句子相似度大于兩個“中立”的句子,而兩個“中立”的句子相似度大于兩個“沖突”的句子,這樣基于這三種标簽就可以為NLI的句子對排序了。而有了這個排序後,NLI資料也可以用CoSENT來訓練了。類似地,對于STS-B這種本身就是打分的資料,就更适用于CoSENT了,因為打分标簽本身就是排序資訊。

後續部分工作概括

  • SNCSE: Contrastive Learning for Unsupervised Sentence Embedding with Soft Negative Samples
    • 針對模型「無法區分文本相似度和語義相似度,更偏向具有相似文本,而不考慮實際語義差異」的問題,提出了一種「顯式添加否定詞進而生成軟負樣本」結合「雙向邊際損失」的方案。
  • EASE: Entity-Aware Contrastive Learning of Sentence Embedding
    • 強調實體在句向量表征中的重要性。在資料層面,使用正、負實體代替正負樣本。
  • CLAIF:Improving Contrastive Learning of Sentence Embeddings from AI Feedback
    • 針對訓練過程中缺乏細粒度的監督信号, 即沒有考慮到正樣本對之間的相似性差異,引入來自LLM的AI回報,構造具有不同相似度的樣本對,并對這些樣本對給出細粒度的相似度分數作為監督信号,幫助文本表示的學習。

PromptBERT

PromptBERT是句嵌入領域繼SimCSE又一篇經典之作。

這篇工作的核心就是想用Prompt來産生句子表示。作者認為,原生BERT表現不好主要是因為詞語頻率、大小寫、subword等token導緻的bias,而BERT本身各層Transformer都沒有糾正這個問題。通過利用prompt,可以更有效地使用BERT各層中的知識,并且用[MASK]來表示embedding的話,可以避免像以前一樣做各種token的平均,進而避免了token引入的偏差。

為什麼Embedding模型在大語言模型中很重要?

這篇工作方法的核心思路也比較簡單,分為兩步:

  1. 用Prompt的方式生成句子表示,比如[X] means [MASK],[X]是輸入句子,[MASK]是輸出的表示,用這個當句子表示
  2. 用不同的Prompt模版來生成對比學習的角度,繼續采用自監督的方式訓練

Instrcutor Embedding

根據OpenAI的論文《Text and Code Embeddings by Contrastive Pre-Training》的說法,文本相似度和語義檢索是兩個不同的任務,訓練目标可能存在一定沖突。随着訓練進行,如果模型可能在語義搜尋任務上的表現越好,在句子相似度任務上的表現可能就越差。同時,現有的Embedding模型面對新任務和新領域時,性能通常表現不佳。

而我們理想的Embedding顯然應該同時具備多種能力。怎麼能讓Embedding模型同時适應多個任務,并且在新領域上有泛化性呢?

Instrcutor Embedding設計了一種基于指令微調的文本嵌入新方法:在文本輸入之前拼接解釋用例的指令(包含任務和領域資訊)。Instrctor Embedding在訓練期間為330個文本嵌入資料集手工編寫了任務指令,并在 70 個嵌入評估任務(其中 64 個任務在訓練過程中未見)上評估了 INSTRUCTOR,範圍從分類和資訊檢索到語義文本相似性和文本生成評估,整體達到了一個較好的性能。

為什麼Embedding模型在大語言模型中很重要?

四、Embedding相關探索與思考

上一章節梳理了基于BERT-like models的Sentence Embedding的代表工作。其實,對于使用雙向注意力機制的BERT-like models擅長做内容了解類的任務似乎是很合理的。但OpenAI Embedding模型較好的效果和OpenAI 對于Decoder-Only架構模型的堅持程度,以及近半年大模型的迅速發展,讓我們不禁好奇,Decoder-only的大模型有沒有可能在Embedding任務上也給我們一次驚喜?

對此我們進行了一些探索類的嘗試。在摸索的過程中,我們最希望能搞清兩個問題:

  • BERT-like models真的比Decoder-Only架構的模型天然更适合做Embedding任務嗎?
  • 對于Embedding任務而言,模型也是越大越好嗎?

最終,經過我們對于Decoder-only模型padding方式、pooling方式、不同層各向異性程度的探究,最終得到的結論和目前部分公開結論相對一緻。

針對第一個問題,《How Contextual are Contextualized Word Representations? Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings》論文進行了BERT和GPT不同層效果對比的探究實驗,實驗效果如下表:

為什麼Embedding模型在大語言模型中很重要?

根據上表,可以發現:

  • 在不同層上,BERT的效果整體要顯著優于GPT
  • GPT-2 last layer的各向異性比較嚴重,中間層或低層比頂層更适合做similarity任務

針對第二個問題,Instructor Embedding論文也給出了不同參數量模型的效果對比實驗,如下表:

為什麼Embedding模型在大語言模型中很重要?

根據上表,可以發現:

  • 相比335M的GTR_LARGE模型,參數量數十倍的4.8B的GTR-XXL模型性能并無顯著上升。
  • Decoder-Only架構的5.8B的SGPT-NLI模型不敵相近參數量的Encoder-Only架構的4.8B的GTR-XXL模型。

綜上,結合我們的實驗,初步結論是:

  • 模型參數量角度:在Embedding任務上,模型參數量提升并不一定能帶來效果的提升。
  • 模型結構角度:根據目前的實驗結果,雙向注意力的BERT-like models确實效果比單向注意力的Decoder-only結構更佳。

當然,由于OpenAI并未公布他們Embedding方案的技術細節,或許我們還沒有擷取使用GPT來做Embedding的正确打開方式。也歡迎感興趣的同學進一步讨論~

參考文獻

  • SimCSE: Simple Contrastive Learning of Sentence Embeddings
  • ESimCSE: Enhanced Sample Building Method for Contrastive Learning of Unsupervised Sentence Embedding
  • SNCSE: Contrastive Learning for Unsupervised Sentence Embedding with Soft Negative Samples
  • EASE: Entity-Aware Contrastive Learning of Sentence Embedding
  • PromptBERT: Improving BERT Sentence Embeddings with Prompts
  • Improving Contrastive Learning of Sentence Embeddings from AI Feedback
  • Text and Code Embeddings by Contrastive Pre-Training
  • One Embedder, Any Task: Instruction-Finetuned Text Embeddings
  • 蘇劍林. (Jan. 06, 2022). 《CoSENT(一):比Sentence-BERT更有效的句向量方案 》[Blog post]. Retrieved from https://kexue.fm/archives/8847
  • How Contextual are Contextualized Word Representations? Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings
  • SGPT: GPT Sentence Embeddings for Semantic Search

繼續閱讀