1. 程式人生 > 其它 >BERT P2_Fun Facts about BERT_李巨集毅

BERT P2_Fun Facts about BERT_李巨集毅

BERT P2_Fun Facts about BERT

Why does BERT work?

"為什麼BERT有用?"

最常見的解釋是,當輸入一串文字時,每個文字都有一個對應的向量。對於這個向量,我們稱之為embedding。

它的特別之處在於,這些向量代表了輸入詞含義。例如,模型輸入 "臺灣大學"(國立臺灣大學),輸出4個向量。這4個向量分別代表 "臺"、"灣"、"大 "和 "學"

更具體地說,如果你把這些詞所對應的向量畫出來,或者計算它們之間的距離

你會發現,意思比較相似的詞,它們的向量比較接近。例如,水果和草都是植物,它們的向量比較接近。但這是一個假的例子,我以後會給你看一個真正的例子。"鳥 "和 "魚 "是動物,所以它們可能更接近。

你可能會問,中文有歧義,其實不僅是中文,很多語言都有歧義,BERT可以考慮上下文,所以,同一個詞,比如說 "蘋果",它的上下文和另一個 "蘋果 "不同,它們的向量也不會相同。

水果 "蘋果 "和手機 "蘋果 "都是 "蘋果",但根據上下文,它們的含義是不同的。所以,它的向量和相應的embedding會有很大不同。水果 "蘋果 "可能更接近於 "草",手機 "蘋果 "可能更接近於 "電"。

現在我們看一個真實的例子。假設我們現在考慮 "蘋果 "這個詞,我們會收集很多有 "蘋果 "這個詞的句子,比如 "喝蘋果汁"、"蘋果Macbook "等等。然後,我們把這些句子放入BERT中。

接下來,我們將計算 "蘋果 "一詞的相應embedding。輸入 "喝蘋果汁",得到一個 "蘋果 "的向量。為什麼不一樣呢?在Encoder中存在Self-Attention,所以根據 "蘋果 "一詞的不同語境,得到的向量會有所不同。接下來,我們計算這些結果之間的==cosine similarity==,即計算它們的相似度。

結果是這樣的,這裡有10個句子

  • 前5個句子中的 "蘋果 "代表可食用的蘋果。例如,第一句是 "我今天買了蘋果吃",第二句是 "進口富士蘋果平均每公斤多少錢",第三句是 "蘋果茶很難喝",第四句是 "智利蘋果的季節來了",第五句是 "關於進口蘋果的事情",這五個句子都有 "蘋果 "一詞,

  • 後面五個句子也有 "蘋果 "一詞,但提到的是蘋果公司的蘋果。例如,"蘋果即將在下個月釋出新款iPhone","蘋果獲得新專利","我今天買了一部蘋果手機","蘋果股價下跌","蘋果押注指紋識別技術",共有十個 "蘋果"

計算每一對之間的相似度,得到一個10×10的矩陣。相似度越高,這個顏色就越淺。所以,自己和自己之間的相似度一定是最大的,自己和別人之間的相似度一定是更小的。

但前五個 "蘋果 "和後五個 "蘋果 "之間的相似度相對較低。

BERT知道,前五個 "蘋果 "是指可食用的蘋果,所以它們比較接近。最後五個 "蘋果 "指的是蘋果公司,所以它們比較接近。所以BERT知道,上下兩堆 "蘋果 "的含義不同

BERT的這些向量是輸出向量,每個向量代表該詞的含義。BERT在填空的過程中已經學會了每個漢字的意思。",也許它真的理解了中文,對它來說,漢字不再是毫無關聯的,既然它理解了中文,它就可以在接下來的任務中做得更好。

那麼接下來你可能會問,"為什麼BERT有如此神奇的能力?",為什麼......,為什麼它能輸出代表輸入詞含義的向量? 這裡,約翰-魯伯特-弗斯,一位60年代的語言學家,提出了一個假說。他說,要知道一個詞的意思,我們需要看它的 "Company",也就是經常和它一起出現的詞彙,也就是它的上下文

一個詞的意思,取決於它的上下文

  • 所以以蘋果(apple)中的果字為例。如果它經常與 "吃"、"樹 "等一起出現,那麼它可能指的是可食用的蘋果。

  • 如果它經常與電子、專利、股票價格等一起出現,那麼它可能指的是蘋果公司。

