TensorFlow.js: אימון מחדש של מודל זיהוי ספאם בתגובות לטיפול במקרי קצה

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

ה-Codelab הזה תוכנן להתבסס על התוצאה הסופית של ה-Codelab הקודם בסדרה הזו לזיהוי ספאם בתגובות באמצעות TensorFlow.js.

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

התוצאה הסופית של ה-Codelab מוצגת כאן:

a4511e5d445706b1.gif

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

ה-Codelab הזה מתמקד בעיבוד שפה טבעית (NLP) ומראה איך לשנות אפליקציית אינטרנט קיימת שיצרתם (מומלץ מאוד לבצע את הפעולות הבאות ב-Codelabs) כדי להתמודד עם הבעיה האמיתית של שליחת תגובות ספאם. הרבה מפתחי אינטרנט ייתקלו בבעיה כזו כשהם עובדים על אחת מאפליקציות האינטרנט הפופולריות שקיימות כיום.

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

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

  • השלמת ה-Codelab הראשון בסדרה הזו.
  • ידע בסיסי בטכנולוגיות אינטרנט כולל HTML, CSS ו-JavaScript.

מה תפַתחו

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

בואו נתחיל לפרוץ...

מה תלמדו

אתם:

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

שיעור ה-Lab הזה הוא היכרות עם HTML5, CSS ו-JavaScript. תריצו גם קוד Python דרך 'שיעור Lab משותף' notebook לאמן מחדש את המודל שנוצר באמצעות Model Maker, אבל לא צריך לדעת ב-Python כדי לעשות את זה.

2. הגדרת קוד

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

ב-Glitch, פשוט לוחצים על הלחצן remix this (רמיקס זה) כדי לפצל אותו וליצור קבוצת קבצים חדשה שניתן לערוך.

3. זיהוי מקרי קצה בפתרון הקודם

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

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

תגובות לגיטימיות שפורסמו ללא בעיה (מילות מפתח שליליות אמיתיות):

  1. "וואו, אהבתי את הסרטון הזה, עבודה מדהימה". ספאם של הסתברות: 47.91854%
  2. "כל כך אהבתי את ההדגמות האלה! יש לך פרטים נוספים?" ספאם של הסתברות: 47.15898%
  3. "באיזה אתר אפשר לעבור כדי לקבל מידע נוסף?" ספאם הסתברות: 15.32495%

זה נהדר, ההסתברויות לכל האפשרויות שלמעלה די נמוכות ומצליחות לעבור בהצלחה את ברירת המחדל SPAM_THRESHOLD, שהיא סבירות מינימלית של 75% לפני ביצוע הפעולה (מוגדר בקוד script.js מ-Codelab הקודם).

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

תגובות לגיטימיות שסומנו כספאם (תוצאות חיוביות כוזבות):

  1. "האם מישהו יכול לקשר לאתר של המסכה שהוא עוטה?" ספאם הסתברות: 98.46466%
  2. "האם אפשר לקנות את השיר הזה ב-Spotify? שמישהו יודיע לי בבקשה!" ספאם של הסתברות: 94.40953%
  3. "האם מישהו יכול ליצור איתי קשר ולספק פרטים לגבי אופן ההורדה של TensorFlow.js?" ספאם של הסתברות: 83.20084%

אויש… נראה שהתגובות הלגיטימיות האלה מסומנות כספאם כשצריך לאשר אותן. איך פותרים את הבעיה?

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

תגובות ספאם שסומנו כספאם (תוצאות חיוביות אמיתיות):

  1. "זה מגניב, אבל כדאי לראות את קישורי ההורדה באתר שלי טובים יותר!" ספאם של הסתברות: 99.77873%
  2. "אני יודע/ת שחלק מהאנשים שיכולים לתת לך תרופות פשוט רואים את קובץ ה-pr0file שלי לפרטים" סבירות ספאם: 98.46955%
  3. "צפו בפרופיל שלי כדי להוריד סרטונים מדהימים עוד יותר טובים יותר! http://example.com" הסתברות כספאם: 96.26383%

