אימון מודל לזיהוי ספאם בתגובות באמצעות TensorFlow Lite Model Maker

1. לפני שמתחילים

ב-codelab הזה תבדקו קוד שנוצר באמצעות TensorFlow ו-TensorFlow Lite Model Maker כדי ליצור מודל עם מערך נתונים שמבוסס על ספאם בתגובות. הנתונים המקוריים זמינים ב-Kaggle. המידע נאסף לקובץ CSV יחיד, ועבר ניקוי שכלל הסרת טקסט פגום, תגי עיצוב, מילים חוזרות ועוד. כך יהיה קל יותר להתמקד במודל במקום בטקסט.

הקוד שצריך לבדוק מופיע כאן, אבל מומלץ מאוד לעקוב אחרי הקוד ב-Colaboratory.

דרישות מוקדמות

מה תלמדו

  • איך להתקין את TensorFlow Lite Model Maker באמצעות Colab.
  • איך מורידים את הנתונים משרת Colab למכשיר.
  • איך משתמשים בכלי להעלאת נתונים.
  • איך בונים את המודל.

מה נדרש

2. התקנה של TensorFlow Lite Model Maker

  • פותחים את Colab. בתא הראשון ב-Notebook יותקן TensorFLow Lite Model Maker:
!pip install -q tflite-model-maker

אחרי שהתהליך מסתיים, עוברים לתא הבא.

3. ייבוא הקוד

בתא הבא יש מספר ייבואים שהקוד במחברת יצטרך להשתמש בהם:

import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

בנוסף, המערכת תבדוק אם הפעלתם TensorFlow 2.x, שנדרש לשימוש ב-Model Maker.

4. הורדת הנתונים

לאחר מכן מורידים את הנתונים משרת Colab למכשיר, ומגדירים את המשתנה data_file כך שיצביע על הקובץ המקומי:

data_file = tf.keras.utils.get_file(fname='comment-spam.csv', 
  origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv', 
  extract=False)

ב-Model Maker אפשר לאמן מודלים מקובצי CSV פשוטים כמו זה. צריך רק לציין באילו עמודות נמצא הטקסט ובאילו עמודות נמצאות התוויות. בהמשך ה-codelab מוסבר איך עושים את זה.

5. הטמעות שנלמדו מראש

בדרך כלל, כשמשתמשים ב-Model Maker, לא יוצרים מודלים מאפס. אתם משתמשים במודלים קיימים שאתם מתאימים לצרכים שלכם.

מודלים של שפה, כמו זה, כוללים שימוש בהטמעות שנלמדו מראש. הרעיון מאחורי הטמעה הוא שהמילים מומרות למספרים, וכל מילה בקורפוס הכולל מקבלת מספר. הטמעה היא וקטור שמשמש לקביעת הסנטימנט של המילה על ידי הגדרת 'כיוון' למילה. לדוגמה, הווקטורים של מילים שמופיעות לעיתים קרובות בהודעות ספאם בתגובות מצביעים לכיוון דומה, והווקטורים של מילים שלא מופיעות בהודעות כאלה מצביעים לכיוון ההפוך.

כשמשתמשים בהטמעות שנלמדו מראש, מתחילים עם קורפוס, או אוסף, של מילים שכבר נלמדו מהן רגשות מתוך גוף טקסט גדול, כך שמגיעים לפתרון הרבה יותר מהר מאשר כשמתחילים מאפס.

ב-Model Maker יש כמה הטמעות של מודלים שכבר עברו אימון, שאפשר להשתמש בהן. אבל האפשרות הכי פשוטה ומהירה להתחלה היא average_word_vec.

הנה הקוד:

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

הפרמטר num_words

אתם גם מציינים את מספר המילים שאתם רוצים שהמודל ישתמש בהן.

אולי תחשבו שככל שיש יותר מילות מפתח, כך יותר טוב, אבל בדרך כלל יש מספר נכון של מילות מפתח על סמך התדירות שבה כל מילה משמשת. אם משתמשים בכל מילה במאגר המידע, המודל יכול לנסות ללמוד ולקבוע את הכיוון של מילים שמשמשות רק פעם אחת. בכל מאגר טקסטים, הרבה מילים משמשות רק פעם אחת או פעמיים, ולכן לא כדאי לכלול אותן במודל כי ההשפעה שלהן על הסנטימנט הכולל היא זניחה.

אפשר להשתמש בפרמטר num_words כדי לכוונן את המודל לפי מספר המילים הרצוי. מספר קטן יותר עשוי לספק מודל קטן ומהיר יותר, אבל הוא עלול להיות פחות מדויק כי הוא מזהה פחות מילים. לעומת זאת, מספר גדול יותר עשוי לספק מודל גדול יותר ואיטי יותר. חשוב למצוא את שביל הזהב!

הפרמטר wordvec_dim

הפרמטר wordved_dim הוא מספר המאפיינים שרוצים להשתמש בהם עבור הווקטור של כל מילה. כלל האצבע שנקבע על סמך מחקר הוא השורש הרביעי של מספר המילים. לדוגמה, אם אתם משתמשים ב-2,000 מילים, כדאי להתחיל עם 7. אם משנים את מספר המילים שבהן משתמשים, אפשר לשנות גם את זה.

הפרמטר seq_len

