0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

十分鐘讀懂旋轉(zhuǎn)編碼(RoPE)

深度學(xué)習(xí)自然語言處理 ? 來源:深度學(xué)習(xí)自然語言處理 ? 2023-09-05 17:11 ? 次閱讀

旋轉(zhuǎn)位置編碼(Rotary Position Embedding,RoPE)是論文 Roformer: Enhanced Transformer With Rotray Position Embedding 提出的一種能夠?qū)⑾鄬?duì)位置信息依賴集成到 self-attention 中并提升 transformer 架構(gòu)性能的位置編碼方式。而目前很火的 LLaMA、GLM 模型也是采用該位置編碼方式。

和相對(duì)位置編碼相比,RoPE 具有更好的外推性,目前是大模型相對(duì)位置編碼中應(yīng)用最廣的方式之一。

備注:什么是大模型外推性?

外推性是指大模型在訓(xùn)練時(shí)和預(yù)測(cè)時(shí)的輸入長(zhǎng)度不一致,導(dǎo)致模型的泛化能力下降的問題。例如,如果一個(gè)模型在訓(xùn)練時(shí)只使用了 512 個(gè) token 的文本,那么在預(yù)測(cè)時(shí)如果輸入超過 512 個(gè) token,模型可能無法正確處理。這就限制了大模型在處理長(zhǎng)文本或多輪對(duì)話等任務(wù)時(shí)的效果。

旋轉(zhuǎn)編碼RoPE

1.1 基本概念

在介紹 RoPE 之前,先給出一些符號(hào)定義,以及基本背景。

首先定義一個(gè)長(zhǎng)度為 的輸入序列為:

461bf25a-4bca-11ee-a25d-92fbcf53809c.png

其中 表示輸入序列中第 個(gè) token,而輸入序列 對(duì)應(yīng)的 embedding 表示為:

462ffaa2-4bca-11ee-a25d-92fbcf53809c.png

其中 表示第 個(gè) token 對(duì)應(yīng)的 維詞嵌入向量。 接著在做 self-attention 之前,會(huì)用詞嵌入向量計(jì)算 向量同時(shí)加入位置信息,函數(shù)公式表達(dá)如下:

4641f414-4bca-11ee-a25d-92fbcf53809c.png

其中 表示第 個(gè) token 對(duì)應(yīng)的詞向量 集成位置信息 之后的 query 向量。而 則表示第 個(gè) token 對(duì)應(yīng)的詞向量 集成位置信息 之后的 key 和 value 向量。 而基于 transformer 的位置編碼方法都是著重于構(gòu)造一個(gè)合適的 函數(shù)形式。 而計(jì)算第 個(gè)詞嵌入向量 對(duì)應(yīng)的 self-attention 輸出結(jié)果,就是 和其他 都計(jì)算一個(gè) attention score ,然后再將 attention score 乘以對(duì)應(yīng)的 再求和得到輸出向量

464ef24a-4bca-11ee-a25d-92fbcf53809c.png

1.2 絕對(duì)位置編碼

對(duì)于位置編碼,常規(guī)的做法是在計(jì)算 query,key 和 value 向量之前,會(huì)計(jì)算一個(gè)位置編碼向量 加到詞嵌入 上,位置編碼向量 同樣也是 維向量,然后再乘以對(duì)應(yīng)的變換矩陣

46588f4e-4bca-11ee-a25d-92fbcf53809c.png

而經(jīng)典的位置編碼向量 的計(jì)算方式是使用 Sinusoidal 函數(shù):

46604568-4bca-11ee-a25d-92fbcf53809c.png

其中 表示位置 維度向量 中的第 位置分量也就是偶數(shù)索引位置的計(jì)算公式,而 就對(duì)應(yīng)第 位置分量也就是奇數(shù)索引位置的計(jì)算公式。

1.3 2維旋轉(zhuǎn)位置編碼

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

