《十二時辰》教你直觀理解 Position-Encoding

TL;DR

  • paper中的位置編碼定義可以直觀理解為 "鐘表盤上每個針頭的位置坐標(biāo)"
  • 跟直接拿index作為位置編碼的方案相比祥国,這種定義有兩個優(yōu)點
    • 可以使用不含bias的線性變換來表征\Delta t飞蛹,從而便于模型attend到相對位置[1]
    • 各維度的周期互相交錯施戴,表征能力為其最小公倍數(shù);能對訓(xùn)練數(shù)據(jù)中從沒見過的更長位置信息加以編碼

問題由來

深度學(xué)習(xí)中有個著名的 Transformer模型 (2017年Google Brain發(fā)表那篇《Attention Is All You Need》[2]) ,其中有個設(shè)計得奇形怪狀的 “Position Encoding” 一直不太好理解

定義成下面這個樣子(一臉懵逼和悦,有木有……)

\begin{aligned} PE_{(pos,2i)} &= sin(pos/10000^{2i/d_{model}}) \\ PE_{(pos,2i+1)} &= cos(pos/10000^{2i/d_{model}}) \end{aligned}

關(guān)于這個 Position-Encoding的定義,有以下幾點疑惑:

  1. 這種復(fù)雜的定義渠缕,真的能編碼 位置信息嗎鸽素?
  2. 為啥不直接用下標(biāo),而是整個這么復(fù)雜的定義亦鳞?

巧的是馍忽,我昨晚看《長安十二時辰》的時候,聯(lián)想到“天干地支”燕差,
似乎對于這個定義有了 比較直觀的理解 遭笋;且待我與列位看官慢慢道來。

真能編碼位置信息

干支紀(jì)年

不妨回憶一下老祖宗的“天干地支”紀(jì)年法(類似兩個齒輪):

  • 以"十天干"(“甲徒探、乙瓦呼、丙、丁测暗、戊央串、己、庚碗啄、辛质和、壬、癸”)為 第一維度
  • 以"十二地支"(“子挫掏、丑侦另、寅、卯、辰褒傅、巳弃锐、午、未殿托、申霹菊、酉、戌支竹、亥”)為 第二維度
  • 兩個維度 綁定在一起 循環(huán)滾動旋廷,但是周期不同(分別為10/12)
    • e.g. (簡書的markdown-latex在移動端不支持中文字符,只好截圖如下)
    • 兩維度若獨立滾動礼搁,排列組合就是 10\times12=120 \neq 60 饶碘,與常識沖突

  • 表征能力是 兩個周期的最小公倍數(shù) lcm(10,12)=60

天干地支

