国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一文通透位置編碼:從標(biāo)準(zhǔn)位置編碼、旋轉(zhuǎn)位置編碼RoPE到ALiBi、LLaMA 2 Long

這篇具有很好參考價(jià)值的文章主要介紹了一文通透位置編碼:從標(biāo)準(zhǔn)位置編碼、旋轉(zhuǎn)位置編碼RoPE到ALiBi、LLaMA 2 Long。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

關(guān)于位置編碼和RoPE?

  1. 應(yīng)用廣泛,是很多大模型使用的一種位置編碼方式,包括且不限于LLaMA、baichuan、ChatGLM等等
  2. 我之前在本博客中的另外兩篇文章中有闡述過(guò)(一篇是關(guān)于LLaMA解讀的,一篇是關(guān)于transformer從零實(shí)現(xiàn)的),但自覺(jué)寫(xiě)的不是特別透徹好懂
    再后來(lái)在我參與主講的類ChatGPT微調(diào)實(shí)戰(zhàn)課中也有講過(guò),但有些學(xué)員依然反饋RoPE不是特別好理解

考慮到只要花足夠多的時(shí)間 心思 投入,沒(méi)有寫(xiě)不清楚的,講課更是如此,故為徹底解決這個(gè)位置編碼/RoPE的問(wèn)題,我把另外兩篇文章中關(guān)于位置編碼的內(nèi)容抽取出來(lái),并不斷深入、擴(kuò)展、深入,比如其中最關(guān)鍵的改進(jìn)是兩輪改進(jìn),一個(gè)12.16那天,一個(gè)12.21那天

  1. 12.16那天
    小的改進(jìn)是把“1.1 標(biāo)準(zhǔn)位置編碼的起源”中,關(guān)于i、2i、2i+1的一系列計(jì)算結(jié)果用表格規(guī)整了下
    如此,相比之前把一堆數(shù)字一堆,表格更加清晰、一目了然
    大的改進(jìn)是把“3.1.1 第一種形式的推導(dǎo)(通俗易懂版)”的細(xì)節(jié)重新梳理了以下,以更加一目了然、一看即懂,可能是全網(wǎng)關(guān)于RoPE最通俗細(xì)致的推導(dǎo)
  2. 12.21那天
    把RoPE的本質(zhì)給強(qiáng)調(diào)出來(lái)

最終成為本文

第一部分 transformer原始論文中的標(biāo)準(zhǔn)位置編碼

如此篇文章《Transformer通俗筆記:從Word2Vec、Seq2Seq逐步理解到GPT、BERT》所述,RNN的結(jié)構(gòu)包含了序列的時(shí)序信息,而Transformer卻完全把時(shí)序信息給丟掉了,比如“他欠我100萬(wàn)”,和“我欠他100萬(wàn)”,兩者的意思千差萬(wàn)別,故為了解決時(shí)序的問(wèn)題,Transformer的作者用了一個(gè)絕妙的辦法:位置編碼(Positional Encoding)

1.1 標(biāo)準(zhǔn)位置編碼的起源

即將每個(gè)位置編號(hào),從而每個(gè)編號(hào)對(duì)應(yīng)一個(gè)向量,最終通過(guò)結(jié)合位置向量和詞向量,作為輸入embedding,就給每個(gè)詞都引入了一定的位置信息,這樣Attention就可以分辨出不同位置的詞了,具體怎么做呢?

  1. 如果簡(jiǎn)單粗暴的話,直接給每個(gè)向量分配一個(gè)數(shù)字,比如1到1000之間
  2. 也可以用one-hot編碼表示位置

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

  3. transformer論文中作者通過(guò)sin函數(shù)和cos函數(shù)交替來(lái)創(chuàng)建 positional encoding,其計(jì)算positional encoding的公式如下

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

    其中,pos相當(dāng)于是每個(gè)token在整個(gè)序列中的位置,相當(dāng)于是0, 1, 2, 3...(看序列長(zhǎng)度是多大,比如10,比如100),代表位置向量的維度(也是詞embedding的維度,transformer論文中設(shè)置的512維)?

    至于是embedding向量的位置下標(biāo)對(duì)2求商并取整(可用雙斜杠表示整數(shù)除法,即求商并取整),它的取值范圍是,比如

    pos
    (0 2 4等偶數(shù)維用sin函數(shù)計(jì)算)
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    0 ?
    1 ?? transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式?
    2 ?
    3 transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式?
    4 ??
    5 transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    6
    ....
    510
    511 transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    相當(dāng)于
    是指向量維度中的偶數(shù)維,即第0維、第2維、第4維...,第510維,用sin函數(shù)計(jì)算
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式 是向量維度中的奇數(shù)維,即第1維、第3維、第5維..,第511維,用cos函數(shù)計(jì)算

不要小看transformer的這個(gè)位置編碼,不少做NLP多年的人也不一定對(duì)其中的細(xì)節(jié)有多深入,而網(wǎng)上大部分文章談到這個(gè)位置編碼時(shí)基本都是千篇一律、泛泛而談,很少有深入,故本文還是細(xì)致探討下

1.2 標(biāo)準(zhǔn)位置編碼的示例:多圖多舉例

考慮到一圖勝千言 一例勝萬(wàn)語(yǔ),舉個(gè)例子,當(dāng)我們要編碼「我 愛(ài) 你」的位置向量,假定每個(gè)token都具備512維,如果位置下標(biāo)從0開(kāi)始時(shí),則根據(jù)位置編碼的計(jì)算公式可得且為讓每個(gè)讀者閱讀本文時(shí)一目了然,我計(jì)算了每個(gè)單詞對(duì)應(yīng)的位置編碼示例(在此之前,這些示例在其他地方基本沒(méi)有)

  • 當(dāng)對(duì)上的單詞「我」進(jìn)行位置編碼時(shí),它本身的維度有512維
  • 當(dāng)對(duì)上的單詞「愛(ài)」進(jìn)行位置編碼時(shí),它本身的維度有512維

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

    ?然后再疊加上embedding向量,可得

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

  • 當(dāng)對(duì)上的單詞「你」進(jìn)行位置編碼時(shí),它本身的維度有512維
  • ....

最終得到的可視化效果如下圖所示

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

1.3 標(biāo)準(zhǔn)位置編碼的coding實(shí)現(xiàn)

代碼實(shí)現(xiàn)如下

“”“位置編碼的實(shí)現(xiàn),調(diào)用父類nn.Module的構(gòu)造函數(shù)”“”
class PositionalEncoding(nn.Module):
    def __init__(self, d_model, dropout, max_len=5000):
        super(PositionalEncoding, self).__init__()  
        self.dropout = nn.Dropout(p=dropout)  # 初始化dropout層
        
        # 計(jì)算位置編碼并將其存儲(chǔ)在pe張量中
        pe = torch.zeros(max_len, d_model)                # 創(chuàng)建一個(gè)max_len x d_model的全零張量
        position = torch.arange(0, max_len).unsqueeze(1)  # 生成0到max_len-1的整數(shù)序列,并添加一個(gè)維度
        # 計(jì)算div_term,用于縮放不同位置的正弦和余弦函數(shù)
        div_term = torch.exp(torch.arange(0, d_model, 2) *
                             -(math.log(10000.0) / d_model))

        # 使用正弦和余弦函數(shù)生成位置編碼,對(duì)于d_model的偶數(shù)索引,使用正弦函數(shù);對(duì)于奇數(shù)索引,使用余弦函數(shù)。
        pe[:, 0::2] = torch.sin(position * div_term)
        pe[:, 1::2] = torch.cos(position * div_term)
        pe = pe.unsqueeze(0)                  # 在第一個(gè)維度添加一個(gè)維度,以便進(jìn)行批處理
        self.register_buffer('pe', pe)        # 將位置編碼張量注冊(cè)為緩沖區(qū),以便在不同設(shè)備之間傳輸模型時(shí)保持其狀態(tài)
        
    # 定義前向傳播函數(shù)
    def forward(self, x):
        # 將輸入x與對(duì)應(yīng)的位置編碼相加
        x = x + Variable(self.pe[:, :x.size(1)], 
                         requires_grad=False)
        # 應(yīng)用dropout層并返回結(jié)果
        return self.dropout(x)