46651980-4bca-11ee-a25d-92fbcf53809c.png接下來的目標(biāo)就是找到一個(gè)等價(jià)的位置編碼方式,從而使得上述關(guān)系成立。 假定現(xiàn)在詞嵌入向量的維度是兩維 ,這樣就可以利用上 2 維度平面上的向量的幾何性質(zhì),然后論文中提出了一個(gè)滿足上述關(guān)系的 的形式如下:467a59c6-4bca-11ee-a25d-92fbcf53809c.png這里面 Re 表示復(fù)數(shù)的實(shí)部。 進(jìn)一步地, 可以表示成下面的式子:468cdf4c-4bca-11ee-a25d-92fbcf53809c.png看到這里會(huì)發(fā)現(xiàn),這不就是 query 向量乘以了一個(gè)旋轉(zhuǎn)矩陣嗎?這就是為什么叫做旋轉(zhuǎn)位置編碼的原因。 同理, 可以表示成下面的式子469c2614-4bca-11ee-a25d-92fbcf53809c.png最終 可以表示如下:

46b897c2-4bca-11ee-a25d-92fbcf53809c.png

關(guān)于上面公式(8)~(11)的具體推導(dǎo),可以參見文章最后的附錄,或者參考文章:一文看懂 LLaMA 中的旋轉(zhuǎn)式位置編碼(Rotary Position Embedding)。 1.4 擴(kuò)展到多維

將2維推廣到任意維度,可以表示如下:46cf41ac-4bca-11ee-a25d-92fbcf53809c.png內(nèi)積滿足線性疊加性,因此任意偶數(shù)維的 RoPE,我們都可以表示為二維情形的拼接,即46e42edc-4bca-11ee-a25d-92fbcf53809c.png將 RoPE 應(yīng)用到前面公式(4)的 Self-Attention 計(jì)算,可以得到包含相對(duì)位置信息的 Self-Attetion:46fdb5be-4bca-11ee-a25d-92fbcf53809c.png

中,。

值得指出的是,由于 是一個(gè)正交矩陣,它不會(huì)改變向量的模長(zhǎng),因此通常來說它不會(huì)改變?cè)P偷姆€(wěn)定性。 1.5 RoPE 的高效計(jì)算

由于 的稀疏性,所以直接用矩陣乘法來實(shí)現(xiàn)會(huì)很浪費(fèi)算力,推薦通過下述方式來實(shí)現(xiàn) RoPE:

471dd83a-4bca-11ee-a25d-92fbcf53809c.png

其中 是逐位對(duì)應(yīng)相乘,即計(jì)算框架中的 運(yùn)算。從這個(gè)實(shí)現(xiàn)也可以看到,RoPE 可以視為是乘性位置編碼的變體。 總結(jié)來說,RoPE 的 self-attention 操作的流程是:對(duì)于 token 序列中的每個(gè)詞嵌入向量,首先計(jì)算其對(duì)應(yīng)的 query 和 key 向量,然后對(duì)每個(gè) token 位置都計(jì)算對(duì)應(yīng)的旋轉(zhuǎn)位置編碼,接著對(duì)每個(gè) token 位置的 query 和 key 向量的元素按照兩兩一組應(yīng)用旋轉(zhuǎn)變換,最后再計(jì)算 query 和 key 之間的內(nèi)積得到 self-attention 的計(jì)算結(jié)果。 論文中有個(gè)很直觀的圖片展示了旋轉(zhuǎn)變換的過程:

47331678-4bca-11ee-a25d-92fbcf53809c.png

1.6 遠(yuǎn)程衰減

可以看到,RoPE 形式上和前面公式(6)Sinusoidal 位置編碼有點(diǎn)相似,只不過 Sinusoidal 位置編碼是加性的,而 RoPE 可以視為乘性的。 的選擇上,RoPE 同樣沿用了 Sinusoidal 位置編碼的方案,即 ,它可以帶來一定的遠(yuǎn)程衰減性。

具體證明如下: 兩兩分組后,它們加上 RoPE 后的內(nèi)積可以用復(fù)數(shù)乘法表示為:

475fcfba-4bca-11ee-a25d-92fbcf53809c.png

476650ce-4bca-11ee-a25d-92fbcf53809c.png

并約定 ,那么由 Abel 變換(分部求和法)可以得到:

4773e220-4bca-11ee-a25d-92fbcf53809c.png

