نماذج ومنصات الذكاء الاصطناعي

دليل كامل لتعديل نماذج اللغة الكبيرة

mm
أضف Unite.AI إلى مصادرك المفضلة على Google

نماذج اللغة الكبيرة (LLMs) مثل GPT-4 و LaMDA و PaLM وغيرها قد أثاروا ضجة كبيرة بفضل قدرتهم الرائعة على فهم وإنشاء نصوص تشبه النصوص البشرية في مجموعة واسعة من الموضوعات. يتم تدريب هذه النماذج مسبقًا على مجموعات بيانات ضخمة تضم مليارات الكلمات من الإنترنت والكتب والمصادر الأخرى.

يمنح هذا التدريب المسبق النماذج بمعرفة عامة واسعة حول اللغة والموضوعات والقدرات العقلية وحتى بعض التحيزات الموجودة في بيانات التدريب.

然而 ، على الرغم من اتساع نطاقها ، فإن نماذج LLMs المُتدربة مسبقًا تفتقر إلى الخبرة المتخصصة في مجالات أو مهام معينة.

هنا يأتي دور تعديل النماذج – عملية تعديل نموذج LLM المُتدرب مسبقًا ليكون خبيرًا في تطبيق أو حالة معينة. من خلال تدريب النموذج进一步 على مجموعة بيانات أصغر ومحددة للمهمة ، يمكننا تعديل قدراته ليتوافق مع دقة ومتطلبات المجال.

تعديل النماذج مشابه لنقل معرفة عام واسعة النطاق لشخص متعلم جيد إلى خبير في مجال معين. في هذا الدليل ، سنستكشف ما هو تعديل النماذج ، ولماذا يتم تعديلها ، وكيفية القيام بذلك.

تعديل نماذج اللغة الكبيرة

تعديل نماذج اللغة الكبيرة

ما هو تعديل النماذج؟

في جوهره ، تعديل النماذج يتضمن أخذ نموذج كبير مُتدرب مسبقًا وتحديث معاملاته باستخدام مرحلة تدريب ثانية على مجموعة بيانات مخصصة لمهمة أو مجال معين.

هذا يسمح للنموذج بالتعلم والاحتفاظ بالدقة والأنماط والأهداف المحددة لتلك المنطقة الضيقة.

في حين أن التدريب المسبق يلتقط فهمًا عامًا للغة من مجموعة كبيرة ومتنوعة من النصوص ، فإن تعديل النماذج يخصص هذه القدرة العامة.

يتضمن تعديل النماذج تحديث جميع معاملات النموذج المُتدرب مسبقًا باستخدام مرحلة تدريب ثانية على مجموعة بيانات مخصصة للمهمة أو المجال.

لماذا يتم تعديل نماذج LLMs؟

هناك عدة أسباب رئيسية لتعديل نموذج لغة كبير:

  1. تخصيص المجال: كل مجال ، من القانون إلى الطب إلى هندسة البرمجيات ، له تقليدات لغة واختصارات ومواضيع خاصة به. يمكن تعديل نموذج عام ليفهم وينتج نصًا مخصصًا للمجال المحدد.
  2. تخصص المهمة: يمكن تعديل نماذج LLMs لمهام معالجة اللغة الطبيعية المختلفة مثل تلخيص النص والترجمة الآلية وإجابة الأسئلة وغيرها. هذا التخصص يزيد من الأداء على المهمة المستهدفة.
  3. التعامل مع البيانات: يمكن تعديل النماذج لتدريبها على بيانات خاصة بالمنظمة ، مما يحافظ على سرية البيانات الحساسة.
  4. بيانات محدودة: يمكن الحصول على مجموعات بيانات كبيرة ومُ标ّاة لتدريب النماذج من البداية أمرًا صعبًا. يمكن تعديل النماذج لتحقيق أداء قوي على مهام معينة باستخدام بيانات خاضعة للإشراف المحدودة.
  5. تحديث النموذج: يمكن تعديل النماذج بشكل متكرر لدمج المعرفة والمهارات الجديدة مع مرور الوقت.
  6. تقليل التحيزات: يمكن تعديل النماذج لتحسين أدائها وتقليل التحيزات غير المرغوب فيها.

باختصار ، تعديل النماذج يغلق الفجوة بين نموذج عام ومتطلبات تطبيق أو حالة معينة. يعزز دقة وموثوقية خرج النموذج لمهام محددة.

تعديل نماذج اللغة الكبيرة

تعديل نماذج اللغة الكبيرة

