تخطّي إلى المحتوى

تدريب نموذج على بيانات التعليق التوضيحي

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

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

جديد في v2.14.0

نادراً ما تصل بيانات التعليق التوضيحي بالشكل الذي يقرؤه المُدرِّب. فالدراسة ذات التداخل لها عدة تصنيفات لكل عنصر، وكثيراً ما تتعارض. والدراسة الجارية تكتسب تصنيفات كل يوم، وترى كل جولة إعادة تدريب عناصر أكثر مما رأته الجولة السابقة. ويحتاج المُدرِّب إلى هدف واحد لكل عنصر وإلى مجموعة ثابتة من العناصر يُقاس عليها، والقرارات أدناه تنتج الأمرين معاً. ويسمّي كل قسم أدناه إعداد Potato الذي يتخذ القرار. وللاطلاع على صفحة التدريب نفسها، راجع نظرة عامة على تدريب النماذج والدرس الذي يدرّب نموذجاً أول. ولتدريب نموذج في شيفرتك أنت، يغطي تصدير التعليقات التوضيحية للتعلّم الآلي صيغ التصدير، وتنطبق القرارات نفسها على الملف المصدَّر.

حسم عدة معلّقين إلى تصنيف واحد

يحوّل التجميع التصنيفات التي أعطاها عدة معلّقين لعنصر واحد إلى التصنيف الوحيد الذي يتدرّب عليه النموذج. وأبسط الطرق تصويت الأغلبية. يعدّ تصويت الأغلبية إجابة كل معلّق مرة واحدة ويُبقي الإجابة الأكثر شيوعاً. وتقدّر طريقة Dawid and Skene (1979) مصفوفة اللبس لكل معلّق بتعظيم التوقع، وتزن كل صوت بالموثوقية المقدّرة للمعلّق. فيؤثر المعلّق المهمل في النتيجة أقل من المعلّق الدقيق. ويقارن تجميع تصنيفات الحشود الطريقتين والنماذج المبنية على Dawid-Skene.

تحسم تشغيلة التدريب في Potato التصنيفات بـmodel_training.aggregation. القيمة الافتراضية consensus تشغّل Dawid-Skene كلما كان في المشروع أكثر من معلّق واحد وتعود إلى تصويت الأغلبية إذا فشل التقدير. والقيمة الأخرى majority تشغّل تصويت الأغلبية وحده. وتعامل الطريقتان إجابة المعلّق الكاملة على مخطط ما بوصفها صوتاً واحداً. فلا تُحسب إجابتان من multiselect صوتاً واحداً إلا إذا حدّدت الإجابتان مجموعة التصنيفات نفسها.

الإعداد consensus للتشغيلة وتصدير الإجماع ميزتان منفصلتان. يعطي تصدير الإجماع كل معلّق صوتاً واحداً، ويبلّغ عن العدد والكسر لكل إجابة على كل عنصر، ويسم كل عنصر بـretired أو needs_review. اقرأ التصدير قبل التدريب حين تريد أن ترى عنصراً بعنصر أين انقسم المعلّقون. ويقدّر MACE درجة كفاءة لكل معلّق من الأصوات نفسها.

التعلّم من الاختلاف

في المهام الذاتية مثل الإساءة أو العاطفة، قد يختلف المعلّقون لأن كلاً منهم يقرأ العنصر قراءة مختلفة، والتصنيف الواحد المصوَّت عليه يطرح هذا الانقسام. يستعرض Uma et al. (2021) طرقاً تتدرّب على الاختلاف بدلاً من تصنيف مجمَّع واحد. وتتدرّب إحدى عائلات هذه الطرق على تصنيفات ناعمة. والتصنيف الناعم توزيع احتمالي على التصنيفات، يُبنى من حصة المعلّقين الذين اختاروا كل تصنيف.

