一个加速语言模型生成的方法
- 现在语言模型的一个弊端
- speculative decoding
- 预言家预测的问题
- speculative decoding 模块的实现方法
- NAT Non-autoregressive
- 模型压缩
- 使用搜索引擎
- 一些更复杂些的speculative decoding 实现方式
speculative decoding 是一个适用于目前生成模型的加速方法,不需要修改模型,就可以大大加速模型的生成速度。
现在语言模型的一个弊端
现在语言模型用autoregressive decoding方法生成输出内容的时候,由于其底层实现机制是decoder按照顺序一步步生成的,没有办法并行,所以生成的速度很慢。
克服它的一个方法就是speculative decoding,模型之外,外挂一个预言家,多预言一个就加速一倍。
speculative decoding
现在就是要多加上一个speculative decoding模块,它生成速度很快,它的所用就是用来预测语言模型下一个要生成的是什么。这样就可以把语言模型原本串行的操作,变成并行的。原本语言模型的输入的,和 输入加 speculative decoding 预测的下一个token 一起输入到语言模型里,这样语言模型就一次可以并行处理两个输入,生成两个输出了,如图:
还是用机器翻译来举个例子:
- 原本的输入形式:
输入:机器学习,输出 machine
输入: 机器学习 ,merchine,输出 learning
输入 :机器学习 ,merchine,输出 end
- 加上预言模块后:
输入一次变成两个 也就是原本输入中的上面的前两条一起输入给语言模型,也就是:
不仅输入
机器学习,
,还要用 speculative decoding 预言到的machine ,形成
机器学习,machine
上面两个一起输入给语言模型,让它输出。
如果 speculative decoding一次预测一个,那么速度就可以提升为原来的2倍,一次预测2个token,就可以提升3倍:
看到这里你i肯定会想,难道预言家不会犯错么,上面一次预测的这两个token万一有错误呢?
预言家预测的问题
预言家必然不可能都预测准确,要不然语言模型还有什么用,下面我们看看预测错误会出现什么情况:
假如正确的输出是一个红一个黄的token,但是预言家预预测出了一个红一个灰的token,也就是预测错误了一个,那情况就如下:
这情况下,第三步是错误,但是前两步是正确的呢,速度还是提升了。极端的,预言家全部都没预测对,但是不影响原来一个token的输出,只是多了一点预言家的预测时间,和多了一些运算资源,但是几乎可以忽略。
总之,好处多余坏处。那么预言家 speculative decoding 如何实现呢
speculative decoding 模块的实现方法
speculative decoding 诉求就是速度快,可以犯点错,下面有三个方法可以实现这个诉求
NAT Non-autoregressive
我们可以用 Non-autoregressive 来实现这个,它的实现方式就是生成速度快,但是生成的没那么准确。
把输入放到NAT的模型里面,同时预测多个输出
模型压缩
可以压缩模型,比如模型量化等很多方法可以压缩模型,用小模型去作为预言家
使用搜索引擎
可以直接联网输入,把搜索到的拿出来作为预言的token
一些更复杂些的speculative decoding 实现方式
一个预言家预测准确的情况无法确定,但是我们可以放多个预言家,这样会耗费计算资源,但是预言准确的命中率会大大提升。