選自towardsdatascience

  作者:Giuliano Giacaglia

  機器之心編譯

  參與:Geek AI、張倩

  Transformer 是一種越來越流行的神經網絡架構。最近,OpenAI 將 Transformer 用到了他們的語言模型中, DeepMind 也將其用到了他們爲擊敗頂級職業玩家所設計的 AlphaStar 程序中。本文將詳解這一架構的工作原理。

  Transformer 是爲解決序列轉換或

  神經機器翻譯

  問題而設計的架構,該任務將一個輸入序列轉化爲一個輸出序列。 語音識別、文本轉語音等問題都屬於這類任務。

  序列轉換。綠色方框代表輸入,藍色矩形代表模型,紫色方框代表輸出。

  對於執行序列轉換任務的模型來說,它們需要某種記憶能力。例如,讓我們將下面的句子翻譯成另一種語言:

  “The Transformers” are a Japanese [[hardcore punk]] band. The band was formed in 1968, during the height of Japanese music history”

  在本例中,第二句中的「band」一詞指的是第一句中介紹的「The Transformers」樂隊。當你在第二句中讀到這支樂隊時,你知道它指的是「The Transformers」樂隊。這對翻譯任務可能非常重要。此外,還有很多這樣的例子,某句中的某個單詞指的是前面句子中的單詞。

  注意力機制

  爲了解決這些問題,研究人員創造了一種將注意力分配到特定單詞上的技術。

  在翻譯一個句子時,我們會特別注意正在翻譯的單詞。當轉寫錄音時,我們會仔細聆聽正在努力記下來的片段。如果讓我描述一下我所在的房間,我會一邊說一邊環顧我所描述的物體的四周。

  神經網絡可以使用注意力機制實現相同的行爲,將注意力集中在給出了信息的部分上。例如,一個循環神經網絡(RNN)可以處理另一個 RNN 的輸出。在每一個時間步上,它都會關注另一個 RNN 的輸出的不同位置。

  爲了解決這些問題,神經網絡使用了一種名爲「注意力機制」的技術。對 RNN 來說,每個單詞都有一個對應的隱藏狀態,並且被一直傳遞給解碼階段,而不只是將整個句子編碼在一個隱藏狀態中。然後,在 RNN 的每一步中都會利用這些隱藏狀態進行解碼。下面的動圖顯示了完整的工作流程:

  綠色顯示的步驟被稱爲編碼階段,而紫色顯示的步驟則是解碼階段。

  這樣做的理由是,在一個句子中的每個單詞都可能有相關的信息。因此,爲了讓解碼更加精確,模型需要使用注意力機制考慮輸入的每一個單詞。

  爲了在序列轉換任務中將注意力機制引入到 RNN 中,我們將編碼和解碼分爲兩個主要步驟。一個步驟用綠色表示,另一個步驟用紫色表示。綠色的步驟被稱爲編碼階段,紫色的步驟被稱爲解碼階段。

  綠色的步驟負責根據從輸入中創建隱藏狀態。我們沒有像在使用注意力之前那樣僅僅向解碼器傳遞一個隱藏狀態,而是將句子中每個單詞生成的隱藏狀態都傳遞給解碼階段。每一個隱藏狀態都會在解碼階段被利用,從而找到神經網絡應該施加注意力的地方。

  例如,當把句子「Je suis étudiant」翻譯成英文時,就需要解碼步驟在翻譯時關注不同的單詞。

  這個動圖顯示了將句子「Je suis étudiant」翻譯成英文時,每個隱藏狀態被賦予權重的過程。顏色越深,單詞的權重就越大。

  又或者,當你把句子「L’accord sur la zone économique européenne a été signé en ao?t 1992.」從法文翻譯成英文時,每個輸入被賦予注意力的程度如下圖所示:

  將句子「L’accord sur la zone économique européenne a été signé en ao?t 1992.」翻譯成英文。

  但是使用了注意力機制的 RNN 仍然不能解決一些我們討論過的問題。例如,並行地處理輸入(單詞)是不可能的,對於大型的文本語料庫來說,這增加了翻譯文本要花費的時間。

  卷積神經網絡

  卷積神經網絡對解決這些問題有所幫助。通過卷積神經網絡,我們可以:

  輕鬆做到並行化處理(在每一層中)

  利用局部的依賴

  位置之間的距離是對數函數

  一些最流行的用於序列轉換任務的神經網絡架構(如 Wavenet 和 Bytenet)都是基於卷積神經網絡的。

  Wavenet 模型是一種卷積神經網絡(CNN)。

  卷積神經網絡能夠並行工作的原因是,輸入的每個單詞都可以被同時處理,而且並不一定需要依賴於之前有待翻譯的單詞。不僅如此,CNN 的時間複雜度是 log(N)階的,這是從輸出到輸入生成的樹的高度的大小(如上面的動圖所示)。這要比 RNN 的輸出到輸入之間 N 階的距離要短得多。

  但問題是,卷積神經網絡並不一定能夠幫助我們解決翻譯句子時的依賴關係的問題。這也就是「Transformer」模型被創造出來的原因,它是卷積神經網絡和注意力機制的結合。

  Transformer

  爲了解決並行計算的問題,Transformer 試着同時使用卷積神經網絡和注意力模型。注意力模型提升了模型將一個序列轉換爲另一個序列的速度。

  接下來,讓我們看看 Transformer 是如何工作的吧。Transformer 是一類使用注意力機制加速運算的模型。更確切地說,Transformer 使用的是「自注意力機制」。

  Transformer 的示意圖。

  在內部, Transformer 具有與前面的模型類似的架構。但是 Transformer 是由 6 個編碼器和 6 個解碼器組成的。

  每個編碼器互相之間都是類似的。所有的編碼器都有相同的架構。解碼器也都具有相同的特性,即解碼器互相之間也很類似。每個編碼器由一個「自注意力層」和一個「前饋神經網絡」組成。

  編碼器的輸入首先會流經一個「自注意力」層。它會幫編碼器在對特定的單詞進行編碼時關注輸入句子中其它的單詞。解碼器也有這兩層,但解碼器中的自注意力層和前饋神經網絡層之間還有一個注意力層,該層會幫助解碼器關注輸入的句子中相關的部分。

  自注意力機制

  注:這一節摘選自 Jay Allamar 的博文(http://jalammar.github.io/illustrated-transformer/)。

  首先讓我們來看看各種向量/張量,以及它們如何在這些組件之間流動,將一個訓練過的模型的輸入轉化成輸出。與一般的自然語言處理應用程序一樣,我們首先將使用一個嵌入算法將每個輸入的單詞轉換爲向量形式。

  詞嵌入示意圖

  每個單詞都被嵌入到了一個 512 維的向量中。在本文中,我們將這些向量表示爲上圖中這樣的簡單的方框。

  詞嵌入過程僅僅發生在最底部的編碼器中。所有的編碼器所共有的抽象輸入形式是,他們會接受一個 512 維的向量的列表。

  在底部的編碼器中,這種輸入是詞嵌入,而在其他的編碼器中,輸入則是緊接着的下一層編碼器的輸出。在對我們輸入序列中的單詞進行嵌入後,每個向量都會流經編碼器的兩層。

  編碼器內部結構示意圖

  這裏將開始介紹 Transformer 的一個關鍵屬性:每個位置的單詞都會沿着各自的路徑流經編碼器。在自注意力層中,這些路徑之間有相互依賴關係。然而在前饋層中則沒有這樣的依賴關係,因此可以在流經前饋層時並行處理各種路徑。

  接下來,我們使用一個更短的句子作爲例子,看看每個子層中發生了什麼。

  自注意力

  首先,讓我們來看看如何使用向量計算自注意力,然後進一步看看這是如何使用矩陣來實現的。

  找出一個句子中各單詞之間的關係,爲其賦予正確的注意力。

  計算自注意力的第一步是根據每個編碼器的輸入向量(在本例中,是每個單詞的嵌入)創建三個向量。因此,對於每個單詞,我們會創建一個查詢向量、一個鍵向量和一個值向量。這些向量是通過將嵌入乘以我們在訓練過程中訓練出的三個矩陣得到的。

  請注意,這些新向量的維度比嵌入向量小。其維數爲 64,而嵌入和編碼器的輸入/輸出向量的維度爲 512。這三個向量不必更短小,這種架構選擇可以使多頭注意力的計算過程(大部分)保持不變。

  將 x1 與權值矩陣 WQ 相乘得到與該單詞相關的「查詢向量」 q1。我們最終爲輸入句子中的每個單詞創建了一個「查詢」、「鍵」和「值」的投影。

  什麼是「查詢向量」、「鍵向量」和「值向量」?

  這三個向量是對注意力進行計算和思考時非常有用的抽象概念。閱讀下面關於注意力計算方法的有關內容,你就會對這些向量的作用有一個很好的認識。

  計算自注意力的第二步是計算出(某個單詞的查詢向量與其它單詞的鍵向量相乘)的得分。假設我們正在計算本例中第一個單詞「Thinking」的自注意力。我們需要計算出輸入句子中每一個單詞對於「Thinking」的打分。在我們對某個特定位置上的單詞進行編碼時,該得分決定了我們應該對輸入句子中其它的部分施以多少關注。

  該得分是通過將查詢向量分別和我們正在打分的單詞的鍵向量做點乘得到的。所以,假設我們正在計算位置 #1 的自注意力,第一個得分就是 q1 和 k1 的點積。第二個分數就是 q1 和 k2 的點積。

  第三步和第四步是將第二步得到的得分除以 8(文中使用的鍵向量的維度(64)的平方根。這會讓我們得到更穩定的梯度。這裏也可以除以其它的值,但本文給出的是默認情況),然後將做除法的結果傳遞給 softmax 運算。Softmax 會將這些分數進行歸一化,使它們都爲正值,而且加起來等於 1。

  這個 softmax 處理後的得分決定了每個單詞在這個位置上被「表達」的程度。顯然,該位置上本身存在的單詞會得到最高的 softmax 值,但是有時關注與當前編碼單詞相關的另一個單詞是很有用的。

  第五步是將每個值向量與 softmax 得分相乘(爲對其求和做準備)。這裏的直觀理解是,將我們想要關注的單詞的值維持在較高水平,並且忽略那些不相關的單詞(例如,通過將它們的值與 0.001 這樣極小的數字相乘)。

  第六步是對加權值後的值向量求和。該步驟將生成當前編碼位置上(第一個單詞)的自注意力層的輸出。

  這就是自注意力機制計算過程得到的結果。我們可以將最終得到的向量傳遞給前饋神經網絡。然而,在實際的實現中,爲了加快處理速度,這種計算是以矩陣的形式進行的。

  多頭注意力

  基本上,Transformer 就是這樣工作的。但還有一些小的細節可以讓它們工作地更好。例如,Transformer 使用了多頭注意力機制的概念,而不是僅僅在一個維度上讓單詞彼此關注。

  多頭注意力機制背後的想法是,每當你翻譯一個單詞時,你可能會基於你所問的問題的類型對每個單詞賦予不同的注意力。下圖對這種想法的意義進行了說明。例如,當你翻譯句子「I kicked the ball」(我踢了球)時,你可能會問「是誰踢了?」而根據答案的不同 ,將該單詞翻譯成另一種語言的結果可能會有所變化。或者你也可能會問其它的問題,例如「做了什麼?」等等。

  位置編碼

  Transformer 中另一個重要的步驟就是在對每個單詞進行編碼的時候加入了位置編碼。對每個單詞的編碼之間都是相互關聯的,因爲每個單詞的位置與其翻譯結果相關。

  本文爲機器之心編譯,轉載請聯繫本公衆號獲得授權。

  ------------------------------------------------

相关文章