يقبل hf-text-classification المعامل soft_targets: true. ومع ضبطه، يتدرّب العنصر الذي صنّفه معلّقان أو أكثر نحو انقسام المعلّقين بالإنتروبيا التقاطعية مقابل التوزيع. فحين قال اثنان من ثلاثة positive، يكون الهدف 0.67 لـpositive و0.33 لـnegative. وفي مخطط multiselect يتدرّب كل تصنيف نحو حصة المعلّقين الذين حدّدوه. أما العنصر ذو المعلّق الواحد فيتدرّب على تصنيف ذلك المعلّق كما كان. ويبقى النموذج عندئذ غير واثق حيث اختلف الناس، ويتضمن كل تنبؤ probabilities الخاصة بالنموذج. وعلى العناصر المحجوزة التي فيها انقسام أصوات، تبلّغ التشغيلة عن ثلاثة مقاييس إضافية:

المقياسما يقيسه المقياس
soft_jsdتباعد Jensen-Shannon بين توزيع النموذج وانقسام المعلّقين، بالبت من 0 إلى 1
soft_cross_entropyالإنتروبيا التقاطعية لانقسام المعلّقين تحت توزيع النموذج
eceخطأ المعايرة المتوقع للتصنيف الأعلى مقابل التصنيف المصوَّت عليه، على 10 صناديق ثقة

وفي مخطط التصنيف الناعم يعطي كل معلّق توزيعاً بمنزلقات. ويدرّب hf-text-classification مخطط soft_label دائماً نحو متوسط توزيعات المعلّقين، ويضبط التصنيف المسبق المنزلقات على التوزيع المتنبَّأ به. وتحتاج الأهداف الناعمة إلى تصنيفين أو أكثر على العنصر. ولذلك تجمع الدراسة التي تخطط للتدريب على الاختلاف تصنيفات متداخلة منذ البداية، ويغطي كم معلّقاً تحتاج؟ إعدادات التداخل. ويعرض الاختلاف إشارة لا ضجيج الحجة لإبقاء الانقسام في البيانات.

أقسام التدريب والتحقق والاختبار

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

تقسّم تشغيلة Potato العناصر المصنّفة 70/15/15 افتراضياً (splits). ويأتي قسم كل عنصر من تجزئة بذرية لمعرّف العنصر (split_seed). فالعنصر المحجوز في تشغيلة يبقى محجوزاً في التشغيلة التالية ما دام split_seed وsplits على حالهما. وتغيير أي منهما قد ينقل عناصر محجوزة إلى التدريب، وعندئذ تقيس كل درجة بعد التغيير شيئاً من الحفظ عن ظهر قلب. اضبط الإعدادين مرة واحدة، عند بداية الدراسة.

تحتفظ مُدرِّبات الضبط الدقيق، مثل hf-text-classification، بنقطة الحفظ من الحقبة التي سجّلت أفضل درجة على التحقق. وتأتي الدرجة الرئيسية لتشغيلة كهذه من test. أما sklearn-text وsetfit وrdkit-property ومُدرِّبات نماذج القرار وجسور الاستدلال فلا تختار شيئاً على التحقق، وتأخذ تشغيلة أي منها الدرجة الرئيسية من التحقق كلما كان فيه عناصر. وتسمّي التلميحة على عمود Held-out score في جدول التشغيلات القسم والمقياس وراء كل رقم. والعنصر الذي له تصنيف وليس له تنبؤ يُحسب خاطئاً. فلا يستطيع المُدرِّب رفع الدرجة بتخطي العناصر الصعبة، ويبلّغ <split>_coverage عن حصة العناصر التي نالت تنبؤاً.

العناصر المصحَّحة والمثبَّتة

