因为和苏神做过一段时间同事,所以2021年就知道rope了,当时也没太在意,因为位置编码是在为transformer类模型提供位置信息,在我实际实验中不同位置编码对最终效果差别很小。
2023年llm大爆发,facebook开源了llama模型,并且采用了rope,我也第一时间用上了llama,那会感觉rope有点东西,但是还是心理觉得位置编码没那么重要。
直到最近fb发了一篇文章《extending context window of large language models via position interpolation》通过线性插值+少量微调的方式将llama原始2k的模型轻松拓展到了32k,这时候我感觉到rope的强大之处。
进nlp群—>加入nlp交流群
通过线性插值rope扩张llama context长度最早其实是在llamacpp项目中被人发现,有人在推理的时候直接通过线性插值将llama由2k拓展到4k,性能没有下降,引起了很多人关注。fb的论文给这个发现提供了理论和实验支撑,进一步发现通过线性插值+微调可以扩展到32k长度。实现非常简单,只需要对位置编码进行线性插值,初始化的时候增加几行代码就行:
def rotaryembedding(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 # build here to make `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) # different from paper, but it uses a different permutation in order to obtain the same calculation 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上又出现了ntk rope,通过引入新的插值的scale,来扩展context,甚至微调都不需要!让人震撼。实现也是极其简单:
import transformersold_init = transformers.models.llama.modeling_llama.llamarotaryembedding.__init__def ntk_scaled_init(self, dim, max_position_embeddings=2048, base=10000, device=none): #the method is just these three lines max_position_embeddings = 16384 a = 8 #alpha value base = base * a ** (dim / (dim-2)) #base change formula 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过长之后引起的上下文无法关联问题。
两者都有结构简单,方法有效的优点,这个在工程上有极大的优势,个人预感rope将会被大规模采用。如同当年resnet一样。
STM32单片机智能电饭煲系统设计方案
主机通过发送设备地址后由应答位确定该设备是否存在
新能源车自燃事件接连发生,新能源车为何会如此敏感
小米6亮银版颜值对比HTCU11,四曲面玻璃镜面VS扭曲电镀伪镜面
航盛致力于成为世界级、国际化的汽车电子领军企业
RoPE可能是LLM时代的Resnet
3G推动IVI市场提速 Intel将出二代车载Atom
台湾通泰TTP224C-BSBN
阿里巴巴兑现使命 持续加大对未来投入
印度逮捕vivo高管,涉及洗钱案指控
美科学家研发出一款具有触觉感应系统的鞋子
燧原科技致力于搭建国内开源开放的算力产业生态
高压断路器灭弧介质种类
电位器式传感器结构图解,电位器式电阻传感器结构原理图解
PCB制板过孔大小怎样来选择
荣耀V9怎么样?荣耀V9评测:华为荣耀V9出厂测试实验,业内顶级标准不买后悔
led节能灯的驱动电源电路图
华为手机4G运存就够了?你怎么看
创建更智能化的校园环境,自连智慧校园管理解决方案
赛灵思Zynq-7000 All Programmable SoC获年度最具潜力新技术奖提名