Skip to content

التعلم النشط

أعد ترتيب طابور التعليق التوضيحي في Potato حسب عدم يقين النموذج، مع خمس استراتيجيات استعلام ومصنّفات sklearn ومعالجة البدء البارد واستمرارية النموذج عبر عمليات إعادة التشغيل.

يعيد التعلم النشط ترتيب طابور التعليق التوضيحي بحيث يرى المعلّقون الحالات التي يكون النموذج أقل ثقة بشأنها، بدلاً من المرور على المدوّنة بالترتيب الذي وصلت به.

كيف يعمل

  1. اجمع مجموعة أولية من التعليقات التوضيحية
  2. درّب مصنّفاً على ما عُلِّم حتى الآن
  3. قيّم المجموعة غير المعلَّمة حسب عدم اليقين
  4. أعد ترتيب الطابور لوضع الحالات الأكثر عدم يقين في المقدمة
  5. علّق على الحالات ذات الأولوية
  6. أعد التدريب دورياً مع تراكم التعليقات التوضيحية

حلقة التعلّم النشط: التدريب على المُعلَّم، وتسجيل المجموعة غير المُعلَّمة حسب عدم اليقين، وتعليق العناصر الأكثر شكاً، ثم إعادة التدريبوجّه جهد التعليق التوضيحي إلى حيث يتعلّم النموذج أكثر

التهيئة

الإعداد الأساسي

yaml
active_learning:
  enabled: true
  schema_names:
    - sentiment
 
  min_annotations_per_instance: 1
  min_instances_for_training: 20
  update_frequency: 50
  max_instances_to_reorder: 1000

القيمة الافتراضية لـ min_instances_for_training هي 10، ولـ update_frequency هي 5. كلتا القيمتين منخفضة بما يكفي لتستحق الرفع في مشروع حقيقي، لأن إعادة التدريب كل خمسة تعليقات توضيحية تستهلك موارد حوسبة على نموذج لم يتغير إلا قليلاً.

التهيئة الكاملة

yaml
active_learning:
  enabled: true
 
  schema_names:
    - sentiment
 
  min_annotations_per_instance: 1
  min_instances_for_training: 20
  update_frequency: 50
  max_instances_to_reorder: 1000
 
  # How disagreement between annotators resolves into one training label
  resolution_strategy: majority_vote
 
  # Fraction of the queue left in random order, so the model does not
  # only ever see what it already found interesting
  random_sample_percent: 0.2
 
  classifier:
    name: sklearn.linear_model.LogisticRegression
    hyperparameters:
      C: 1.0
      max_iter: 1000
 
  vectorizer:
    name: sklearn.feature_extraction.text.TfidfVectorizer
    hyperparameters:
      max_features: 5000
      ngram_range: [1, 2]
 
  query_strategy: uncertainty
 
  model_persistence:
    enabled: true
    save_directory: "models/"
    retention_count: 5

الكتل المتداخلة classifier وvectorizer وmodel_persistence هي الصيغة الموثّقة، وهي الصيغة التي يتعرّف عليها potato validate --strict. مفاتيحها الفرعية هي name وhyperparameters للكتلتين الأوليين، وenabled وsave_directory وretention_count للثالثة. أي كتلة تستخدم أسماء مفاتيح فرعية أخرى تُتجاهل دون أي تنبيه، ويعود التشغيل بصمت إلى القيم الافتراضية.

استراتيجيات الاستعلام

الاستراتيجيةالوصف
uncertaintyالحالات التي يكون النموذج أقل ثقة بشأنها. وهي الافتراضية
diversityالحالات الأقل تشابهاً مع ما عُلِّق عليه بالفعل
badgeBatch Active learning by Diverse Gradient Embeddings
baldBayesian Active Learning by Disagreement
hybridمزيج مرجّح من عدم اليقين والتنوع
yaml
active_learning:
  query_strategy: uncertainty

اسم الاستراتيجية غير المعروف يعود إلى uncertainty مع تحذير بدلاً من إفشال بدء التشغيل، لذا راجع السجل إذا بدت استراتيجية ما بلا أثر.

ضبط hybrid وBALD

تستخدم hybrid افتراضياً 70% لعدم اليقين و30% للتنوع:

yaml
active_learning:
  query_strategy: hybrid
  hybrid_weights:
    uncertainty: 0.7
    diversity: 0.3

تدرّب bald مجموعة صغيرة من النماذج وترتّب الحالات حسب درجة الاختلاف داخلها:

yaml
active_learning:
  query_strategy: bald
  bald_params:
    n_estimators: 5
    bootstrap_fraction: 0.8

المصنّفات

تُحدَّد المصنّفات بمسار استيرادها في sklearn. القيمة الافتراضية هي sklearn.linear_model.LogisticRegression.

المصنّفالمسارالأفضل لـالسرعة
الانحدار اللوجستيsklearn.linear_model.LogisticRegressionمعظم مهام النصوصسريع
الغابة العشوائيةsklearn.ensemble.RandomForestClassifierالأنماط غير الخطيةمتوسط
SVCsklearn.svm.SVCمجموعات البيانات الصغيرةبطيء
Multinomial NBsklearn.naive_bayes.MultinomialNBتصنيف النصوص البسيطسريع جداً

الانحدار اللوجستي، وهو نقطة البداية الموصى بها:

yaml
active_learning:
  classifier:
    name: sklearn.linear_model.LogisticRegression
    hyperparameters:
      C: 1.0
      max_iter: 1000

الغابة العشوائية، عندما لا يكون القرار قريباً من الخطي:

yaml
active_learning:
  classifier:
    name: sklearn.ensemble.RandomForestClassifier
    hyperparameters:
      n_estimators: 100
      max_depth: 10

يجب توجيه SVC صراحةً لإنتاج احتمالات، لأن درجة عدم اليقين تعتمد عليها:

yaml
active_learning:
  classifier:
    name: sklearn.svm.SVC
    hyperparameters:
      kernel: rbf
      probability: true

Naive Bayes، عندما تكون السرعة أهم من آخر نقطة في الدقة:

yaml
active_learning:
  classifier:
    name: sklearn.naive_bayes.MultinomialNB
    hyperparameters:
      alpha: 1.0

calibrate_probabilities مفعّل افتراضياً، وهذا مهم لأن أخذ العينات بناءً على عدم اليقين يرتّب حسب الاحتمال المتوقع، والمصنّف غير المعايَر يرتّب العناصر التي يخطئ فيها بثقة كما لو كانت محسومة.

محوّلات الميزات

القيمة الافتراضية هي sklearn.feature_extraction.text.TfidfVectorizer.

TF-IDF، ميزات مرجّحة:

yaml
active_learning:
  vectorizer:
    name: sklearn.feature_extraction.text.TfidfVectorizer
    hyperparameters:
      max_features: 5000
      ngram_range: [1, 2]
      stop_words: english

عدّ بسيط:

yaml
active_learning:
  vectorizer:
    name: sklearn.feature_extraction.text.CountVectorizer
    hyperparameters:
      max_features: 3000
      ngram_range: [1, 1]

التجزئة (Hashing)، لمفردات أكبر من أن تُحفظ في الذاكرة:

yaml
active_learning:
  vectorizer:
    name: sklearn.feature_extraction.text.HashingVectorizer
    hyperparameters:
      n_features: 10000

يُكتب ngram_range كقائمة YAML ويُحوَّل إلى الصف (tuple) الذي يتوقعه sklearn، لذا فإن [1, 2] صحيح هنا ولا يحتاج إلى صياغة خاصة.

البدء البارد

قبل وجود أي نموذج لا يوجد ما يمكن الشك فيه، لذا تُختار الدفعة الأولى دون نموذج:

yaml
active_learning:
  cold_start_strategy: random
  cold_start_batch_size: 20

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

يمكن لنموذج لغة كبير أن يقيّم الحالات خلال فترة البدء البارد أو إلى جانب المصنّف:

yaml
active_learning:
  enabled: true
  schema_names:
    - sentiment
 
  llm:
    enabled: true
    endpoint_type: vllm
    base_url: http://localhost:8000/v1
    model: meta-llama/Llama-3.2-3B-Instruct
    confidence_method: verbalized

يحدد confidence_method كيفية الحصول على درجة الثقة، والاختيار مهم لأن هذه الدرجة هي التي توجّه الاختيار:

الطريقةكيف تعملالمقايضة
verbalizedيُبلغ النموذج عن ثقته بنفسه على مقياس من 1 إلى 10عامة، لكنها غير موثوقة مع بعض النماذج
logprobsتُحسب من اللوغاريتمات الاحتمالية للرموزالأفضل معايرةً، وتحتاج إلى نقطة نهاية تُرجع logprobs
consistencyتُرسل الحالة نفسها عدة مرات وتُقيَّم حسب درجة الاتفاقتعمل في أي مكان، بتكلفة N استدعاء لكل حالة

