上一篇文章基于大语言模型微调的相机知识助手开发-算法分析主要是工程层面的代码实现,但是没有涉及到底层原理。因此本文的主要目的是探讨为什么微调一个文本生成的大语言模型要使用因果语言模型,以及讨论怎样对数据进行扩展。
1.为什么使用AutoModelForCausalLM
- AutoModelForSequenceClassification用于文本分类
- AutoModelForMaskedLM用于填充被遮盖的单词。其实文本生成类的任务就是一种特殊的掩码语言模型,即AutoModelForMaskedLM, 只不过每次生成的时候都是遮盖最后一个单词
- AutoModelForSeq2SeqLM用于序列到序列的生成,比如翻译。但是这种类的输入输出是强相关的,换句话说就是输出强依赖于输入,类似于翻译这种,自由度很低。
而AutoModelForCausalLM则保证从前往后生成,只基于前K个词预测第K+1个词,GPT系列就是这个原理。
2.怎样对数据进行扩展
这点是本文的重点。《深入浅出:深度学习和神经网络》这本书中介绍的数据扩展的方式是将图像上下左右各移动一个像素,这样数据量就扩充了4倍。很可惜我做的是文本生成,不是图像识别,不能直接平移像素。
现在的想法是既然instruction和input部分的labels是-100,这部分是不参与文本生成的,模型真正需要生成的是output部分的labels。可以依次删除output部分的前5个字符,即删除第一个字符,删除第二个字符....这样数据量就扩充了3倍。原理是加入原labels序列是21, 23, 14, 16 46, 那么删除第一个字符现在的序列就是23, 14, 16, 46,模型基于instruction和input原本生成的第一个字符应该对应21,现在变成了23,这也对应了用户写prompt时漏一个字或者打错一个字的情况,从而增强模型的泛化能力。
这种方式并不好,因为它会破坏句子的连贯性。用户的确会少输一个字,或者打错一个字,但是这种错误并不总是出现在前5个词里面。
最好的方法是保持原意不变,把句子换个说法。有一个好思路,叫做“回译”,即中文翻译成英文,英文再翻译成中文,这样就达到了意思不变,表达改变的效果。