Datawhale AI 夏令营(2024第三期)AI+逻辑推理方向 模型微调学习笔记

发布于:2024-08-02 ⋅ 阅读:(223) ⋅ 点赞:(0)

如何基于开源大模型进行优化

1. Prompt工程

大模型可能知道问题相关,但是我们问的不清楚。所以需要根据我们的提问,构建出一个比较结构化的、大模型易于理解和分析的提问内容。
在下方的第二个资料里,我才知道有这么多Prompt的构建思路,难怪说是“工程”。

相关学习资料:

2. RAG

大模型不知道问题相关。这种情况我们可以在问题上附加部分已知的领域知识。可以结合向量数据库或者知识图谱等优化。

3. 微调

大模型不知道问题相关。这种情况可以构建一定量的数据集,进一步训练、调整大模型的参数,使新的大模型更适合提问者的需求。

4. 不同需求场景下的比较

  1. 领域知识变更频繁。RAG不会修改已有大模型,调整较为灵活方便,更适合。
  2. 对定制能力要求高。微调对模型的优化效果较RAG好,定制性好,但也会损失一定的通用能力。
  3. 要求幻觉较少:RAG传入的专业辅助知识更能减少幻觉。
  4. 成本与可解释性。微调需要大量训练调整网络参数,成本较高,可解释型较差。RAG可以结合自身的知识库进行解释,且搭建工程框架的成本比训练模型低。
  5. 低延迟。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 1e101.61e6,这是好几个数量级的差距了。

(这个图只是推荐算法里矩阵分解的演示,仅供参考)
在这里插入图片描述
下图为LoRA论文中的图,A矩阵初始化为高斯分布矩阵,B矩阵初始化为0矩阵。
在这里插入图片描述

多路召回

采用不同的策略、特征或者简单模型,分别召回一部分候选集,然后再把这些候选集混合在一起后供后续排序模型使用。
在baseline中就是将一个问题问同一个大模型三次,因为大模型是概率模型所以可能会有不同的答案。收集三次回复的结果,少数服从多数。
我感觉在一般的使用中,可以组合使用不同的prompt、不同的模型进行投票。此次比赛有显存限制估计不好用多个模型了。

其他优化思路

  1. 全量微调
    lora训练的是分解的矩阵,难免有精度损失。如果有钱有时间,全量微调效果应该更好。
  2. 数据集
    使用更多的开源数据集,或者用更好的大模型推理出新数据集(或者获得更好的推理思路),用他们训练当前模型。
  3. 货比三家
    对于不同的模型、不同的Prompt,组合搭配,选评分最高的。

小白本人的pytorch学习

由于我没怎么用过pytorch,还学习了相关API


网站公告

今日签到

点亮在社区的每一天
去签到