本文發(fā)布之后,有同學(xué)留言問(wèn),上面中的第11行、12行代碼

div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model))

為什么先轉(zhuǎn)換為了等價(jià)的指數(shù)+對(duì)數(shù)運(yùn)算,而不是直接冪運(yùn)算?是效率、精度方面有差異嗎?

這里使用指數(shù)和對(duì)數(shù)運(yùn)算的原因是為了確保數(shù)值穩(wěn)定性和計(jì)算效率

  • 一方面,直接使用冪運(yùn)算可能會(huì)導(dǎo)致數(shù)值上溢或下溢。當(dāng)d_model較大時(shí),10000.0 ** (-i / d_model)中的冪可能會(huì)變得非常小,以至于在數(shù)值計(jì)算中產(chǎn)生下溢。通過(guò)將其轉(zhuǎn)換為指數(shù)和對(duì)數(shù)運(yùn)算,可以避免這種情況,因?yàn)檫@樣可以在計(jì)算過(guò)程中保持更好的數(shù)值范圍
  • 二方面,在許多計(jì)算設(shè)備和庫(kù)中,指數(shù)和對(duì)數(shù)運(yùn)算的實(shí)現(xiàn)通常比冪運(yùn)算更快。這主要是因?yàn)橹笖?shù)和對(duì)數(shù)運(yùn)算在底層硬件和軟件中有特定的優(yōu)化實(shí)現(xiàn),而冪運(yùn)算通常需要計(jì)算更多的中間值

所以,使用指數(shù)和對(duì)數(shù)運(yùn)算可以在保持?jǐn)?shù)值穩(wěn)定性的同時(shí)提高計(jì)算效率。

既然提到了這行代碼,我們干脆就再講更細(xì)致些,上面那行代碼對(duì)應(yīng)的公式為

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

其中的中括號(hào)對(duì)應(yīng)的是一個(gè)從 0 到 的等差數(shù)列(步長(zhǎng)為 2),設(shè)為

且上述公式與這個(gè)公式是等價(jià)的

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

為何,原因在于,從而有

?最終,再通過(guò)下面這兩行代碼完美實(shí)現(xiàn)位置編碼

        # 使用正弦和余弦函數(shù)生成位置編碼,對(duì)于d_model的偶數(shù)索引,使用正弦函數(shù);對(duì)于奇數(shù)索引,使用余弦函數(shù)。
        pe[:, 0::2] = torch.sin(position * div_term)
        pe[:, 1::2] = torch.cos(position * div_term)

第二部分 從復(fù)數(shù)到歐拉公式

先復(fù)習(xí)下復(fù)數(shù)的一些關(guān)鍵概念

  1. 我們一般用transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式表示復(fù)數(shù),實(shí)數(shù)?叫做復(fù)數(shù)的實(shí)部,實(shí)數(shù)?叫做復(fù)數(shù)的虛部

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

  2. 復(fù)數(shù)的輻角是指復(fù)數(shù)在復(fù)平面上對(duì)應(yīng)的向量和正向?qū)崝?shù)軸所成的有向角

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

  3. transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式的共軛復(fù)數(shù)定義為:,也可記作,復(fù)數(shù)與其共軛的乘積等于它的模的平方,即transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式,這是一個(gè)實(shí)數(shù)

2.1 如何通俗易懂的理解復(fù)數(shù)

在我們的日常生活中,經(jīng)常會(huì)遇到各種平移運(yùn)動(dòng),為了描述這些平移運(yùn)動(dòng),數(shù)學(xué)上定義了加減乘除,然還有一類運(yùn)動(dòng)是旋轉(zhuǎn)運(yùn)動(dòng),而加減乘除無(wú)法去描述旋轉(zhuǎn)運(yùn)動(dòng),而有了復(fù)數(shù)之后,便不一樣了,此話怎講?

根據(jù)復(fù)數(shù)的定義:,可以看出來(lái):,而這個(gè)展開(kāi)過(guò)程就揭示了虛數(shù)??背后的本質(zhì),因?yàn)檫@個(gè)展開(kāi)過(guò)程中的兩次乘法可以看成連續(xù)的操作

  • 即把 1 經(jīng)過(guò)2次完全一樣的操作:,變成了 ?1?,那什么樣的操作能得到這個(gè)效果呢?
  • 你兩眼一亮,直呼:旋轉(zhuǎn)啊,先旋轉(zhuǎn)?90度,再旋轉(zhuǎn)?90 度就可以了啊,如下圖所示

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

so,?就代表了旋轉(zhuǎn)(至此,可能你已經(jīng)隱隱約約意識(shí)到,為何我們?cè)诮忉屝D(zhuǎn)位置編碼時(shí),為何要扯上復(fù)數(shù)了),為形象說(shuō)明,再舉兩個(gè)例子

  • 比如對(duì)于transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式,自然數(shù) 1,繞坐標(biāo)中心旋轉(zhuǎn)180度(),再平移1 ,就回到坐標(biāo)原點(diǎn)
  • 再比如對(duì)于transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

2.2 如何快速理解歐拉公式

2.2.1 什么是歐拉公式

當(dāng) 表示任意實(shí)數(shù), 是自然對(duì)數(shù)的底數(shù), 是復(fù)數(shù)中的虛數(shù)單位,則根據(jù)歐拉公式有

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

表達(dá)的含義在于該指數(shù)函數(shù)可以表示為實(shí)部為,虛部為的一個(gè)復(fù)數(shù)

該歐拉公式相當(dāng)于建立了指數(shù)函數(shù)、三角函數(shù)和復(fù)數(shù)之間的橋梁,但怎么推導(dǎo)出來(lái)的呢,其實(shí)很簡(jiǎn)單

  1. 由于有

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

  2. 所以,如果?,則有

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

2.2.2 歐拉公式與三角函數(shù)

如何直觀的理解這個(gè)歐拉公式呢?

其實(shí),可以把看作通過(guò)單位圓的圓周運(yùn)動(dòng)來(lái)描述單位圓上的點(diǎn),transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式通過(guò)復(fù)平面的坐標(biāo)來(lái)描述單位圓上的點(diǎn),是同一個(gè)點(diǎn)不同的描述方式,所以有transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式,如下圖所示

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

根據(jù)歐拉公式transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式,可以輕易推出:

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

我們把復(fù)數(shù)當(dāng)作向量來(lái)看待,復(fù)數(shù)的實(shí)部是方向,虛部是方向,很容易觀察出其幾何意義,如下圖所示

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

還在思考怎么得來(lái)的?很簡(jiǎn)單哦,還記得向量的加減法么?

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

第三部分?旋轉(zhuǎn)位置編碼(RoPE)的推導(dǎo)與實(shí)現(xiàn)

3.1 旋轉(zhuǎn)位置編碼的原理與推導(dǎo)

所謂旋轉(zhuǎn)位置編碼,其在位置編碼上刪除了絕對(duì)位置嵌入,而在網(wǎng)絡(luò)的每一層增加了蘇劍林等人(2021)提出的旋轉(zhuǎn)位置嵌入(RoPE),其思想是采用絕對(duì)位置編碼的形式 實(shí)現(xiàn)相對(duì)位置編碼,且RoPE主要借助了復(fù)數(shù)的思想

具體來(lái)說(shuō),當(dāng)咱們給self-attention中的向量都加入了位置信息后,便可以表示為

其中

  • 表示「第? 個(gè) token 對(duì)應(yīng)的詞向量??」集成「位置信息??」之后的 query 向量
  • 而?、??則分別表示第??個(gè) token 對(duì)應(yīng)的詞向量??集成位置信息??之后的 key 向量、?value 向量

3.1.1 第一種形式的推導(dǎo)(可能是全網(wǎng)最通俗易懂版)

接著論文中提出為了能利用上 token 之間的相對(duì)位置信息,假定 query 向量??和 key 向量??之間的內(nèi)積操作可以被一個(gè)函數(shù)??表示,該函數(shù)??的輸入是詞嵌入向量?、?,和它們之間的相對(duì)位置?:

這里面其實(shí)有很大的一個(gè)關(guān)鍵,但大部分資料甚至RoPE原始論文都不會(huì)給你特別強(qiáng)調(diào)出來(lái),即為何要構(gòu)造這么一個(gè)等式呢?

  • 原因在于左邊算是q和k向量的內(nèi)積,而這恰好是transformer計(jì)算自注意力機(jī)制的核心一步,右邊等式則意味著m與n的相對(duì)位置
    如此一來(lái),該等式便把“q和k的內(nèi)積”與“它們的相對(duì)位置”給串起來(lái)了
  • 也如阿荀所說(shuō),左邊是含有各自絕對(duì)位置信息的q向量和k向量,而這個(gè)等式就是RoPE追求的目標(biāo),物理含義就是通過(guò)顯式傳入絕對(duì)位置信息實(shí)現(xiàn)與傳入相對(duì)位置信息對(duì)等的情況

假定現(xiàn)在詞嵌入向量的維度是兩維? ,然后RoPE利用2維度平面上的向量的幾何性質(zhì),再結(jié)合復(fù)數(shù)的性質(zhì),神奇般的找到了滿足上述等式的??和??,其形式如下:

這里面的 Re 表示復(fù)數(shù)的實(shí)部

  • 進(jìn)一步地,?可以表示成下面的式子(如果此刻你覺(jué)得你有點(diǎn)懵,沒(méi)事,下文馬上會(huì)一步一步的詳細(xì)推導(dǎo)):
  • 看到這里會(huì)發(fā)現(xiàn),這不就是 query 向量乘以了一個(gè)旋轉(zhuǎn)矩陣嗎?這就是為什么叫做旋轉(zhuǎn)位置編碼的原因
    同理,? 可以表示成下面的式子:
  • 最終可以表示如下:

然上述分別關(guān)于、、的三個(gè)式子,咋一步一步推導(dǎo)來(lái)的?為做細(xì)致說(shuō)明,特參考此文一步一步解釋下


首先看第一個(gè)式子,對(duì)于,這個(gè)式子的右邊項(xiàng)有兩部分,一部分是、一部分是

  1. 對(duì)于前者,可知其中的是個(gè)二維矩陣,是個(gè)二維向量,自然相乘的結(jié)果也必然是一個(gè)二維向量,用表示
  2. 對(duì)于后者,根據(jù)歐拉公式transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式,可得
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    ?
  3. 基于上面第1點(diǎn)結(jié)論,可知

    然后將表示成復(fù)數(shù)形式,可得
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    從而有
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

    基于上面第2點(diǎn)結(jié)論,可知即是兩個(gè)復(fù)數(shù)相乘
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
  4. 考慮到以下兩個(gè)關(guān)于復(fù)數(shù)的背景知識(shí)
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式


    可得
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

    將這個(gè)結(jié)果表達(dá)成實(shí)數(shù)向量形式,即是
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

    至此,你也就不難發(fā)現(xiàn),這不就是query向量乘以了一個(gè)旋轉(zhuǎn)矩陣
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

至于第二個(gè)式子,根據(jù)上述過(guò)程同理,可得key向量

  • transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

最后第三個(gè)式子,函數(shù)g,則可得

其中,表示一個(gè)復(fù)數(shù)的實(shí)數(shù)部分,而則表示復(fù)數(shù)的共軛

  1. 考慮到
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    再結(jié)合上面第一個(gè)式子中的推導(dǎo),可得
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    繼續(xù)結(jié)合上面第一個(gè)式子中的推導(dǎo)(比如transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式,及),繼續(xù)可知,我們現(xiàn)在要證明的是存在
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
  2. 總之,接下來(lái)我們就要證明上述函數(shù) g 的計(jì)算公式是成立的
    首先,回顧一下attention操作,位置m的query和位置n的key會(huì)做一個(gè)內(nèi)積操作
    即由
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    可得
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    相當(dāng)于[A,B]與[C,D]做內(nèi)積,則相當(dāng)于A B橫著,C D豎著,最終結(jié)果為AC BD,最后再把括號(hào)里的項(xiàng)全部對(duì)應(yīng)相乘、展開(kāi)
  3. 首先,把上面第二點(diǎn)的式子整理一下,總計(jì)8項(xiàng),為了把相關(guān)的項(xiàng)提取出來(lái),第1項(xiàng) 8項(xiàng)合并處理、第2項(xiàng) 7項(xiàng)合并處理、第3項(xiàng) 6項(xiàng)合并處理、第4項(xiàng) 5項(xiàng)合并處理
    其次,考慮到
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    最后,再把相關(guān)項(xiàng)的特點(diǎn),兩次調(diào)整下順序即可

    依據(jù)以上三點(diǎn),從而有
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

    完美! 如此,也就證明了,位置 m 的 query 和位置 n 的 key 的內(nèi)積就是函數(shù) g

    最后,把上面的式子一、式子二的最終結(jié)果都分別用矩陣向量乘的形式來(lái)表達(dá)就是:

    接下來(lái),我們要計(jì)算兩個(gè)旋轉(zhuǎn)矩陣的乘積,即中間部分的這個(gè)式子

    展開(kāi)之后,可得

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

    從而有

上面都還只是針對(duì)詞嵌入維度為2的情況,那對(duì)于的通用情況呢,將2維推廣到任意維度,可以表示如下:

內(nèi)積滿足線性疊加性,因此任意偶數(shù)維的RoPE,我們都可以表示為二維情形的拼接,即將詞嵌入向量元素按照兩兩一組分組

每組應(yīng)用同樣的旋轉(zhuǎn)操作且每組的旋轉(zhuǎn)角度計(jì)算方式如下:

所以簡(jiǎn)單來(lái)說(shuō) RoPE 的 self-attention 操作的流程是

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

  1. 對(duì)于 token 序列中的每個(gè)詞嵌入向量,首先計(jì)算其對(duì)應(yīng)的 query 和 key 向量
  2. 然后對(duì)每個(gè) token 位置都計(jì)算對(duì)應(yīng)的旋轉(zhuǎn)位置編碼
  3. 接著對(duì)每個(gè) token 位置的 query 和 key 向量的元素按照 兩兩一組 應(yīng)用旋轉(zhuǎn)變換
  4. 最后再計(jì)算 query 和 key 之間的內(nèi)積得到 self-attention 的計(jì)算結(jié)果

3.1.2 第二種形式的推導(dǎo)(蘇劍林版)

與上面第一種形式的推導(dǎo)類似,為了引入復(fù)數(shù),首先假設(shè)了在加入位置信息之前,原有的編碼向量是二維行向量和,其中和是絕對(duì)位置,現(xiàn)在需要構(gòu)造一個(gè)變換,將和引入到和中,即尋找變換:?

也就是說(shuō),我們分別為、設(shè)計(jì)操作、,使得經(jīng)過(guò)該操作后,、就帶有了位置、的絕對(duì)位置信息
考慮到Attention的核心計(jì)算是內(nèi)積:

故我們希望的內(nèi)積的結(jié)果帶有相對(duì)位置信息,即尋求的這個(gè)變換,應(yīng)該具有特性:

怎么理解?很簡(jiǎn)單,當(dāng)m和n表示了絕對(duì)位置之后,m與n在句子中的距離即位置差m-n,就可以表示為相對(duì)位置了,且對(duì)于復(fù)數(shù),內(nèi)積通常定義為一個(gè)復(fù)數(shù)與另一個(gè)復(fù)數(shù)的共軛的乘積」

  1. 為合理的求出該恒等式的一個(gè)盡可能簡(jiǎn)單的解,可以設(shè)定一些初始條件,比如、,然后可以先考慮二維情形,然后借助復(fù)數(shù)來(lái)求解
    在復(fù)數(shù)中有,表示取實(shí)部的操作(復(fù)數(shù) 和“ 復(fù)數(shù) 的共軛即?”之積仍是一個(gè)復(fù)數(shù))
    因論文100課的群里有學(xué)員對(duì)該點(diǎn)存在疑問(wèn),故借用七月黃老師的回復(fù)補(bǔ)充下:這個(gè)等式和復(fù)數(shù)乘法和向量乘積的聯(lián)系有關(guān)
    考慮兩個(gè)復(fù)數(shù)
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式,的共軛是
    一方面,對(duì)于等式的右邊項(xiàng)而言
    q和k*的乘積是 transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    這個(gè)結(jié)果的實(shí)部是 transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    二方面,對(duì)于等式的左邊項(xiàng)而言
    其對(duì)應(yīng)于對(duì)應(yīng)的實(shí)數(shù)向量和對(duì)應(yīng)的實(shí)數(shù)向量的乘積
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    綜合以上兩點(diǎn),可知右邊項(xiàng)所表示的“復(fù)數(shù)q和復(fù)數(shù)k的共軛k*的乘積”,和左邊項(xiàng)做表示的“q、k所對(duì)應(yīng)向量的乘積”是一樣的


    總之,我們需要尋找一種變換,使得
  2. 簡(jiǎn)單起見(jiàn),我們假設(shè)存在復(fù)數(shù),使得,然后我們用復(fù)數(shù)的指數(shù)形式,設(shè)
  3. 那么代入方程后就得到兩個(gè)方程
    方程1:
    方程2:Θf(q,m)?Θf(k,n) = Θg(q,k,m?n)

    ? 對(duì)于方程1,代入得到(接著,再把和都設(shè)為0)

    最后一個(gè)等號(hào)源于初始條件和,所以現(xiàn)在我們可以很簡(jiǎn)單地設(shè),,即它不依賴于

    ? 至于方程2,同樣代入得到
    Θf(q,m)?Θf(k,m) = Θg(q,k,0) = Θf(q,0)?Θf(k,0) = Θ(q)?Θ(k)

    這里的、是、本身的幅角,而最后一個(gè)等號(hào)同樣源于初始條件
    根據(jù)上式Θf(q,m)?Θf(k,m) = Θ(q)?Θ(k),可得Θf(q,m)?Θ(q)=Θf(k,m)?Θ(k),所以Θf(q,m)?Θ(q)的結(jié)果是一個(gè)只與m相關(guān)、跟q無(wú)關(guān)的函數(shù),記為φ(m),即Θf(q,m)=Θ(q)+φ(m)
  4. 接著令n=m?1代入Θf(q,m)?Θf(k,n) = Θg(q,k,m?n),可以得到 Θf(q,m)?Θf(k,m-1) = Θg(q,k,1)
    然后將 Θf(q,m) 和 Θf(k,m-1) 的等式代入Θf(q,m)=Θ(q)+φ(m),我們可以得到 Θ(q) + φ(m) - (Θ(k) + φ(m-1)) = Θg(q,k,1),整理一下就得到
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    即{φ(m)}是等差數(shù)列,設(shè)右端為θ,那么就解得φ(m)=mθ

    綜上,我們得到二維情況下用復(fù)數(shù)表示的RoPE:
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
  5. 所以說(shuō),尋求的變換就是,也就是給乘以,相應(yīng)地,乘以
    做了這樣一個(gè)變換之后,根據(jù)復(fù)數(shù)的特性,有: 也就是,如果把二維向量看做復(fù)數(shù),那么它們的內(nèi)積,等于一個(gè)復(fù)數(shù)乘以另一個(gè)復(fù)數(shù)的共軛,得到的結(jié)果再取實(shí)部,代入上面的變換,也就有: 這樣一來(lái),內(nèi)積的結(jié)果就只依賴于,也就是相對(duì)位置了
    換言之,經(jīng)過(guò)這樣一番操作,通過(guò)給Embedding添加絕對(duì)位置信息,可以使得兩個(gè)token的編碼,經(jīng)過(guò)內(nèi)積變換(self-attn)之后,得到結(jié)果是受它們位置的差值,即相對(duì)位置影響的

于是,對(duì)于任意的位置為的二維向量,把它看做復(fù)數(shù),乘以,而根據(jù)歐拉公式,有:

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

從而上述的相乘變換也就變成了(過(guò)程中注意:):

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

把上述式子寫(xiě)成矩陣形式:

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

而這個(gè)變換的幾何意義,就是在二維坐標(biāo)系下,對(duì)向量進(jìn)行了旋轉(zhuǎn),因而這種位置編碼方法,被稱為旋轉(zhuǎn)位置編碼

根據(jù)剛才的結(jié)論,結(jié)合內(nèi)積的線性疊加性,可以將結(jié)論推廣到高維的情形??梢岳斫鉃椋?jī)蓚€(gè)維度一組,進(jìn)行了上述的“旋轉(zhuǎn)”操作,然后再拼接在一起:

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

由于矩陣的稀疏性,會(huì)造成計(jì)算上的浪費(fèi),所以在計(jì)算時(shí)采用逐位相乘再相加的方式進(jìn)行:

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

其中為矩陣逐位相乘操作

3.2 旋轉(zhuǎn)位置編碼的coding實(shí)現(xiàn)(分非LLaMA版和LLaMA版兩種)

原理理解了,接下來(lái)可以代碼實(shí)現(xiàn)旋轉(zhuǎn)位置編碼,考慮到LLaMA本身的實(shí)現(xiàn)不是特別好理解,所以我們先通過(guò)一份非LLaMA實(shí)現(xiàn)的版本,最后再看下LLaMA實(shí)現(xiàn)的版本

對(duì)于,非LLaMA版的實(shí)現(xiàn),其核心就是實(shí)現(xiàn)下面這三個(gè)函數(shù) (再次強(qiáng)調(diào),本份關(guān)于RoPE的非LLaMA版的實(shí)現(xiàn) 與上面和之后的代碼并非一體的,僅為方便理解RoPE的實(shí)現(xiàn))

3.2.1 非LLaMA版的實(shí)現(xiàn)

3.2.1.1 sinusoidal_position_embedding的編碼實(shí)現(xiàn)

sinusoidal_position_embedding:這個(gè)函數(shù)用來(lái)生成正弦形狀的位置編碼。這種編碼用來(lái)在序列中的令牌中添加關(guān)于相對(duì)或絕對(duì)位置的信息