يوضح الرسم التخطيطي المقدم عملية تنفيذ واستخدام نماذج اللغة الكبيرة (LLMs) ، خاصة للتطبيقات المؤسسية. في البداية ، يتم إطعام نموذج مُتدرب مسبقًا مثل T5 ببيانات شركة منظمة ومتنوعة ، والتي قد تأتي في أشكال مختلفة مثل CSV أو JSON. يتم إجراء عملية تدريب خاضعة للإشراف أو غير خاضعة للإشراف أو نقل التعلم على هذه البيانات ، مما يعزز صلة النموذج بالاحتياجات الخاصة للشركة.

بعد تعديل النموذج ببيانات الشركة ، يتم تحديث أوزانه وفقًا لذلك. ثم يمر النموذج المُدرّب بعمليات تدريب إضافية ، مما يحسنه باستمرار مع مرور الوقت مع ظهور بيانات جديدة للشركة. عملية التدريب هذه متكررة وديناميكية ، حيث يتعلم النموذج ويعيد التدريب ليتكيف مع أنماط البيانات المتطورة.

يتكون خرج النموذج المُدرّب – وهو عبارة عن رموز وتمثيلات تمثل الكلمات – ويتم نشره لاستخدامات مؤسسية مختلفة. يمكن أن تتراوح هذه التطبيقات من بوتات الدردشة إلى الرعاية الصحية ، وكلها تتطلب من النموذج فهم واستجابة لاستفسارات محددة بالصناعة. في مجال المالية ، تشمل التطبيقات الكشف عن الاحتيال وتحليل التهديدات ، وفي الرعاية الصحية ، يمكن للنماذج مساعدة المرضى في الاستفسارات والتشخيصات.

قدرة النموذج المُدرّب على معالجة واستجابة لبيانات جديدة مع مرور الوقت يضمن استمرار فائدته. وبالتالي ، يمكن للمستخدمين التفاعل مع النموذج من خلال التطبيقات ، وطرح الأسئلة والحصول على استجابات مدروسة تعكس تدريب النموذج وتنقيحه على بيانات خاصة بالمجال.

تدعم هذه البنية مجموعة واسعة من التطبيقات المؤسسية ، مما يظهر مرونة وملاءمة نماذج اللغة الكبيرة عند تنفيذها وصيانتها بشكل صحيح في سياق أعمال.

مناهج تعديل النماذج

هناك استراتيجيتان رئيسيتان لتعديل نماذج اللغة الكبيرة:

1) تعديل النموذج الكامل

في نهج تعديل النموذج الكامل ، يتم تحديث جميع المعاملات (الأوزان والتحيزات) للنموذج المُتدرب مسبقًا خلال مرحلة التدريب الثانية. يتم تعريض النموذج لمجموعة بيانات مُ标ّاة خاصة بالمهمة أو المجال ، ويتم تحسين النموذج باستخدام عملية التدريب القياسية.

هذا يسمح للنموذج بإجراء تعديلات شاملة وتكيف مع المهمة أو المجال المستهدف. ومع ذلك ، يوجد بعض العيوب:

  • يتطلب الموارد الحاسوبية والزمن الكبيرين للتدريب ، مشابهًا لمرحلة التدريب المسبق.
  • تكون متطلبات التخزين عالية ، حيث تحتاج إلى الحفاظ على نسخة منفصلة من النموذج المُعدّل لكل مهمة.
  • هناك خطر “نسيان كارثي” ، حيث قد يؤدي تعديل النموذج إلى فقد بعض القدرات العامة المكتسبة خلال التدريب المسبق.

على الرغم من هذه القيود ، يبقى تعديل النموذج الكامل تقنية قوية ومستخدمة على نطاق واسع عندما تتوفر الموارد ويختلف المهمة المستهدفة بشكل كبير عن اللغة العامة.

2) طرق تعديل كفؤة

为了克服全模型微调的计算挑战,研究人员开发了高效的策略,只更新模型参数的少数子集。这些参数高效的技术在专业化和降低资源需求之间取得平衡。

一些流行的高效微调方法包括:

前缀微调: 在这里,引入并训练少量任务特定的向量或“前缀”来条件预训练模型的注意力机制。仅更新这些前缀进行微调。

LoRA(低秩适应): LoRA 在预训练模型的每个层中注入可训练的低秩矩阵。这些小秩调整有助于专业化模型,需要的可训练参数远少于全模型微调。

当然,我可以提供有关LoRA(低秩适应)的详细解释,包括数学公式和代码示例。LoRA是一种流行的参数高效微调(PEFT)技术,在大型语言模型(LLM)适应领域获得了显著关注。

