iT邦幫忙

2021 iThome 鐵人賽

DAY 22
3
AI & Data

AI Voice Conversion系列 第 22

【Day22】 Transformer 新手包 (二)

Query,Key,Value

在昨天我們有提到 "自" 注意力機制,現在我們更詳細的來看具體是怎麼算的。

先定義一下 "做 attention" 這件事就是收 2 個向量,然後輸出一個分數告訴你這兩個向量有多配,至於怎麼算有很多種,像是昨天說的內積。

  1. 假設我們輸入是 [x1,x2,x3,x4] 我們先把這個東西做 embedding,變成 [a1,a2,a3,a4]

  2. 把 [a1,a2,a3,a4] 丟進 "自"注意力機制中做運算,每個 input 都各別乘上 3 種不同的矩陣[w1,w2,w3],會得到 3 個新 Vector 就是 Query,Key,Value

    [q1,q2,q3,q4],[k1,k2,k3,k4],[v1,v2,v3,v4]
    
  3. 把每個 q 對做每個 k 都做 attention 得到 [alpha1,alpha2,alpha3,alpha4]],以論文上來講 "做 attention" 這件事是

     alpha = q。k^i / sqrt(d) ,d is the dim of q and k
    
  4. 把每個 alpha 做 softmax 得到 alpha^ 這邊其實你會發現跟昨天的一樣

  5. 把結果個別乘上 v 然後加總然後得到輸出 b1,相信大家都看過下面這張圖XD

  • 如果你不想讓 b1 知道其他地方的資訊,那你只需要把其他地方的 alpha^乘V 設成 0 就好了。還是有點不清楚的話就再看一張圖吧! 看看 b2 怎麼算出來的

這裡就是和 RNN 不一樣的地方了,你會發現對電腦而言,b1,b2 這些是可以平行運算的!

Multi-Head Attention

剛剛上面有提到 q,k,v,Multi-Head 顧名思義就是把這些分裂成 2 份(或更多),然後後做一樣的事,注意雖然分成兩份 [qi1,qj],但 qi 只會對 ki,vi 做,qj 也一樣,最後把兩份不同的 b concatenate 起來,看下面這張圖就知道了。

為什麼沒事要給自己找麻煩呢? 其實這麼做是有原因的,上面我們提到不想讓有的 head 知道其他地方的資訊,但又想讓某個 head 知道其他地方的資訊,就可以這樣處理。

Positional Encoding

如果照上面算下來,你會發現對 b 來講,輸入順序這件事毫無意義的,因為對 b 而言它就是對所有的輸入做 self-attention,b 是沒有輸入前後位置的概念的,但這顯然不對,而解決這個問題德方法,就是 Positional Encoding。

這個 e^i 不是訓練出來的,它是人工設定的,用的時候只要把它加上 a^i 就好了。(之後再說這個怎麼生的)

整理一下 Transformer Encoder 的部分

來看一張被轉貼到爛的圖,再經過我的巧手之後變得更爛了XD

decoder 還有一些小差異我們明天繼續講

參考資料

Hung-yi Lee - Transformer

Hung-yi Lee 老師的內容都很扎實好理解,而且還無私地分享給大家,抱持著感恩的心收看吧 XD !

/images/emoticon/emoticon09.gif/images/emoticon/emoticon13.gif/images/emoticon/emoticon14.gif/images/emoticon/emoticon22.gif/images/emoticon/emoticon28.gif


上一篇
【Day21】 Transformer 新手包 (一)
下一篇
【Day23】 Transformer 新手包 (三)
系列文
AI Voice Conversion30

尚未有邦友留言

立即登入留言