前面我們所講的模型,輸入都是一個向量,但有沒有可能在某些場景中輸入是多個向量,即一個向量集合,并且這些向量的數目并不是固定的呢?

這一類的場景包括文字識別、語音識別、圖網路等等,
那么先來考慮輸出的型別,如果對于輸入是多個數目不定的向量,可以有以下這幾種輸出方式:
- 每個向量對應一個輸出:輸出的數目與輸入向量的數目一致,例如下圖的詞性識別、語調識別、狀態識別等等:

- 只有單個輸出:這種應用于例如判斷一段話的正負面作用、語音辨認說話者等等,如下圖:

- 機器自己決定輸出多少個結果(seq2seq):如翻譯、語音轉文字等等,
Sequence Labeling(輸入輸出數目一致)
最簡單的思路當然是將每一個向量單獨作為一個輸入,然后將其丟入到一個全連接之中,每個單獨產生結果,但是這種方法的問題在于沒辦法考慮前后向量之間的聯系,那么轉換另一個思路就是開一個window,每次將window中的向量一起輸入到全連接網路中,如下圖:

這種方式的問題在于如果遇到某些場景需要全部向量都考慮,但是我們無法事先知道這個場景中向量的數目,我們也就很難調整我們的window去適應,在這種情況下就需要用到自注意力機制了,
Self-attention
可以將自注意力機制看成一層,其接受所有向量的輸入,然后輸出的數目跟輸入的數目的是一樣的,可以認為它的每個輸出都是考慮了整個向量集之后的結果,之后再將這些輸出每個單獨放入一個全連接網路中來得到輸出,這樣可以顯著的降低全連接網路的引數量,并且這個也可以多次使用,自注意力后FC再自注意力再FC等等,

那么接下來的問題就是這個機制如何接受輸入并作出相應的輸出,這邊以第一個向量對應的第一個輸出為例:

- 計算每個輸入向量之間的關聯性:計算關聯性\(\alpha\)有很多種方法:

最常見的是這種Dot-product,就是將兩個向量分別乘以一個矩陣,得到新的向量,然后再進行點乘得到一個數值,也就是\(\alpha\)
-
計算出兩兩向量之間的相關性后進行Sortmax:如下圖:

-
對每個向量再乘以一個另外的矩陣得到一個新的向量,再進行加權和得到結果:

哪一個向量對應的\(\alpha\)(attention score)越大,那么得到的b就越接近于它所計算出來的\(v\),這就是最終結果了,
從矩陣角度理解全程序
- 由于每一個輸入向量都需要計算\(q,k,v\)三個向量,因此可以利用矩陣的形式更加簡潔方便的進行計算:

- 計算\(\alpha\)也是同理:

- 計算b也是轉換成矩陣操作:

而經過上述的分析,可以看到需要學習的引數只有\(W^q,W^k,W^v\)而已,
Multi-head Self-attention
這是認為不同的輸入向量之間可能不止有一種相關性,因此:

各種引數都有多重,只不過各自算各自的,
Position embedding
在前面的自注意力程序中,我們并沒有關注到各個輸入向量之間的位置資訊!這在一些場景里面是很關鍵的一部分資訊,但是我們只是計算了各自的相關性沒有考慮到位置資訊,因此需要加上Position embedding:

只需要在每個輸入向量上加上一個\(e^i\)即可,這個里面就包含了具體的位置資訊,而如何產生\(e^i\)仍然是一個在研究的問題,
CNN與Self-attention
事實上,CNN是受限制的Self-attention,也就是Self-attention的特例,Self-attention可以通過某些設計和限制就可以變成CNN,完成和CNN同樣的任務,
RNN與Self-attention
RNN也是處理輸入是向量序列問題的演算法,其具體程序就是一開始有一個memory,它和第一個輸入向量一起輸入到RNN中將會輸出一個向量,該向量一方面放入全連接網路中得到一個輸出,另一方面和下一個輸入向量一起作為下一個RNN的輸入,以此類推,

而它們的區別在于:
- 對不同位置的考慮:在RNN中如果最后一個黃色的輸出向量希望它能夠與第一個輸入的藍色向量有關,那么就需要藍色向量從一開始輸入就一直被記得,直到最后一個;而在Self-attention則不用考慮到這個問題,計算就已經是統籌兼顧了
- 計算的平行性:RNN是無法進行平行計算的,而Self-attention是可以的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/540152.html
標籤:其他
上一篇:深度學習之殘差網路