所以

477b9e34-4bca-11ee-a25d-92fbcf53809c.png

因此我們可以考察 隨著相對(duì)距離的變化情況來作為衰減性的體現(xiàn):

4786324a-4bca-11ee-a25d-92fbcf53809c.png

從圖中我們可以看到隨著相對(duì)距離的變大,內(nèi)積結(jié)果有衰減趨勢(shì)的出現(xiàn)。因此,選擇 ,確實(shí)能帶來一定的遠(yuǎn)程衰減性。論文中還試過以 為初始化,將 視為可訓(xùn)練參數(shù),然后訓(xùn)練一段時(shí)間后發(fā)現(xiàn) 并沒有顯著更新,因此干脆就直接固定 了。

RoPE實(shí)驗(yàn)

我們看一下 RoPE 在預(yù)訓(xùn)練階段的實(shí)驗(yàn)效果:

47a45be4-4bca-11ee-a25d-92fbcf53809c.png

從上面可以看出,增大序列長(zhǎng)度,預(yù)訓(xùn)練的準(zhǔn)確率反而有所提升,這體現(xiàn)了RoPE 具有良好的外推能力。 下面是在下游任務(wù)上的實(shí)驗(yàn)結(jié)果:47bcf0d2-4bca-11ee-a25d-92fbcf53809c.png其中 RoFormer 是一個(gè)絕對(duì)位置編碼替換為 RoPE 的 WoBERT 模型,后面的參數(shù)(512)是微調(diào)時(shí)截?cái)嗟膍axlen,可以看到 RoPE 確實(shí)能較好地處理長(zhǎng)文本語義。

RoPE代碼實(shí)現(xiàn)

Meta 的 LLAMA 和 清華的 ChatGLM 都使用了 RoPE 編碼,下面看一下具體實(shí)現(xiàn)。

3.1 在LLAMA中的實(shí)現(xiàn)