什么是LoRA?

LoRA是一种微调方法,向预训练的LLM引入少量可训练参数,允许高效地适应下游任务,同时保留原始模型的大部分知识。与其微调LLM的所有参数,LoRA将任务特定的低秩矩阵注入模型的层中,实现显著的计算和内存节省。

数学公式

LoRA(低秩适应)是一种大型语言模型(LLM)微调方法,向权重矩阵引入低秩更新。对于权重矩阵 0∈, LoRA 添加低秩矩阵 , 其中 , 其中 是秩。这种方法显著降低了可训练参数的数量,使得微调过程的计算和内存开销大大减少。更新的权重矩阵由 给出。

这种低秩更新可以被解释为修改原始权重矩阵 $W_{0}$,通过添加低秩矩阵 $BA$。这种公式的主要优势在于,相比于更新 $W_{0}$ 中的所有 $d \times k$ 参数,LoRA 只需要优化 $A$ 和 $B$ 中的 $r \times (d + k)$ 参数,显著降低了可训练参数的数量。

以下是使用 peft 库对预训练的 LLM 应用 LoRA 进行文本分类的 Python 示例:

</div>
<div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color="">from</span> transformers <span class="token" data-darkreader-inline-color="">import</span> AutoModelForSequenceClassification
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color="">from</span> peft <span class="token" data-darkreader-inline-color="">import</span> get_peft_model<span class="token" data-darkreader-inline-color="">,</span> LoraConfig<span class="token" data-darkreader-inline-color="">,</span> TaskType
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Load pre-trained model</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">model <span class="token" data-darkreader-inline-color="">=</span> AutoModelForSequenceClassification<span class="token" data-darkreader-inline-color="">.</span>from_pretrained<span class="token" data-darkreader-inline-color="">(</span><span class="token" data-darkreader-inline-color="">"bert-base-uncased"</span><span class="token" data-darkreader-inline-color="">, </span>num_labels<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">2</span><span class="token" data-darkreader-inline-color="">)</span>
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Define LoRA configuration</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">peft_config <span class="token" data-darkreader-inline-color="">=</span> LoraConfig<span class="token" data-darkreader-inline-color="">(</span>task_type<span class="token" data-darkreader-inline-color="">=</span>TaskType<span class="token" data-darkreader-inline-color="">.</span>SEQ_CLS<span class="token" data-darkreader-inline-color="">, </span>r<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">8</span><span class="token" data-darkreader-inline-color="">,</span> <span class="token" data-darkreader-inline-color=""># Rank of the low-rank update</span>
lora_alpha<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">16</span><span class="token" data-darkreader-inline-color="">,</span></code><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Scaling factor for the low-rank update</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""> target_modules <span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">[</span><span class="token" data-darkreader-inline-color="">"q_lin"</span><span class="token" data-darkreader-inline-color="">,</span> <span class="token" data-darkreader-inline-color="">"v_lin"</span><span class="token" data-darkreader-inline-color="">]</span><span class="token" data-darkreader-inline-color="">,</span> <span class="token" data-darkreader-inline-color=""># Apply LoRA to the query and value layers</span>
<span class="token" data-darkreader-inline-color="">)</span>
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Create the LoRA-enabled model</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">model <span class="token" data-darkreader-inline-color="">=</span> get_peft_model<span class="token" data-darkreader-inline-color="">(</span>model<span class="token" data-darkreader-inline-color="">,</span> peft_config<span class="token" data-darkreader-inline-color="">)</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Fine-tune the model with LoRA</span>
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># ... (training code omitted for brevity)</span></code></div>
</div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">

在这个例子中,我们加载预训练的BERT模型进行序列分类,并定义LoRA配置。参数 r 指定低秩更新的秩,lora_alpha 是更新的缩放因子。参数 target_modules 指定哪些层应该接收低秩更新。创建LoRA启用的模型后,我们可以继续进行微调过程,使用标准的训练过程。

适配层: 与LoRA类似,但不是低秩更新,而是插入每个变换器块中的薄“适配”层。只有这些新紧凑层的参数被训练。

提示微调: 这种方法完全冻结预训练模型。相反,引入可训练的“提示”嵌入作为输入来激活模型的预训练知识以适应目标任务。

这些高效方法可以实现高达100倍的计算减少,相比全模型微调,同时仍然实现有竞争力的性能。它们还降低了存储需求,避免了全模型复制。

然而,它们的性能可能会落后于全模型微调,尤其是对于与一般语言或需要更全面的专业化任务有很大差异的任务。

