欢迎关注我的公众号“ NLP前沿 ”,日更最新论文/博客速读,周更AI领域近一周发生的那些事儿 。欢迎投稿! 行文仓促,有理解错误,欢迎指正 !
https://github.com/thunlp/InfLLM
https://arxiv.org/abs/2402.04617
一张图看框架,如下图,简单总结,历史的上文token,被分为3类,Initial token、Evicted token、Local token,每次解码下一个token的时候,Initial token常驻和一个窗口内的token,Evicted token会分块,检索一部分token出来。如果检索不到,那这个方法就退化为了streaming llm方法。
整个流程应该大致上就上述内容,接下来是一些细节的。
中间那部分被称为Evicted token的,如何缓存,如何检索? 位置编码?
考虑到长序列的局部语义一致性,对历史的k,v进行分块存储 检索,而不是以token级存储单元来存储,可以保持性能的同时降低成本。
每个块中选择几个代表性的token用在块表示。每个token可以计算其再局部窗口中的重要性,表示其影响力。计算方法如下:以第m个token为例,使用m的key向量,计算与周围L的q向量的相关性,但是公式的j是1开始的,只往后看,感觉怪怪的。另外就是,原文表示这里只是介绍简单的无须训练的代表向量计算方式,可以通过训练更好的表示模型,留给未来的工作来验证。
计算相似度。l_{x}在编码阶段等于块大小,在解码阶段为1,求个和。
受到之前一些工作的启发,对超出窗口的用相同的位置编码来表示。
原理到这里结束了,贴一张结果图,更多的分析详见开头原文地址。
