大语言模型(LLM)的发展日新月异,越来越多的开源权重的模型被释放出来。 这些模型能够在消费级的硬件上跑起来。所谓跑起来,我们是指大模型的推理(LLM的预训练成本依然还是个人很难承担的)可以运行起来。大模型的量化一直是学术界以及工业界都持续关注的方向。
所谓”模型量化“,是指让原本单位权重为float16(16bit)的模型,能以单位权重为8bit,4bit,甚至1bit在内存(显存)中加载,然后进行模型推理。单位权重为float16的模型量化为8bit,显然运行时候的静态内存就直接减少一半,其资源节约不言而喻;然而我们希望的是”不给马儿吃草,还希望马儿跑得块“,即节约资源的同时还希望不损失模型所带来的智能化的体验。
例如,我们有原始模型 M M M,以及量化到8bit的模型 M q ( 8 ) M_q^{(8)} Mq(8),假设我们使用 M ( input ) M(\text{input}) M(input)表示模型 M M M对于输入 input \text{input} input所给出的输出结果;
如果 input = \text{input}= input=“你好,请为我推荐一个附近的餐厅”,而两个模型的输出结果分别为:
M ( input ) = M(\text{input})= M(input)=“由于我不知道您所在的位置,所以假设您现在在北京,我会为您推荐全聚德烤鸭”
M q ( 8 ) ( input ) = M_q^{(8)}(\text{input})= Mq(8)(input)=“我为您推荐的是烤鸭,它在北京广受欢迎”
对比 M ( input ) M(\text{input}) M(input)以及 M q ( 8 ) ( input ) M_q^{(8)}(\text{input}) Mq(8)(input),显然我们认为前者是一个更好的回答,那么 M q ( 8 ) M_q^{(8)} Mq(8)和 M M M之间的差距该如何衡量?
先说答案:在不同的数据集上,度量 M M M以及 M q ( 8 ) M_q^{(8)} Mq(8) 的Perplexity,然后进行对比, M q ( 8 ) M_q^{(8)} Mq(8)与 M M M在各数据集上的Perplexity的结果越接近说明 M q ( 8 ) M_q^{(8)} Mq(8)作为量化之后的模型其推理性能损失的越少。
那么什么是Perplexity?请大家继续往下看:
1. 语言模型的简单回顾
在介绍Perplexity之前,我们先回顾一下什么是语言模型,语言模型就是求一个序列在这个语言(数据)中的出现的概率。
例如我们有如下的语言 L L L(该语言的数据只包含下面的一个长度为6的字符串):
我有一个宠物
w i w_i wi为以上语言 L L L中任意一个字符,例如”我“; w 1 , w 2 , ⋯ w s w_1,w_2,\cdots w_s w1,w2,⋯ws为语言 L L L中出现长度为 s s s的连续的字符序列; P ( w 1 , w 2 , . . . w s ) P(w_1,w_2,...w_s) P(w1,w2,...ws)表示序列 w 1 , w 2 , . . . w s w_1,w_2,...w_s w1,w2,...ws在这个语言中出现的概率; C ( w 1 , w 2 , . . . w s ) C(w_1,w_2,...w_s) C(w1,w2,...ws)表示序列 w 1 , w 2 , . . . w s w_1,w_2,...w_s w1,w2,...ws在语言 L L L中出现的次数;且我们定义条件概率 P ( w l ∣ w 1 , w 2 , . . . w s − 1 ) P(w_l \mid w_1,w_2,...w_{s-1}) P(wl∣w1,w2,...ws−1)取值计算如下:
P ( w s ∣ w 1 , . . . w s − 1 ) = C ( w 1 , . . . w s ) C ( w 1 , . . . w s − 1 w x ) ( 1 ) \begin{align*} P(w_s \mid w_1,...w_{s-1}) &= \frac{C(w_1,...w_s) }{C(w_1,...w_{s-1} w_{x})} \end{align*} \qquad (1) P(ws∣w