NEFTune指的是Noise Embedding Finetuning(噪声嵌入精调),提出自论文:NEFTune: NOISY EMBEDDINGS IMPROVE INSTRUCTION FINETUNING。
NEFTune方法的原理仅使用一句话就可以描述清楚:在finetune过程的词向量中引入一些均匀分布的噪声即可明显地提升模型的表现:
如上图,基于AlpacaEval
进行评测,引入了噪声之后在Alpaca数据集上有34.9%的提升!!!其他数据集也有不低于7.5%的提升,效果惊人~。
噪声的生成方法也不复杂,就是按原向量维度生成每一项都是一个从-1到1之间的随机数的噪声向量,再乘以缩放因子 α L d \frac{\alpha}{\sqrt{Ld}} Ldα,缩放因子参考自论文:Freelb: Enhanced adversarial training for natural language understanding,它和 α 3 \frac{\alpha}{\sqrt{3}} 3α有着相似的expected Euclidean magnitude。
引入方法后的整个finetune过程引用原文的算法描述如下:
因为方法很简单,实现自然也很简单:
uniform_(a,b)
,即按替换原向量每一项为a到b之间的随机数。
>>> a = torch.zeros(3, 3)
>>> print(a)
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
>>> a.uniform_(-1, 1)
tensor([[-0.8951, -0.6760, -0.1516],
[-0.6764, -0.6086, -0.4051],
[-0.7278, 0.2884, 0.7550]])
>>>
hugging face已在TRL (Transformer Reinforcement Learning)
库中支持了该方法。
参考文献
- NEFTune: NOISY EMBEDDINGS IMPROVE INSTRUCTION FINETUNING、
- https://github.com/neelsjain/NEFTune
- Freelb: Enhanced adversarial training for natural language understanding