【NLP】Day 19: 注意!謝謝你的注意!Transformer (上)

如果我能看得更遠,那是因為站在巨人的肩膀上。
牛頓

經過了前幾天的旅程,相信大家對於運用在自然語言處理的神經網路,應該已經有了一定程度的認識。神經網路是深度學習的起點,我們一路從機器學習一直到現在的深度學習,其實都依循著一定的脈絡在往前走。不知道大家是否還記得我們在旅程一開始的時候曾經說過,為了要讓機器學習模型理解文字,首要工作是要將文字轉換成數字,因此發展出了許多如詞頻、TF-IDF等以詞為模型理解語言的最小單位的方式,接著以詞頻為基礎,將語言理解成具有統計概念的分布模型,因此這樣的模型被稱為語言模型,接著將這些轉成數值的文字資料放進傳統機器學習模型。後來,人工智慧學家發現,比起讓模型從詞彙的角度出發,讓模型可以理解文字、句子、甚至是文章上下文之間的連續關係,其實應用上可以更為廣泛。

就跟我們人有著不同專長一樣,不同的模型也擅長處理不同的資料。當模型處理具有序列關係的資料時,這種sequence model就是最好的選擇,也就是說,我們前幾天所說到的模型,RNN、LSTM、GRU等,都是sequence model的一種。

今天要介紹的,也是一種sequence model,稱為Transformer。今天這篇文將會有很大一部分是來自於 The Illustrated Transformer這篇文章,若各位想拜讀原文,可以毫不猶豫地點進去這篇文章喔!

自然語言處理的變形金剛:Transformer

如果我們將模型視作一個黑盒子,那首先要先釐清,輸入模型的資料型態會是一個句子,輸出也會是一個句子(畢竟是sequence model,輸入及輸出也會是 “sequence”),而在這個模型內部,是由一長串的編碼器(encoder)跟解碼器(decoder)所組成。我們可以參考以下示意圖:

在圖中我們可以看到,輸入及輸出之間是由一串的編碼器和解碼器所組成。雖然在原文中的圖也是用各六個編碼及解碼器,但事實上跟6這個數字一點關係都沒有。 畢竟不是每個人都是諫山創一樣對數字有執著

首先我們先來將注意力放在編碼器(Pun intended!),編碼器的構造又是由 自注意力機制(self-attention mechanism)以及一組前饋神經網路(feed-forward neural network) 所組成。另外在解碼器中,除了自注意力機制以及前饋神經網路之外,也多了編解碼注意力機制(encoder-decoder attention),前饋神經網路在我的 神經網路也會神機錯亂?不,只會精神錯亂…深度學習:前饋神經網路 這篇文章中已經提過,想必大家應該都很清楚了(吧?)(嗎?)所以今天會將主力放在解釋何謂自注意力機制

自注意力機制(self-attention mechanism)

自注意力機制的要點在於,深度學習模型可以判斷句子中某個字與句中其他字的關聯性大小,比如說,句中某個字的指涉對象是同一句中的哪個字。這樣說或許有點抽象,什麼指涉,什麼關聯性的吊書袋幹嘛?其實若用原文的舉例來說的話:

1
"The animal didn't cross the street because it was too tired."

在這句話中,it的指涉對象就是animal,也就是說,整句話之中,itanimal的關係最接近,所以模型在進行自注意力機制的時候,就會給animal比較高的權重。這個運作方式就像是先前在圓圓圈圈圓圓~深度學習:循環神經網路 RNN之中所說,RNN透過隱藏層之間的資料傳遞(也就是RNN的記憶能力)來了解當前處理的字,與先前處理過的字,兩者之間的關係。

如何計算的呢?

  1. 步驟一:從編碼器輸入層中(在這裡則是詞嵌入層)中計算出三個向量,分別為key vector、query vector以及value vector。這三個向量分別乘上權重https://chart.googleapis.com/chart?cht=tx&chl=W%5EQhttps://chart.googleapis.com/chart?cht=tx&chl=W%5EK 以及 https://chart.googleapis.com/chart?cht=tx&chl=W%5EV 之後,就可以得到這個字在句子中的投射(projection),也就是用比較短的向量來代表一個字在一個句子之中的「定位」(我的理解,若有錯請指出)。

  1. 步驟二:在這裡要做的是,要計算對當位置輸入字詞來說,其他字的「重要程度」。作法則是將計算所得的key vector,與自己還有其他字詞的query vector相乘(也就是內積),即可獲得前述所謂「重要程度」的分數。

  1. 步驟三:再來就是除以8,接著把他丟入softmax激勵函數。之所以除以8的原因只是因為這是64的平方根,也就是key vector維度的平方根,這可以幫助在梯度下降時穩定找到最佳解。我們在這裡最終會獲得[0, 1]之間的數字。

  1. 步驟四:最後就是相乘再相加。
    • 相乘:將Softmax所得的數值,乘以value vector。這裡的作用是,將重要的字保留下來,並將不重要的字過濾掉。(因為不重要的字會乘上一個超小的數值,就可以把他的重要性降低了)。
    • 相加:將前面計算的數值相加,就可以得到在這個「位置」的自注意層輸出了。

是不是已經腦洞大開了呢!但這還只是single-head attention,在原論文 Attention Is All You Need中其實又再針對這個概念進行了改良 套句高中數學老師說的,是想逼死誰? ,加入了multi-head attention,而這可以更準確地判斷句中不同位置的字的相對重要程度,不過我們明天再來詳細介紹是怎麼回事,還有後續的decoder的運作方式;另外,朋友們也可以想想看,為什麼在文中,我只要寫到「位置」,我都會特別加上引號。不過我們在這邊先休息一下,明天進入Transformer 下篇!