现在的大模型已经非常聪明,但是像我这种“求知欲”比较强的人就会好奇为什么你问什么它答什么,它是怎么拥有这种能力的?为什么有时候在 Prompt 里我们给它几个例子,它就能做得更好?
大模型的训练周期
首先把它的生命周期分成两个阶段:预训练和推理。
预训练(Pre-training):十年寒窗苦读
这预训练阶段,研究员会把互联网的海量数据(百科,代码,新闻等)整理出来喂给模型。
🌰举个例子:
想象一个学生被关在世界上最大的图书馆里,没日没夜地看书。他的任务只有一个:遮住一句话的最后一个词,猜那个词是什么。
比如:“床前明月__”,他要猜出“光”。
猜错了?打手板(调整参数); 猜对了?给糖吃。
Few-Shot
其实在互联网的海量数据中存在着“天然 Few-Shot”,比如:
一个网页上可能列出了很多商品信息:
商品:鞋子,价格:100元
商品:帽子,价格:50元
商品:袜子,价格:...
当模型在预训练阶段读到这种文本时,它为了预测“袜子”后面的价格,必须学会关注上文的格式规律。这种在海量数据中不断捕捉“重复模式”的训练,直接赋予了模型 In-Context Learning(上下文学习) 的能力。这就是 Few-Shot 的源头。如果预训练数据里这种结构化、重复性的文本很少,模型的 Few-Shot 能力就会很差。
Zero-Shot
Zero-Shot 的本质是:“虽然你没给例子,但我以前读过类似的任务描述,我知道这是什么意思。”
虽然预训练没有专门的指令微调,但互联网文本里包含了大量的“任务描述”。
比如 CSDN、Github、StackOverflow 上的问答:“如何用 Java 实现某个需求?代码如下…”。
或者翻译网站上的文本:“下面是这段话用英文怎么翻译”,亦或是社区论坛里的话题讨论。
如果预训练数据的多样性(Diversity) 足够高,覆盖了代码、翻译、问答、逻辑推理等各种文本,模型在 Zero-Shot 时就能回忆起它在预训练阶段见过的类似场景,从而理解你的指令。
推理 (Inference):进考场答题
这个阶段的模型已经积累了大量的知识
📝 形象比喻:
现在,这个学霸走出图书馆,坐到了考场上。你就是出题老师。
你在对话框里输入的每一个字,都是在给它出题。它根据之前在图书馆学到的知识,实时计> 算出答案。
推理场景
- Zero-Shot(零样本)
在 prompt 中直接给任务指令,不给例子:
请将以下文本分类为正面或负面情感:
"这家餐厅太难吃了"
- Few-Shot (少样本)
在 prompt 中加入少量的示例:
情感分类示例:
"服务很好" -> 正面
"价格太贵" -> 负面
"环境不错" -> 正面
请分类:"这家餐厅太难吃了" -> ?
以上只是在 prompt 中的应用,实际中还需要研究员在后续对模式进行 微调。
微调(Fine-tuning)
所谓微调只是对预训练得到的模型进行调整,可以实现:
- 领域适配:让通用模型掌握专业知识(医疗、金融、法律等等)
- 任务适配:让模型擅长特定任务(分类、信息提取、翻译、QA 等等)
- 个性化定制:让模型按照某种风格输出(客服、女仆、管家等等)
- 对齐人类偏好:提高回答的有用性、准确性;输出的内容符合社会公认的道德伦理,减少有害内容的输出。
- 。。。
微调更像是把预训练积累的这些潜能“对齐”到人类的指令格式上,而不是凭空创造了这些能力。
我认为微调阶段的One-Shot或者 Few-Shot 都归结到 Few-Shot prompting,本质还是通过提示词里的示例更好的激发模型的性能
总结
Few-Shot、One-Shot、Zero-Shot 这些能力(是的,这些概念是模型的能力,而不是训练方法),主要是模型在预训练过程中自然涌现出来的,而不是研究员刻意设计或调整出来的。
预训练是在打造模型的“悟性”。悟性高的模型(预训练数据量大、质量高),你在使用时(推理),只需要给一点点提示(Few-Shot),它就能瞬间领悟,给你完美的答案。