בסדר, זה עובד כמו שצריך עם הסף המקורי של 75%, אבל מאחר שבשלב הקודם שינית את SPAM_THRESHOLD כך שרמת הביטחון שלו תהיה גבוהה מ-98.5%, המשמעות היא ששתי דוגמאות כאן מאפשרות מעבר, ולכן ייתכן שהסף גבוה מדי. אולי 96% יותר מתאים לך? אבל אם תעשו זאת, אחת מהתגובות בקטע הקודם (תוצאות חיוביות כוזבות) תסומן כספאם כשהן לגיטימיות, כיוון שהיא דורגה כ-98.46466%.

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

בואו נמשיך...

תגובות ספאם שמותר לפרסם (מילות מפתח שליליות כוזבות):

  1. "צפו בפרופיל שלי כדי להוריד סרטונים מדהימים עוד יותר טובים!" ספאם הסתברות: 7.54926%
  2. "קבלו הנחה על שיעורי האימון שלנו במכון הכושר ראו pr0file!" ספאם של הסתברות: 17.49849%
  3. "המניה מז'אנר מדהימה! להגיע לפני מאוחר מדי!" ספאם של הסתברות: 20.42894%

לגבי התגובות האלה, אין אפשרות לעשות דבר פשוט על ידי שינוי נוסף של הערך של SPAM_THRESHOLD. הפחתת סף הספאם מ-96% ל-9% בערך תוביל לסימון תגובות כנותיות כספאם, ולאחת מהן יש דירוג של 58% על אף שהוא לגיטימי. הדרך היחידה להתמודד עם הערות כאלה היא לאמן מחדש את המודל עם מקרי קצה כאלה שנכללים בנתוני האימון, כדי שהוא ילמד להתאים את התפיסה שלו על העולם כדי לקבוע מה נחשב לספאם או לא.

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

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

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

4. אימון מחדש של מודל זיהוי הספאם של התגובות

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

סיכום של מודל מוכן מראש

המודל המוכן מראש שבו השתמשת היה מודל שנוצר על ידי צד שלישי באמצעות יוצר המודלים שמשתמש ב'הטמעת מילים ממוצעת' כדי לפעול.

בגלל שהמודל נבנה עם Model Maker, תצטרכו לעבור לזמן קצר ל-Python כדי לאמן מחדש את המודל, ואז לייצא את המודל שנוצר לפורמט TensorFlow.js כדי שתוכלו להשתמש בו בדפדפן. למרבה המזל, הכלי Model Maker מאפשר מאוד להשתמש במודלים שלהם בצורה פשוטה, כך שאפשר לעקוב אחריהם בקלות ואנחנו נדריך אתכם בתהליך, אז אל תדאגו אם לא השתמשתם ב-Python בעבר.

Colabs

ב-Codelab הזה אין לך יותר מדי חשש מרצון להגדיר שרת Linux עם כל כלי העזר השונים של Python שהותקנו, אפשר פשוט להריץ קוד דרך דפדפן האינטרנט באמצעות 'Colab Notebook'. ה-notebooks האלה יכולים להתחבר ל"קצה עורפי" - מדובר בשרת שמותקן מראש בו תכונות מסוימות, שבאמצעותו ניתן להריץ קוד שרירותי בתוך דפדפן האינטרנט ולראות את התוצאות. האפשרות הזו שימושית מאוד ליצירת אב טיפוס מהירה או לשימוש במדריכים כאלה.

כל מה שצריך לעשות הוא לעבור אל colab.research.google.com. יוצג לך מסך פתיחה כמו:

6b82258445885c50.png

עכשיו לוחצים על הלחצן New Notebook (מחברת חדשה) בפינה הימנית התחתונה של החלון הקופץ. אתם אמורים לראות שיתוף פעולה ריק כזה:

2d52c8f7afa88564.png

נהדר! השלב הבא הוא לחבר את ה-colab בקצה העורפי לשרת עורפי כלשהו כדי להריץ את קוד Python שתכתבו. כדי לעשות את זה, לוחצים על Connect (התחברות) בפינה השמאלית העליונה ובוחרים באפשרות Connect to domain time (סביבת זמן ריצה מתארחת).

fa5f578a1a3d352b.png

לאחר החיבור אמורים להופיע במקומם סמלים של RAM ודיסק, כך:

541c9894fb39d4cb.png

יפה מאוד! עכשיו אפשר להתחיל לתכנת ב-Python כדי לאמן מחדש את המודל של 'יוצר המודלים'. כל שעליך לעשות הוא לבצע את השלבים הבאים.

