הוספת סיווג טקסט במכשיר לאפליקציה באמצעות TensorFlow Lite ו-Firebase – Codelab ל-iOS

1. סקירה כללית

classification_result_screen.png

ברוכים הבאים ל-codelab בנושא סיווג טקסט באמצעות TensorFlow Lite ו-Firebase. ב-codelab הזה תלמדו איך להשתמש ב-TensorFlow Lite וב-Firebase כדי לאמן מודל לסיווג טקסט ולפרוס אותו באפליקציה. ה-codelab הזה מבוסס על הדוגמה הזו של TensorFlow Lite.

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

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

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

מה תלמדו

  • אימון מודל לניתוח סנטימנט ב-TF Lite באמצעות TF Lite Model Maker
  • פריסת מודלים של TF Lite ב-Firebase ML וגישה אליהם מהאפליקציה
  • מעקב אחרי משוב משתמשים כדי למדוד את רמת הדיוק של המודל באמצעות Firebase Analytics
  • בדיקת ביצועים של מודל פרופיל באמצעות מעקב אחר ביצועים ב-Firebase
  • בחירה של אחד מכמה מודלים שמוטמעים שנטענים דרך הגדרת התצורה מרחוק
  • התנסות במודלים שונים באמצעות Firebase A/B Testing

מה צריך להכין

  • ‫Xcode 11 (או גרסה מתקדמת יותר)
  • ‫CocoaPods 1.9.1 (או גרסה מתקדמת יותר)

איך תשתמשו במדריך הזה?

רק לקרוא לקרוא ולבצע את התרגילים

איך היית מדרג את חוויית הפיתוח שלך באפליקציות ל-Android?

מתחילים ביניים מומחים

2. יצירת פרויקט במסוף Firebase

הוספת Firebase לפרויקט

  1. עוברים אל מסוף Firebase.
  2. בוחרים באפשרות Create New Project (יצירת פרויקט חדש) ונותנים לפרויקט את השם Firebase ML iOS Codelab.

3. קבלת פרויקט לדוגמה

הורדת הקוד

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

git clone https://github.com/FirebaseExtended/codelab-textclassification-ios.git
cd codelab-textclassification-ios
pod install --repo-update

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

הגדרת Firebase

פועלים לפי התיעוד כדי ליצור פרויקט חדש ב-Firebase. אחרי שיוצרים את הפרויקט, מורידים את קובץ GoogleService-Info.plist שלו ממסוף Firebase וגוררים אותו לשורש של פרויקט Xcode.

9efb62a92f27e939.png

מוסיפים את Firebase ל-Podfile ומריצים את הפקודה pod install.

pod 'FirebaseMLModelDownloader', '9.3.0-beta'

בשיטה AppDelegate's didFinishLaunchingWithOptions, מייבאים את Firebase לחלק העליון של הקובץ

import FirebaseCore

מוסיפים קריאה להגדרת Firebase.

FirebaseApp.configure()

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

4. אימון מודל לניתוח סנטימנטים

נשתמש ב-TensorFlow Lite Model Maker כדי לאמן מודל לסיווג טקסט, במטרה לחזות את הסנטימנט של טקסט נתון.

השלב הזה מוצג כ-notebook של Python שאפשר לפתוח ב-Google Colab.

פתיחה ב-Colab

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

5. פריסת מודל ב-Firebase ML

יש שתי סיבות עיקריות לכך שכדאי לפרוס מודל ל-Firebase ML:

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

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

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

כשמוצגת בקשה, נותנים למודל את השם sentiment_analysis ומעלים את הקובץ שהורדתם מ-Colab בשלב הקודם.

3c3c50e6ef12b3b.png

6. הורדת מודל מ-Firebase ML

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

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

בחלק העליון של ModelLoader.swift, מייבאים את מודול Firebase.

import FirebaseCore
import FirebaseMLModelDownloader

ואז מטמיעים את השיטות הבאות.

static func downloadModel(named name: String,
                          completion: @escaping (CustomModel?, DownloadError?) -> Void) {
  guard FirebaseApp.app() != nil else {
    completion(nil, .firebaseNotInitialized)
    return
  }
  guard success == nil && failure == nil else {
    completion(nil, .downloadInProgress)
    return
  }
  let conditions = ModelDownloadConditions(allowsCellularAccess: false)
  ModelDownloader.modelDownloader().getModel(name: name, downloadType: .localModelUpdateInBackground, conditions: conditions) { result in
          switch (result) {
          case .success(let customModel):
                  // Download complete.
                  // The CustomModel object contains the local path of the model file,
                  // which you can use to instantiate a TensorFlow Lite classifier.
                  return completion(customModel, nil)
          case .failure(let error):
              // Download was unsuccessful. Notify error message.
            completion(nil, .downloadFailed(underlyingError: error))
          }
  }
}

ב-ViewController.swift, מחליפים את הקריאה ל-loadModel() בשיטה החדשה שלנו להורדת מודלים.viewDidLoad

