Prompt Learning 原理
1. Prompt Learning 是什么
Prompt Learning 可以先理解成一句话:
不大改模型本身,而是学习"应该给模型什么样的提示",让预训练大模型更好地完成下游任务。
它和 LoRA、SFT 的核心区别是:
- LoRA / SFT:主要修改模型内部参数
- Prompt Learning:主要优化输入给模型的 Prompt
2. 最普通的 Prompt 是什么
例如,让 LLM 根据网络状态判断是否发生拥塞:
text
根据下面的网络状态判断是否发生拥塞:
RTT = 120 ms
Packet Loss = 5%
Bandwidth = 20 Mbps
模型输出:
text
Congestion
这里:
"根据下面的网络状态判断是否发生拥塞"
就是人工设计的 Prompt。
这种 Prompt 一般称为:
Hard Prompt / Discrete Prompt \boxed{\text{Hard Prompt / Discrete Prompt}} Hard Prompt / Discrete Prompt
也就是离散文本提示。
3. Prompt Learning 到底在"学习"什么
人工设计的 Prompt 不一定是最适合模型的。
因此,Prompt Learning 的核心思想是:
让模型通过训练,自己寻找最适合当前任务的 Prompt。
但它通常并不是直接学习一句人类能够阅读的文本,而是学习一组连续的向量。
假设原始输入表示为:
X=x1,x2,x3,...,xn X=x_1,x_2,x_3,\\dots,x_n X=x1,x2,x3,...,xn
Prompt Learning 会在输入前增加几个可训练的 Prompt 向量:
P=p1,p2,p3,...,pm P=p_1,p_2,p_3,\\dots,p_m P=p1,p2,p3,...,pm
最终输入变成:
P;X\] \[P;X\] \[P;X
即:
p1,p2,...,pm,x1,x2,...,xn\] \[p_1,p_2,\\dots,p_m,x_1,x_2,\\dots,x_n\] \[p1,p2,...,pm,x1,x2,...,xn
其中:
p1,p2,...,pm p_1,p_2,\dots,p_m p1,p2,...,pm
并不是实际的英文单词或者中文字符,而是一组可学习的 Embedding 向量。
因此这种 Prompt 也称为:
Soft Prompt \boxed{\text{Soft Prompt}} Soft Prompt
4. Prompt Learning 的训练原理
假设已经有一个预训练好的大模型:
fθ f_{\theta} fθ
其中:
θ \theta θ
表示 LLM 原来的参数。
通常在 Prompt Learning 中:
θ 冻结 \boxed{\theta\ \text{冻结}} θ 冻结
也就是说:
大模型主体参数基本不更新。
然后在输入前增加一组可以学习的 Prompt:
P=p1,p2,...,pm P=p_1,p_2,\\dots,p_m P=p1,p2,...,pm
输入变成:
P;X\] \[P;X\] \[P;X
送入 LLM:
y^=fθ(P;X) \hat{y}=f_{\theta}(P;X) y^=fθ(P;X)
其中:
- XXX:原始任务输入
- PPP:可训练 Prompt
- y^\hat{y}y^:模型预测结果
然后将预测结果与真实标签 yyy 比较:
L=Loss(y^,y) L=\text{Loss}(\hat{y},y) L=Loss(y^,y)
通过反向传播更新 Prompt:
P←P−η∂L∂P P \leftarrow P-\eta\frac{\partial L}{\partial P} P←P−η∂P∂L
其中:
- η\etaη:学习率
- PPP:需要学习的 Prompt 参数
因此,训练过程中主要更新的是:
P \boxed{P} P
而不是整个 LLM。
5. 一个简单例子
假设任务是:
根据 RTT、带宽和丢包率判断当前网络是否拥塞。
原始网络状态:
text
RTT = 120 ms
Bandwidth = 20 Mbps
Packet Loss = 5%
经过编码后,可以得到:
X=x1,x2,x3 X=x_1,x_2,x_3 X=x1,x2,x3
然后增加 4 个可训练 Prompt:
P=p1,p2,p3,p4 P=p_1,p_2,p_3,p_4 P=p1,p2,p3,p4
最终输入:
p1,p2,p3,p4,x1,x2,x3\] \[p_1,p_2,p_3,p_4,x_1,x_2,x_3\] \[p1,p2,p3,p4,x1,x2,x3
送入 LLM:
P;X→LLM→y^ P;X \rightarrow LLM \rightarrow \hat{y} P;X→LLM→y^
假设真实答案是:
text
Congestion
但模型预测:
text
No Congestion
那么计算预测误差:
L=Loss(y^,y) L=\text{Loss}(\hat{y},y) L=Loss(y^,y)
然后反向传播:
text
p1 更新
p2 更新
p3 更新
p4 更新
经过大量样本训练之后:
p1,p2,p3,p4 p_1,p_2,p_3,p_4 p1,p2,p3,p4
会逐渐学习到:
应该怎样提示 LLM,才能让它更好地完成网络拥塞判断任务。
6. 为什么 Prompt Learning 能起作用
预训练 LLM 已经学习了大量知识、模式和关系。
Prompt Learning 并不是重新训练一个模型,而是在学习:
如何把大模型原本具有的能力更好地激活出来。
可以把大模型想象成一个已经掌握很多知识的人。
Prompt Learning 不是重新教他知识,而是在学习:
"应该怎么问,他才能更准确地给出答案。"
因此:
Prompt Learning≈学习如何引导预训练模型 \boxed{ \text{Prompt Learning} \approx \text{学习如何引导预训练模型} } Prompt Learning≈学习如何引导预训练模型
7. Prompt Engineering 和 Prompt Learning 的区别
Prompt Engineering
Prompt 由人工设计。
例如:
text
Please predict network congestion according to the following network state.
如果效果不好,需要人工不断修改:
text
Prompt V1
Prompt V2
Prompt V3
...
因此:
Prompt由人设计 \boxed{\text{Prompt由人设计}} Prompt由人设计
Prompt Learning
Prompt 不完全由人工决定,而是通过训练数据自动学习。
即:
P=p1,p2,...,pm P=p_1,p_2,\\dots,p_m P=p1,p2,...,pm
通过:
Loss→Backpropagation→Prompt更新 Loss \rightarrow Backpropagation \rightarrow Prompt更新 Loss→Backpropagation→Prompt更新
最终得到适合当前任务的 Prompt。
因此:
Prompt由数据驱动自动学习 \boxed{\text{Prompt由数据驱动自动学习}} Prompt由数据驱动自动学习
8. Prompt Learning、LoRA 和 SFT 的区别
| 方法 | 主要训练内容 | LLM 原始参数 |
|---|---|---|
| Prompt Learning | Prompt Embedding | 通常冻结 |
| LoRA | 低秩矩阵 A,BA,BA,B | 原参数冻结 |
| Full SFT | LLM 大量或全部参数 | 更新 |
| LoRA + SFT | LoRA 参数 | 主体参数冻结 |
可以进一步理解为:
Prompt Learning
主要在输入端进行适配:
Trainable Prompt→LLM \boxed{ \text{Trainable Prompt} \rightarrow LLM } Trainable Prompt→LLM
LoRA
主要在模型内部进行适配:
W′=W+BA \boxed{ W'=W+BA } W′=W+BA
其中:
- WWW:原始预训练权重
- A,BA,BA,B:可训练低秩矩阵
9. Prompt Learning 的完整流程
text
任务输入 X
│
│
├─────────────┐
│ │
可训练 Prompt P │
│ │
└──────┬──────┘
↓
[P ; X]
↓
Frozen LLM
↓
预测结果 ŷ
↓
与真实标签 y 比较
↓
Loss
↓
Backpropagation
↓
更新 Prompt P
对应数学表达:
P;X→fθ→y^ P;X \rightarrow f_{\theta} \rightarrow \hat{y} P;X→fθ→y^
计算:
L=Loss(y^,y) L=\text{Loss}(\hat{y},y) L=Loss(y^,y)
然后:
P←P−η∂L∂P P \leftarrow P-\eta\frac{\partial L}{\partial P} P←P−η∂P∂L
而:
θ \theta θ
通常保持冻结。
10. 常见的 Prompt Learning 方法
Prompt Tuning
直接在输入 Embedding 前增加一组可学习 Prompt Token:
p1,p2,...,pm,X\] \[p_1,p_2,\\dots,p_m,X\] \[p1,p2,...,pm,X
特点:
主要只训练输入层的 Soft Prompt。
Prefix Tuning
不仅在输入层添加 Prompt,还会在 Transformer 的多层 Attention 中加入可训练 Prefix。
可以简单理解为:
text
Input
↓
Transformer Layer 1 ← Prefix
↓
Transformer Layer 2 ← Prefix
↓
Transformer Layer 3 ← Prefix
↓
Output
因此它对模型内部多层计算都有影响。
P-Tuning
P-Tuning 同样学习连续 Prompt,但通常会增加一个 Prompt Encoder 来生成 Prompt Embedding。
基本思想仍然是:
通过少量 Prompt 参数,引导冻结的大模型适应下游任务。
11. Prompt Learning 在网络任务中的应用
假设网络输入包括:
RTT, Bandwidth, Loss, Queue RTT,\ Bandwidth,\ Loss,\ Queue RTT, Bandwidth, Loss, Queue
一种最简单的做法是先文本化:
text
RTT is 120 ms.
Bandwidth is 20 Mbps.
Packet loss is 5%.
Queue length is 30.
Please predict the optimal network action.
然后:
text
Network Data
↓
Text Prompt
↓
Tokenizer
↓
Token Embedding
↓
LLM
↓
Network Decision
如果加入 Soft Prompt,则可以表示成:
P1,P2,...,Pm;Network Input→LLM P_1,P_2,\\dots,P_m;\\text{Network Input} \rightarrow LLM P1,P2,...,Pm;Network Input→LLM
训练过程中:
Loss→更新 P1,P2,...,Pm Loss \rightarrow \text{更新 }P_1,P_2,\dots,P_m Loss→更新 P1,P2,...,Pm
12. Prompt Learning 在网络任务中的局限性
对于网络任务,输入往往不是普通文本,而可能包括:
- 时间序列
- 网络拓扑图
- DAG
- 图像
- 连续数值状态
- 链路状态
- 流量状态
如果将这些数据全部转换成文本:
text
RTT = ...
Bandwidth = ...
Loss = ...
Node 1 connects Node 2 ...
Node 2 connects Node 5 ...
...
可能出现两个问题。
问题 1:结构信息表达不充分
例如网络拓扑本身具有复杂的节点和边关系。
如果完全转成文字:
Graph→Text \text{Graph} \rightarrow \text{Text} Graph→Text
可能无法很好地保留原来的拓扑关系。
问题 2:输入 Prompt 过长
网络规模扩大之后,大量状态全部文本化可能导致:
Network Size↑⇒Prompt Length↑ \text{Network Size}\uparrow \Rightarrow \text{Prompt Length}\uparrow Network Size↑⇒Prompt Length↑
最终受到 LLM Context Length 的限制。
因此,一些网络 LLM 方法会采用:
Raw Network Data→专用 Encoder→Token-like Embedding→LLM \text{Raw Network Data} \rightarrow \text{专用 Encoder} \rightarrow \text{Token-like Embedding} \rightarrow LLM Raw Network Data→专用 Encoder→Token-like Embedding→LLM
而不是把所有网络数据都强制转换成文本 Prompt。
13. 最核心的一句话
Prompt Learning 的本质,是在冻结或基本冻结预训练大模型的情况下,通过训练少量连续 Prompt Embedding,学习最适合当前任务的提示方式,从而引导和激活大模型已有的知识与能力。
可以浓缩成:
可训练 Prompt+任务输入→冻结 LLM→预测→Loss→更新 Prompt \boxed{ \text{可训练 Prompt} + \text{任务输入} \rightarrow \text{冻结 LLM} \rightarrow \text{预测} \rightarrow Loss \rightarrow \text{更新 Prompt} } 可训练 Prompt+任务输入→冻结 LLM→预测→Loss→更新 Prompt