يذهب نوعان من العناصر إلى قسم train في كل تشغيلة لاحقة، أياً كان القسم الذي أسندته إليه التجزئة. الأول عنصر صحّحه مراجع في مراجعة النموذج، والثاني عنصر ثبّته أحدهم بـTrain on these بجوار شريحة في صفحة الفهرس. تأتي التصحيحات من العناصر التي كان النموذج أسوأ فيها، وفي التحقق أو الاختبار ستقيس التصحيحات النموذج على عينة من أخطائه هو. وتسجّل التشغيلة التي تنقل عناصر محجوزة إلى التدريب تحذيراً بالعدد، وعندئذ لا تكون درجة العناصر المحجوزة لها قابلة للمقارنة المباشرة بدرجة تشغيلة أقدم. وتسجّل التشغيلة التي تتدرّب على عنصر مصحَّح كانت تشغيلة أقدم قد حجزته تحذيراً كذلك، لأن الدرجة على عناصر التحقق أو الاختبار للتشغيلة الأقدم، أو على مجموعة بيانات حُفظت من تلك العناصر، تتضمن عندئذ عناصر تدرّب عليها النموذج الجديد. وتعطي التصحيحات والعناصر المثبتة تتدرّب دائماً القواعد.

تسجيل ما تدرّب عليه كل نموذج

تتطلب مقارنة تشغيلتين معرفة العناصر التي تدرّبت عليها كل تشغيلة وقيست عليها. تكتب كل تشغيلة في Potato حزمة تحت <output_annotation_dir>/training/runs/<run_id>/bundle/ فيها train.jsonl وval.jsonl وtest.jsonl وlabels.json وmanifest.json. يسجّل البيان بذرة التقسيم وطريقة التجميع وعدد العناصر في كل قسم وعدد العناصر المفروضة على التدريب وبصمة SHA-256 لملفات الأقسام. ولا شيء في الحزمة يعود إلى Potato، ويستطيع سكربت خارج Potato قراءة الحزمة بوصفها نسخة مكتفية بذاتها من التصنيفات المحسومة والأقسام.

وتحتفظ قاعدة بيانات المشروع project.sqlite بسجل فيه صف لكل تشغيلة. يسجّل كل صف المُدرِّب والمعاملات وأحجام الأقسام وبذرة التقسيم ومقاييس العناصر المحجوزة وبصمة الحزمة. ويسجّل جدول ثانٍ القسم الذي كان فيه كل عنصر في كل تشغيلة. وتقرأ الكتابة الراجعة ذلك الجدول ولا تصنّف مسبقاً أي عنصر تدرّبت عليه أي تشغيلة لا تزال في السجل (يُبقي retain_runs خمس تشغيلات منتهية افتراضياً). فالنموذج واثق من العناصر التي تدرّب عليها لأسباب لا تقول شيئاً عن البيانات الجديدة.

ولمقارنة نماذج لاحقة على العناصر نفسها تماماً، يحفظ Keep this split as a dataset في صفحة التشغيلة عناصر التحقق أو الاختبار أو التدريب للتشغيلة إصداراً من مجموعة بيانات، مع التصنيفات البشرية المتفق عليها. ولا يتغير الإصدار المحفوظ بعد ذلك. يضم كل إصدار محفوظ قسماً واحداً ويبدأ من الصفر لا مضافاً إلى الإصدار السابق. فعناصر التحقق للتشغيلة 2 المحفوظة فوق عناصر التشغيلة 1 كانت ستضم عناصر تدرّبت عليها التشغيلة 2. ولا يستطيع تقييم على إصدار محفوظ قراءة إجابة النموذج، لأن المدخلات المحفوظة تستبعد حقل التصنيف المسبق. ويحتاج الحفظ إلى datasets.enabled: true. وحين يغادر النموذج أو مجموعة البيانات المشروع، يغطي توثيق مجموعات البيانات والنماذج أوراق البيانات وبطاقات النماذج.

كم من البيانات يحتاج نموذج أول

يرفض كل مُدرِّب في Potato الملاءمة إذا كان في قسم train أقل من min_instances من العناصر. الافتراضيات أدناه هي الأعداد التي تبدأ عندها التشغيلة:

المُدرِّبالافتراضي لـmin_instancesملاحظة
setfit8مصمَّم لأول أيام المشروع، من نحو ثمانية عناصر لكل تصنيف
sklearn-text10يعاير الثقة ابتداءً من 50 عنصر تدريب فقط
hf-audio-tagger10
hf-text-classification وhf-token-classification وhf-image-classification20
llm-sft وllm-dpo20