def sinusoidal_position_embedding(batch_size, nums_head, max_len, output_dim, device):
    # (max_len, 1)
    position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(-1)

    # (output_dim//2)
    # 即公式里的i, i的范圍是 [0,d/2]
    ids = torch.arange(0, output_dim // 2, dtype=torch.float)  
    theta = torch.pow(10000, -2 * ids / output_dim)

    # (max_len, output_dim//2)
    # 即公式里的:pos / (10000^(2i/d))
    embeddings = position * theta 

    # (max_len, output_dim//2, 2)
    embeddings = torch.stack([torch.sin(embeddings), torch.cos(embeddings)], dim=-1)

    # (bs, head, max_len, output_dim//2, 2)
    # 在bs維度重復(fù),其他維度都是1不重復(fù)
    embeddings = embeddings.repeat((batch_size, nums_head, *([1] * len(embeddings.shape))))  

    # (bs, head, max_len, output_dim)
    # reshape后就是:偶數(shù)sin, 奇數(shù)cos了
    embeddings = torch.reshape(embeddings, (batch_size, nums_head, max_len, output_dim))
    embeddings = embeddings.to(device)
    return embeddings

一般的文章可能解釋道這個(gè)程度基本就over了,但為了讓初學(xué)者一目了然計(jì),我還是再通過(guò)一個(gè)完整的示例,來(lái)一步步說(shuō)明上述各個(gè)步驟都是怎么逐一結(jié)算的,整個(gè)過(guò)程和之前此文里介紹過(guò)的transformer的位置編碼本質(zhì)上是一回事..

為方便和transformer的位置編碼做對(duì)比,故這里也假定output_dim = 512

  1. 首先,我們有 ids 張量,當(dāng) output_dim 為 512 時(shí),則

    ,
    ,transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    ,
    ,transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    ,
    ,transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    ...

    ,transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    ids = [0,0, 1,1, 2,2, ..., 254,254, 255,255]

    然后我們有一個(gè)基數(shù)為10000的指數(shù)運(yùn)算,使用了公式 torch.pow(10000, -2 * ids / output_dim)
  2. 執(zhí)行 embeddings = position * theta 這行代碼,它會(huì)將 position 的每個(gè)元素與 theta 的相應(yīng)元素相乘,前三個(gè)元素為

  3. 接下來(lái)我們將對(duì) embeddings 的每個(gè)元素應(yīng)用 torch.sin 和 torch.cos 函數(shù)
    對(duì)于 torch.sin(embeddings),我們將取 embeddings 中的每個(gè)元素的正弦值:



    對(duì)于 torch.cos(embeddings),我們將取 embeddings 中的每個(gè)元素的余弦值:



    最后,torch.stack([torch.sin(embeddings), torch.cos(embeddings)], dim=-1) 將這兩個(gè)新的張量沿著一個(gè)新的維度堆疊起來(lái),得到的 embeddings如下
  4. 最終,得到如下結(jié)果
    [
      [
        [
          [sin(\frac{0}{10000^{\frac{0}{512}}}), cos(\frac{0}{10000^{\frac{0}{512}}}), sin(\frac{0}{10000^{\frac{2}{512}}}), cos(\frac{0}{10000^{\frac{2}{512}}}), ..., cos(\frac{0}{10000^{\frac{510}{512}}})],
          [sin(\frac{1}{10000^{\frac{0}{512}}}), cos(\frac{1}{10000^{\frac{0}{512}}}), sin(\frac{1}{10000^{\frac{2}{512}}}), cos(\frac{1}{10000^{\frac{2}{512}}}), ..., cos(\frac{1}{10000^{\frac{510}{512}}})],
          [sin(\frac{2}{10000^{\frac{0}{512}}}), cos(\frac{2}{10000^{\frac{0}{512}}}), sin(\frac{2}{10000^{\frac{2}{512}}}), cos(\frac{2}{10000^{\frac{2}{512}}}), ..., cos(\frac{2}{10000^{\frac{510}{512}}})]
        ]
      ]
    ]
3.2.1.2 RoPE的編碼實(shí)現(xiàn)

RoPE:這個(gè)函數(shù)將相對(duì)位置編碼(RoPE)應(yīng)用到注意力機(jī)制中的查詢和鍵上。這樣,模型就可以根據(jù)相對(duì)位置關(guān)注不同的位置

import torch
import torch.nn as nn
import torch.nn.functional as F
import math


def RoPE(q, k):
    # q,k: (bs, head, max_len, output_dim)
    batch_size = q.shape[0]
    nums_head = q.shape[1]
    max_len = q.shape[2]
    output_dim = q.shape[-1]

    # (bs, head, max_len, output_dim)
    pos_emb = sinusoidal_position_embedding(batch_size, nums_head, max_len, output_dim, q.device)


    # cos_pos,sin_pos: (bs, head, max_len, output_dim)
    # 看rope公式可知,相鄰cos,sin之間是相同的,所以復(fù)制一遍。如(1,2,3)變成(1,1,2,2,3,3)
    cos_pos = pos_emb[...,  1::2].repeat_interleave(2, dim=-1)  # 將奇數(shù)列信息抽取出來(lái)也就是cos 拿出來(lái)并復(fù)制
    sin_pos = pos_emb[..., ::2].repeat_interleave(2, dim=-1)  # 將偶數(shù)列信息抽取出來(lái)也就是sin 拿出來(lái)并復(fù)制

    # q,k: (bs, head, max_len, output_dim)
    q2 = torch.stack([-q[..., 1::2], q[..., ::2]], dim=-1)
    q2 = q2.reshape(q.shape)  # reshape后就是正負(fù)交替了

    # 更新qw, *對(duì)應(yīng)位置相乘
    q = q * cos_pos + q2 * sin_pos

    k2 = torch.stack([-k[..., 1::2], k[..., ::2]], dim=-1)
    k2 = k2.reshape(k.shape)
    # 更新kw, *對(duì)應(yīng)位置相乘
    k = k * cos_pos + k2 * sin_pos

    return q, k

老規(guī)矩,為一目了然起見(jiàn),還是一步一步通過(guò)一個(gè)示例來(lái)加深理解

  1. sinusoidal_position_embedding函數(shù)生成位置嵌入。在output_dim=512的情況下,每個(gè)位置的嵌入會(huì)有512個(gè)維度,但為了簡(jiǎn)單起見(jiàn),我們只考慮前8個(gè)維度,前4個(gè)維度為sin編碼,后4個(gè)維度為cos編碼。所以,我們可能得到類似以下的位置嵌入
    # 注意,這只是一個(gè)簡(jiǎn)化的例子,真實(shí)的位置嵌入的值會(huì)有所不同。
    pos_emb = torch.tensor([[[[0.0000, 0.8415, 0.9093, 0.1411, 1.0000, 0.5403, -0.4161, -0.9900],
                              [0.8415, 0.5403, 0.1411, -0.7568, 0.5403, -0.8415, -0.9900, -0.6536],
                              [0.9093, -0.4161, -0.8415, -0.9589, -0.4161, -0.9093, -0.6536, 0.2836]]]])
  2. 然后,我們提取出所有的sin位置編碼和cos位置編碼,并在最后一個(gè)維度上每個(gè)位置編碼進(jìn)行復(fù)制
    sin_pos = pos_emb[..., ::2].repeat_interleave(2, dim=-1)  # 提取出所有sin編碼,并在最后一個(gè)維度上復(fù)制
    cos_pos = pos_emb[..., 1::2].repeat_interleave(2, dim=-1)  # 提取出所有cos編碼,并在最后一個(gè)維度上復(fù)制
  3. 更新query向量
    我們首先構(gòu)建一個(gè)新的q2向量,這個(gè)向量是由原來(lái)向量的負(fù)的cos部分和sin部分交替拼接而成的
    我們用cos_pos對(duì)q進(jìn)行元素級(jí)乘法,用sin_pos對(duì)q2進(jìn)行元素級(jí)乘法,并將兩者相加得到新的query向量
    q2 = torch.stack([-q[..., 1::2], q[..., ::2]], dim=-1).flatten(start_dim=-2)
    # q2: tensor([[[[-0.2,  0.1, -0.4,  0.3, -0.6,  0.5, -0.8,  0.7],
    #               [-1.0,  0.9, -1.2,  1.1, -1.4,  1.3, -1.6,  1.5],
    #               [-1.8,  1.7, -2.0,  1.9, -2.2,  2.1, -2.4,  2.3]]]])
    
    q = q * cos_pos + q2 * sin_pos
    公式表示如下

    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

  4. ?????更新key向量
    對(duì)于key向量,我們的處理方法與query向量類似
    k2 = torch.stack([-k[..., 1::2], k[..., ::2]], dim=-1).flatten(start_dim=-2)
    # k2: tensor([[[[-0.15,  0.05, -0.35,  0.25, -0.55,  0.45, -0.75,  0.65
3.2.1.3 attention的編碼實(shí)現(xiàn)

attention:這是注意力機(jī)制的主要功能

  • 首先,如果use_RoPE被設(shè)置為T(mén)rue,它會(huì)應(yīng)用RoPE,通過(guò)取查詢和鍵的點(diǎn)積(并進(jìn)行縮放)
  • 然后,進(jìn)行softmax操作來(lái)計(jì)算注意力分?jǐn)?shù),以得到概率,輸出是值的加權(quán)和,權(quán)重是計(jì)算出的概率
  • 最后,旋轉(zhuǎn)后的q和k計(jì)算點(diǎn)積注意力后,自然就具備了相對(duì)位置信息
def attention(q, k, v, mask=None, dropout=None, use_RoPE=True):
    # q.shape: (bs, head, seq_len, dk)
    # k.shape: (bs, head, seq_len, dk)
    # v.shape: (bs, head, seq_len, dk)

    if use_RoPE:
        # 使用RoPE進(jìn)行位置編碼
        q, k = RoPE(q, k)

    d_k = k.size()[-1]

    # 計(jì)算注意力權(quán)重
    # (bs, head, seq_len, seq_len)
    att_logits = torch.matmul(q, k.transpose(-2, -1))  
    att_logits /= math.sqrt(d_k)

    if mask is not None:
        # 對(duì)權(quán)重進(jìn)行mask,將為0的部分設(shè)為負(fù)無(wú)窮大
        att_scores = att_logits.masked_fill(mask == 0, -1e-9)  

    # 對(duì)權(quán)重進(jìn)行softmax歸一化
    # (bs, head, seq_len, seq_len)
    att_scores = F.softmax(att_logits, dim=-1)  

    if dropout is not None:
        # 對(duì)權(quán)重進(jìn)行dropout
        att_scores = dropout(att_scores)

    # 注意力權(quán)重與值的加權(quán)求和
    # (bs, head, seq_len, seq_len) * (bs, head, seq_len, dk) = (bs, head, seq_len, dk)
    return torch.matmul(att_scores, v), att_scores


