位置編碼
? ? ? ? 很多網(wǎng)友在討論transfromer的self-attention模塊中位置編碼缺失問題時攒岛,一般會優(yōu)先拋出CNN和RNN是位置敏感的這一論述耍属,不過一般很少細(xì)說态鳖;我們先來看看Transofmer的位置編碼迁酸,然后再對比一下CNN和RNN院塞。
注:除了原論文中的公式函卒,以下內(nèi)容純屬個人推導(dǎo),僅供相互討論钉稍。
為什么Transformer需要顯式添加位置編碼配深?
? ? ? ? 先來看看,如果拋棄RNN特征提取層嫁盲,而僅使用attention層篓叶,會發(fā)生什么烈掠,上面圖(1)對應(yīng)的公式如下:
????????下面我們繼續(xù)分析,在計算A的attention向量時缸托,當(dāng)我們將上下文中的B和C的順序互換時會有:
????????顯然左敌,由向量空間的加法交換律,有:
????????因此俐镐,在我們計算A的attention向量時矫限,改變上下文的順序,并不會對A的結(jié)果有任何改變佩抹;而這顯然是不合理的叼风,在文本數(shù)據(jù)中,交換兩個詞語棍苹,會使得語義截然不同无宿。
? ? ? ? 另外,transformer中使用的是pointwise-feed-forward-network枢里,意思是每個數(shù)據(jù)幀孽鸡,單獨使用該全連接層進(jìn)行變換;所以栏豺,經(jīng)過FC層的各個數(shù)據(jù)彬碱,仍然保持位置不敏感性,我想這就是作者強(qiáng)調(diào)pointwise的用意奥洼,而并不是為了起個花哨的名字巷疼。
Transformer是如何進(jìn)行位置編碼的?
? ? ? ? 原論文中使用的是sin灵奖、cos函數(shù)構(gòu)造的位置編碼嚼沿,加到詞向量中去,我簡單查了一些網(wǎng)頁桑寨,它們都使用來解釋位置編碼伏尼,不過對我來說忿檩,還是覺得比較模糊尉尾;下面我說說自己的理解,我們從最基本的公式入手燥透,看看會得到什么沙咏。
沒有加入位置編碼時:
受內(nèi)積運算啟發(fā),我們先引入符號班套,當(dāng)
是對稱正定陣時肢藐,即構(gòu)成度量陣,這顯然構(gòu)成了合法的
中的內(nèi)積吱韭,顯然這里的
一般不滿足對稱正定性吆豹,不過我還是打算這樣來使用鱼的,用來"度量"兩個向量的相關(guān)性。
設(shè)此時的下標(biāo)索引分別是n和m痘煤,位置編碼分別是
凑阶,則加入位置編碼后,由雙線性性有:
其中:
????????第一項顯然是度量兩個輸入詞向量之間的關(guān)于語言的相關(guān)性衷快;
????????第二宙橱、三項分別度量了輸入向量
到絕對位置m的相關(guān)性,和向量
關(guān)于絕對位置n的相關(guān)性蘸拔;
? ? ? ? 第四項度量了絕對位置n和絕對位置m之間的相關(guān)性师郑,這是一個很重要的點,它可以用來度量“相對距離”的遠(yuǎn)近调窍,因為相對距離更適合學(xué)習(xí)和泛化宝冕。經(jīng)驗證,發(fā)現(xiàn)作者使用的位置編碼在標(biāo)準(zhǔn)內(nèi)積下的Gram矩陣如下(這里只使用了5x5):
? ? ? ? 可以看到主對角線是最大的陨晶,離當(dāng)前位置的距離越大猬仁,相關(guān)度越小先誉;在模型中實際使用的是變換后的Gram矩陣湿刽,若繼續(xù)保持上面矩陣中的趨勢,則我們認(rèn)為作者使用的位置編碼PE矩陣褐耳,的確編碼了相對距離到模型中去诈闺。
? ? ? ? 為什么要使用這樣的編碼呢?先看看原論文中使用的公式:
其中:分別表示向量維度铃芦,詞向量某個維度的索引雅镊,詞向量的位置索引。
????????咋一看刃滓,這似乎內(nèi)藏著很深的玄機(jī)仁烹,根本就想不通為什么這樣設(shè)計,似乎也沒什么道理咧虎;一開始卓缰,我想通過積分來驗證對的采樣
,都有
近似滿足度量矩陣的性質(zhì)砰诵。所以我想看看
征唬,畢業(yè)多年,對這樣的積分茁彭,還是懵逼了总寒;不過一番查閱下來,發(fā)現(xiàn)可以通過泰勒展開理肺,然后積分成一個級數(shù)表達(dá)式摄闸;也就是并沒有簡單的解析表達(dá)式善镰,所以想全面地分析作者給出的公式,還是很困難年枕。
? ? ? ? 也有可能媳禁,作者就是想找到一個函數(shù)列,使得對于任意
都有
隨著
的增大而減小画切,從而達(dá)到“越久遠(yuǎn)的信息越不相關(guān)”這一目的即可竣稽;另外就是在實際中神經(jīng)網(wǎng)絡(luò)的背景下,最好保持函數(shù)在類似
這樣的小區(qū)間霍弹,所以作者提出的函數(shù)的確滿足需求毫别。至少目前,我自己驗證過的maxlen和d_model的都嚴(yán)格滿足條件典格。
? ? ? ? 不過岛宦,作者提出的這個函數(shù)列,有個現(xiàn)象(如下圖)所示耍缴;這是某個pos上的位置編碼的函數(shù)圖像砾肺,根據(jù)函數(shù)的性質(zhì),可知當(dāng)
時防嗡,震動的越厲害变汪。也就是在不同的維度,位置編碼的行為是相差甚遠(yuǎn)的蚁趁,加上這種非一致性的劇烈震動裙盾,這可能導(dǎo)致權(quán)重矩陣
的學(xué)習(xí)有負(fù)擔(dān),畢竟位置編碼被加到詞向量上去他嫡,而詞向量維度之間應(yīng)該不會有如此強(qiáng)烈的震動番官,另外就是我認(rèn)為神經(jīng)網(wǎng)絡(luò)對于學(xué)習(xí)這種畸形的函數(shù)是比較困難的。
? ? ? ? 所以徘熔,這是個好的位置編碼函數(shù)族嗎?至少我對這種維度之間非一致性的編碼還是抱有一點的懷疑淆党。不過酷师,說到sin和cos函數(shù),這讓我聯(lián)想到傅立葉級數(shù)中的正交函數(shù)系宁否,不過在那里討論的都是函數(shù)的正交關(guān)系(也就是不相關(guān)性)窒升;而這里要討論的是函數(shù)(編碼向量)之間的相關(guān)性缀遍,并且具有:a)相關(guān)度具有單調(diào)性慕匠,b)函數(shù)有界性。
? ??????我覺得普通的正弦波就有很好的性質(zhì)域醇;所以台谊,我嘗試著使用sinusoid函數(shù)系來滿足上面的條件蓉媳,但是我想要加上一個性質(zhì),就是維度之間的震動規(guī)律保持一致性锅铅。
? ? ? ? 由于酪呻,于是,我需要在很小的范圍內(nèi)找出一列函數(shù)盐须,使得它們滿足條件a)和b)玩荠,條件a)似乎不那么好滿足;我試著按照作者的公式贼邓,在角頻率
的范圍內(nèi)找合適的函數(shù)列
都沒有成功阶冈。
? ? ? ? 不過,我突然想起來塑径,按照函數(shù)的auto-correlation女坑,把周期函數(shù)沿著坐標(biāo)軸滑動時,函數(shù)的自相關(guān)不正是在周期點處最大嗎统舀?所以匆骗,我想到了只通過改變相位來改變相關(guān)度(但是只能在很小的范圍內(nèi)滑動),得到了下面的數(shù)據(jù):
我用的公式為:誉简,再次碉就,這個式子也是沒什么道理的,是我隨便捏出來的闷串;應(yīng)該要多調(diào)才能用铝噩;可惜目前手上沒有可以訓(xùn)練大模型的機(jī)器,無法驗證想法窿克,不管對錯骏庸,后面有機(jī)會再說吧。
? ? ? ? 另外年叮,對于展開式中的2具被,3兩項,到底扮演著什么角色只损,似乎不太清晰一姿。
是絕對位置n和m處的位置編碼,而
是詞向量:
1)首先跃惫,這里的位置編碼是不可學(xué)習(xí)的向量叮叹,而如果詞向量也使用預(yù)訓(xùn)練好的詞向量,并且是frozen的話爆存,那么這兩個八桿子打不著的向量進(jìn)行相似度計算蛉顽,似乎是沒道理的,應(yīng)該要去除該部分先较。
2)若位置編碼是不可學(xué)習(xí)的向量携冤,而詞向量時可以進(jìn)行微調(diào)的(或可學(xué)習(xí)的)悼粮,那么在訓(xùn)練的過程中,將詞向量在某種程度上與這樣畸形的位置編碼向量相融曾棕,會不會對詞向量造成破壞呢扣猫?
3)所以,從這點看翘地,沒準(zhǔn)使用學(xué)習(xí)到的位置編碼是更合理的申尤,我記得作者在論文中也提到過學(xué)習(xí)到的位置編碼,不過最終沒有使用衙耕,應(yīng)該是比較難訓(xùn)練瀑凝。
卷積網(wǎng)絡(luò)是如何得到位置編碼的?
? ? ? ? 假設(shè)我們使用卷積核大小為3臭杰,步長為2的卷積層對序列“ABCABCD”進(jìn)行運算粤咪,得到特征“f1,f2,f3”。我們來看看輸入序列的交換對結(jié)果的影響:
1)交換圖中藍(lán)色箭頭對應(yīng)的輸入:
? ? ? ? a)若這兩個向量不等(見下右圖)渴杆,則雖然卷積核參數(shù)一樣寥枝,但是輸入向量不一樣,交換動作磁奖,的確對f1和f2產(chǎn)生了影響囊拜,因此此時可以說卷積網(wǎng)絡(luò)對位置交換是敏感的;
? ? ? ? b)若這兩個向量相等(見下左圖)比搭,則由于卷積網(wǎng)絡(luò)的參數(shù)共享冠跷,可知該交換動作對特征f1和f2的值,沒有絲毫影響身诺;不過蜜托,由于輸入本來就是兩個一樣的字符,即便交換它們霉赡,也不會對整個序列(例如:句子)的產(chǎn)生絲毫影響橄务。
? ? ? ? 所以,此時可以說卷積網(wǎng)絡(luò)是對輸入位置敏感的穴亏。
2)當(dāng)輸入序列呈現(xiàn)如下圖的對稱性時,我們將第1組的3個輸入與第二組交換嗓化,從下左圖變?yōu)橄掠覉D棠涮;則原先特征f1=10,f2=20刺覆,現(xiàn)在變?yōu)閒1=20严肪,f2=10;此時,若仍使用卷積網(wǎng)絡(luò)里的Max-pooling層诬垂,則網(wǎng)絡(luò)對該交換保持不變;并且在pooling層以后將再也不可能恢復(fù)這樣的信息伦仍。
3)不過,一般的卷積網(wǎng)絡(luò)充蓝,最后會接上一個全連接網(wǎng)絡(luò)層Fully-connected隧枫,我認(rèn)為卷積網(wǎng)絡(luò)對位置的敏感性,大多是來自于這樣的全連接層谓苟,而卷積層本身是比較缺失位置敏感性的官脓;由于卷積核是共享的,即便產(chǎn)生圖(2)中的情況涝焙,最后還有全連接來進(jìn)行兜底卑笨,如下圖,由于黃色權(quán)重和藍(lán)色權(quán)重的不同仑撞,即便“f1,f2”作為集合是相同的赤兴,但是運算后的結(jié)果是不同的。
4)所以使用卷積網(wǎng)絡(luò)做一些語言層面的計算時沮翔,全連接是個好組件(除非任務(wù)本身不適合用全連接)陨帆,而Pooling層要小心地使用,根據(jù)具體情況具體分析采蚀。
循環(huán)網(wǎng)絡(luò)是如何得到位置編碼的疲牵?
我們以簡單的單層RNN為例,并且忽略激活函數(shù)榆鼠,和偏置項:
則將遞歸式進(jìn)行展開得:
令瑰步,并對
進(jìn)行特征分解
,
為標(biāo)準(zhǔn)正交矩陣璧眠,則有:
????????顯然缩焦,RNN是causal 的,我們無需對分析未來數(shù)據(jù)的影響责静;
? ? ? ? 其中袁滥,標(biāo)準(zhǔn)正交陣只是對
做了旋轉(zhuǎn),不改變
的模長灾螃,然后通過特征值
來對旋轉(zhuǎn)后的特征各個維度分別進(jìn)行不同比例的縮放题翻。假設(shè)特征值都是小于1的(因為網(wǎng)絡(luò)也不太可能學(xué)到距離越大越相關(guān)的事件,另外特征值小于1,只會使得網(wǎng)絡(luò)性能衰退嵌赠;而特征值大于1塑荒,則直接爆炸,使得訓(xùn)練失斀Α)齿税,可以看到在序列中,隨著距離當(dāng)前時間t越來越久遠(yuǎn)炊豪,輸入
被對應(yīng)的特征值削弱得越來越厲害凌箕。因此,在RNN中的確存在著指數(shù)級衰退的相關(guān)度词渤,所以RNN在一定范圍內(nèi)牵舱,對位置是敏感的。當(dāng)兩幀數(shù)據(jù)在RNN的位置敏感區(qū)域外交換缺虐,則RNN也會不感知芜壁。
(TODO)