שלב 1

מעתיקים את הקוד שבהמשך בתא הראשון שהוא ריק כרגע. האפליקציה תתקין עבורך את TensorFlow Lite Model Maker באמצעות מנהל החבילות של Python שנקרא 'pip' (הוא דומה ל-npm שבו רוב הקוראים במעבדת הקוד הזו מכירים יותר אותו מהסביבה העסקית של JS):

!apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0
!pip install -q tflite-model-maker

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

7ac5e3516bed6335.png צריך ללחוץ על לחצן ההפעלה כדי להריץ את הקוד שהוקלד בתא.

עכשיו תתבצע התקנה של יוצר המודלים:

651f21b04fb648cc.png

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

שלב 2

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

869904a9d774c455.png

התא הבא שרץ יכלול כמה פעולות ייבוא שצריך להשתמש בהן בקוד בשאר ה-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')

דברים סטנדרטיים למדי, גם אם אתם לא יודעים Python. מתבצע ייבוא של כמה כלי עזר ואת הפונקציות של 'יוצר המודלים' שדרושות בשביל מסווג הספאם. תתבצע גם בדיקה לראות אם הפעלת את TensorFlow 2.x, שנדרש לשימוש ב-Model Maker.

לבסוף, בדיוק כמו קודם, מריצים את התא על-ידי לחיצה על כשמעבירים את העכבר מעל התא, ומוסיפים תא קוד חדש לשלב הבא.

שלב 3

בשלב הבא מורידים את הנתונים משרת מרוחק למכשיר, ומגדירים את המשתנה training_data כנתיב של הקובץ המקומי שירד:

data_file = tf.keras.utils.get_file(fname='comment-spam-extras.csv', origin='https://storage.googleapis.com/jmstore/TensorFlowJS/EdX/code/6.5/jm_blog_comments_extras.csv', extract=False)

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

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

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

מפעילים את התא הזה, ובסיום ההפעלה שלו, מוסיפים תא חדש ועוברים לשלב 4.

שלב 4

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

ב'יוצר המודלים' יש כמה הטמעות של מודלים ללמידה מוקדמת שאפשר להשתמש בהם, אבל הדרך הקלה והמהירה ביותר להתחיל היא average_word_vec, שבה השתמשתם ב-Codelab הקודם כדי לבנות את האתר. הנה הקוד:

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

פרמטר

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

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

כשמדובר במילים שיש להן דירוג גבוה ב'מימד הרפואי' הוא עשוי להבין שמאפיין שני, שקשור למילים לגוף האדם, יכול להועיל. מילים כמו "leg", "arm", "neck" עשויות לקבל כאן דירוג גבוה וגם די גבוהה בממד הרפואי.

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

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

הסבר על

seq_len

פרמטר

בדרך כלל, מודלים קפדניים מאוד בכל הנוגע לערכי קלט. עבור מודל שפה, פירוש הדבר הוא שמודל השפה יכול לסווג משפטים באורך מסוים, באורך סטטי. הערך הזה נקבע באמצעות הפרמטר seq_len, שבו הוא מייצג את הערך 'sequence length' (אורך רצף). כשממירים מילים למספרים (או לאסימונים), המשפט הופך לרצף של האסימונים האלה. לכן המודל יאמן (במקרה הזה) לסווג ולזהות משפטים שיש בהם 20 אסימונים. אם המשפט ארוך יותר, הוא ייחתך. אם הוא קצר יותר, הוא יהיה ללא ערכים – בדיוק כמו ב-Codelab בסדרה הזו.

שלב 5 – טוענים את נתוני האימון

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

אחר כך אפשר יהיה להשתמש בשיטת data.split() כדי לפצל את הנתונים לנתוני אימון ובדיקה. הסימן 0 .9 מציין ש-90% ממערך הנתונים ישמשו לאימון, והשאר ישמש לבדיקה.

שלב 6 – בניית המודל

צריך להוסיף תא נוסף שבו נוסיף קוד לבניית המודל:

model = text_classifier.create(train_data, model_spec=spec, epochs=50)

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

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

bbe4b896d8060bc4.png

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

4ed286d114960ca.png

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

שלב 7 – ייצוא המודל