if __name__ == '__main__':
    # (bs, head, seq_len, dk)
    q = torch.randn((8, 12, 10, 32))
    k = torch.randn((8, 12, 10, 32))
    v = torch.randn((8, 12, 10, 32))

    # 進(jìn)行注意力計(jì)算
    res, att_scores = attention(q, k, v, mask=None, dropout=None, use_RoPE=True)

    # 輸出結(jié)果的形狀
    # (bs, head, seq_len, dk),  (bs, head, seq_len, seq_len)
    print(res.shape, att_scores.shape)

3.2.2 LLaMA版的實(shí)現(xiàn)

接下來(lái),我們?cè)賮?lái)看下LLaMA里是怎么實(shí)現(xiàn)這個(gè)旋轉(zhuǎn)位置編碼的,具體而言,LLaMA 的model.py文件里面實(shí)現(xiàn)了旋轉(zhuǎn)位置編碼(為方便大家理解,我給相關(guān)代碼 加了下注釋)
首先,逐一實(shí)現(xiàn)這三個(gè)函數(shù)
precompute_freqs_cis
reshape_for_broadcast
apply_rotary_emb

# 預(yù)計(jì)算頻率和復(fù)數(shù)的函數(shù)
def precompute_freqs_cis(dim: int, end: int, theta: float = 10000.0):
? ? freqs = 1.0 / (theta ** (torch.arange(0, dim, 2)[: (dim // 2)].float() / dim)) ? ?# 計(jì)算頻率
? ? t = torch.arange(end, device=freqs.device) ? ?# 根據(jù)結(jié)束位置生成序列
? ? freqs = torch.outer(t, freqs).float() ? ?# 計(jì)算外積得到新的頻率
? ? freqs_cis = torch.polar(torch.ones_like(freqs), freqs) ? ?# 計(jì)算復(fù)數(shù)
? ? return freqs_cis ? ?# 返回復(fù)數(shù)
# 重塑的函數(shù)
def reshape_for_broadcast(freqs_cis: torch.Tensor, x: torch.Tensor):
? ? ndim = x.ndim ? ?# 獲取輸入張量的維度
? ? assert 0 <= 1 < ndim ? ?# 檢查維度的合理性
? ? assert freqs_cis.shape == (x.shape[1], x.shape[-1]) ? ?# 檢查復(fù)數(shù)的形狀
? ? shape = [d if i == 1 or i == ndim - 1 else 1 for i, d in enumerate(x.shape)] ? ?# 計(jì)算新的形狀
? ? return freqs_cis.view(*shape) ? ?# 重塑復(fù)數(shù)的形狀并返回
# 應(yīng)用旋轉(zhuǎn)嵌入的函數(shù)
def apply_rotary_emb(
? ? xq: torch.Tensor,
? ? xk: torch.Tensor,
? ? freqs_cis: torch.Tensor,
) -> Tuple[torch.Tensor, torch.Tensor]:
? ? xq_ = torch.view_as_complex(xq.float().reshape(*xq.shape[:-1], -1, 2)) ? ?# 將xq視為復(fù)數(shù)
? ? xk_ = torch.view_as_complex(xk.float().reshape(*xk.shape[:-1], -1, 2)) ? ?# 將xk視為復(fù)數(shù)
? ? freqs_cis = reshape_for_broadcast(freqs_cis, xq_) ? ?# 重塑復(fù)數(shù)的形狀
? ? xq_out = torch.view_as_real(xq_ * freqs_cis).flatten(3) ? ?# 計(jì)算xq的輸出
? ? xk_out = torch.view_as_real(xk_ * freqs_cis).flatten(3) ? ?# 計(jì)算xk的輸出
? ? return xq_out.type_as(xq), xk_out.type_as(xk) ? ?# 返回xq和xk的輸出

之后,在注意力機(jī)制的前向傳播函數(shù)中調(diào)用上面實(shí)現(xiàn)的第三個(gè)函數(shù) apply_rotary_emb,賦上位置信息

        # 對(duì)Query和Key應(yīng)用旋轉(zhuǎn)嵌入
        xq, xk = apply_rotary_emb(xq, xk, freqs_cis=freqs_cis)

第四部分?線性偏差注意力ALiBi

模型名稱?? ? 隱藏層維度?? ? 層數(shù)?? ? 注意力頭數(shù)?? ? 詞表大小?? ? 訓(xùn)練數(shù)據(jù)(tokens)?? ? 位置編碼?? ? 最大長(zhǎng)度
Baichuan-7B 4,096 32 32 64,000 1.2 萬(wàn)億 RoPE 4,096
Baichuan-13B 5,120 40 40 64,000 1.4 萬(wàn)億 ALiBi 4,096
Baichuan 2-7B 4096 32 32 125,696 2.6萬(wàn)億 RoPE 4096
Baichuan 2-13B 5120 40 40 125,696 2.6萬(wàn)億 ALiBi 4096

注意看上表的位置編碼那一列,baichuan 7B無(wú)論第一代還是第二代,位置編碼均用的RoPE,而baichuan 13B則無(wú)論是第一代還是第二代,均用的ALiBi

下面便詳細(xì)介紹下該ALiBi

4.1 什么是ALiBi

ALiBi全稱是Attention with Linear Biases,通過(guò)論文《Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation》提出,其不像標(biāo)準(zhǔn)transformer那樣,在embedding層添加位置編碼,而是在softmax的結(jié)果后添加一個(gè)靜態(tài)的不可學(xué)習(xí)的偏置項(xiàng)(說(shuō)白了,就是數(shù)值固定)

具體而言,如下圖所示

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

  1. 當(dāng)計(jì)算每個(gè)頭的注意力分?jǐn)?shù)時(shí),線性偏差注意力方法ALiBi會(huì)向每個(gè)注意力分?jǐn)?shù)(,左)添加一個(gè)常數(shù)偏差(右)
    When computing attention scores for each head, our linearly biased attention method, ALiBi, adds a constant bias (right) to each attention score (qi· kj , left).
    ?

    左邊是自注意力得分,關(guān)于q和k的內(nèi)積
    右邊是一個(gè)相對(duì)距離的矩陣,
    q1? q2 q3 q4 q5
    k1? k2? k3 k4 k5

    所以才有
    ? q1和k1之間的距離是0,所以對(duì)應(yīng)位置就是0
    ? q2和k1之間的距離是「相對(duì)位置偏移為“k的索引”1」 - 「q的索引2」,得到1-2 = -1,就對(duì)應(yīng)到了中間矩陣的取值為-1了
    以此類推,相對(duì)距離矩陣的中間對(duì)角線上都是0,然后左下角的取值都是對(duì)應(yīng)的「k的索引」-「q的索引」了

  2. 那m具體怎么取值呢,按論文中的說(shuō)法是
    當(dāng)8個(gè)heads的時(shí)候,m的取值為:

    如果是16個(gè)heads,則m的取值為:

    相當(dāng)于追加了一半的1/sqrt(2)到原來(lái)的8個(gè)head的每個(gè)m的取值

    擴(kuò)展到一般情況就是:對(duì)于n個(gè)head的話,m的取值就是,即如下
    ,?這樣的m個(gè)坡度了

    最終整體的公式便是
    transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式
    對(duì)于第i個(gè)query來(lái)說(shuō),他們之間的相對(duì)距離就是:k的索引 - q的索引
    具體而言,k的索引 遍歷,而q的索引 取值為

// 待更

第五部分?LLaMA 2 Long中位置編碼的修改

5.1?LLaMA 2 Long相比LLaMA 2的變化:修改位置編碼 長(zhǎng)度達(dá)到32K