لا يعدّ الحدّ الأدنى إلا قسم train. وعند التقسيم الافتراضي 70/15/15، تبدأ تشغيلة sklearn-text متى كان لنحو 15 عنصراً تصنيف. ويعطي مثال تدريب النماذج في مستودع Potato نقطة قياس واحدة. فمع 120 مراجعة منتجات اصطناعية من أصل 160 في المثال، لكل منها تصنيف واحد، سجّلت تشغيلة sklearn-text واحدة 0.84 macro-F1 على التحقق ونشرت 80 تصنيفاً مسبقاً. والرقم من مهمة اصطناعية واحدة بتصنيفين، ودرجة العناصر المحجوزة في تشغيلاتك أنت هي الرقم الذي يُقرأ لمهمتك.

ابدأ بـsklearn-text. فالمُدرِّب لا يحتاج إلى شيء خارج تثبيت عادي ولا إلى GPU. وأعد التدريب كلما وصلت تصنيفات، وراقب درجة العناصر المحجوزة من تشغيلة إلى أخرى مع إبقاء split_seed دون تغيير. وتُرسّخ التصنيفات المسبقة إجابات المعلّقين. فاترك writeback.schemas فارغاً إلى أن تبرر درجة العناصر المحجوزة عرض إجابات النموذج. ويغطي الوسم بمساعدة نموذج ما يتغير حين يرى المعلّقون التصنيفات المسبقة، ويغطي كيف تميّز المراجعة الحقيقية من الإقرار الآلي كيف تتحقق من أن المعلّقين لا يزالون يقرؤون العناصر.

ملف تهيئة يضبط كل قرار

يدرّب ملف التهيئة أدناه على مخطط مشاعر بتصنيفين. ويضبط كل مفتاح تحت model_training واحداً من القرارات أعلاه:

yaml
annotation_task_name: "Review sentiment"
task_dir: "."
data_files:
  - "data/reviews.json"
item_properties:
  id_key: "id"
  text_key: "text"
output_annotation_dir: "annotation_output"
 
annotation_schemes:
  - annotation_type: "radio"
    name: "sentiment"
    description: "Is this review positive or negative?"
    labels: ["positive", "negative"]
 
model_training:
  enabled: true
  aggregation: consensus
  split_seed: 0
  splits: {train: 0.7, val: 0.15, test: 0.15}
  trainer_params:
    hf-text-classification:
      soft_targets: true

يحسم aggregation: consensus التصنيفات المتداخلة بـDawid-Skene. وكُتب split_seed وsplits بالقيمتين الافتراضيتين لأن أياً من الإعدادين لا ينبغي أن يتغير طوال عمر الدراسة. ويجعل soft_targets: true كل تشغيلة hf-text-classification على المشروع تتدرّب على انقسامات الأصوات. ويحتاج ذلك المُدرِّب إلى pip install "potato-annotation[train-text]"، ويعمل sklearn-text على ملف التهيئة نفسه بلا تثبيت إضافي. ومن دون كتلة writeback لا يرى المعلّقون تصنيفات مسبقة. أعد تشغيل الخادم بملف التهيئة، وافتح /admin/training، واختر مُدرِّباً والمخطط sentiment، وانقر Train now. ويسرد مرجع تهيئة تدريب النماذج كل مفتاح، ويضيف درس النموذج في الحلقة الكتابة الراجعة وإعادة التدريب التلقائية.

قراءات إضافية

المراجع

  • Dawid, A. P., and Skene, A. M. (1979). Maximum Likelihood Estimation of Observer Error-Rates Using the EM Algorithm. Applied Statistics, 28(1), 20. doi.org/10.2307/2346806
  • Uma, A. N., Fornaciari, T., Hovy, D., Paun, S., Plank, B., and Poesio, M. (2021). Learning from Disagreement: A Survey. Journal of Artificial Intelligence Research, 72, 1385–1470. doi.org/10.1613/jair.1.12752