當我們訓練BERT時,我們給它w1、w2、w3和w4,我們覆蓋w2,並告訴它預測w2,而它就是從上下文中提取資訊來預測w2。所以這個向量是其上下文資訊的精華,可以用來預測w2是什麼。

這樣的想法在BERT之前已經存在了。在word embedding中,有一種技術叫做CBOW。

CBOW所做的,與BERT完全一樣。做一個空白,並要求它預測空白處的內容。這個CBOW,這個word embedding技術,可以給每個詞彙一個向量,代表這個詞彙的意義。

CBOW是一個非常簡單的模型,它使用兩個變換,是一個非常簡單的模型,有人會問,"為什麼它只使用兩個變換?","它可以更復雜嗎?",CBOW的作者,Thomas Mikolov,曾經來到臺灣。當時我在上課的時候,經常有人問我,為什麼CBOW只用線性,為什麼不用深度學習,我問過Thomas Mikolov這個問題,他說可以用深度學習,但是之所以選擇線性模型,一個簡單的模型,最大的擔心,其實是算力問題。當時的計算能力和現在不在一個數量級上,可能是2016年的時候,幾年前的技術也不在一個數量級上,當時要訓練一個非常大的模型還是比較困難的,所以他選擇了一個比較簡單的模型。

今天,當你使用BERT的時候,就相當於一個深度版本的CBOW,你可以做更復雜的事情,而且BERT還可以根據不同的語境,從同一個詞彙產生不同的embedding。因為它是一個考慮到語境的高階版本的詞embedding,BERT也被稱為Contextualized embedding,這些由BERT提取的向量或embedding被稱為Contextualized embedding,希望大家能接受這個答案。

但是,這個答案,它真的是真的嗎?這是你在文獻中聽到最多的答案。當你和別人討論BERT時,這是大多數人都會告訴你的理由。它真的是真的嗎?這裡有一個難以理解的,由我們實驗室的一個學生做的實驗。實驗是這樣的:我們應用為文字訓練的BERT對蛋白質、DNA鏈和音樂進行分類。

讓我們以DNA鏈的分類為例。DNA是一系列的脫氧核團核酸,有四種,分別用A、T、C和G表示,所以一條DNA鏈是這樣的。

你可能會問,"EI IE和N代表什麼?"不要在意細節,我也不知道,總之,這是一個分類問題。只要用訓練資料和標記資料來訓練它,就可以了。

神奇的部分來了,DNA可以用ATCG來表示,現在,我們要用BERT來對DNA進行分類

例如,"A "是 "we","T "是 "you","C "是 "he","G "是 "she"。對應的詞並不重要,你可以隨機生成。"A "可以對應任何詞彙,"T"、"C "和 "G "也可以,這並不重要,對結果影響很小。只是這串文字無法理解。

例如,"AGAC "變成了 "we she we he",不知道它在說什麼。

然後,把它扔進一個一般的BERT,用CLS標記,一個輸出向量,一個Linear transform,對它進行分類。只是分類到了DNA類,我不知道他們是什麼意思。

和以前一樣,Linear transform使用隨機初始化,而BERT是通過預訓練模型初始化的。但用於初始化的模型,是學習填空的模型。它已經學會了英語填空。

你可能會認為,這個實驗完全是無稽之談。如果我們把一個DNA序列預處理成一個無意義的序列,那麼BERT的目的是什麼? 大家都知道,BERT可以分析一個有效句子的語義,你怎麼能給它一個無法理解的句子呢? 做這個實驗的意義是什麼?

蛋白質有三種分類,那麼蛋白質是由氨基酸組成的,有十種氨基酸,只要給每個氨基酸一個隨機的詞彙,那麼DNA是一組ATCG,音樂也是一組音符,給它每個音符一個詞彙,然後,把它作為一個文章分類問題來做。

你會發現,如果你不使用BERT,你得到的結果是藍色部分,如果你使用BERT,你得到的結果是紅色部分,這實際上更好,你們大多數人現在一定很困惑。

這個實驗只能用神奇來形容,沒有人知道它為什麼有效,而且目前還沒有很好的解釋,我之所以要談這個實驗,是想告訴你們,要了解BERT的力量,還有很多工作要做。