9月底,GenAI, Meta正式發(fā)布LLaMA 2 Long(這是其論文《Effective Long-Context Scaling of Foundation Models》),與LLaMA 2相比,LLaMA 2 Long的變化主要體現(xiàn)在以下兩點(diǎn)

  1. 一是訓(xùn)練參數(shù)上,采用了高達(dá)4000億token的數(shù)據(jù)源(We build our models by continually pretraining from LLAMA 2 checkpoints with additional 400 billion tokens formed as long training sequences)
    ——相反,原始LLaMA 2包含多個(gè)變體,但最多的版本也只有700億
  2. 二是架構(gòu)上,與LLaMA 2保持不變,但對(duì)位置編碼進(jìn)行了一個(gè)非常小的必要修改,以此完成高達(dá)3.2萬(wàn)token的上下文窗口支持

5.1.1?LLaMA 2 Long中的位置編碼做了怎樣的修改

在LLaMA 2中,它的位置編碼采用的是旋轉(zhuǎn)編碼RoPE方法,其通過(guò)旋轉(zhuǎn)矩陣來(lái)實(shí)現(xiàn)位置編碼的外推

  1. 本質(zhì)上來(lái)說(shuō),RoPE就是將表示單詞、數(shù)字等信息的token embeddings映射到3D圖表上,給出它們相對(duì)于其他token的位置——即使在旋轉(zhuǎn)時(shí)也如此
  2. 這就能夠使模型產(chǎn)生準(zhǔn)確且有效的響應(yīng),并且比其他方法需要的信息更少,因此占用的計(jì)算存儲(chǔ)也更小

然,Meta的研究人員通過(guò)對(duì)70億規(guī)模的LLaMA 2進(jìn)行實(shí)驗(yàn),確定了LLaMA 2中的RoPE方法的一個(gè)局限性,即,阻止注意力模塊聚集遠(yuǎn)處token的信息

為此,Meta想出了一個(gè)非常簡(jiǎn)單的破解辦法:

減少每個(gè)維度的旋轉(zhuǎn)角度(which essentially reduces the rotation angles of each dimension)
具體而言就是將超參數(shù)“基頻(base frequency)b”從10000增加到500000(increasing the “base frequency b” of ROPE from 10, 000 to 500, 000)

在附錄中,Meta還通過(guò)可視化為螺旋圖這一非常有趣的方式,將RoPE ABF與RoPE PI的差異進(jìn)行了理論分析

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

  • 上圖b旨在說(shuō)明位置插值對(duì)映射向量相對(duì)位置的影響,與上圖a相比,連續(xù)點(diǎn)之間的距離被大幅縮小
    Figure 8b aims to illustrate the impact of Position Interpolation on the relative position of the mapped vectors. The distance between the consecutive points got reduced considerably compered to Figure8a.
  • 上圖c說(shuō)明了調(diào)整基頻對(duì)結(jié)果的影響(The impact of Adjusted Base Frequency is illustrated on Figure 8c)
    雖然螺旋頻率增加導(dǎo)致點(diǎn)之間最小距離縮小(although the minimal distance between points got considerably reduced due to the increased frequency of the helix)
    但連續(xù)點(diǎn)之間的距離幾乎與上圖a相同(The distance between the consecutive points remained almost the same as on Figure 8a)
    即螺旋頻率增加所帶來(lái)的影響將在高頻段中逐漸減少(This effect of increasedfrequency of the helix would be reduced in the high)

總之,與RoPE PI相比,RoPE ABF的優(yōu)勢(shì)主要體現(xiàn)在它能以更大的粒度分配嵌入向量(the embedded vectors),從而使模型更容易區(qū)分位置

此外,他們還觀察到,嵌入向量之間的相對(duì)距離既對(duì)RoPE PI的關(guān)鍵參數(shù)有線性依賴性,也對(duì)RoPE ABF的關(guān)鍵參數(shù)也有對(duì)數(shù)依賴性。

這也就是為什么可以很容易地對(duì)基頻這一超參數(shù)“下手”

5.1.2 改動(dòng)之后的效果

這一改動(dòng)立刻奏效,縮小了RoPE對(duì)遠(yuǎn)端token的衰減效應(yīng),并且在擴(kuò)展LLAMA的上下文長(zhǎng)度上優(yōu)于一項(xiàng)類似的名為“位置插值”的方法RoPE PI(如下圖所示,RoPE表示基線方法,RoPE ABF為Meta此次發(fā)明的新方法,xPos是另一種應(yīng)用了該方法的旋轉(zhuǎn)編碼變體)

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

然,一個(gè)問(wèn)題是,通過(guò)上面這個(gè)可視化結(jié)果,Meta觀察到RoPE在長(zhǎng)程區(qū)域出現(xiàn)了較大的“振蕩”,這對(duì)于語(yǔ)言建模來(lái)說(shuō)可能不是個(gè)好消息

不過(guò),通過(guò)報(bào)告幾種方法在長(zhǎng)序列困惑度和FIRST-SENTENCE-RETRIEVAL兩個(gè)任務(wù)上的表現(xiàn)來(lái)看,問(wèn)題不大

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

而且,尤其在后者任務(wù)上,他們提出的RoPE ABF是唯一一個(gè)可以始終保持性能的變體

transformer普通位置編碼和旋轉(zhuǎn)位置編碼,大模型/AIGC/ChatGPT系列:原理、論文、代碼、實(shí)戰(zhàn),位置編碼,旋轉(zhuǎn)位置編碼,RoPE,歐拉公式

最終,LLaMA 2 Long憑借著這一改動(dòng),達(dá)成了3.2萬(wàn)的上下文token,并通過(guò)長(zhǎng)下文連續(xù)預(yù)訓(xùn)練的共同作用,獲得了開(kāi)頭所示的好成績(jī):

除了全面超越LLaMA 2、在特定任務(wù)上超越Claude 2和ChatGPT,Meta也給出了它和一些開(kāi)源長(zhǎng)下文模型的對(duì)比。結(jié)果也相當(dāng)不賴,如下圖所示

//待更


后記

最后,說(shuō)明下為何像開(kāi)頭說(shuō)的是「23年12.16日這天對(duì)本文做了大修」呢,原因在于

  1. 我司《論文審稿GPT第2版》即將進(jìn)入模型訓(xùn)練階段,其涉及到三個(gè)候選模型:mistral-yarn、mistral、llama-longlora
    故準(zhǔn)備解析下YaRN,順帶把外推、內(nèi)插都全面介紹下,而過(guò)程中不可避免會(huì)提到RoPE,故也總算把RoPE徹底寫(xiě)清楚了
  2. 這些東西,哪怕是近期最新的技術(shù)、模型等理解了后 會(huì)發(fā)現(xiàn)都不難,但我總想把理解的門(mén)檻無(wú)限降低,所以想真正寫(xiě)清楚或講清楚一個(gè)東西,必須得反復(fù)琢磨、反復(fù)修改,以讓更多人因此看懂,更何況當(dāng)我和我的團(tuán)隊(duì)每天看paper、做項(xiàng)目,更可以幫到大家不斷進(jìn)階、深入

如今博客的訪問(wèn)PV2000萬(wàn),希望明年達(dá)到2000萬(wàn)UV以上,以上視為后記文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-769737.html

參考文獻(xiàn)與推薦閱讀

  1. 馬同學(xué)關(guān)于向量和歐拉公式的幾篇科普文章
    向量的加法
    歐拉公式,復(fù)數(shù)域的成人禮
  2. 關(guān)于歐拉公式的幾篇文章
    被眾人膜拜的歐拉恒等式是個(gè)什么東東?
    怎么向小學(xué)生解釋歐拉公式 e^(πi)+1=0?
  3. 讀懂旋轉(zhuǎn)編碼(RoPE)
  4. LLM學(xué)習(xí)記錄(五)--超簡(jiǎn)單的RoPE理解方式,這篇文章很不錯(cuò)
  5. 蘇劍林:Transformer升級(jí)之路:2、博采眾長(zhǎng)的旋轉(zhuǎn)式位置編碼
  6. LLaMA的解讀與其微調(diào):Alpaca-LoRA/Vicuna/BELLE/中文LLaMA/姜子牙/LLaMA 2
  7. 關(guān)于ALiBi的兩篇文章
    [速讀經(jīng)典]ALiBi - 給注意力加上線性偏置
    關(guān)于Transformer中的位置編碼-ALiBi
  8. 最強(qiáng)LLaMA突然來(lái)襲!只改一個(gè)超參數(shù),實(shí)現(xiàn)上下文3.2萬(wàn)token,多個(gè)任務(wù)打敗ChatGPT、Claude 2