בדרך כלל, המודלים מאוד נוקשים בכל מה שקשור לערכי הקלט. במקרה של מודל שפה, המשמעות היא שמודל השפה יכול לסווג משפטים באורך סטטי מסוים. הערך הזה נקבע לפי הפרמטר seq_len או אורך הרצף.

כשממירים מילים למספרים או לטוקנים, משפט הופך לרצף של הטוקנים האלה. במקרה כזה, המודל מאומן לסווג ולזהות משפטים עם 20 טוקנים. אם המשפט ארוך יותר, הוא ייחתך. אם הוא קצר יותר, הוא מרופד. אפשר לראות טוקן <PAD> ייעודי בקורפוס שמשמש למטרה הזו.

6. שימוש בכלי להעלאת נתונים

קודם הורדתם את קובץ ה-CSV. עכשיו הגיע הזמן להשתמש בכלי לטעינת נתונים כדי להפוך את זה לנתוני אימון שהמודל יכול לזהות:

data = DataLoader.from_csv(
    filename=data_file,
    text_column='commenttext',
    label_column='spam',
    model_spec=spec,
    delimiter=',',
    shuffle=True,
    is_training=True)

train_data, test_data = data.split(0.9)

אם פותחים את קובץ ה-CSV בעורך, רואים שבכל שורה יש רק שני ערכים, והם מתוארים באמצעות טקסט בשורה הראשונה של הקובץ. בדרך כלל, כל רשומה נחשבת לעמודה.

תוכלו לראות שהתיאור של העמודה הראשונה הוא commenttext, והערך הראשון בכל שורה הוא הטקסט של התגובה. באופן דומה, התיאור של העמודה השנייה הוא spam, ואפשר לראות שהערך השני בכל שורה הוא True או False,, שמציינים אם הטקסט הזה נחשב לספאם בתגובות או לא. המאפיינים האחרים מגדירים את המשתנה model_spec שיצרתם קודם, יחד עם תו מפריד, שבמקרה הזה הוא פסיק כי הקובץ מופרד בפסיקים. תשתמשו בנתונים האלה לאימון המודל, ולכן הערך של is_Training יהיה True.

כדאי להחריג חלק מהנתונים כדי לבדוק את המודל. מפצלים את הנתונים, כך ש-90% מהם ישמשו לאימון ו-10% לבדיקה או להערכה. כדי לוודא שנתוני הבדיקה נבחרו באופן אקראי ולא מתוך 10% הנתונים התחתונים במערך הנתונים, משתמשים ב-shuffle=True כשמעלים את הנתונים כדי להקצות אותם באופן אקראי.

7. איך בונים את המודל

התא הבא הוא פשוט כדי לבנות את המודל, והוא שורה אחת של קוד:

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50, 
                               validation_data=test_data)

הקוד הזה יוצר מודל לסיווג טקסט באמצעות Model Maker, ומציין את נתוני האימון שרוצים להשתמש בהם (כפי שהוגדרו בשלב הרביעי), את מפרט המודל (כפי שהוגדר בשלב הרביעי) ומספר האפוקים, שהוא 50 במקרה הזה.

העיקרון הבסיסי של למידת מכונה הוא שזו צורה של התאמת תבניות. בתחילה, המערכת טוענת את המשקלים שאומנו מראש עבור המילים ומנסה לקבץ אותן יחד עם חיזוי של המילים שמצביעות על ספאם כשהן מקובצות יחד, ושל המילים שלא מצביעות על ספאם. בפעם הראשונה, סביר להניח שהחלוקה תהיה שווה כי המודל רק מתחיל לפעול.

c42755151d511ce.png

לאחר מכן, המודל ימדוד את התוצאות של תקופת האימון הזו ויריץ קוד אופטימיזציה כדי לשפר את התחזית שלו, ואז ינסה שוב. זוהי תקופה. לכן, אם מציינים epochs=50, המערכת תעבור על ה "לולאה" הזו 50 פעמים.

7d0ee06a5246b58d.png

כשמגיעים לאפוקה ה-50, המודל מדווח על רמת דיוק גבוהה בהרבה. במקרה הזה, מוצג 99%.

בדרך כלל, נתוני הדיוק של האימות קצת יותר נמוכים מנתוני הדיוק של האימון, כי הם מציינים איך המודל מסווג נתונים שהוא לא ראה בעבר. היא משתמשת ב-10% מנתוני הבדיקה שהשארתם בצד קודם לכן.

f063ff6e1d2add67.png

8. ייצוא המודל

  1. מריצים את התא הזה כדי לציין ספרייה ולייצא את המודל:
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
  1. דוחסים את כל התיקייה של /mm_spam_savedmodel ומורידים את הקובץ mm_spam_savedmodel.zip שנוצר, שדרוש לכם ב-codelab הבא.
# Rename the SavedModel subfolder to a version number
!mv /mm_spam_savedmodel/saved_model /mm_spam_savedmodel/123
!zip -r mm_spam_savedmodel.zip /mm_spam_savedmodel/

9. מזל טוב

בשיעור הזה למדתם איך ליצור ולייצא את המודל באמצעות קוד Python. עכשיו יש לכם SavedModel, ובסופו התוויות והאוצר מילים. ב-codelab הבא מוסבר איך להשתמש במודל הזה כדי להתחיל לסווג תגובות ספאם.

מידע נוסף