تعود logprobs إلى الثقة المُعلنة لفظياً عندما لا تُرجعها نقطة النهاية.

استمرارية النموذج

يمكن للنماذج المدرّبة أن تبقى بعد إعادة التشغيل بدلاً من إعادة بنائها من الصفر:

yaml
active_learning:
  model_persistence:
    enabled: true
    save_directory: "models/"
    retention_count: 5

القيمة الافتراضية لـ retention_count هي 2، وهو يحدد الحد الأقصى لعدد النماذج المحفوظة التي يُحتفظ بها.

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

المخططات المتعددة

يسرد schema_names المخططات التي تدرّب تعليقاتها التوضيحية النموذج. إذا لم يُحدَّد، فإنه يأخذ افتراضياً المخططات القابلة للتعليم في المشروع:

yaml
annotation_schemes:
  - annotation_type: radio
    name: sentiment
    description: "What is the sentiment?"
    labels: [Positive, Negative, Neutral]
 
  - annotation_type: radio
    name: topic
    description: "What is the topic?"
    labels: [Politics, Sports, Tech, Entertainment]
 
active_learning:
  enabled: true
  schema_names:
    - sentiment
    - topic

التهيئة الكاملة

yaml
annotation_task_name: "Sentiment Analysis with Active Learning"
task_dir: "."
port: 8000
 
data_files:
  - "data/reviews.json"
 
item_properties:
  id_key: id
  text_key: text
 
annotation_schemes:
  - annotation_type: radio
    name: sentiment
    description: "What is the sentiment?"
    labels:
      - Positive
      - Negative
      - Neutral
    sequential_key_binding: true
 
active_learning:
  enabled: true
  schema_names:
    - sentiment
 
  min_annotations_per_instance: 1
  min_instances_for_training: 30
  update_frequency: 50
  max_instances_to_reorder: 500
  random_sample_percent: 0.2
 
  classifier:
    name: sklearn.linear_model.LogisticRegression
    hyperparameters:
      C: 1.0
      max_iter: 1000
 
  vectorizer:
    name: sklearn.feature_extraction.text.TfidfVectorizer
    hyperparameters:
      max_features: 5000
      ngram_range: [1, 2]
 
  query_strategy: uncertainty
 
  model_persistence:
    enabled: true
    save_directory: "models/"
    retention_count: 5
 
output_annotation_dir: "output/"
export_annotation_format: jsonl
 
user_config:
  allow_all_users: true

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

يقرر التعلم النشط ما يُعرض تالياً، ويساعد دعم الذكاء الاصطناعي المعلّق فيما هو معروض على الشاشة. هما مستقلان ويمكن الجمع بينهما:

yaml
active_learning:
  enabled: true
  schema_names:
    - sentiment
  min_instances_for_training: 30
 
ai_support:
  enabled: true
  endpoint_type: openai
  ai_config:
    model: gpt-4o-mini
    api_key: ${OPENAI_API_KEY}
    max_tokens: 800
    include:
      all: true

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

المراقبة

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

أفضل الممارسات

اجمع خط أساس أولاً

لا يمكن تدريب أي شيء على مجموعة فارغة، والنموذج المدرّب على عشرين تعليقاً توضيحياً يعيد في الغالب ترتيب الضوضاء:

yaml
active_learning:
  min_instances_for_training: 50

راقب توازن الفئات

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

لا تُعد التدريب بكثرة

yaml
active_learning:
  update_frequency: 100

احتفظ بالنماذج عبر عمليات إعادة التشغيل

yaml
active_learning:
  model_persistence:
    enabled: true
    save_directory: "models/"

استكشاف الأخطاء وإصلاحها

التدريب لا يبدأ أبداً

تحقق من أن التعليقات التوضيحية بلغت min_instances_for_training، ومن أن لكل فئة مثالاً واحداً على الأقل. لا يمكن ملاءمة مصنّف على مجموعة تدريب ذات فئة واحدة.

إعادة الترتيب تبدو بلا أثر

ابحث في السجل عن query_strategy غير معروفة، إذ تعود بصمت إلى عدم اليقين. تأكد من enabled: true، ومن أن schema_names يسمّي مخططات موجودة فعلاً.

بطء مع مجموعة كبيرة

قلّل max_instances_to_reorder، أو زِد update_frequency، أو انتقل إلى HashingVectorizer للمفردات الكبيرة جداً.

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

للاطلاع على تفاصيل التنفيذ، راجع الوثائق المصدرية.