如何基于开源大模型进行优化
1. Prompt工程
大模型可能知道问题相关,但是我们问的不清楚。所以需要根据我们的提问,构建出一个比较结构化的、大模型易于理解和分析的提问内容。
在下方的第二个资料里,我才知道有这么多Prompt的构建思路,难怪说是“工程”。
相关学习资料:
- datawhalechina/llm-cookbook(教程)
- Prompt Engineering Guide(内含多种Prompt策略)
2. RAG
大模型不知道问题相关。这种情况我们可以在问题上附加部分已知的领域知识。可以结合向量数据库或者知识图谱等优化。
3. 微调
大模型不知道问题相关。这种情况可以构建一定量的数据集,进一步训练、调整大模型的参数,使新的大模型更适合提问者的需求。
4. 不同需求场景下的比较
- 领域知识变更频繁。微调需要重复训练模型,而RAG不用修改已有大模型,调整较为灵活方便,更适合。
- 对定制能力要求高。微调对模型的优化效果较RAG好,定制性好,但也会损失一定的通用能力。
- 要求幻觉较少:RAG传入的专业辅助知识更能减少幻觉。
- 成本与可解释性。微调需要大量训练调整网络参数,成本较高,且网络参数的可解释型较差。RAG可以结合自身的知识库进行解释,且搭建工程框架的成本比训练模型低。
- 低延迟。RAG在模型推理的基础上还要进行一些文本向量化、知识库读写等,延迟较微调高。
baseline2学习
vllm
我理解是一个将本地模型暴露为网络服务的框架,但是通过一些优化提高了吞吐率和内存利用效率,适用于实时应用场景。而且他可以无缝集成hf的模型,使用起来确实很方便。
LoRA
模型微调,自然需要得到一个
Δ
W
\Delta W
ΔW, 通过
W
n
e
w
=
W
o
r
i
g
i
n
+
Δ
W
W_{new}=W_{origin}+\Delta W
Wnew=Worigin+ΔW,更新模型参数,进而得到一个新模型。
这就意味着
Δ
W
\Delta W
ΔW的矩阵大小与
W
o
r
i
g
i
n
W_{origin}
Worigin一致。众所周知大模型突出一个参数量大,那
Δ
W
\Delta W
ΔW自然也是非常耗显存的。为了把训练的价格打下来,就出现了LoRA。
LoRA(Low-Rank Adaptation):对于一个预训练好的基座模型,保留其原有的权重矩阵W不变,仅微调训练更新部分,且这个更新权重矩阵被分解成A和B两个低秩矩阵。
它的策略就是把
Δ
W
\Delta W
ΔW这个大矩阵分解为A、B两个小矩阵。在训练时,只训练这两个小矩阵,最后通过
W
n
e
w
=
W
o
r
i
g
i
n
+
B
A
W_{new}=W_{origin}+BA
Wnew=Worigin+BA更新模型参数。
我们假设
Δ
W
\Delta W
ΔW是(1e5,1e5),A是(1e5,8), B是(8,1e5),那么前后的元素个数差为
1
e
10
−
1.6
∗
1
e
6
1e10-1.6*1e6
1e10−1.6∗1e6,这是好几个数量级的差距了。
(这个图只是推荐算法里矩阵分解的演示,仅供参考)
下图为LoRA论文中的图,A矩阵初始化为高斯分布矩阵,B矩阵初始化为0矩阵。
多路召回
采用不同的策略、特征或者简单模型,分别召回一部分候选集,然后再把这些候选集混合在一起后供后续排序模型使用。
在baseline中其实就是将一个问题问同一个大模型三次,因为大模型是概率模型所以可能会有不同的答案。收集三次回复的结果,少数服从多数。
我感觉在一般的使用中,可以组合使用不同的prompt、不同的模型进行投票。此次比赛有显存限制估计不好用多个模型了。
其他优化思路(都只是思路,不确定效果是否更好)
- 全量微调
lora训练的是分解的矩阵,难免有精度损失。如果有钱有时间,全量微调效果应该更好。 - 数据集
使用更多的开源数据集训练。或者用更好的大模型构建出新数据集(或者获得更好的推理思路),用他们训练当前模型(模型蒸馏)。 - 模型量化
将超出比赛要求限制的大模型,通过降低浮点型参数的精度等方式,降低他的显存消耗,使其正常完成比赛。 - 货比三家
对于不同的模型、不同的Prompt,组合搭配,选评分最高的。
完全使用baseline02的分数
小白本人的pytorch学习
由于我没怎么用过pytorch,还学习了相关API
- 构建网络
- 构建网络
- pytorch中的几个层
- pytorch中的几个层
- pytorch教程
- 构建pytorch数据集