(圖片來自網(wǎng)絡(luò) http://oraclebonescriptdiary.blogspot.com/2013/08/blog-post.html)

鐘表計時

類似的,看看機(jī)械鐘表的表盤

  • 這是機(jī)械鐘而非電子鐘馒吴,可以認(rèn)為 時針與分鐘的行程都是連續(xù)(而非離散)的
  • 忽略紀(jì)年和計時的區(qū)別扎运;時針與分針 類似與 天干和地支
    • 時針與分針 滾動速度(頻率)不同,前者快60倍
    • 頻率是周期的倒數(shù)饮戳,也可認(rèn)為兩者是 綁定在一起 滾動豪治,但是周期不同
  • 由于時針的周期恰好能被分針整除,故該鐘的表征能力 等于一根時針

機(jī)械鐘的盤面

(圖片來自京東 https://item.jd.com/54349670287.html)
(注:圖片僅用于研究目的扯罐,不帶貨哈)

單位圓上的點坐標(biāo)表征與旋轉(zhuǎn)

回顧一下高中數(shù)學(xué):

  • 單位圓上的任意點坐標(biāo)可以表達(dá)為 (x,y) = \left(\cos(\varphi), \sin(\varphi)\right) 的形式
  • 不同的周期類比于不同的表針 (時负拟、分、秒 ...) / 或者理解為 天干和地支
  • 任意一根表針的 針頭坐標(biāo)(x,y)旋轉(zhuǎn)\theta角歹河,皆可用 一個 2\times 2的 僅與 旋轉(zhuǎn)角度\theta有關(guān)掩浙、而與起點位置(x,y)無關(guān)的矩陣表達(dá)
    \left[\begin{array}{c}{x^{\prime}} \\ {y^{\prime}}\end{array}\right]=\left[\begin{array}{cc}{\cos \theta} & {-\sin \theta} \\ {\sin \theta} & {\cos \theta}\end{array}\right] *\left[\begin{array}{l}{x} \\ {y}\end{array}\right]
  • 多根表針的情況類似,用更大的矩陣可以表達(dá)

因此秸歧,時間"10:55"也可以(冗余)表達(dá)為
\begin{aligned} &\left(hour_x, hour_y, min_x, min_y \right) \\ = &\left( \cos\left(\frac{10}{12}\cdot 2\pi \right), \sin\left(\frac{10}{12}\cdot 2\pi \right), \cos\left(\frac{55}{60}\cdot 2\pi \right), \sin\left(\frac{55}{60}\cdot 2\pi \right) \right) \\ \triangleq &\left( \cos\left(\frac{10}{f_1}\right), \sin\left(\frac{10}{f_1}\right), \cos\left(\frac{55}{f_2}\right), \sin\left(\frac{55}{f_2}\right) \right) \\ \end{aligned}

Transformer模型中的位置編碼

再看看 Transformer模型中的 Position-Encoding 定義:

\begin{aligned} PE_{(pos,2i)} &= sin(pos/10000^{2i/d_{model}}) \\ PE_{(pos,2i+1)} &= cos(pos/10000^{2i/d_{model}}) \end{aligned}

其中

  • pos代表序列內(nèi)維度(第幾幀)
  • 2i/2i+1 分別代表PE的奇數(shù)/偶數(shù)維度(位置編碼向量的第幾維)
  • 從上述矩陣中切片某一列(viz. 固定列坐標(biāo)涣脚,只看PE的某一個維度),并將pos簡寫為t寥茫,得到下述列向量
    \begin{bmatrix} \sin\left(\frac{t}{f_1}\right)\\ \cos\left(\frac{t}{f_1}\right)\\ \sin\left(\frac{t}{f_2}\right)\\ \cos\left(\frac{t}{f_2}\right)\\ \vdots\\ \sin\left(\frac{t}{f_{\frac{d_\text{model}}{2}}}\right)\\ \cos\left(\frac{t}{f_{\frac{d_\text{model}}{2}}}\right) \end{bmatrix}

恰好就是在描述 d_{\text{model}}/2根針構(gòu)成的表盤上,各針頭的坐標(biāo)
顯然矾麻,每個針頭的坐標(biāo)都清楚了纱耻,自然有能力表征位置信息(甚至有點維度冗余)

整這么復(fù)雜的定義,有道理

上文說過险耀,表針的旋轉(zhuǎn)可以使用不含bias的矩陣來表達(dá)弄喘;復(fù)述如下:

  • 任意一根表針的 針頭坐標(biāo)(x,y)旋轉(zhuǎn)\theta角,皆可用 一個 2\times 2的 僅與 旋轉(zhuǎn)角度\theta有關(guān)甩牺、而與起點位置(x,y)無關(guān)的矩陣表達(dá)
    \left[\begin{array}{c}{x^{\prime}} \\ {y^{\prime}}\end{array}\right]=\left[\begin{array}{cc}{\cos \theta} & {-\sin \theta} \\ {\sin \theta} & {\cos \theta}\end{array}\right] *\left[\begin{array}{l}{x} \\ {y}\end{array}\right]
  • 多根表針的情況類似蘑志,用更大的矩陣可以表達(dá)

矩陣乘法本質(zhì)是線性變換,對應(yīng)于Dense層; 而 t_0 + \Delta t幀的位置向量可以表示為 t_0幀 的位置向量的線性變換(只需旋轉(zhuǎn),無需偏置 ; 詳見證明[3]).
這為模型捕捉單詞之間的相對位置關(guān)系提供了便利急但,使得模型能夠 方便地attend到相對時刻

思考 self-attention-layer 中 Q/K/V 的定義

  • 每一幀都是先做word_embedding("我是啥語義")澎媒,然后加上positional_embedding("我在哪一幀"),然后使用 K 矩陣做線性變換波桩,得到代表該幀作為key的向量. (Q/V 類似同理)
  • 解碼到t幀時戒努,對t-3幀的attent程度為 Q^T_{t} K_{t-3}; 是點積形式, 兩向量取值越接近,點積越大
  • QK分別都是 dense(word_embedding+positional_embedding) 的形式镐躲;若能在dense中學(xué)到rotate(-3)的關(guān)系储玫,即可使兩個向量非常接近,點積很大

反之萤皂,如果直接使用下標(biāo)作為位置的定義撒穷,
則"相對時間"的概念要通過 含有bias的"仿射變換(viz. 線性變換+平移)"才能表達(dá)

另外,如上文所述的“干支紀(jì)年法”類似裆熙;各個維度的周期不能整除端礼,可以表征的范式是各維度的最小公倍數(shù)。
這樣就能在inference時弛车,對訓(xùn)練數(shù)據(jù)中從沒見過的更長位置信息加以編碼

下面給出 MXNet中位置編碼的教學(xué)實現(xiàn)[4]齐媒;工程實現(xiàn)類似,參見 GitHub

class PositionalEncoding(nn.Block):
    def __init__(self, units, dropout, max_len=1000):
        super(PositionalEncoding, self).__init__()
        T = nd.arange(0, max_len).reshape((-1,1)) / nd.power(
            10000, nd.arange(0, units, 2)/units) # 臨時矩陣T
        self.P = nd.zeros((1, max_len, units)) # 注意P是常數(shù)矩陣纷跛,無需訓(xùn)練
        self.P[:, :, 0::2] = nd.sin(T) # 偶數(shù)下標(biāo)行 取sin
        self.P[:, :, 1::2] = nd.cos(T)
        self.dropout = nn.Dropout(dropout)

    def forward(self, X):
        # P是常數(shù)矩陣喻括,直接截取需要的形狀部分 然后與X相加即可
        X = X + self.P[:, :X.shape[1], :].as_in_context(X.context)
        return self.dropout(X)

尚存幾點疑惑

  1. 位置編碼為啥要跟語義向量add到一起,而非concat贫奠;上文中的旋轉(zhuǎn)矩陣作用到語義部分唬血,擔(dān)心會有副作用
  2. 相對位置可以表達(dá)為線性變換,憑啥就有利于模型學(xué)習(xí)唤崭? paper原文中語焉不詳拷恨,上述 K/Q/V的解釋只是我的一種猜想,也不能很嚴(yán)謹(jǐn)?shù)恼f服自己
  3. 更多歡迎留言討論

Reference


  1. "詳解Transformer (Attention Is All You Need)", 劉巖, 2018, https://zhuanlan.zhihu.com/p/48508221 ?

  2. Vaswani, Ashish, et al. "Attention is all you need." Advances in neural information processing systems. 2017. https://arxiv.org/abs/1706.03762 ?

  3. "Linear Relationships in the Transformer’s Positional Encoding" Timo Denk's Blog, Timo Denk, 2019, https://timodenk.com/blog/linear-relationships-in-the-transformers-positional-encoding/ ?

  4. "9.3 Transformer" Dive into Deep Learning, Mu Li, et al, http://en.d2l.ai/chapter_attention-mechanism/transformer.html ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谢肾,一起剝皮案震驚了整個濱河市腕侄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芦疏,老刑警劉巖冕杠,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酸茴,居然都是意外死亡分预,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門薪捍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笼痹,“玉大人配喳,你說我怎么就攤上這事〉矢桑” “怎么了晴裹?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纺座。 經(jīng)常有香客問我息拜,道長,這世上最難降的妖魔是什么净响? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任少欺,我火速辦了婚禮,結(jié)果婚禮上馋贤,老公的妹妹穿的比我還像新娘赞别。我一直安慰自己,他們只是感情好配乓,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布仿滔。 她就那樣靜靜地躺著,像睡著了一般犹芹。 火紅的嫁衣襯著肌膚如雪崎页。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天腰埂,我揣著相機(jī)與錄音飒焦,去河邊找鬼。 笑死屿笼,一個胖子當(dāng)著我的面吹牛牺荠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驴一,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼休雌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肝断?” 一聲冷哼從身側(cè)響起杈曲,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胸懈,沒想到半個月后鱼蝉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡箫荡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了渔隶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羔挡。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡洁奈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绞灼,到底是詐尸還是另有隱情利术,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布低矮,位于F島的核電站印叁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏军掂。R本人自食惡果不足惜轮蜕,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝗锥。 院中可真熱鬧跃洛,春花似錦、人聲如沸终议。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穴张。三九已至细燎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皂甘,已是汗流浹背玻驻。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留叮贩,地道東北人击狮。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像益老,于是被迫代替她去往敵國和親彪蓬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 如果不熟悉線性代數(shù)的概念捺萌,要去學(xué)習(xí)自然科學(xué)档冬,現(xiàn)在看來就和文盲差不多√掖浚”酷誓,然而“按照現(xiàn)行的國際標(biāo)準(zhǔn),線性代數(shù)是通過公...
    Drafei閱讀 1,540評論 0 3
  • 理解矩陣一:轉(zhuǎn)載自:http://blog.csdn.net/myan/article/details/64751...
    jiandanjinxin閱讀 1,535評論 1 15
  • 柿色的風(fēng)里 江南用纖柔的素手 剪出了明凈的秋季 落葉豐厚起來 飄逸在女孩純潔的額頭 仿佛弱水三千 江南的女孩 素面...
    馨香傾城閱讀 146評論 0 3
  • 無能為力态坦,我不喜歡這個詞盐数,但是它又經(jīng)常出現(xiàn)在我的生活中,我不喜歡這個詞又喜歡這個詞伞梯。 我們有時做事會發(fā)現(xiàn)自己玫氢,有心...
    閑洛閱讀 105評論 0 1
  • 蝶戀花·寒草 文/寒草 原創(chuàng)2009.09.10. 寒風(fēng)清影千行樹, 凄風(fēng)涼月帚屉, 云蔽江石兀。 苦草憐月月不度漾峡, ...
    寒草qiu_lixian閱讀 324評論 1 6