GongCheng1919 / bias-compensation

[CAAI AIR'24] Minimize Quantization Output Error with Bias Compensation
7 stars 1 forks source link

difference with bias correction #2

Open shee-gao opened 4 months ago

shee-gao commented 4 months ago

想请问一下这篇论文操作与bias correction 有啥本质区别嘛

GongCheng1919 commented 3 months ago

很抱歉没有及时回复您的问题。以下是对您问题的回复: BC和bias correction的目标不一样,因此导致了完全不一样的优化和应用结果,核心在于BC和quantizer解耦了, 使得BC可以被很容易的优化并且和可以被应用于任何模块,在选定了quantizer的前提下BC可以保证最低的输出误差,而bias correction无法保证。

具体而言,bias correction的提出是为了减少量化误差,从而提高量化模型的精度,其核心思想是在量化完成之后的输出上添加一个offset,来对齐量化前后输出的均值,最早在2019年nips的PTQ中被提出。 最新的工作中bias correction也被用于对齐量化前后的激活值分布,从而提高量化模型的精度。 在简单的量化和特殊的模块中,比如仅使用权值量化的Linear模块中,bias correction可以被推导出来等价于在输出上添加了一个偏置tensor,但是大家通常不这么做,因为推导出的这个偏置tensor和output一样大,如果缓存起来的话非常耗内存。 在复杂一点的场景和模块,比如权值和激活值均被量化的情况,以及BMM模块,TransformerResidual Block等复杂的模块,bias correction是无法被推导为在输出添加一个偏置tensor, 因为bias correction的本质是对每一个量化过程(一个linear层量化通常包含权值和激活两个量化过程)添加一个offset,会导致复杂的输出计算,比如多个float tensor的乘法和加法,因此从形式上来说, BC总是被应用到输出上,bias correction本应用于量化过程中与量化耦合, 从形式上说BC和bias correction是不同的。 此外,bias correction中offset的设置也是启发式的,难以优化,虽然通常都能降低量化损失,但是难以保证是最优的。

我们提出BC用于补偿量化输出误差,从而提高量化模型的精度。 其核心思想是通过在量化的输出上添加一个bias vector,从而抵消量化误差。 这个bias vector是独立于量化方法的,可以用于任何量化方法,比如定点量化、二值量化等。 也可以用于任何模块或者模型的补偿,比如TransformerResidual Block等。 BC的优化是一个凸优化问题,对于任何量化模块、量化方法,都可以保证最低的输出误差。

此外,我们的想法还来自CVPR2023的NoiseQuant,在该文章中,作者提出在量化的输入上添加一个noise tensor可以使得量化变得更平滑,然后再在输出后去除这个noise tensor,实验发现可以实现更低的量化精度损失。 我们在复现中发现量化前添加noise tensor,量化后又去除noise tensor,并不会改变输出的结果。 通过推导发现NoiseQuant改善量化结果的本质在于其在量化输出后的去除noise tensor的过程中, 没有对noise tensor进行量化(因为量化前添加的noise tensor随着输入的量化被一起量化了), 这意味着NoiseQuant并没有从添加了噪声的输入中完全去除noise tensor的影响,而是相当于对输出添加了一个0均值的噪声(quantized(noise)-noise,可以从这里的111-112行找到该结果)。 我们从NoiseQuant的实现代码中发现,该noise tensor的生成启发式的,其从一个固定范围的参数中生成一系列的随机数来作为noise tensor,并且暴力搜索哪一个noise tensor可以使得量化结果最好。 这个启发式的搜索过程是非常耗时的,而且不一定能够找到最优的noise tensor。

我们提出了BC,通过凸优化得到最优的bias vector,用于直接补偿量化输出误差,不需要在输入上添加noise然后去除,可以保证最低的输出误差,不需要启发式的搜索过程。

希望这条回复对您有所帮助,如果您有任何问题,请随时联系我们。

ZhengHSI commented 3 months ago

总的来说,bias correction是用于量化后模型激活值的校准,它主要是用于校准量化后的激活值,使量化前后模型的激活值的均值保持一致。而我们的方法,是用于校准量化模型中的每个模块的输出和原始模型输出一致,也就是在模型每个被量化的模块的输出后添加一个偏置向量,对齐原始模块输出。理论上来讲,我们的方法也可以和bias correction相结合,因为我们所加的偏置向量是在MAC(矩阵乘法也就是激活和权重相乘)操作之后,而bias correction是添加在MAC操作之前。

GongCheng1919 commented 3 months ago

想请问一下这篇论文操作与bias correction 有啥本质区别嘛

请看我上面的回复,谢谢!

shee-gao commented 3 months ago

thanks


发件人: @. @.> 代表 GONG CHENG @.> 发送时间: 2024年5月13日 23:15 收件人: GongCheng1919/bias-compensation @.> 抄送: 高射 @.>; Author @.> 主题: Re: [GongCheng1919/bias-compensation] difference with bias correction (Issue #2)

想请问一下这篇论文操作与bias correction 有啥本质区别嘛

请看我上面的回复,谢谢!

― Reply to this email directly, view it on GitHubhttps://github.com/GongCheng1919/bias-compensation/issues/2#issuecomment-2107949325, or unsubscribehttps://github.com/notifications/unsubscribe-auth/BBWFB4J3YM37HWES7J6QFG3ZCDKH7AVCNFSM6AAAAABG4SVVW2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMBXHE2DSMZSGU. You are receiving this because you authored the thread.Message ID: @.***>