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

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

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

הקוד הזה נבדק כאן, אבל מומלץ מאוד לעקוב אחר הקוד ב-Colaboratory.

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

מה תלמדו

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

מה תצטרך להכין

2. התקנה של דגם TensorFlow Lite

  • פותחים את Colab. התא הראשון בפנקס יתקין עבורך את TensorFlow Lite Maker 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, שהיא דרישה לשימוש ביוצר המודלים.

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)

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

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

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

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

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

הכלי ליצירת דגמים מספק כמה הטמעות נתונים שנלמדו מראש ואפשר להשתמש בהן, אבל האפשרות הראשונה והמהירה ביותר להתחלת העבודה היא האפשרות של 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)

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

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

c42755151d511ce.png

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

7d0ee06a5246b58d.png

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

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

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 שנוצר, הנדרש במעבדת הקוד הבאה.
# 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. מזל טוב

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

מידע נוסף