我並不是要否認BERT能夠分析句子的含義這一事實。從embedding中,我們清楚地觀察到,BERT知道每個詞的含義,它能找出含義相似的詞和不相似的詞。但正如我想指出的那樣,即使你給它一個無意義的句子,它仍然可以很好地對句子進行分類。

所以,也許它的力量並不完全來自於對實際文章的理解。也許還有其他原因。例如,也許,BERT只是一套更好的初始引數。也許這與語義不一定有關。也許這套初始引數,只是在訓練大型模型時更好。

是這樣嗎?這個問題需要進一步研究來回答。我之所以要講這個實驗,是想讓大家知道,我們目前使用的模型往往是非常新的,需要進一步的研究,以便我們瞭解它的能力。

你今天學到的關於BERT的知識,只是滄海一粟。我會把一些視訊的連結放在這裡。

如果你想了解更多關於BERT的知識,你可以參考這些連結。你的作業不需要它,,這學期剩下的時間也不需要。我只想告訴你,BERT還有很多其他的變種。

Multi-lingual BERT

接下來,我要講的是,一種叫做Multi-lingual BERT的BERT。Multi-lingual BERT有什麼神奇之處?

它是由很多語言來訓練的,比如中文、英文、德文、法文等等,用填空題來訓練BERT,這就是Multi-lingual BERT的訓練方式。

Zero-shot Reading Comprehension

google訓練了一個Multi-lingual BERT,它能夠做這104種語言的填空題。神奇的地方來了,如果你用英文問答資料訓練它,它就會自動學習如何做中文問答

我不知道你是否完全理解我的意思,所以這裡有一個真實的實驗例子。

這是一些訓練資料。他們用SQuAD進行fine-tune。這是一個英文Q&A資料集。中文資料集是由臺達電釋出的,叫DRCD。這個資料集也是我們在作業中要用到的資料集。

在BERT提出之前,效果並不好。在BERT之前,最強的模型是QANet。它的正確率只有......,嗯,我是說F1得分,而不是準確率,但你可以暫時把它看成是準確率或正確率。

如果我們允許用中文填空題進行預訓練,然後用中文Q&A資料進行微調,那麼它在中文Q&A測試集上的正確率達到89%。因此,其表現是相當令人印象深刻的。

神奇的是,如果我們把一個Multi-lingual的BERT,用英文Q&A資料進行微調,它仍然可以回答中文Q&A問題,並且有78%的正確率,這幾乎與QANet的準確性相同。它從未接受過中文和英文之間的翻譯訓練,也從未閱讀過中文Q&A的資料收集。,它在沒有任何準備的情況下參加了這個中文Q&A測試,儘管它從未見過中文測試,但不知為何,它能回答這些問題。

Cross-lingual Alignment?

你們中的一些人可能會說:"它在預訓練中讀過104種語言,104種語言中的一種是中文,是嗎? 如果是,這並不奇怪。"但是在預訓練中,學習的目標是填空。它只能用中文填空。有了這些知識,再加上做英文問答的能力,不知不覺中,它就自動學會了做中文問答。

聽起來很神奇,那麼BERT是怎麼做到的呢?一個簡單的解釋是:也許對於多語言的BERT來說,不同的語言並沒有那麼大的差異。無論你用中文還是英文顯示,對於具有相同含義的單詞,它們的embedding都很接近。漢語中的 "跳 "與英語中的 "jump "接近,漢語中的 "魚 "與英語中的 "fish "接近,漢語中的 "遊 "與英語中的 "swim "接近,也許在學習過程中它已經自動學會了。

它是可以被驗證的。我們實際上做了一些驗證。驗證的標準被稱為Mean Reciprocal Rank,縮寫為MRR。我們在這裡不做詳細說明。你只需要知道,MRR的值越高,不同embedding之間的Alignment就越好

更好的Alignment意味著,具有相同含義但來自不同語言的詞將被轉化為更接近的向量。如果MRR高,那麼具有相同含義但來自不同語言的詞的向量就更接近。

這條深藍色的線是谷歌釋出的104種語言的Multi-lingual BERT的MRR,它的值非常高,這說明不同語言之間沒有太大的差別。Multi-lingual BERT只看意思,不同語言對它沒有太大的差別。

