我們昨天介紹了 Transformer 的結構,但是並沒有介紹到 Transformer 內最神祕的 Self-Attention 層。究竟 Transformer 是怎麼憑藉著 Self-Attention 來對輸入序列進行平行運算?又要怎麼做到解決預測結果和關鍵訊息的位置過於遙遠的問題?
PS:接下來介紹的教材來源皆為台大李宏毅教授的網路教學,有興趣的話可以去聽詳細內容,相信一定能有所收穫。
由於人類語言具有前後順序、上下文關係,對於這種時間序列的資料很常使用 RNN 進行處理,像是文章分類、語意分析...等。
但是 RNN 有個問題就是它並不容易被平行運算,假如今天我們輸入一個 Sequence ~ ,而我們想算出 的話,我們就必須先從 → → → 直到 ,才能把 算出來
因此有人提出用 CNN 取代 RNN 的方法,一個三角形代表一個 filter,每個 filter 的輸入就是 Sequence 的其中一小段,不同的 filter 對應 Sequence 中不同的部分。但是 CNN 需要疊很多層的才能涵蓋句子的所有資訊,而且後來的表現也不比 RNN 佳,因此出現了Self-Attention 機制。
Self-Attention 想要做的事情就是取代 RNN 可以做的事情
它的輸出/入跟 RNN 一樣的,它的最大優勢在於:
現在我們假設輸入 ~ 四個向量,而 Self-Attention 要輸出另外一排 b 向量,而每一個 b 都是考慮了所有的 a 以後才生成出來的
要算出 ,第一個步驟是根據 找出這個 sequence 裡面跟 相關的其他向量,而每一個向量跟 的關聯的程度,我們用一個數值叫 來表示。
在這裡必須先提一下 Self-Attention 機制裡面有3個非常重要的值: Query, Key, Value 。分別表示用來匹配的值、被匹配的值、以及抽取出來的資訊。
至於決定兩個向量之間的關聯性 最常用的方法就是dot product (內積)。它就是拿兩個向量作為輸入,分別乘上兩個不同的矩陣,左邊的向量乘上 矩陣、右邊的向量乘上 矩陣 ( 就是 Query 矩陣 ,而 就是 Key 矩陣,他們的值都是隨機初始化後通過訓練得到 )
接下來得到 跟 這兩個向量後再做內積,全部加起來以後就得到一個 scalar (純量),而這個純量就是 ,我們就把它當作兩個向量關聯的程度。
接下來我們把剛才介紹的套用在 Self-Attention 裡面。
怎麼用 抽取重要的資訊呢?步驟如下:
如果某一個向量它得到的分數越高,假如說 跟 的關聯性很強、這個 得到的值很大,那我們今天在做權重總和以後得到的 的值就可能會比較接近 。
現在,既然我們已經知道如何計算出 ,那麼自然也能根據同樣的方法推算出 、 、。 至此,我們已經將 Self-Attention 的內部的計算方式講解完畢。明天來聊聊使用了 Transformer 中 Encoder 架構的自然語言處理模型 BERT 吧!