#生成旋轉(zhuǎn)矩陣
defprecompute_freqs_cis(dim:int,seq_len:int,theta:float=10000.0):
#計(jì)算詞向量元素兩兩分組之后,每組元素對(duì)應(yīng)的旋轉(zhuǎn)角度	heta_i
freqs=1.0/(theta**(torch.arange(0,dim,2)[:(dim//2)].float()/dim))
#生成token序列索引t=[0,1,...,seq_len-1]
t=torch.arange(seq_len,device=freqs.device)
#freqs.shape=[seq_len,dim//2]
freqs=torch.outer(t,freqs).float()#計(jì)算m*	heta

#計(jì)算結(jié)果是個(gè)復(fù)數(shù)向量
#假設(shè)freqs=[x,y]
#則freqs_cis=[cos(x)+sin(x)i,cos(y)+sin(y)i]
freqs_cis=torch.polar(torch.ones_like(freqs),freqs)
returnfreqs_cis

#旋轉(zhuǎn)位置編碼計(jì)算
defapply_rotary_emb(
xq:torch.Tensor,
xk:torch.Tensor,
freqs_cis:torch.Tensor,
)->Tuple[torch.Tensor,torch.Tensor]:
#xq.shape=[batch_size,seq_len,dim]
#xq_.shape=[batch_size,seq_len,dim//2,2]
xq_=xq.float().reshape(*xq.shape[:-1],-1,2)
xk_=xk.float().reshape(*xk.shape[:-1],-1,2)

#轉(zhuǎn)為復(fù)數(shù)域
xq_=torch.view_as_complex(xq_)
xk_=torch.view_as_complex(xk_)

#應(yīng)用旋轉(zhuǎn)操作,然后將結(jié)果轉(zhuǎn)回實(shí)數(shù)域
#xq_out.shape=[batch_size,seq_len,dim]
xq_out=torch.view_as_real(xq_*freqs_cis).flatten(2)
xk_out=torch.view_as_real(xk_*freqs_cis).flatten(2)
returnxq_out.type_as(xq),xk_out.type_as(xk)

classAttention(nn.Module):
def__init__(self,args:ModelArgs):
super().__init__()

self.wq=Linear(...)
self.wk=Linear(...)
self.wv=Linear(...)

self.freqs_cis=precompute_freqs_cis(dim,max_seq_len*2)

defforward(self,x:torch.Tensor):
bsz,seqlen,_=x.shape
xq,xk,xv=self.wq(x),self.wk(x),self.wv(x)

xq=xq.view(batch_size,seq_len,dim)
xk=xk.view(batch_size,seq_len,dim)
xv=xv.view(batch_size,seq_len,dim)

#attention操作之前,應(yīng)用旋轉(zhuǎn)位置編碼
xq,xk=apply_rotary_emb(xq,xk,freqs_cis=freqs_cis)

#scores.shape=(bs,seqlen,seqlen)
scores=torch.matmul(xq,xk.transpose(1,2))/math.sqrt(dim)
scores=F.softmax(scores.float(),dim=-1)
output=torch.matmul(scores,xv)#(batch_size,seq_len,dim)
#......
這里舉一個(gè)例子,假設(shè) batch_size=10, seq_len=3, d=8,則調(diào)用函數(shù) precompute_freqs_cis(d, seq_len) 后,生成結(jié)果為:

In[239]:freqs_cis
Out[239]:
tensor([[1.0000+0.0000j,1.0000+0.0000j,1.0000+0.0000j,1.0000+0.0000j],
[0.5403+0.8415j,0.9950+0.0998j,0.9999+0.0100j,1.0000+0.0010j],
[-0.4161+0.9093j,0.9801+0.1987j,0.9998+0.0200j,1.0000+0.0020j]])

以結(jié)果中的第二行為例(對(duì)應(yīng)的 m = 1),也就是:47cc4bea-4bca-11ee-a25d-92fbcf53809c.png最終按照公式(12)可以得到編碼之后的 。 注意:在代碼中是直接用 freqs_cis[0] * xq_[0] 的結(jié)果表示第一個(gè) token 對(duì)應(yīng)的旋轉(zhuǎn)編碼(和公式 12 計(jì)算方式有所區(qū)別)。其中將原始的 query 向量 轉(zhuǎn)換為了復(fù)數(shù)形式。

In[351]:q_=q.float().reshape(*q.shape[:-1],-1,2)

In[352]:q_[0]
Out[352]:
tensor([[[1.0247,0.4782],
[1.5593,0.2119],
[0.4175,0.5309],
[0.4858,0.1850]],

[[-1.7456,0.6849],
[0.3844,1.1492],
[0.1700,0.2106],
[0.5433,0.2261]],

[[-1.1206,0.6969],
[0.8371,-0.7765],
[-0.3076,0.1704],
[-0.5999,-1.7029]]])

In[353]:xq=torch.view_as_complex(q_)

In[354]:xq[0]
Out[354]:
tensor([[1.0247+0.4782j,1.5593+0.2119j,0.4175+0.5309j,0.4858+0.1850j],
[-1.7456+0.6849j,0.3844+1.1492j,0.1700+0.2106j,0.5433+0.2261j],
[-1.1206+0.6969j,0.8371-0.7765j,-0.3076+0.1704j,-0.5999-1.7029j]])
這里為什么可以這樣計(jì)算? 主要是利用了復(fù)數(shù)的乘法性質(zhì)。 我們首先來復(fù)習(xí)一下復(fù)數(shù)乘法的性質(zhì):

47ea7994-4bca-11ee-a25d-92fbcf53809c.png

因此要計(jì)算:

47ef1fd0-4bca-11ee-a25d-92fbcf53809c.png

可以轉(zhuǎn)化為計(jì)算:

4802d41c-4bca-11ee-a25d-92fbcf53809c.png

所以可以將公式(12)轉(zhuǎn)化為兩個(gè)復(fù)數(shù)的乘法運(yùn)算。 3.2 在ChatGLM中的實(shí)現(xiàn) 和 LLAMA 的實(shí)現(xiàn)方式相差不大。代碼如下:

classRotaryEmbedding(torch.nn.Module):
def__init__(self,dim,base=10000,precision=torch.half,learnable=False):
super().__init__()
#計(jì)算	heta_i
inv_freq=1./(base**(torch.arange(0,dim,2).float()/dim))
inv_freq=inv_freq.half()

self.learnable=learnable
iflearnable:
self.inv_freq=torch.nn.Parameter(inv_freq)
self.max_seq_len_cached=None
else:
self.register_buffer('inv_freq',inv_freq)
self.max_seq_len_cached=None
self.cos_cached=None
self.sin_cached=None
self.precision=precision

defforward(self,x,seq_dim=1,seq_len=None):
ifseq_lenisNone:
seq_len=x.shape[seq_dim]
ifself.max_seq_len_cachedisNoneor(seq_len>self.max_seq_len_cached):
self.max_seq_len_cached=Noneifself.learnableelseseq_len
#生成token序列索引t=[0,1,...,seq_len-1]
t=torch.arange(seq_len,device=x.device,dtype=self.inv_freq.dtype)
#對(duì)應(yīng)m*	heta
freqs=torch.einsum('i,j->ij',t,self.inv_freq)
#將m*	heta拼接兩次,對(duì)應(yīng)復(fù)數(shù)的實(shí)部和虛部
emb=torch.cat((freqs,freqs),dim=-1).to(x.device)
ifself.precision==torch.bfloat16:
emb=emb.float()

#[sx,1(b*np),hn]
cos_cached=emb.cos()[:,None,:]#計(jì)算得到cos(m*	heta)
sin_cached=emb.sin()[:,None,:]#計(jì)算得到cos(m*	heta)
ifself.precision==torch.bfloat16:
cos_cached=cos_cached.bfloat16()
sin_cached=sin_cached.bfloat16()
ifself.learnable:
returncos_cached,sin_cached
self.cos_cached,self.sin_cached=cos_cached,sin_cached
returnself.cos_cached[:seq_len,...],self.sin_cached[:seq_len,...]

def_apply(self,fn):
ifself.cos_cachedisnotNone:
self.cos_cached=fn(self.cos_cached)
ifself.sin_cachedisnotNone:
self.sin_cached=fn(self.sin_cached)
returnsuper()._apply(fn)

defrotate_half(x):
x1,x2=x[...,:x.shape[-1]//2],x[...,x.shape[-1]//2:]
returntorch.cat((-x2,x1),dim=x1.ndim-1)

RoPE的外推性

我們都知道 RoPE 具有很好的外推性,前面的實(shí)驗(yàn)結(jié)果也證明了這一點(diǎn)。這里解釋下具體原因。 RoPE 可以通過旋轉(zhuǎn)矩陣來實(shí)現(xiàn)位置編碼的外推,即可以通過旋轉(zhuǎn)矩陣來生成超過預(yù)期訓(xùn)練長(zhǎng)度的位置編碼。這樣可以提高模型的泛化能力和魯棒性。 我們回顧一下 RoPE 的工作原理:假設(shè)我們有一個(gè) 維的絕對(duì)位置編碼 ,其中 是位置索引。我們可以將 看成一個(gè) 維空間中的一個(gè)點(diǎn)。我們可以定義一個(gè) 維空間中的一個(gè)旋轉(zhuǎn)矩陣 ,它可以將任意一個(gè)點(diǎn)沿著某個(gè)軸旋轉(zhuǎn)一定的角度。我們可以用 來變換 ,得到一個(gè)新的點(diǎn) 。我們可以發(fā)現(xiàn), 的距離是相等的,即 。這意味著 的相對(duì)關(guān)系沒有改變。但是, 的距離可能發(fā)生改變,即 。這意味著 的相對(duì)關(guān)系有所改變。因此,我們可以用 來調(diào)整不同位置之間的相對(duì)關(guān)系。 如果我們想要生成超過預(yù)訓(xùn)練長(zhǎng)度的位置編碼,我們只需要用 來重復(fù)變換最后一個(gè)預(yù)訓(xùn)練位置編碼 ,得到新的位置編碼480fb7ae-4bca-11ee-a25d-92fbcf53809c.png依此類推。這樣就可以得到任意長(zhǎng)度的位置編碼序列 ,其中 可以大于 。由于 是一個(gè)正交矩陣,它保證了 的距離不會(huì)無限增大或縮小,而是在一個(gè)有限范圍內(nèi)波動(dòng)。這樣就可以避免數(shù)值溢出或下溢的問題。同時(shí),由于 是一個(gè)可逆矩陣,它保證了 的距離可以通過 的逆矩陣 還原到 的距離,即

48273b18-4bca-11ee-a25d-92fbcf53809c.png

這樣就可以保證位置編碼的可逆性和可解釋性。 總結(jié)而言: 旋轉(zhuǎn)編碼 RoPE 可以有效地保持位置信息的相對(duì)關(guān)系,即相鄰位置的編碼之間有一定的相似性,而遠(yuǎn)離位置的編碼之間有一定的差異性。這樣可以增強(qiáng)模型對(duì)位置信息的感知和利用。這一點(diǎn)是其他絕對(duì)位置編碼方式(如正弦位置編碼、學(xué)習(xí)的位置編碼等)所不具備的,因?yàn)樗鼈冎荒鼙硎窘^對(duì)位置,而不能表示相對(duì)位置。 旋轉(zhuǎn)編碼 RoPE 可以通過旋轉(zhuǎn)矩陣來實(shí)現(xiàn)位置編碼的外推,即可以通過旋轉(zhuǎn)矩陣來生成超過預(yù)訓(xùn)練長(zhǎng)度的位置編碼。這樣可以提高模型的泛化能力和魯棒性。這一點(diǎn)是其他固定位置編碼方式(如正弦位置編碼、固定相對(duì)位置編碼等)所不具備的,因?yàn)樗鼈冎荒鼙硎绢A(yù)訓(xùn)練長(zhǎng)度內(nèi)的位置,而不能表示超過預(yù)訓(xùn)練長(zhǎng)度的位置。 旋轉(zhuǎn)編碼 RoPE 可以與線性注意力機(jī)制兼容,即不需要額外的計(jì)算或參數(shù)來實(shí)現(xiàn)相對(duì)位置編碼。這樣可以降低模型的計(jì)算復(fù)雜度和內(nèi)存消耗。這一點(diǎn)是其他混合位置編碼方式(如 Transformer-XL、XLNet 等)所不具備的,因?yàn)樗鼈冃枰~外的計(jì)算或參數(shù)來實(shí)現(xiàn)相對(duì)位置編碼。

總結(jié)

最近一直聽到旋轉(zhuǎn)編碼這個(gè)詞,但是一直沒有仔細(xì)看具體原理。今天花時(shí)間仔細(xì)看了一遍,確實(shí)理論寫的比較完備,而且實(shí)驗(yàn)效果也不錯(cuò)。目前很多的大模型,都選擇了使用了這種編碼方式(LLAMA、GLM 等)。

附錄

這里補(bǔ)充一下前面公式 1.3.2 節(jié)中,公式(8)~(11)是怎么推導(dǎo)出來的。 回到之前的公式(8),編碼之后的 以及內(nèi)積 的形式如下:

483ee6b4-4bca-11ee-a25d-92fbcf53809c.png

上面的公式為什么滿足:

4857353e-4bca-11ee-a25d-92fbcf53809c.png

首先我們得先了解一下基本的復(fù)數(shù)相關(guān)知識(shí)。 首先看到上述 公式中有個(gè)指數(shù)函數(shù): 這個(gè)其實(shí)是歐拉公式,其中 表示任意實(shí)數(shù), 是自然對(duì)數(shù)的底數(shù), 是復(fù)數(shù)中的虛數(shù)單位,則根據(jù)歐拉公式有:

4860079a-4bca-11ee-a25d-92fbcf53809c.png

則是上述指數(shù)函數(shù)可以表示為實(shí)部為 ,虛部為 的一個(gè)復(fù)數(shù),歐拉公式建立了指數(shù)函數(shù)、三角函數(shù)和復(fù)數(shù)之間的橋梁。 則上述 公式的487135f6-4bca-11ee-a25d-92fbcf53809c.png然后我們看回公式:48799c82-4bca-11ee-a25d-92fbcf53809c.png其中 是個(gè)二維矩陣, 是個(gè)二維向量,相乘的結(jié)果也是一個(gè)二維向量,這里用 表示:

48868c3a-4bca-11ee-a25d-92fbcf53809c.png

然后首先將 表示成復(fù)數(shù)形式:489594dc-4bca-11ee-a25d-92fbcf53809c.png接著

48a10218-4bca-11ee-a25d-92fbcf53809c.png

其實(shí)就是兩個(gè)復(fù)數(shù)相乘:

48ae78d0-4bca-11ee-a25d-92fbcf53809c.png

然后就有:

48c1163e-4bca-11ee-a25d-92fbcf53809c.png

將結(jié)果重新表達(dá)成實(shí)數(shù)向量形式就是:

48ce2aa4-4bca-11ee-a25d-92fbcf53809c.png

這里不難發(fā)現(xiàn)就是 query 向量乘以了一個(gè)旋轉(zhuǎn)矩陣。

48f3ef14-4bca-11ee-a25d-92fbcf53809c.png

這就是為什么叫做旋轉(zhuǎn)式位置編碼的原因。 同理可得 key 向量

48fb4174-4bca-11ee-a25d-92fbcf53809c.png

最后還有個(gè)函數(shù) 49122d12-4bca-11ee-a25d-92fbcf53809c.png其中 表示一個(gè)復(fù)數(shù) 的實(shí)部部分,而 則表示復(fù)數(shù) 的共軛。 復(fù)習(xí)一下共軛復(fù)數(shù)的定義:

4925c192-4bca-11ee-a25d-92fbcf53809c.png

所以可得:

4932fe7a-4bca-11ee-a25d-92fbcf53809c.png

繼續(xù)可得:

495221a6-4bca-11ee-a25d-92fbcf53809c.png

接下來我們就要證明函數(shù) 的計(jì)算公式是成立的。 首先回顧一下 attention 操作,位置 的 query 和位置 的 key 會(huì)做一個(gè)內(nèi)積操作:

496f8d72-4bca-11ee-a25d-92fbcf53809c.png

接著進(jìn)行推導(dǎo),我們整理一下:

4983dbce-4bca-11ee-a25d-92fbcf53809c.png

這就證明上述關(guān)系是成立的,位置 的 query 和位置 的 key 的內(nèi)積就是函數(shù) 把上面的式子用矩陣向量乘的形式來表達(dá)就是:49a28f74-4bca-11ee-a25d-92fbcf53809c.png ?


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 向量
    +關(guān)注

    關(guān)注

    0

    文章

    55

    瀏覽量

    11631
  • 旋轉(zhuǎn)編碼
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    10505
  • 大模型
    +關(guān)注

    關(guān)注

    2

    文章

    2135

    瀏覽量

    1978

原文標(biāo)題:十分鐘讀懂旋轉(zhuǎn)編碼(RoPE)

文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    快充技術(shù)&芯片詳解 十分鐘讓你的手機(jī)滿血復(fù)活

    快沖技術(shù)全面來襲!你了解市面上的這些手機(jī)用的快充技術(shù)原理嗎?你知道有哪些電池管理芯片的使用讓你的手機(jī)十分鐘滿血復(fù)活嗎?今天跟小編一起,了解一下這些快充技術(shù)和芯片吧。
    發(fā)表于 06-23 13:35 ?6.5w次閱讀

    十分鐘學(xué)會(huì)Xilinx FPGA 設(shè)計(jì)1.1

    十分鐘學(xué)會(huì)Xilinx FPGA 設(shè)計(jì)1.1
    發(fā)表于 08-10 11:10

    ModelSim SE 十分鐘入門

    ModelSim SE 十分鐘入門[table=98%][tr][td][table=98%][tr][td]1.ModuleSim SE 快速入門本文以ModelSim SE 5.6版本為
    發(fā)表于 08-12 15:07

    ModelSim SE 十分鐘入門

    ModelSim SE 十分鐘入門
    發(fā)表于 08-20 20:33

    十分鐘學(xué)會(huì)ISE

    十分鐘學(xué)會(huì)ISE
    發(fā)表于 03-26 09:39

    十分鐘學(xué)會(huì)ISE

    十分鐘學(xué)會(huì)ISE
    發(fā)表于 09-05 22:49

    全球首發(fā)十分鐘快速充滿電移動(dòng)電源

    `快速充電無壓力:十分鐘能充滿的移動(dòng)電源MY POWER 任性系列土豪金版深圳市麥可電源有限公司是一家專業(yè)從事高頻開關(guān)電源研發(fā)、生產(chǎn)、銷售、服務(wù)于一體的綜合性企業(yè)。產(chǎn)品廣泛應(yīng)用于網(wǎng)絡(luò)系統(tǒng)、安防系統(tǒng)
    發(fā)表于 03-25 14:56

    采集系統(tǒng)需要隔十分鐘采集10S數(shù)據(jù),怎么實(shí)現(xiàn)?

    畢業(yè)實(shí)驗(yàn)需要用labview做個(gè)采集界面,但是我沒有這方面基礎(chǔ),所以這個(gè)隔十分鐘采集10S數(shù)據(jù)功能怎么也實(shí)現(xiàn)不了,現(xiàn)在我就做到下面這樣,求大神指導(dǎo)一二~不勝感激!
    發(fā)表于 01-13 12:56

    BearPi-HM Nano 十分鐘上手教程資料

    BearPi-HM Nano 十分鐘上手教程一、準(zhǔn)備工作二、開始下載三、開始部署環(huán)境
    發(fā)表于 04-13 10:20

    基于STM32F103RB的數(shù)碼管如何去實(shí)現(xiàn)十分鐘計(jì)時(shí)呢

    基于STM32F103RB的數(shù)碼管如何去實(shí)現(xiàn)十分鐘計(jì)時(shí)呢?其中斷代碼是怎樣的?
    發(fā)表于 11-17 06:12

    遇到SE5經(jīng)常自動(dòng)重啟,大約十幾分鐘到二十分鐘左右重啟一次的問題如何解決?

    遇到SE5經(jīng)常自動(dòng)重啟,大約十幾分鐘到二十分鐘左右重啟一次的問題怎么辦
    發(fā)表于 09-18 08:13

    十分鐘學(xué)會(huì)Xilinx FPGA 設(shè)計(jì)

    十分鐘學(xué)會(huì)Xilinx FPGA 設(shè)計(jì) Xilinx FPGA設(shè)計(jì)基礎(chǔ)系統(tǒng)地介紹了Xilinx公司FPGA的結(jié)構(gòu)特點(diǎn)和相關(guān)開發(fā)軟件的使用方法,詳細(xì)描述了VHDL語言的語法和設(shè)計(jì)方法,并深入討
    發(fā)表于 03-15 15:09 ?178次下載

    三星改革智能手機(jī)充電技術(shù),充滿只需十分鐘

    現(xiàn)在的手機(jī)電池續(xù)航短的問題一直手機(jī)領(lǐng)域研究的重點(diǎn)。近日,三星爆出猛料,宣布已經(jīng)成功研制出石墨烯電池,以后充電只需要十分鐘
    發(fā)表于 12-02 11:24 ?2019次閱讀

    英國(guó)搭建太陽能汽車充電網(wǎng)試點(diǎn)項(xiàng)目,電動(dòng)汽車在三十分鐘內(nèi)完成充電

    英國(guó)計(jì)劃在國(guó)內(nèi)設(shè)立100多座以太陽能為能源的汽車充電站。每個(gè)充電站場(chǎng)地配備24個(gè)汽車充電區(qū),車主可用手機(jī)app預(yù)訂充電。據(jù)悉,所有電動(dòng)汽車均能在三十分鐘內(nèi)完成充電,部分車型甚至在十分鐘內(nèi)即可充滿。
    的頭像 發(fā)表于 04-06 17:28 ?3167次閱讀

    十分鐘分析穩(wěn)壓三極管工作原理資料下載

    電子發(fā)燒友網(wǎng)為你提供十分鐘分析穩(wěn)壓三極管工作原理資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-11 08:54 ?3次下載
    <b class='flag-5'>十分鐘</b>分析穩(wěn)壓三極管工作原理資料下載