// Download the model from Firebase
print("Fetching model...")
ModelLoader.downloadModel(named: "sentiment_analysis") { (customModel, error) in
  guard let customModel = customModel else {
    if let error = error {
      print(error)
    }
    return
  }

  print("Model download complete")

  // TODO: Initialize an NLClassifier from the downloaded model
}

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

7. שילוב המודל באפליקציה

ספריית המשימות של TensorFlow Lite עוזרת לשלב מודלים של TensorFlow Lite באפליקציה בכמה שורות קוד בלבד. אנחנו נאכלס מופע של TFLNLClassifier באמצעות מודל TensorFlow Lite שהורד מ-Firebase. לאחר מכן נשתמש בו כדי לסווג את קלט הטקסט ממשתמשי האפליקציה ולהציג את התוצאה בממשק המשתמש.

הוספת התלות

עוברים אל קובץ ה-Podfile של האפליקציה ומוסיפים את ספריית המשימות של TensorFlow Lite (טקסט) לתלות של האפליקציה. חשוב להוסיף את התלות מתחת להצהרת target 'TextClassification'.

pod 'TensorFlowLiteTaskText', '~> 0.2.0'

מריצים את הפקודה pod install כדי להתקין את התלות החדשה.

הפעלת סיווג טקסט

לאחר מכן נטען את מודל ניתוח הסנטימנטים שהורד מ-Firebase באמצעות NLClassifier של Task Library.

ViewController.swift

נצהיר על משתנה מופע של TFLNLClassifier. בחלק העליון של הקובץ, מייבאים את התלות החדשה:

import TensorFlowLiteTaskText

התגובה הזו מופיעה מעל השיטה ששינינו בשלב האחרון:

// TODO: Add a TFLNLClassifier property.

מחליפים את TODO בקוד הבא:

private var classifier: TFLNLClassifier?

מאתחלים את המשתנה textClassifier באמצעות מודל ניתוח הסנטימנט שהורד מ-Firebase. מחפשים את התגובה שהוספנו בשלב הקודם:

// TODO: Initialize an NLClassifier from the downloaded model

מחליפים את TODO בקוד הבא:

let options = TFLNLClassifierOptions()
self.classifier = TFLNLClassifier.nlClassifier(modelPath: customModel.path, options: options)

סיווג טקסט

אחרי שמגדירים את המופע של classifier, אפשר להריץ ניתוח סנטימנט באמצעות הפעלת method אחת.

ViewController.swift

בשיטה classify(text:), מחפשים את התגובה TODO:

// TODO: Run sentiment analysis on the input text

מחליפים את התגובה בקוד הבא:

guard let classifier = self.classifier else { return }

// Classify the text
let classifierResults = classifier.classify(text: text)

// Append the results to the list of results
let result = ClassificationResult(text: text, results: classifierResults)
results.append(result)

8. הרצת האפליקציה הסופית

הטמעתם את מודל ניתוח הסנטימנטים באפליקציה, אז בואו נבדוק אותו. מחברים את מכשיר ה-iOS ולוחצים על Run (הפעלה) ( execute.png) בסרגל הכלים של Xcode.

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

classification_result_screen.png

9. שיפור האפליקציה באמצעות תכונות נוספות של Firebase

בנוסף לאירוח של מודלים של TFLite, פלטפורמת Firebase מספקת כמה תכונות נוספות שיכולות לשפר את תרחישי השימוש שלכם בלמידת מכונה:

  • מעקב אחר ביצועים ב-Firebase כדי למדוד את מהירות ההסקה של המודל שפועל במכשיר של המשתמשים.
  • ‫Firebase Analytics כדי למדוד את הביצועים של המודל בסביבת הייצור על ידי מדידת תגובת המשתמשים.
  • ‫Firebase A/B Testing כדי לבדוק כמה גרסאות של המודל
  • זוכרים שאמרנו קודם שאנחנו מאמנים שתי גרסאות של מודל TFLite? בדיקות A/B הן דרך טובה לגלות איזו גרסה מניבה ביצועים טובים יותר בסביבת הייצור.

כדי לקבל מידע נוסף על השימוש בתכונות האלה באפליקציה, אפשר לעיין ב-codelabs הבאים:

10. כל הכבוד!

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

מה נכלל

  • TensorFlow Lite
  • Firebase ML

השלבים הבאים

  • מדידת מהירות ההסקה של המודל באמצעות מעקב אחר ביצועים ב-Firebase.
  • פריסת המודל מ-Colab ישירות ל-Firebase באמצעות Firebase ML Model Management API.
  • מוסיפים מנגנון שמאפשר למשתמשים לשלוח משוב על תוצאת החיזוי, ומשתמשים ב-Firebase Analytics כדי לעקוב אחרי המשוב מהמשתמשים.
  • מבצעים בדיקת A/B למודל Average Word Vector ולמודל MobileBERT באמצעות Firebase A/B Testing.

מידע נוסף

יש לך שאלה?

דיווח על בעיות