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