בניית מודל למידת מכונה של שליחת תגובות ספאם

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

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

הקוד שברצונך לבדוק סופק כאן, אבל מומלץ מאוד לפעול לפי הקוד ב-Google Colab.

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

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

מה תלמדו

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

למה תזדקק?

2. התקנת TensorFlow Lite Model Maker

פותחים את Colab. התא הראשון ב-notebook יתקין עבורכם את TensorFLow Lite Model Maker:

!pip install -q tflite-model-maker

לאחר השלמתו, עבור לתא הבא.

3. ייבוא הקוד

בתא הבא יש כמה פעולות ייבוא שהקוד ב-notebook יצטרך לבצע:

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. הורדת הנתונים

לאחר מכן מורידים את הנתונים משרת Cloud למכשיר ומגדירים את 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 פשוטים כמו הקובץ הזה. צריך רק לציין אילו עמודות מכילות את הטקסט ואילו מחזיקות את התוויות. ב-Codelab אפשר לקרוא איך לעשות את זה.

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)

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

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

b94b00f0b155db3d.png

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

85f1d21c0b64d654.png

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

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

5be7967ec70e4302.png

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

אחרי שהאימון הסתיים, תוכלו לייצא את המודל.

TensorFlow מודל בפורמט משלו. צריך להמיר אותו לפורמט TFLITE כדי להשתמש בו באפליקציה לנייד. 'יוצר המודלים' מטפל במורכבות הזו בשבילכם.

פשוט מייצאים את המודל ומזינים ספרייה:

model.export(export_dir='/mm_spam')

בתוך הספרייה הזו יופיע קובץ model.tflite. מורידים אותו תצטרכו אותה ב-Codelab הבא, שבו הוא יתווסף לאפליקציה ל-Android!

שיקולים לגבי iOS

מודל ה- .tflite שייצאתם כרגע פועל היטב ל-Android, כי המטא-נתונים של המודל מוטמעים בו, ומערכת Android Studio יכולה לקרוא את המטא-נתונים האלה.

המטא-נתונים האלה חשובים מאוד כי הם כוללים מילון של אסימונים שמייצגים מילים כפי שהמודל מזהה אותן. זכרו מוקדם יותר כשגיליתם שמילים הופכות לאסימונים, ואז האסימונים האלה מקבלים וקטורים לסנטימנט שלהם? האפליקציה לנייד צריכה לדעת את האסימונים האלה. לדוגמה, אם המילה 'כלב' עבר המרה לאסימונים ל-42, והמשתמשים שלכם מקלידים "כלב" למשפט אחד, האפליקציה תצטרך להמיר את המילה "כלב" 42 כדי שהמודל יבין זאת. מפתחים של Android מקבלים 'ספריית המשימות של TensorFlow Lite' שמקל על השימוש, אבל ב-iOS צריך לעבד את אוצר המילים, כדי שהוא יהיה זמין. הכלי ליצירת מודלים יכול לייצא בשבילך את הנתונים על ידי ציון הפרמטר export_format. לכן, כדי לקבל את התוויות ואת אוצר המילים של המודל, תוכלו להשתמש כך:

model.export(export_dir='/mm_spam/', 
             export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

9. מזל טוב

בשיעור הזה תלמדו איך להשתמש ב-Python Code (קוד Python) כדי לבנות ולייצא את המודל. בסוף יהיה קובץ tflite.

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