微调过程

无论微调策略如何,专用LLM的总体过程都遵循一个通用框架:

  1. 数据准备: 您需要获取或创建一个标记数据集,将输入(提示)映射到所需输出,用于目标任务。对于文本生成任务,如摘要,这将是输入文本到摘要输出对。
  2. 数据分割: 按照最佳实践,将标记数据集分成训练、验证和测试集。这将数据分离为模型训练、超参数调优和最终评估。
  3. 超参数调优: 参数如学习率、批次大小和训练计划需要针对数据进行调优,以实现最有效的微调。这通常涉及一个小的验证集。
  4. 模型训练: 使用调优的超参数,在整个训练集上运行微调优化过程,直到模型在验证集上的性能停止改善(早期停止)。

虽然这概述了总体过程,但许多细微差别会影响特定LLM或任务的微调成功。策略如课程学习、多任务微调和少样本提示可以进一步提高性能。

此外,高效微调方法需要额外的考虑。例如,LoRA需要通过组合层条件预训练模型输出的技术。提示微调需要精心设计的提示来激活正确的行为。

高级微调:整合人工反馈

虽然使用标记数据集的标准监督微调有效,但一个令人兴奋的前沿领域是直接使用人工偏好和反馈来训练LLM。这一人机交互方法利用了强化学习的技术:

PPO(近端策略优化): 在这里,LLM被视为强化学习代理,其输出是“动作”。训练一个奖励模型来预测人类评分或质量评分,用于这些输出。PPO然后优化LLM以生成最大化奖励模型评分的输出。

RLHF(从人工反馈中学习强化学习): 这扩展了PPO,直接将人工反馈纳入学习过程。奖励不再来自固定奖励模型,而是来自微调过程中LLM输出的迭代人工评估。

虽然计算密集,但这些方法允许根据人类评估的所需特征更精确地塑造LLM行为,超出了静态数据集的捕捉能力。

像Anthropic这样的公司使用RLHF使他们的语言模型(如Claude)具有改进的真实性、道德和安全意识,而不仅仅是任务能力。

潜在风险和局限性

虽然微调LLM非常强大,但也存在需要谨慎管理的风险:

偏见放大: 如果微调数据包含社会偏见,模型可能会放大这些不良偏见。策划代表性和去偏数据集至关重要。

事实漂移: 即使在高质量数据上微调后,语言模型也可能“编造”不正确的事实或输出与训练示例不一致的内容。可能需要事实检索方法。

可扩展性挑战: 像GPT-3这样的巨型模型的全模型微调需要巨大的计算资源,这对于许多组织来说可能不可行。高效微调部分缓解了这一问题,但也存在权衡。

灾难性遗忘: 在全模型微调期间,模型可能会经历灾难性遗忘,导致在预训练期间学习的某些一般能力丢失。可能需要多任务学习。

知识产权和隐私风险: 用于微调的专有数据可能会泄露到公开发布的语言模型输出中,构成风险。差异隐私和信息危害缓解技术是活跃的研究领域。

总体而言,虽然微调非常有用,但它是一个细致入微的过程,需要在数据质量、身份考虑、风险缓解和基于用例要求的性能效率权衡方面谨慎对待。

未来:语言模型定制

展望未来,微调和模型适应技术的进步将在解锁大型语言模型在各个应用和领域的全部潜力方面发挥关键作用。

使得即使资源有限也能微调更大模型(如PaLM)的更高效方法可能会使访问民主化。自动化数据集创建管道和提示工程可以简化专业化。

无监督技术可以从原始数据中微调,而无需标签,这可能会开辟新的前沿。将在不同任务或数据上训练的微调子模型的组合方法可能会允许按需构建高度定制的模型。

最终,随着LLM变得更加普遍,将其无缝定制和专业化以适应每一种可想象的用例的能力将至关重要。微调和相关模型适应策略是实现大型语言模型作为灵活、安全和强大的AI助手的愿景的关键步骤,该助手可以增强人类在每个领域和事业中的能力。

لقد قمت بإنفاق الخمس سنوات الماضية في غمرة العالم المثير للاهتمام من التعلم الآلي والتعلم العميق. وقد أدت شغفي وخبرتي إلى المساهمة في أكثر من 50 مشروعًا متنوعًا في هندسة البرمجيات، مع التركيز بشكل خاص على الذكاء الاصطناعي والتعلم الآلي. كما أدت فضولي المستمر إلى جذبي نحو معالجة اللغة الطبيعية، وهو مجال أنا متحمس لاستكشافه بشكل أكبر.