橙色這條是我們試圖自己訓練Multi-lingual BERT。我們使用的資料較少,每種語言只使用了20萬個句子。資料較少。我們自我訓練的模型結果並不好。我們不知道為什麼我們的Multi-lingual BERT不能將不同的語言統一起來。似乎它不能學習那些在不同語言中具有相同含義的符號,它們應該具有相同的含義。這個問題困擾了我們很長時間。

為什麼我們要做這個實驗?為什麼我們要自己訓練Multi-lingual BERT?因為我們想了解,是什麼讓Multi-lingual BERT。我們想設定不同的引數,不同的向量,看看哪個向量會影響Multi-lingual BERT。

但是我們發現,對於我們的Multi-lingual BERT來說,無論你如何調整引數,它就是不能達到Multi-lingual的效果,它就是不能達到Alignment的效果。我們把資料量增加了五倍,看看能不能達到Alignment的效果。在做這個實驗之前,大家都有點牴觸,大家都覺得有點害怕,因為訓練時間要比原來的長五倍。

訓練了兩天後,什麼也沒發生,損失甚至不能減少,就在我們要放棄的時候,損失突然下降了

用了8個V100來訓練,我們的實驗室也沒有8個V100,是在NCHC(國家高效能運算中心)的機器上執行的,訓練了兩天後,損失沒有下降,似乎失敗了。當我們要放棄的時候,損失下降了。

這是某個學生在Facebook上發的帖子,我在這裡引用它來告訴你,我當時心裡的感嘆。整個實驗,必須執行一個多星期,才能把它學好,每一種語言1000K的資料。

所以看起來,資料量是一個非常關鍵的因素,關係到能否成功地將不同的語言排列在一起。所以有時候,神奇的是,很多問題或很多現象,只有在有足夠的資料量時才會顯現出來。它可以在A語言的QA上進行訓練,然後直接轉移到B語言上,從來沒有人說過這一點

這是過去幾年才出現的,一個可能的原因是,過去沒有足夠的資料,現在有足夠的資料,現在有大量的計算資源,所以這個現象現在有可能被觀察到。

最後一個神奇的實驗,我覺得這件事很奇怪

你說BERT可以把不同語言中含義相同的符號放在一起,使它們的向量接近。但是,當訓練多語言的BERT時,如果給它英語,它可以用英語填空,如果給它中文,它可以用中文填空,它不會混在一起

那麼,如果不同語言之間沒有區別,怎麼可能只用英語標記來填英語句子呢?為什麼它不會用中文符號填空呢?它就是不填,這說明它知道語言的資訊也是不同的,那些不同語言的符號畢竟還是不同的,它並沒有完全抹去語言資訊,所以我想出了一個研究課題,我們來找找,語言資訊在哪裡。

後來我們發現,語言資訊並沒有隱藏得很深。一個學生髮現,我們把所有英語單詞的embedding,放到多語言的BERT中,取embedding的平均值,我們對中文單詞也做同樣的事情。在這裡,我們給Multi-lingual BERT一個英語句子,並得到它的embedding。我們在embedding中加上這個藍色的向量,這就是英語和漢語之間的差距

這些向量,從Multi-lingual BERT的角度來看,變成了漢語。有了這個神奇的東西,你可以做一個奇妙的無監督翻譯。

例如,你給BERT看這個中文句子。

這個中文句子是,"能幫助我的小女孩在小鎮的另一邊,,沒人能夠幫助我",現在我們把這個句子扔到Multi-lingual BERT中。

然後我們取出Multi-lingual BERT中的一個層,它不需要是最後一層,可以是任何一層。我們拿出某一層,給它一個embedding,加上這個藍色的向量。對它來說,這個句子馬上就從中文變成了英文。

在向BERT輸入英文後,通過在中間加一個藍色的向量來轉換隱藏層,轉眼間,中文就出來了。"沒有人可以幫助我",變成了 "是(是)沒有人(沒有人)可以幫助我(我)","我 "變成了 "我","沒有人 "變成了 "沒有人",所以它在某種程度上可以做無監督的標記級翻譯,儘管它並不完美,神奇的是,Multi-lingual的BERT仍然保留了語義資訊。