因為和蘇神做過一段時間同事,所以2021年就知道RoPE了,當(dāng)時也沒太在意,因為位置編碼是在為transformer類模型提供位置信息,在我實際實驗中不同位置編碼對最終效果差別很小。
2023年LLM大爆發(fā),facebook開源了LLAMA模型,并且采用了RoPE,我也第一時間用上了LLAMA,那會感覺RoPE有點東西,但是還是心理覺得位置編碼沒那么重要。
直到最近fb發(fā)了一篇文章《EXTENDING CONTEXT WINDOW OF LARGE LANGUAGE MODELS VIA POSITION INTERPOLATION》通過線性插值+少量微調(diào)的方式將LLAMA原始2k的模型輕松拓展到了32k,這時候我感覺到RoPE的強大之處。
進NLP群—>加入NLP交流群
通過線性插值RoPE擴張LLAMA context長度最早其實是在llamacpp項目中被人發(fā)現(xiàn),有人在推理的時候直接通過線性插值將LLAMA由2k拓展到4k,性能沒有下降,引起了很多人關(guān)注。fb的論文給這個發(fā)現(xiàn)提供了理論和實驗支撐,進一步發(fā)現(xiàn)通過線性插值+微調(diào)可以擴展到32k長度。實現(xiàn)非常簡單,只需要對位置編碼進行線性插值,初始化的時候增加幾行代碼就行:
defRotaryEmbedding(torch.nn.Module):
def__init__(self,dim,max_position_embeddings=2048,base=10000,device=None):
super().__init__()
inv_freq=1.0/(base**(torch.arange(0,dim,2).float().to(device)/dim))
self.register_buffer("inv_freq",inv_freq)
max_position_embeddings=8192
#Buildheretomake`torch.jit.trace`work.
self.max_seq_len_cached=max_position_embeddings
t=torch.arange(
self.max_seq_len_cached,
device=self.inv_freq.device,
dtype=self.inv_freq.dtype,
)
self.scale=1/4
t*=self.scale
freqs=torch.einsum("i,j->ij",t,self.inv_freq)
#Differentfrompaper,butitusesadifferentpermutationinordertoobtainthesamecalculation
emb=torch.cat((freqs,freqs),dim=-1)
self.register_buffer(
"cos_cached",emb.cos()[None,None,:,:],persistent=False
)
self.register_buffer(
"sin_cached",emb.sin()[None,None,:,:],persistent=False
)
這兩天reddit上又出現(xiàn)了ntk RoPE,通過引入新的插值的scale,來擴展context,甚至微調(diào)都不需要!讓人震撼。實現(xiàn)也是極其簡單:
importtransformers
old_init=transformers.models.llama.modeling_llama.LlamaRotaryEmbedding.__init__
defntk_scaled_init(self,dim,max_position_embeddings=2048,base=10000,device=None):
#Themethodisjustthesethreelines
max_position_embeddings=16384
a=8#Alphavalue
base=base*a**(dim/(dim-2))#Basechangeformula
old_init(self,dim,max_position_embeddings,base,device)
transformers.models.llama.modeling_llama.LlamaRotaryEmbedding.__init__=ntk_scaled_init
具體解釋可以參考蘇神自己寫的文章[1]。
為什么說RoPE會成為LLM時代的Resnet,首先是兩者解決的問題有相似性。
Resnet解決了卷積模型變深之后梯度消失的問題,使的深度模型大放光彩。
RoPE類似的也解決了LLM context過長之后引起的上下文無法關(guān)聯(lián)問題。
兩者都有結(jié)構(gòu)簡單,方法有效的優(yōu)點,這個在工程上有極大的優(yōu)勢,個人預(yù)感RoPE將會被大規(guī)模采用。如同當(dāng)年Resnet一樣。
-
模型
+關(guān)注
關(guān)注
1文章
3114瀏覽量
48660 -
resnet
+關(guān)注
關(guān)注
0文章
12瀏覽量
3155 -
LLM
+關(guān)注
關(guān)注
0文章
264瀏覽量
297
原文標(biāo)題:RoPE可能是LLM時代的Resnet
文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論