用時鐘和地址秒懂 Transformer 位置編碼(positional encoding)
位置編碼借用了時鐘的概念:時、分、秒各自以不同的頻率轉動,組合起來就能標示出唯一的時刻。Transformer 用同樣的方法替每個字補上「順序」。
為何需要位置資訊?
RNN 按字的順序讀,天生就有字序;Attention 則是所有 token 同時互相看,「我打他」和「他打我」對它來說是同一包詞,分不出先後。
所以要在每個 token 的向量上加一個「位置標籤」,告訴模型它是第幾個字。
位置標籤像一串地址
地址由縣市、路名、門牌號碼組成。全台灣有很多戶 12 號,但「台北市中山北路 12 號」只有一個,組合起來才獨一無二。
而且隔壁鄰居只差門牌、路名和縣市都一樣,所以住得越近,地址越像,模型因此感覺得到距離。
用時鐘來看實際做法
向量裡每兩個維度是一根「指針」,各自以不同速度轉:前面的維度轉很快,像秒針;後面的維度轉很慢,像時針。
比起直接把字編號 1、2、3…,這樣做有兩個好處:
① 指針再怎麼轉都在錶面範圍內,就像 sin 和 cos 永遠介於 −1 到 1,數值不會越來越大而蓋過字本身的意思。
② 兩個位置的關係只取決於指針的夾角,就像台北和東京的手錶不管幾點都差一小時。模型因此能直接讀出兩個字隔了多遠。
如果是你,會用什麼生活中的東西來解釋位置編碼?