אחרי שהאימון הסתיים, תוכלו לייצא את המודל. ב-TensorFlow מודל מסוים יש פורמט משלו והוא צריך להמיר אותו לפורמט TensorFlow.js לשימוש בדף אינטרנט. פשוט מדביקים את הפקודה הבאה בתא חדש ומריצים אותה:

model.export(export_dir="/js_export/", export_format=[ExportFormat.TFJS, ExportFormat.LABEL, ExportFormat.VOCAB])
!zip -r /js_export/ModelFiles.zip /js_export/

אחרי הרצת הקוד הזה, בלחיצה על סמל התיקייה הקטן שמימין ל-Colab אפשר לעבור לתיקייה שייצאת אליה למעלה (בספריית השורש – יכול להיות שיהיה צורך לעלות ברמה מסוימת) ולמצוא את חבילת ה-ZIP של הקבצים שיוצאו ב-ModelFiles.zip.

הורידו את קובץ ה-ZIP למחשב עכשיו, כי תשתמשו בקבצים האלה בדיוק כמו ב-Codelab הראשון:

cda3c681ebf144b4.png

נהדר! החלק של Python הסתיים, ועכשיו אפשר לחזור לארץ של JavaScript המוכרת והאהובה. סוף סוף!

5. הצגת מודל למידת המכונה החדש

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

קודם כול, אם עדיין לא עשיתם זאת, מחלצים את הקבצים של המודל שהורדתם מה-notebook של Model Maker Colab שהרצתם. הקבצים הבאים אמורים להופיע בתוך התיקיות השונות:

3ace87c57b98cfbc.png

מה יש לך פה?

  • model.json – זהו אחד מהקבצים שמרכיבים את מודל TensorFlow.js לאחר האימון. הקובץ הספציפי הזה ישמש בקוד ה-JS.
  • group1-shard1of1.bin – זהו קובץ בינארי שמכיל חלק גדול מהנתונים השמורים של מודל TensorFlow.js שיוצא, והוא צריך להתארח במקום כלשהו בשרת להורדה באותה ספרייה כמו model.json שלמעלה.
  • vocab – הקובץ המוזר הזה ללא סיומת הוא משהו של יוצר המודלים שמראה לנו איך לקודד מילים במשפטים, כדי שהמודל יבין איך להשתמש בהן. בקטע הבא נרחיב בנושא הזה.
  • labels.txt - העמודה הזו מכילה רק את שמות המחלקות שייווצרו שהמודל יחזה. במודל הזה, אם פותחים את הקובץ בעורך הטקסט, מוצג בו רק "false". ו-TRUE מצוין כי הוא 'לא ספאם' או 'ספאם' כפלט החיזוי שלו.

אירוח קובצי המודל של TensorFlow.js

קודם כול צריך להזין את הקבצים model.json ו-*.bin שנוצרו בשרת אינטרנט כדי שאפשר יהיה לגשת אליהם דרך דף האינטרנט.

מחיקת קובצי מודל קיימים

כי אתם מתכננים לעבוד על התוצאה של ה-Codelab הראשון בסדרה הזו, לכן צריך קודם למחוק את קובצי המודל הקיימים שהועלו. אם משתמשים ב-Glitch.com, צריך פשוט לבדוק בחלונית הקבצים שמימין את האפשרויות model.json ו-group1-shard1of1.bin, ללחוץ על התפריט הנפתח (3 נקודות) לכל קובץ ולבחור באפשרות מחיקה כמו שמוצג:

c72bfdc5a0db4d0d.png

העלאת קבצים חדשים ל-Glitch

נהדר! עכשיו צריך להעלות את הרשומות החדשות:

  1. פותחים את תיקיית הנכסים בחלונית הימנית של פרויקט Glitch ומוחקים נכסים ישנים שהועלו אם יש להם שמות זהים.
  2. לוחצים על העלאת נכס ובוחרים את group1-shard1of1.bin להעלאה לתיקייה הזו. עכשיו זה אמור להיראות כך אחרי ההעלאה:

c6739dd30e6df977.png

  1. נהדר! עכשיו עושים את אותו הדבר גם בקובץ model.json, כך ש-2 קבצים צריכים להיות בתיקיית הנכסים באופן הבא:

b7858eb08bea9ac3.png

  1. לחיצה על הקובץ group1-shard1of1.bin שהעלית עכשיו תאפשר לך להעתיק את כתובת ה-URL למיקום שלו. יש להעתיק את הנתיב הזה עכשיו, כפי שמוצג:

19999f6644f61153.png

  1. עכשיו בפינה הימנית התחתונה של המסך, לוחצים על כלים > טרמינל. ממתינים עד שחלון הטרמינל ייטען.
  2. אחרי הטעינה, מקלידים את הטקסט הבא ומקישים על Enter כדי לשנות את הספרייה לתיקייה www:

טרמינל:

cd www
  1. בשלב הבא, צריך להשתמש ב-wget כדי להוריד את 2 הקבצים שהועלו עכשיו, על ידי החלפת כתובות ה-URL שלמטה בכתובות ה-URL שיצרת לקבצים בתיקיית הנכסים ב-Glitch (בודקים בתיקיית הנכסים בכתובת ה-URL המותאמת אישית של כל קובץ).

שימו לב שהרווח בין שתי כתובות ה-URL ושכתובות ה-URL שבהן תצטרכו להשתמש יהיו שונות מאלה שמוצגות, אבל הן ייראו דומות:

טרמינל

wget https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fmodel.json?v=1616111344958 https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fgroup1-shard1of1.bin?v=1616017964562

נהדר! יצרת עותק של הקבצים שהועלו לתיקייה www.

עם זאת, כרגע תתבצע הורדה שלהם עם שמות מוזרים. אם תקלידו ls במסוף ותקישו על Enter, תראו משהו כזה:

6c417fdfc64762f1.png

  1. באמצעות הפקודה mv, משנים את שמות הקבצים. מקלידים את הטקסט הבא במסוף ומקישים על Enter אחרי כל שורה:

טרמינל:

mv *group1-shard1of1.bin* group1-shard1of1.bin
mv *model.json* model.json
  1. לסיום, מרעננים את הפרויקט של Glitch על ידי הקלדת refresh בטרמינל ומקישים על Enter:

טרמינל:

refresh

אחרי הרענון אמור להופיע עכשיו model.json ו-group1-shard1of1.bin בתיקייה www בממשק המשתמש:

530b651f4dbac64.png

נהדר! השלב האחרון הוא עדכון הקובץ dictionary.js.

  1. אפשר להמיר את קובץ ה-vocab החדש שהורדתם לפורמט JS הנכון באופן ידני באמצעות עורך הטקסט או באמצעות הכלי הזה ולשמור את הפלט שמתקבל כ-dictionary.js בתיקייה www. אם כבר יש לכם קובץ dictionary.js, אפשר פשוט להעתיק ולהדביק את התוכן החדש מעל הקובץ ולשמור אותו.

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

64e5cf6f6e158d6c.gif

כמו שאפשר לראות, 6 הקבוצות הראשונות מסווגות כראוי כלא ספאם והקבוצה השנייה של 6 מזוהות כספאם. יופי!

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

"המניה מז'אנר מדהימה! כדאי להגיע לפני מאוחר מדי!"

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

"הערך של המניה XYZ גדל! כדאי לקנות ממש לפני שייגמר!"

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

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

6. מעולה!

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

סיכום

ב-Codelab הזה:

  1. מקרי קצה שהתגלו ולא עבדו בזמן השימוש במודל מוכן מראש של תגובות ספאם.
  2. אימנו מחדש את המודל של 'יוצר המודלים' כדי להביא בחשבון את מקרי הקצה שמצאת
  3. התבצע ייצוא של המודל החדש שאומן לפורמט TensorFlow.js
  4. אפליקציית האינטרנט עודכנה כדי להשתמש בקבצים החדשים

מה השלב הבא?

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

משתפים את היצירות שלכם איתנו

אתם יכולים להרחיב בקלות את מה שיצרתם היום גם לתרחישים יצירתיים אחרים, ואנחנו ממליצים לכם לחשוב מחוץ למסגרת ולהמשיך להאקינג.

אל תשכחו לתייג אותנו ברשתות החברתיות באמצעות ה-hashtag הבא: #MadeWithTFJS, כדי לקבל הזדמנות להציג את הפרויקט שלכם בבלוג של TensorFlow או אפילו באירועים עתידיים. נשמח לראות את הדמויות שלך.

כדי להעמיק עוד את ה-codelabs ב-TensorFlow.js

אתרים שאפשר לשלם עליהם