到了這里,關(guān)于一文通透位置編碼:從標(biāo)準(zhǔn)位置編碼、旋轉(zhuǎn)位置編碼RoPE到ALiBi、LLaMA 2 Long的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【論文閱讀隨筆】RoPE/旋轉(zhuǎn)編碼:ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING

    絕對(duì)位置編碼比較簡(jiǎn)單,加或乘一個(gè)有次序的數(shù) 實(shí)現(xiàn)相對(duì)位置編碼,也即意味著,要蘊(yùn)含位置差的信息: 假設(shè)m是某個(gè)token的位置信息,n是另一個(gè)token的位置信息,要有類似 m ? n m-n m ? n 的信息,比較容易想到復(fù)數(shù)乘法會(huì)產(chǎn)生 m ? n m-n m ? n ,以及復(fù)數(shù)乘法和復(fù)數(shù)內(nèi)積的性

    2024年03月11日
    瀏覽(22)
  • 如何修改大模型的位置編碼 --以LLama為例

    如何修改大模型的位置編碼 --以LLama為例

    最近在看RoPE相關(guān)內(nèi)容,一些方法通過(guò)簡(jiǎn)單修改位置編碼就可以無(wú)需訓(xùn)練支持更長(zhǎng)的文本內(nèi)容。由于一些模型,已經(jīng)訓(xùn)練好了,但是怎么修改已經(jīng)訓(xùn)練好的模型位置編碼。查了以下相關(guān)代碼,記錄一下。原理這里就不細(xì)講了,貼幾個(gè)相關(guān)博客。 十分鐘讀懂旋轉(zhuǎn)編碼(RoPE) Tr

    2024年04月15日
    瀏覽(21)
  • 一文通透從輸入U(xiǎn)RL到頁(yè)面渲染的全過(guò)程----高頻面試

    一文通透從輸入U(xiǎn)RL到頁(yè)面渲染的全過(guò)程----高頻面試

    喜歡大海 喜歡夕陽(yáng) 寫(xiě)下便是永恒 從輸入 URL 到頁(yè)面渲染發(fā)生了什么? 比如在瀏覽器輸入了 www.qq.com 后瀏覽器是怎么把最終的頁(yè)面呈現(xiàn)。因?yàn)樯婕暗降闹R(shí)點(diǎn)和可挖掘的地方比較多,而且這中間幾乎每一步都是可以優(yōu)化的。URL從輸入到頁(yè)面渲染這整個(gè)過(guò)程可以分為 網(wǎng)絡(luò)通信

    2024年01月18日
    瀏覽(25)
  • 相對(duì)位置編碼和絕對(duì)位置編碼

    相對(duì)位置編碼和絕對(duì)位置編碼

    位置編碼的區(qū)別: 相對(duì)位置編碼和絕對(duì)位置編碼是兩種不同的位置編碼方法。 絕對(duì)位置編碼是一種基于位置嵌入的方法,其中每個(gè)位置都被分配了一個(gè)唯一的位置向量。這些向量是固定的,與輸入序列的內(nèi)容無(wú)關(guān)。這種編碼方式對(duì)于處理較短的序列效果較好,但在處理長(zhǎng)序

    2024年02月15日
    瀏覽(29)
  • 旋轉(zhuǎn)編碼器原理、選型及編碼

    旋轉(zhuǎn)編碼器(rotary encoder)也稱為軸編碼器,是將旋轉(zhuǎn)的機(jī)械位移量轉(zhuǎn)換為電氣信號(hào),對(duì)該信號(hào)進(jìn)行處理后檢測(cè)位置速度等信號(hào)的傳感器。檢測(cè)直線機(jī)械位移量的傳感器稱為線性編碼器[1]。一般裝設(shè)在旋轉(zhuǎn)物體中垂直旋轉(zhuǎn)軸的一面。 旋轉(zhuǎn)編碼器用在許多需要精確旋轉(zhuǎn)位置及速

    2024年01月19日
    瀏覽(26)
  • unity學(xué)習(xí)(68)——相機(jī)/模型的旋轉(zhuǎn)/位置計(jì)算

    unity學(xué)習(xí)(68)——相機(jī)/模型的旋轉(zhuǎn)/位置計(jì)算

    這個(gè)比想象中要難,而且需要自己寫(xiě)。 1.相機(jī)可以轉(zhuǎn)xy兩個(gè)位置,可以 點(diǎn)頭和轉(zhuǎn)圈 。注意這里有一個(gè)if判斷(后面返回來(lái)發(fā)現(xiàn)了這些問(wèn)題) 2.角色不能點(diǎn)頭, 只能轉(zhuǎn)圈 。 難得是移動(dòng)方向,因?yàn)?移動(dòng)方向(位置)和轉(zhuǎn)向是相關(guān)聯(lián)的 。 3.先做相機(jī)的移動(dòng),相機(jī)除了和角色做同向的

    2024年04月26日
    瀏覽(22)
  • 【Unity腳本開(kāi)源】記錄鼠標(biāo)按下的位置和移動(dòng)的距離來(lái)進(jìn)行物體的旋轉(zhuǎn),并在鼠標(biāo)釋放后將物體恢復(fù)到初始旋轉(zhuǎn)位置

    ??作者:白日參商 ???♂?個(gè)人主頁(yè):白日參商主頁(yè) ??堅(jiān)持分析平時(shí)學(xué)習(xí)到的項(xiàng)目以及學(xué)習(xí)到的軟件開(kāi)發(fā)知識(shí),和大家一起努力呀?。?! ????加油! 加油! 加油! 加油 ??歡迎評(píng)論 ??點(diǎn)贊???? 收藏 ??加關(guān)注+! 提針對(duì)這個(gè)需求,以下是示例腳本代碼: ??作者

    2024年02月12日
    瀏覽(22)
  • STM32 EC11 旋轉(zhuǎn)編碼器

    STM32 EC11 旋轉(zhuǎn)編碼器

    代碼在最后,復(fù)制可直接食用 以及我的電路圖 在研究EC11的時(shí)序之前首先要了解一點(diǎn),EC11按旋轉(zhuǎn)的輸出動(dòng)作可以分為兩種。一種是轉(zhuǎn)兩格,A、B對(duì)C端輸出一個(gè)完整脈沖(轉(zhuǎn)一格就只是由低電平-高電平或由高電平-低電平);另一種就是轉(zhuǎn)一格,A、B對(duì)C端輸出一個(gè)完整脈沖。

    2024年02月02日
    瀏覽(30)
  • Code Llama 簡(jiǎn)介:編碼未來(lái)的綜合指南

    Code Llama 簡(jiǎn)介:編碼未來(lái)的綜合指南

    在不斷發(fā)展的技術(shù)領(lǐng)域,Meta 推出的 Code Llama 標(biāo)志著一次重大飛躍。這種最先進(jìn)的大型語(yǔ)言模型 (LLM) 不僅僅是開(kāi)發(fā)人員武器庫(kù)中的另一個(gè)工具;它也是開(kāi)發(fā)人員的工具之一。它改變了游戲規(guī)則。讓我們深入了解 Code Llama 提供的功能、它與DemoGPT的合作,以及它對(duì)未來(lái)編碼的潛力

    2024年02月09日
    瀏覽(19)
  • Transformer 位置編碼

    Transformer 位置編碼

    ?作者簡(jiǎn)介:人工智能專業(yè)本科在讀,喜歡計(jì)算機(jī)與編程,寫(xiě)博客記錄自己的學(xué)習(xí)歷程。 ??個(gè)人主頁(yè):小嗷犬的個(gè)人主頁(yè) ??個(gè)人網(wǎng)站:小嗷犬的技術(shù)小站 ??個(gè)人信條:為天地立心,為生民立命,為往圣繼絕學(xué),為萬(wàn)世開(kāi)太平。 Attention Is All You Need 是 Google 于 2017 年發(fā)表的

    2024年01月16日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包