前面的篇章,我們主要都是在處理單一的輸入值,或是固定size的一維矩陣輸入值。但有時候我們會沒辦法保證輸入的大小都是固定的,像是聲音訊號、文字長度。或者輸入的值是一組vector set,像是一次有好幾組vector同時要輸入等等。
同樣的,很多時候我們沒辦法知道輸出的label的size,像是我們輸入一段文字,可能只需要透過classification辨別文字給予的評價好壞,這時候就只會有一個輸出。或者是在翻譯英文的時候,就可能是一個英文字對應到一個中文字,這時候幾組輸入可能就對應到幾組輸出。
*當輸入與輸出是一個set對一個set,那我們可以稱之為sequence-to-sequence的問題。
Q:那如果我們各別將每一組的input直接經過fully connected network計算可以得到我們的目標嗎?
A: 有些問題可以,但像是英翻中的問題,是不是就會考慮到詞性問題,考慮到他們彼此的依賴關係?這時候fully connected Network就沒辦法精準處理我們的問題。
-> 所以才需要self-attention。
self attention能夠同時接收整個sequence的資訊,就能考慮到彼此的依賴關係。
要如何計算self Attention?
*b1~b4的計算不需要照順序,他們可以同時平行計算。
*Wq, Wk, Wv(transformer)的參數需要透過training data尋找。
*我們也可以將a1~a4整合起來做為矩陣,W也能以矩陣表示。
Dot-product的計算方法:
需要被計算出關聯性的主角,我們先透過Wq, Wk得到qi(query)與ki(key),其他的配角計算出kj(key)。
接著,我們將qi 與所有配角的 kj相乘 ,就能得到關聯性𝛼ij。
相關性本身就有許多不一樣的定義,所以我們應該要有不同q與k,做出不同的相關性 → 以此推論出會有不同的k與v,這就被稱為有多個head。但要注意的是,如果我們有多個q,那在計算時它們彼此是獨立的,不能互相使用。
Positional Encoding
但到目前為止,我們少了一個位置的資訊。但有時位置的資訊也是很重要,像是英文字的位置有可能決定他是名詞或是動詞,因此我們需要加上一個判斷位置的資訊。
所以我們可以設置一個位置參數ei,加入到ai上面。(第一個位置就是e1,第二個就是e2),ei的值是可以由我們設計的。 -> 這部分是尚待研究的問題,可以參考一些論文的設計。
語音辨識的使用
通常我們在語音辨識上,每一個向量只有10ms的範圍,所以講一句話就有可能產生上千個向量,複雜度就會提高。
-> 所以在語音辨識上,我們可以採用Truncated Self-attention的方法,在看一整個句子時,只挑選某個範圍內的文字做辨識,這樣就不需要輸入所有的向量。
CNN可以看做是簡化版的Self-attention,CNN是只計算receptive field一個特定小範圍,而self-attention是考慮整個範圍。
認真想想,其實圖片本身就是一組vector set,所以自然也能使用self-attention。而且self attention能夠透過attention,找到圖片中的像素與自己W參數的相關性,就好像receptive field是機器自己決定出來的(大小、範圍等等),而不像CNN是有我們自己設定的。
以上是關於今天self-attention的基礎知識~