谷歌最強NLP模型BERT,為何炫酷又強大?騰訊程序員給你從頭講起
一、背景介紹
搜索場景下用戶搜索的 query 和召回文章標(biāo)題(title)的相關(guān)性對提升用戶的搜索體驗有很大幫助。query-title 分檔任務(wù)要求針對 query 和 title 按文本相關(guān)性進行 5 個檔位的分類(1~5 檔),各檔位從需求滿足及語義匹配這兩方面對 query-doc 的相關(guān)度進行衡量,檔位越大表示相關(guān)性越高,如 1 檔表示文本和語義完全不相關(guān),而 5 檔表示文本和語義高度相關(guān),完全符合 query 的需求。
我們嘗試將 Bert 模型應(yīng)用在 query-title 分檔任務(wù)上,將 query 和 title 作為句對輸入到 bert 中,取最后一層 cls 向量用做 5 分類(如上圖),最后得到的結(jié)果比 LSTM-Attention 交互式匹配模型要好。雖然知道了 bert能解決這個問題,我們更好奇的是"??ô":為什么 bert 的表現(xiàn)能這么好?這里面有沒有可解釋的部分呢?
因為 Multi-head-attention 是 bert 的主要組成部分,所以我們從"頭"入手,希望弄清楚各個 head 對 bert 模型有什么作用。為了研究某個 head 對模型的影響,我們需要比較有這個 head 和沒有這個 head 模型的前后表現(xiàn)。這里定義一下 HEAD-MASK 操作,其實就是針對某個 head,直接將這個 head 的 attention 值置成 0,這樣對于任何輸入這個 head 都只能輸出 0 向量。
通過 HEAD-MASK 操作對各個 head 進行對比實驗,發(fā)現(xiàn)了下面幾個有趣的點
attention-head 很冗余/魯棒,去掉 20%的 head 模型不受影響 各層 transformer 之間不是串行關(guān)系,去掉一整層 attention-head 對下層影響不大 各個 head 有固定的功能 某些 head 負責(zé)分詞 某些 head 提取語序關(guān)系 某些 head 負責(zé)提取 query-title 之間 term 匹配關(guān)系
下面我們開始實驗正文,看看這些結(jié)論是怎么得到的
二、Bert 模型 Attention-Head 實驗
attention-head 是 bert 的基本組成模塊,本次實驗想要研究各個 head 都對模型作出了什么貢獻。通過 Mask 掉某個 head,對比模型前后表現(xiàn)的差異來研究這個 head 對模型有什么樣的作用(對訓(xùn)練好的 bert 做 head-mask,不重新訓(xùn)練,對比測試集的表現(xiàn))。
bert-base 模型共 12 層每層有 12 個 head,下面實驗各個 head 提取的特征是否有明顯的模式(Bert 模型為在 query-title 數(shù)據(jù)上 finetune 好的中文字模型)
2.1 Attention-Head 比較冗余
標(biāo)準(zhǔn)大小的 bert 一共有 12*12 共 144 個 head.我們嘗試對訓(xùn)練好的 bert 模型,隨機 mask 掉一定比例的 head,再在測試數(shù)據(jù)集上測試分檔的準(zhǔn)確率(五分類)。
下圖的柱狀圖的數(shù)值表示相比于 bseline(也就是不做任何 head-mask)模型 acc 的相對提升,如+1%表示比 baseline 模型的 acc 相對提高了 1%,從下面的圖可以看到,隨機 mask 掉低于 20%的 head,在測試數(shù)據(jù)集上模型的 acc 不會降低,甚至當(dāng) mask 掉 10%的 head 的時候模型表現(xiàn)比不做 head mask 的時候還提升了 1%。當(dāng) mask 掉超過一定數(shù)量的 head 后,模型表現(xiàn)持續(xù)下降,mask 掉越多表現(xiàn)越差。
同時為了弄清楚底層和高層的 transformer 哪個對于 query-title 分類更加的重要,分別對底層(layer0 ~ layer5 )和高層(layer6~layer11)的 head 做 mask, 去掉的 head 比例控制在 0~50%(占總 head 數(shù)量)之間,50%表示去掉了底層或者是高層 100%的 head 下面的圖很清晰的說明了底層和高層的 attention-head 關(guān)系,橙色部分表示只 mask 掉高層(6 - 11 層)的 head,藍色部分表示只 mask 掉底層(0 - 5 層)的 head。
顯然高層的 attention-head 非常的依賴底層的 head,底層的 attention-head 負責(zé)提取輸入文本的各種特征,而高層的 attention 負責(zé)將這些特征結(jié)合起來。具體表現(xiàn)在當(dāng) mask 掉底層(0~5 層)的 80%的 head(圖中橫坐標(biāo)為 40%)和 mask 掉底層的 100%的 head(圖中橫坐標(biāo)為 50%)時,模型在測試數(shù)據(jù)集上表現(xiàn)下降劇烈(圖中藍色部分),說明了去掉大部分的底層 head 后只依賴高層的 head 是不行的,高層的 head 并沒有提取輸入的特征。相反去掉大部分高層的 head 后模型下降的并沒有那么劇烈(圖中橙色部分),說明了底層的 head 提取到了很多對于本任務(wù)有用的輸入特征,這部分特征通過殘差連接可以直接傳導(dǎo)到最后一層用做分類。
這個結(jié)論后面也可以用于指導(dǎo)模型蒸餾,實驗結(jié)果表明底層的 transformer 比高層的 transformer 更加的重要,顯然我們在蒸餾模型時需要保留更多的底層的 head
那么對于模型來說是否有某些層的 head 特別能影響 query-title 分類呢?假設(shè)將 bert 中所有的 attention-head 看做一個 12*12 的方陣,下面是按行 mask 掉一整行 head 后模型在測試數(shù)據(jù)上的表現(xiàn),柱狀圖上的數(shù)值表示相比 baseline 模型的相對提升。
可以看到 mask 掉第 5 層~第 9 層的 head 都模型都有比較大的正面提升,特別是當(dāng)去掉整個第 8 層的 attention-head 的時候測試數(shù)據(jù)準(zhǔn)確率相對提升了 2.3%,從上圖可以得到兩個結(jié)論:
Bert 模型非常的健壯或者是冗余度很高 Bert 模型各層之間不是串行依賴的關(guān)系,信息并不是通過一層一層 transformer 層來傳遞的
bert 模型非常的健壯或者是冗余度很高,直接去掉一整層的 attention-head 并不會對模型的最終表現(xiàn)有太大的影響。 直接去掉整層的 attention-head 模型表現(xiàn)并沒有大幅度的下降,說明各層提取的特征信息并不是一層一層的串行傳遞到分類器的,而是通過殘差連接直接傳導(dǎo)到對應(yīng)的層。
2.2 某些 head 負責(zé)判斷詞的邊界(使得字模型帶有分詞信息)
在我們的 query-title 分檔場景中,發(fā)現(xiàn)詞粒度的 bert 和字粒度的 bert 最終的表現(xiàn)是差不多的,而對于 rnn 模型來說字粒度的 rnn 很難達到詞粒度 rnn 的效果,我們希望研究一下為什么詞粒度和字粒度的 bert 表現(xiàn)差不多。
使用的 bert 可視化工具bert_viz觀察各層 attention-head 的 attention 權(quán)重分布,可以發(fā)現(xiàn)某些 head 帶有很明顯的分詞信息。推測這部分 attention-head 是專門用于提取分詞信息的 head。當(dāng)當(dāng)前的字可能是詞的結(jié)尾時,att 權(quán)重會偏向 sep,當(dāng)這個字為詞的結(jié)尾可能性越大(常見的詞結(jié)尾),sep 的權(quán)重會越高。當(dāng)當(dāng)前字不是詞結(jié)尾時,att 會指向下一個字。這種模式非常明顯,直接拿這個 attention-head 的結(jié)果用于分詞準(zhǔn)確率為 70%。
下面 gif 為我們模型中第 1 層第 3 個 head 的 attention 分布權(quán)重圖,可以發(fā)現(xiàn) attention 權(quán)重很明顯帶有詞的邊界信息,當(dāng)當(dāng)前的字是結(jié)尾時 attention 權(quán)重最大的 token 為"SEP",若當(dāng)前字不是結(jié)尾時 attention 權(quán)重最大的為下一個字。
這種用于提取分詞信息的 head 有很多,且不同的 head 有不同的分詞粒度,如果將多個粒度的分詞綜合考慮(有一個 head 分詞正確就行),則直接用 attention-head 切詞的準(zhǔn)確率在 96%,這也是為什么詞粒度 bert 和字粒度 bert 表現(xiàn)差不多的原因
這種用于提取分詞信息的 head 有很多,且不同的 head 有不同的分詞粒度,如果將多個粒度的分詞綜合考慮(有一個 head 分詞正確就行),則直接用 attention-head 切詞的準(zhǔn)確率在 96%,這也是為什么詞粒度 bert 和字粒度 bert 表現(xiàn)差不多的原因。
猜測字粒度 bert 代詞邊界信息是通過 bert 的預(yù)訓(xùn)練任務(wù) MLM 帶來的,語言模型的訓(xùn)練使得 bert 對各個字之間的組合非常的敏感,從而能夠區(qū)分詞的邊界信息。
2.3 某些 head 負責(zé)編碼輸入的順序
我們知道 bert 的輸入為 token_emb+pos_emb+seg_type_emb 這三個部分相加而成,而文本輸入的順序完全是用 pos_emb 來隱式的表達。bert 中某些 head 實際上負責(zé)提取輸入中的位置信息。這種 attention-head 有明顯的上下對齊的模式,如下圖:
原輸入: query="京東小哥", title="京東小哥最近在干嘛",bert 模型判定為 4 檔
將 title 順序打亂: query="京東小哥", title="近東嘛最都在干哥小京",bert 模型判定為2 檔 將 title 順序打亂: query="京東小哥", title="近東嘛最都在干哥小京",mask 掉 7 個懷疑用于提取語序的 head,bert 模型判定為3 檔
下面的圖分別對比了不做 mask,隨機 mask 掉 7 個 head(重復(fù) 100 次取平均值),mask 掉 7 個特定的 head(懷疑帶有語序信息的 head) 從下面的圖看到,mask 掉 7 個特定的 head 后整體分檔提升為 3 檔,而隨機 mask 掉 7 個 head 結(jié)果仍然為 2 檔,且檔位概率分布和不 mask 的情況差別不大。
這個 case 說明了我們 mask 掉的 7 個特定的 head 應(yīng)該是負責(zé)提取輸入的順序信息,也就是語序信息。將這部分 head mask 掉后,bert 表現(xiàn)比較難察覺到 title 中的亂序,從而提升了分檔。
2.4 某些 head 負責(zé) query 和 title 中相同部分的 term 匹配
query 和 title 中是否有相同的 term 是我們的分類任務(wù)中非常關(guān)鍵的特征,假如 query 中大部分 term 都能在 title 中找到,則 query 和 title 相關(guān)性一般比較高。如 query="京東小哥"就能完全在 title="京東小哥最近在干嘛"中找到,兩者的文本相關(guān)性也很高。我們發(fā)現(xiàn)部分 attention-head 負責(zé)提取這種 term 匹配特征,這種 head 的 attention 權(quán)重分布一般如下圖,可以看到上句和下句中相同 term 的權(quán)重很高(顏色越深表示權(quán)重越大)。
其中在第 2~第 4 層有 5 個 head 匹配的模式特別明顯。我們發(fā)現(xiàn)雖然 bert 模型中 attention-head 很冗余,去掉一些 head 對模型不會有太大的影響,但是有少部分 head 對模型非常重要,下面展示這 5 個 head 對模型的影響,表格中的數(shù)值表示與 baseline 模型的 acc 相對提升值
--不做 HEAD-MASK隨機 MASK 掉 5 個 HEADMASK 掉 5 個指定的 HEADMASK 掉 0~5 層所有 HEADMASK 掉 0 ~ 5 層其他 HEAD, 只保留這 5 個指定 HEAD測試數(shù)據(jù)準(zhǔn)確率+0%+0%-52.4%-86.5%-18.1%
利用測試數(shù)據(jù)作為標(biāo)準(zhǔn),分別測試隨機 mask 掉 5 個 head 和 mask 掉 5 個指定的 head(這些 head 在 attention 可視化上都有明顯的 query-title 匹配的模式)。從結(jié)果可以看到去掉這些負責(zé) query-title 匹配的 head 后模型表現(xiàn)劇烈下降,只去掉這 5 個 head 就能讓模型表現(xiàn)下降 50%。甚至 mask 掉 0~5 層其他 head,只保留這 5 個 head 時模型仍維持 baseline 模型 82%的表現(xiàn),說明了 query-title 的 term 匹配在我們的任務(wù)中是非常重要的。
這也許是為什么雙塔 bert 在我們的場景下表現(xiàn)會那么差的原因(Bert+LSTM 實驗中兩個模型結(jié)合最后的表現(xiàn)差于只使用 Bert, Bert 的輸入為雙塔輸入),因為 query 和 title 分別輸入,使得這些 head 沒有辦法提取 term 的匹配特征(相當(dāng)于 mask 掉了這些 head),而這些匹配特征對于我們的分類任務(wù)是至關(guān)重要的
2.4.1 finetune 對于負責(zé) term 匹配 attention-head 的影響
在 query-title 分檔任務(wù)中 query 和 title 中是否有相同的 term 是很重要的特征,那么在 finetune 過程中負責(zé) query-title 中相同 term 匹配的 head 是否有比較明顯的增強呢?
下面以 case 為例說明: query="我在伊朗長大" title="假期電影《我在伊朗長大》"
下圖展示了 query-title 數(shù)據(jù)***finetune 前*****某個**負責(zé) term 匹配的 head 的 attention 分配圖
在沒有 finetune 前,可以看到某些 head 也會對上下句中重復(fù)的 term 分配比較大的 attention 值,這個特質(zhì)可能是來自于訓(xùn)練任務(wù) NSP(上下句預(yù)測)。因為假如上句和下句有出現(xiàn)相同的 term,則它們是上下句的概率比較大,所以 bert 有一些 head 專門負責(zé)提取這種匹配的信息。
除了上下句相同的 term 有比較大的注意力,每個 term 對自身也有比較大的注意力權(quán)重(體現(xiàn)在圖中對角線上的值都比較大) 為了更直觀的看訓(xùn)練前后哪部分的 attention 值有比較大的改變,分別展示訓(xùn)練后 attention增強(微調(diào)前-微調(diào)后>0)和訓(xùn)練后 attention減弱(微調(diào)前-微調(diào)后<0)的 attention 分配圖??梢杂^察到比較明顯的幾個點:
query 和 title 中 term 匹配的 attention 值變大了 從下圖可以看到, query 和 title 中具有相同 term 時 attention 相比于訓(xùn)練前是有比較大的增強。說明在下游任務(wù)(query-title 分檔)訓(xùn)練中增強了這個 head 的相同 term 匹配信息的抽取能力。 term 和自身的 attention 變小了 模型將重點放在找 query 和 title 中是否有相同的 term,弱化了 term 對自身的注意力權(quán)重 分隔符 sep 的 attention 值變小了。 有論文指出當(dāng)某個 token 的 attention 指向 sep 時表示一種不分配的狀態(tài)(即此時沒有找到合適的 attention 分配方式),在經(jīng)過 finetune 后 term 指向 sep 的權(quán)重變小了,表示經(jīng)過 query-title 數(shù)據(jù)訓(xùn)練后這個 head 的 attention 分配更加的明確了。 2.4.2 是否有某個 head 特別能影響模型
從上面的實驗可以看到,bert 模型有比較多冗余的 head。去掉一部分這些 head 并不太影響模型,但是有少部分 head 特別能影響模型如上面提到的負責(zé)提取上下句中 term 匹配信息的 head,只去掉 5 個這種 head 就能讓模型的表現(xiàn)下降 50%。那么是否有某個 head 特別能影響結(jié)果呢?
下面實驗每次只 mask 掉一個 head,看模型在測試數(shù)據(jù)中表現(xiàn)是否上升/下降。下圖中將 bert 的 144 個 head 看作 12X12 的矩陣,矩陣內(nèi)每個元素表示去掉這個 head 后模型在測試數(shù)據(jù)上的表現(xiàn)。其中 0 表示去掉后對模型的影響不太大。元素內(nèi)的值表示相對于 baseline 的表現(xiàn)提升,如+1%表示相比 baseline 的 acc 提高了 1%。
可以看到對于 bert 的大部分 head,單獨去掉這個 head 對模型并不會造成太大的影響,而有少部分 head 確實特別能影響模型,比如負責(zé)上下句(query-title)中相同 term 匹配的 head。即使去掉一個這種 head 也會使得模型的表現(xiàn)下降。同時注意到高層(第 10 層)有一個 head 去掉后模型表現(xiàn)變化也很大,實驗發(fā)現(xiàn)這個 head 功能是負責(zé)抽取底層 head 輸出的特征,也就是 3-4 層中 head 抽取到輸入的 query-title 有哪些相同 term 特征后,這部分信息會傳遞到第 10 層進一步進行提取,最后影響分類。
2.4.3 高層 head 是如何提取底層 head 特征-一個典型 case
上圖中,在第 10 層有一個 head 去掉后特別能影響模型,觀察其 attention 的分布,cls 的 attention 都集中在 query 和 title 中相同的 term 上,似乎是在對底層 term 匹配 head 抽取到的特征進一步的提取,將這種匹配特征保存到 cls 中(cls 最后一層會用于分類)。
在沒有做任何 head-mask 時, 可以看到 cls 的 attention 主要分配給和 query 和 title 中的共同 term "紫熨斗",而 mask 掉 5 個 2~4 層的 head(具有 term 匹配功能)時, 第 10 層的 cls 注意力分配明顯被改變,分散到更多的 term 中。
這個 case 展示了高層 attention-head 是如何依賴底層的 head 的特征,進一步提取底層的特征并最后作為重要特征用于 query-title 分類。
結(jié)語
本文主要探討了在 query-title 分類場景下,bert 模型的可解釋性。主要從 attention-head 角度入手,發(fā)現(xiàn) attention 一方面非常的冗余,去掉一部分 head 其實不會對模型造成多大的影響。另外一方面有一些 head 卻非常的能影響模型,即使去掉一個都能讓模型表現(xiàn)變差不少。同時發(fā)現(xiàn)不同的 head 實際上有特定的功能,比如底層的 head 負責(zé)對輸入進行特征提取,如分詞、提取輸入的語序關(guān)系、提取 query 和 title(也就是上下句)中相同的 term 信息等。這部分底層的 head 提取到的特征會通過殘差連接送到高層的 head 中,高層 head 會對這部分特征信息進行進一步融合,最終作為分類特征輸入到分類器中。
本文重點討論了哪些 head 是對模型有正面作用,也就是去掉這些 head 后模型表現(xiàn)變差了。但是如果知道了哪些 head 為什么對模型有負面作用,也就是為什么去掉某些 head 模型效果會更好,實際上對于我們有更多的指導(dǎo)作用。這部分信息能夠幫助我們在模型加速,提升模型表現(xiàn)上少走彎路。
參考文獻
[1] Clark K, Khandelwal U, Levy O, et al. What Does BERT Look At? An Analysis of BERT's Attention[J]. arXiv preprint arXiv:1906.04341, 2019.
[2] Vig J. A multiscale visualization of attention in the transformer model[J]. arXiv preprint arXiv:1906.05714, 2019.
【編輯推薦】
支持108種語言的谷歌翻譯如何用AI讓翻譯質(zhì)量越來越好?模型壓縮95%,MIT韓松等人提出新型Lite Transformer谷歌開源“窮人版”摘要生成NLP模型:1000個樣本就能打敗人類如何用谷歌Kubernets搞集群管理?數(shù)據(jù)不夠,Waymo用GAN來湊:用生成圖像在仿真環(huán)境中訓(xùn)練模型【責(zé)任編輯:張燕妮 TEL:(010)68476606】
點贊 0