【NLP】对比学习——文本匹配(二)
文章目錄
- d. SimCSE:2021.04
- Unsupervised
- Supervised
- e. R-Drop(Supervised):2021.06
- f. ESimCSE(Unsupervised):2021.09
- g. PromptBERT(Unsupervised):2022.01
- h. SNCSE(Unsupervised):2022.01
- i. DiffCSE(Unsupervised):2022.04
- 總結
《 文本匹配(一)》中主要講解了對比學習的原理和幾種基于 Bert 的方式獲取句子向量,例如 BERT-flow和 BERT-whitening 等,對預訓練 Bert 的輸出進行變換從而得到更好的句子向量。本篇將通過 ①構造目標函數 ②構建正負例 的對比學習方法訓練模型,取得SOTA的效果。
d. SimCSE:2021.04
SimCSE是有大神陳丹琦發表的《Simple Contrastive Learning of Sentence Embeddings》,確實簡單高效。
SimCSE包含無監督(圖左部分)和有監督(圖右部分)兩種方法。實線箭頭代表正例,虛線代表負例。
Unsupervised
創新點在于使用Dropout對文本增加噪音。
- 正例構造:利用Bert的隨機Dropout,同一文本經過兩次Bert enconder得到不同的句向量構成相似文本。
- 負例構造:同一個Batch中的其他樣本作為負例被隨機采樣。
- 損失函數:li=?logesim(hizi,hizi′)/τ∑j=1Nesim(hizi,hjzj′)/τl_i=-log\;\frac{e^{sim(h_i^{z_i},h_i^{z'_i})/\tau}}{\sum_{j=1}^Ne^{sim(h_i^{z_i},h_j^{z'_j})/\tau}}li?=?log∑j=1N?esim(hizi??,hjzj′??)/τesim(hizi??,hizi′??)/τ?
- 實驗表明該種方式比其他數據增強方式要好:
可能的原因是,在源頭上對輸入的原始詞,做增刪改查,離最后的輸出太遠,而Dropout基本是在最后階段,效果會更直接一些。
Supervised
- 正例:標注數據
- 負例:同Batch內的其他樣本
- 損失函數:?logesim(hi,hi+)/τ∑j=1N(esim(hi,hj+)/τ+esim(hi,hj?)/τ)-log\;\frac{e^{sim(h_i,h_i^+)/\tau}}{\sum_{j=1}^N(e^{sim(h_i,h_j^+)/\tau}+e^{sim(h_i,h_j^-)/\tau})}?log∑j=1N?(esim(hi?,hj+?)/τ+esim(hi?,hj??)/τ)esim(hi?,hi+?)/τ?
e. R-Drop(Supervised):2021.06
Dropout雖然可以防止模型訓練中的過擬合并增強魯棒性,但是其操作在一定程度上會使訓練后的模型成為一種多個子模型的組合約束。SimCSE就是希望Dropout對模型結果不會有太大影響,也就是模型輸出對Dropout是魯棒的。所以,“Dropout兩次”這種思想是可以推廣到一般任務的,這就是R-Drop(Regularized Dropout),由微軟亞洲研究院和蘇州大學提出的更加簡單有效的正則方法。
- R-Drop與傳統作用于神經元或模型參數的約束方法不同,而是作用于輸出層,彌補了Dropout在訓練和測試時的不一致性。在每個mini-batch中,每個數據樣本過兩次帶有Dropout的同一個模型,R-Drop再使用KL-divergence(KL散度)約束兩次的輸出一致。所以,R-Drop約束了由于Dropout帶來的兩個隨機子模型的輸出一致性。
- R- Drop只是簡單增加了一個KL-散度損失函數項,并沒有其他任何改動。雖然該方法看起來很簡單,但在NLP和CV的任務中,都取得了非常不錯的SOTA結果。
- 同樣的輸入,同樣的模型,經過兩個 Dropout 得到的將是兩個不同的分布,近似將這兩個路徑網絡看作兩個不同的模型網絡。基于此,這兩個不同的模型產生的不同分布分別為P1(y∣x)P_1(y|x)P1?(y∣x)和P2(y∣x)P_2(y|x)P2?(y∣x)。而這篇文章的主要貢獻就是在訓練過程中不斷拉低這兩個分布之間的KL 散度。由于KL 散度本身具有不對稱性,作者通過交換這兩種分布的位置以間接使用整體對稱的KL 散度,稱之為雙向KL 散度。
- 損失函數:
普通分類問題,訓練集為D={(xi,yi)}i=1nD=\{(x_i,y_i)\}^n_{i=1}D={(xi?,yi?)}i=1n?,模型為Pω(yi∣xi)P^\omega(y_i|x_i)Pω(yi?∣xi?),則loss一般為最小化交叉熵:Lnll=1n∑i=1n?logPω(yi∣xi)L_{nll}=\frac{1}{n}\sum^n_{i=1}-log\;P^\omega(y_i|x_i)Lnll?=n1?i=1∑n??logPω(yi?∣xi?)
Dropout兩次,樣本已經有了兩個略微不同的模型,這時候的loss分為兩部分,一是常規的交叉熵:Lnlli=?logP1ω(yi∣xi)?logP2ω(yi∣xi)L_{nll}^i=-log\;P^\omega_1(y_i|x_i)-log\;P^\omega_2(y_i|x_i)Lnlli?=?logP1ω?(yi?∣xi?)?logP2ω?(yi?∣xi?)
另一部分為兩個模型之間的對稱KL散度,希望不同Dropout的模型輸出盡可能一致:LKLi=12(DKL(P1ω(yi∣xi)∣∣P2ω(yi∣xi))+DKL(P2ω(yi∣xi)∣∣P1ω(yi∣xi)))L^i_{KL}=\frac{1}{2}(D_{KL}(P^\omega_1(y_i|x_i)||P^\omega_2(y_i|x_i))+D_{KL}(P^\omega_2(y_i|x_i)||P^\omega_1(y_i|x_i)))LKLi?=21?(DKL?(P1ω?(yi?∣xi?)∣∣P2ω?(yi?∣xi?))+DKL?(P2ω?(yi?∣xi?)∣∣P1ω?(yi?∣xi?)))
則最終的loss為:Li=Lnlli+α?LKLIL^i=L^i_{nll}+\alpha\cdot L^I_{KL}Li=Lnlli?+α?LKLI?也就是說在常規交叉熵的基礎上,加了一項強化模型魯棒性正則項。
f. ESimCSE(Unsupervised):2021.09
- SimCSE構建正負例時存在兩個兩個缺點:
①構造正例長度相等,導致模型預測時存在偏差,長度相等的文本會傾向預測相似度高。
②對比學習理論上負例越多,對之間模型學習的越好,但增大Batch會受到性能的限制。 - ESimCSE針對以上問題做了相應的改進:
- 正例構造:通過引入噪聲較小的“單詞重復”方式改變正例的長度,設置重復率dup_rate,確定dup_len后利用均勻分布隨機選取dup_len子詞進行重復。
dup_len∈[0,max(2,int(dup_len?N))]dup\_len\in[0,max(2,int(dup\_len*N))]dup_len∈[0,max(2,int(dup_len?N))]dup_set=uniform(range=[1,N],num=dup_len)dup\_set=uniform(range=[1,N],num=dup\_len)dup_set=uniform(range=[1,N],num=dup_len) - 負例構造:為了更有效的擴展負對,同時不降低性能,通過維護一個隊列,重用前面緊接的mini-batch的編碼嵌入來擴展負對:
①將當前mini-batch的句嵌入放入隊列,同時將“最老的”句子踢出隊列。由于排隊句子嵌入來自前面的mini-batch,通過取其參數的移動平均來保持動量更新模型,并利用動量模型生成排隊句子嵌入。
②在使用動量編碼器時,關閉了dropout,這可以縮小訓練和預測之間的差距。θ←λθm+(1?λ)θe,θm為動量更新編碼器參數,θe為編碼器參數,λ∈[0,1)為動量系數參數,只有編碼器參數通過反向傳播更新,由于動量更新,盡管兩個編碼器編碼不同步,差異很小\theta\leftarrow\lambda\theta_m+(1-\lambda)\theta_e,\\\scriptsize \theta_m為動量更新編碼器參數,\theta_e為編碼器參數, \lambda\in[0,1)為動量系數參數,只有編碼器參數通過反向傳播\\更新, 由于動量更新,盡管兩個編碼器編碼不同步,差異很小θ←λθm?+(1?λ)θe?,θm?為動量更新編碼器參數,θe?為編碼器參數,λ∈[0,1)為動量系數參數,只有編碼器參數通過反向傳播更新,由于動量更新,盡管兩個編碼器編碼不同步,差異很小 - 損失函數:li=?logesim(hi,hi+)/τ∑j=1Nesim(hi,hj+)/τ+∑m=1Mesim(hi,hm+)/τl_i=-log\frac{e^{sim(h_i,h_i^+)/\tau}}{\sum^N_{j=1}e^{sim(h_i,h_j^+)/\tau}+\sum^M_{m=1}e^{sim(h_i,h_m^+)/\tau}}li?=?log∑j=1N?esim(hi?,hj+?)/τ+∑m=1M?esim(hi?,hm+?)/τesim(hi?,hi+?)/τ?
- 效果對比:
g. PromptBERT(Unsupervised):2022.01
Prompt Learning比較火熱,號稱NLP的第四范式,今天我們先從文本表征切入來認識Prompt+對比學習——PromptBERT
- 作者發現BERT在語義相似度方面表現不好,主要由:static token embeddings biases和ineffective layers,而不是high cosine similarity of the sentence embedding。static token embedding是在bert結構中,輸入進block前,通過embedding layer產生的結果,這里強調是靜態的embedding,就是embedding metrics中每個token都唯一對應的embedding,是不隨句子環境而變化的。至于ineffective layers就很好理解了,就是bert中堆疊的block結構,比如bert-base中的12層。作者認為這些結構,對語義相似度的表征這個方面是無效的。
- Anisotropy(各向異性):上篇我們已經提到,詞向量是有維度的,每個維度上基向量單位向量長度不一樣,就是各向異性的。這會造成計算向量相似度的時候產生偏差。如何度量Anisotropy:1n2?n∣∑i∑j≠icos(M(si),M(sj))∣,si為所有句子的集合,M表示sentenceembedding方法\frac{1}{n^2-n}|\sum_i\sum_{j\neq i}cos(M(s_i),M(s_j))|,\\\small s_i為所有句子的集合,M表示sentence embedding方法n2?n1?∣i∑?j=i∑?cos(M(si?),M(sj?))∣,si?為所有句子的集合,M表示sentenceembedding方法任意兩兩計算cos similarity,越接近1,則越more anisotropy。
- 作者分析了造成embedding bias的原因,除了token frequency是造成bias的原因,作者又提出了:subwords,case sentitive。
圖中不同詞頻token的分布情況,顏色越深代表詞頻越高,我們可以看出詞頻高的token,分布比較緊湊,詞頻低的token,分布較分散。作者輸出這個圖像還有一個目的是他提出各向異性(anisotropy)和偏差(bias)是不相關的,各向異性不是導致偏差的原因。
Embedding bias意思是映射分布被一些不相關的信息所干擾,是可以用降維的方式去可視化的。
各向異性意思是整體向量都被映射在了一個“狹窄”的高維空間,這一點是無法用降維的方式去可視化的。
如果按照之前其他論文作者的結論,roberta是不具備各向異性的,所以不應該會產生bias,但結合下面的表格來看,三種模型的embedding都有bias,所以這樣也可以證明anisotropy≠bias\textbf {anisotropy} \neq \textbf{bias}anisotropy=bias。
- 為了消除bias對模型performance的影響,作者用了四種人工方法移除bias,分別為:①分別除去一定量高頻詞,②subwords,③uppercase tokens和④標點。結果是效果都有提升,說明這些確實是產生bias的原因。不過這種人工去除的方法也有一定局限性,做長文本任務時可以使用,短文本時無法使用,因為文本本身就過短,移除的話會損失大量meaningful的信息。
- Prompt+contrastive
將prompt和constrasive應用到表征句向量中,主要從兩個問題入手:①如何用prompt表征句子 ②怎樣選擇合適的prompt表征句向量。
第一種方法是用[MASK]對應位置的hidden state去代表sentence embedding:h=h[MASK]輸入為[text]mean[MASK],輸出[MASK]對應最后一層的hiddenstateh=h_{[MASK]}\\\small 輸入為[text]\;mean\;[MASK],輸出[MASK]對應最后一層的hidden\;stateh=h[MASK]?輸入為[text]mean[MASK],輸出[MASK]對應最后一層的hiddenstate
第二種方法和其他prompt task一樣,選取由h[mask]輸出的top-k tokens,將第一種方法的輸出映射到詞表維度,選概率最大的k個結果,取其概率和對應的static token embedding,相乘進行加權平均:h=∑v∈Vtop?kWvP([MASK]=v∣h[MASK])∑v∈Vtop?kP([MASK]=v∣h[MASK])h=\frac{\sum_{v\in V_{top-k}}W_vP([MASK]=v|h_{[MASK]})}{\sum_{v\in V_{top-k}}P([MASK]=v|h_{[MASK]})}h=∑v∈Vtop?k??P([MASK]=v∣h[MASK]?)∑v∈Vtop?k??Wv?P([MASK]=v∣h[MASK]?)?兩種方法比較,第二種是較傳統的做法,但是缺點也很明顯:
①我們利用到了static token embedding,就會受到bias的影響;②加權平均會讓bert在下游任務上很難去fine-tune。作者選用第一種方式來表征句向量。 - Prompt search
論文介紹了三種構建prompt的方法:①人工構建,②用T5生成,③OptiPrompt
人工構建就是人工嘗試不同的prompt templates,不同的prompt templates對結果的影響還是很大的,其中prefix tokens的整體效果是優于relationship tokens的。
另一種方式就是利用T5去生成prompt templates,這種方法生成的效果是比人工構建的效果要好的。
最后的一種方法是OptiPrompt,將離散的template替換成連續的template,然后在連續的空間內去優化prompt。 - 正例構造:
用不同的templates去表征同一個句子,就像從不同的view去提取句子embedding,得到的結果互為正例。但這樣做問題是,得到的句向量中是包含了template的信息的,所以要去做一個denoise的操作。
具體做法:
對一個句子,先用兩個template去表征這個句向量,可以得到 hih_ihi? 和 hi′h'_ihi′? ,然后為了denoise掉template的信息,將這兩個template單獨的輸入進bert,但是輸入時需要調整position id,加上句子的長度,確保使用和原來一樣的position id,然后可以得到h^i\hat{h}_ih^i?和h^i′\hat{h}'_ih^i′?,再用剛才得到的結果減去這個結果,得到的 hi?h^ih_i-\hat{h}_ihi??h^i? 和 hi′?h^’ih'_i-\hat{h}’_ihi′??h^’i? 互為正例。 - 損失函數:li=?logecos(hi?h^i,hi′?h^i′)/τ∑j=1Necos(hi?h^i,hj′?h^j′)/τl_i=-log\frac{e^{cos(h_i-\hat{h}_i,h'_i-\hat{h}'_i)/\tau}}{\sum^N_{j=1}e^{cos(h_i-\hat{h}_i,h'_j-\hat{h}'_j)/\tau}}li?=?log∑j=1N?ecos(hi??h^i?,hj′??h^j′?)/τecos(hi??h^i?,hi′??h^i′?)/τ?
h. SNCSE(Unsupervised):2022.01
- SNCSE同樣是由微軟團隊提出,主要是針對以上方法存在的問題:當前對比學習的數據增強方式,獲取的正樣本都極為相似,導致模型存在特征抑制,即模型不能區分文本相似度和語義相似度,并更偏向具有相似文本,而不考慮它們之間的實際語義差異。
為了減輕特征抑制,該論文提出了通過軟負樣本結合雙向邊際損失的無監督句子嵌入對比學習方法。其中,軟負樣本,即具有高度相似,但與原始樣本在語義上存在明顯的差異的樣本。雙向邊際損失,即通過擴大原始樣本與正例和原始樣本與軟負例之間的距離,使模型更好地學習到句子之間的語義差別。 - 軟負樣本構造:為原文本添加顯示的否定詞。
在獲取句子表征時,受PromptBERT啟發,通過三種模板表示原樣本、正樣本和軟負樣本:Thesentence:“X”means[MASK].Thesentenceof“X+”means[MASK].Thesentenceof“X#”means[MASK].[mask]的隱藏狀態作為輸出向量The\;sentence:“X”\;means\;[MASK].\\The\;sentence\;of\; “X^+”\;means\;[MASK].\\The\;sentence\;of\;“X^\#”\;means[MASK].\\\small [mask]的隱藏狀態作為輸出向量Thesentence:“X”means[MASK].Thesentenceof“X+”means[MASK].Thesentenceof“X#”means[MASK].[mask]的隱藏狀態作為輸出向量 - 損失函數:
利用InfoNCE損失來區分正負例LInfoNCE=?logecos_sim(hi,hi+)/τ∑j=1Necos_sim(hi,hj+)/τL_{InfoNCE}=-log\frac{e^{cos\_sim(h_i,h_i^+)/\tau}}{\sum^N_{j=1}e^{cos\_sim(h_i,h_j^+)/\tau}}LInfoNCE?=?log∑j=1N?ecos_sim(hi?,hj+?)/τecos_sim(hi?,hi+?)/τ?計算原樣本和正樣本、原樣本和軟負樣本的余弦相似度之差Δ=cos_sim(hi,hi#)?cos_sim(hi,hi+)\Delta=cos\_sim(h_i,h_i^\#)-cos\_sim(h_i,h_i^+)Δ=cos_sim(hi?,hi#?)?cos_sim(hi?,hi+?)定義雙向邊際損失(bidirectional margin loss,BML)來模擬語義相似度差異LBML=ReLU(Δ+α)+ReLU(?Δ?β)L_{BML}=ReLU(\Delta+\alpha)+ReLU(-\Delta-\beta)LBML?=ReLU(Δ+α)+ReLU(?Δ?β)BML損失的目標是將Δ\DeltaΔ限制在[?β,?α][-\beta,-\alpha][?β,?α]內,α\alphaα和β\betaβ分別表示正例和軟負例語義相似度的上、下差異,總損失為InfoNCE損失和雙向邊際損失的加權求和:LSNCSE=LInfoNCE+λLBMLL_{SNCSE}=L_{InfoNCE}+\lambda L_{BML}LSNCSE?=LInfoNCE?+λLBML?
i. DiffCSE(Unsupervised):2022.04
結合句子間差異的無監督句子嵌入對比學習方法——DiffCSE主要還是在SimCSE上進行優化(可見SimCSE的重要性),通過ELECTRA模型的生成偽造樣本和RTD(Replaced Token Detection)任務,來學習原始句子與偽造句子之間的差異,以提高句向量表征模型的效果。
- 其思想同樣來自于CV領域(采用不變對比學習和可變對比學習相結合的方法可以提高圖像表征的效果)。作者提出使用基于dropout masks機制的增強作為不敏感轉換學習對比學習損失和基于MLM語言模型進行詞語替換的方法作為敏感轉換學習「原始句子與編輯句子」之間的差異,共同優化句向量表征。
- 圖左為標準的SimCSE模型,給定句子xxx,SimCSE通過Dropout構造正例x+x^+x+,使用BERT編碼器fff獲得句向量h=f(x)h=f(x)h=f(x)。
圖右為帶條件的句子差異預測模型,即ELECTRA,包含生成器和判別器。給定長度T的句子x=[x1,x2,...,xT]x=[x_1,x_2,...,x_T]x=[x1?,x2?,...,xT?],生成的隨機掩碼序列m=[m1,m2,...,mT],mt∈[0,1]m=[m_1,m_2,...,m_T],m_t\in[0,1]m=[m1?,m2?,...,mT?],mt?∈[0,1]。使用MLM預訓練語言模型作為生成器G,通過掩碼序列x′\textbf{x}'x′來生成句子中被掩掉的token,獲取生成序列x′′\textbf{x}''x′′。然后使用判別器D進行替換token檢測,也就是預測哪些token是被替換的。 - 損失函數:LRTDx=∑t=1T(?1(xt′′=xt)logD(x′′,h,t)?1(xt′′≠xt)log(1?D(x′′,h,t)))L_{RTD}^x=\sum^T_{t=1}(-1(x''_t=x_t)logD(x'',h,t)-1(x''_t\neq x_t)log(1-D(x'',h,t)))LRTDx?=t=1∑T?(?1(xt′′?=xt?)logD(x′′,h,t)?1(xt′′?=xt?)log(1?D(x′′,h,t)))同一個batch的訓練目標為LRTD=∑i=1NLRTDxiL_{RTD}=\sum^N_{i=1}L_{RTD}^{x_i}LRTD?=∑i=1N?LRTDxi??。
最終將SimCSE的Contrastive Loss和RTD Loss結合:L=Lcontrast+λLRTDL=L_{contrast}+\lambda L_{RTD}L=Lcontrast?+λLRTD?為了使判別器D的損失可以傳播的編碼器f中,將句向量拼接到判別器D的輸入中,輔助進行RTD任務,這樣做可以鼓勵編碼器f使信息量足夠大,從而使判別器D能夠區分和之間的微小差別。
當訓練DiffCSE模型時,固定生成器G參數,只有句子編碼器f和判別器D得到優化。訓練結束后,丟棄鑒別器D,只使用句子編碼器f提取句子嵌入對下游任務進行評價。 - 在SimCSE模型中,采用pooler層(一個帶有tanh激活函數的全連接層)作為句子向量輸出。該論文發現,采用帶有BN的兩層pooler效果更為突出,BN在SimCSE模型上依然有效。
①對于掩碼概率,經實驗發現,在掩碼概率為30%時,模型效果最優。
②針對兩個損失之間的權重值,經實驗發現,對比學習損失為RTD損失200倍時,模型效果最優。
總結
本篇主要拆析了SimCSE以來幾種比較重要的文本增強式的對比學習算法,按時間順序,理論上應該是距離越近的算法效果越好,但使用時,還是要結合具體的業務場景,算法沒有好壞,還是用看怎么用。對于有些內容,可能敘述的不是很細致或是需要一定的知識鋪墊,感興趣的同學可以針對性的研讀論文和輔助其他資料。當然,算法層出不窮,更新很快,后續出現比較重要的對比學習算法,我也會更新,也歡迎各位交流討論。
?
?
?
?
?
?
?
?
參考文獻:
》https://www.msra.cn/zh-cn/news/features/r-drop
》https://blog.csdn.net/shawroad88/article/details/125190802
》https://blog.csdn.net/lc_love_ty/article/details/125233876
總結
以上是生活随笔為你收集整理的【NLP】对比学习——文本匹配(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win2003 php5.2.17,wi
- 下一篇: java的副语言_英语副语言的交际功能及