为分类任务微调表示模型
深入讲解为分类任务微调表示模型的完整流程:分类头设计、全量微调 vs LoRA 的选择、小样本场景下的 SetFit 方案,以及过拟合防范与模型评估。
从传统机器学习到 BERT 微调再到零样本分类,梳理文本分类的完整技术路线:何时用规则、何时微调、何时用大模型,以及多标签场景的处理方法。
基本流程是:1)用表示模型(如BERT、Sentence-BERT)把每条文本编码成固定维度的向量;2)把这些向量作为特征,喜欢什么分类器都行——逻辑回归、SVM、甚至简单的两层MLP;3)用标注数据训练分类器。关键在于嵌入向量的质量——如果嵌入模型足够好,同类文本的向量在空间中自然聚集,一个简单的线性分类器就能达到很好的效果。这种方法的优势是推理快、轻量,而且嵌入向量可以复用于多个任务。
嵌入+分类器:推理快、成本低、延迟低,适合大规模、实时场景;但需要标注数据训练分类器,新增类别时可能要重新训练。生成模型直接分类:零样本就能用,只需写提示词,灵活性极强,新增类别改提示词就行;但推理成本高、延迟大、输出可能不稳定(可能输出类别之外的内容)。实践中如果有足够标注数据且对延迟敏感,用嵌入方案;如果标注数据很少或类别经常变化,生成模型更合适。
零样本分类的思路是:把每个类别的描述和待分类文本都编码成嵌入向量,然后算余弦相似度,最相似的类别就是结果。优化标签描述很关键:不要只用一个词(如'positive'),而要用更具体的描述(如'this review expresses satisfaction and positive sentiment');可以用多个描述取平均;还可以用大模型生成每个类别的参考样本作为描述。本质上是把分类问题转换成了语义匹配问题。
朴素贝叶斯假设特征之间相互独立,这对文本来说明显不合理——词与词之间有强烈的依赖关系,'not good'的语义不是'not'和'good'的简单组合。朴素贝叶斯完全忽略词序和上下文,把文本当成无序的词袋。Transformer通过注意力机制捕获了词与词之间的全局依赖关系,能理解否定、转折、反讽、雐义等复杂语言现象,这些都是朴素贝叶斯不可能处理的。不过朴素贝叶斯也不是完全没用,它训练和推理都极快,在简单任务和小数据场景下是很好的baseline。
BERT的掩蔽策略是随机选择15%的token,其中80%替换为[MASK]、10%替换为随机词、10%保持不变。这种混合策略的目的是减少预训练和微调之间的差异(微调时没有[MASK]token)。纯掉的掩码语言建模可能用不同的比例或策略。这种预训练对分类有帮助是因为:模型要预测被遮住的词,就必须理解上下文的语义,这迫使模型学会了通用的语言表示。微调时只需在这些表示上加一个分类头,用少量标注数据就能达到很好效果。
分几步走:1)先用生成模型对无标签数据做一轮粗标注(零样本分类),扩大有标签数据集;2)用所有100万条数据对表示模型做领域自适应的继续预训练(MLM),让嵌入更懂这个领域;3)用扩充后的标注数据微调表示模型(或用SetFit的对比学习方法),出嵌入+分类头;4)用生成模型分类不确定的样本,再人工校验一批加入训练集,迭代优化。核心思路是用生成模型解决冷启动和数据扩充,用表示模型解决大规模推理效率。
这道题要结合具体的三个提示词来分析,但一般规律是:最有效的提示词通常是结构最清晰、约束最明确的那个——明确告诉模型输入是什么、输出只能是哪几个类别、最好给出示例。不好的提示词往往太模糊或者过于开放,让模型可能输出类别之外的内容。好的做法是:角色定义+任务说明+输出约束+few-shot示例,并且明确要求只输出类别名称。
RELATED