לולאת אימון

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

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

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

היישום של לולאת האימון המוכללת של Swift for TensorFlow מושפע מאוד מה- Learner של fastai . למידע נוסף על העיצוב שלהם, עיין ב "fastai: A Layered API for Deep Learning" ובמצגת של Sylvain Gugger "Fast.ai - לולאת אימון הניתנת להתאמה אישית אינסופית" .

נוֹהָג

הדוגמה של ResNet-CIFAR10 מספקת הדגמה טובה כיצד להשתמש בלולאת אימון זו בפועל. ראשית, ייבא את המודול:

import TrainingLoop

לאחר מכן בחר קצה מאיץ על ידי הגדרת Device . במקרה זה, נבחר את הקצה האחורי מבוסס X10 XLA ונשתמש במאיץ הזמין הראשון:

let device = Device.defaultXLA

השלב הבא הוא להגדיר את מערך הנתונים, המודל והאופטימיזציה לשימוש עם לולאת האימון שלך:

let dataset = CIFAR10(batchSize: 10, on: device)
var model = ResNet(classCount: 10, depth: .resNet56, downsamplingInFirstStage: false)
var optimizer = SGD(for: model, learningRate: 0.001)

ולאחר מכן הגדר את לולאת האימון:

var trainingLoop = TrainingLoop(
  training: dataset.training,
  validation: dataset.validation,
  optimizer: optimizer,
  lossFunction: softmaxCrossEntropy,
  metrics: [.accuracy])

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

המדדים הנוכחיים שניתן ללכוד כוללים:

  • loss
  • accuracy
  • top5Accuracy
  • matthewsCorrelationCoefficient
  • perplexity

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

try! trainingLoop.fit(&model, epochs: 10, on: device)

זה יאמן את המודל למשך 10 עידנים באמצעות ה-backend של המאיץ שציינו. נתונים סטטיסטיים יוצגו במהלך האימון לקונסולה באמצעות הנחיה מונפשת.

התקשרויות חוזרות

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

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

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

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

רישום CSV

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

כדי להוסיף רישום CSV ללולאת האימון שלך, הוסף משהו כמו הבא למערך של התקשרויות שסופקו ל- callbacks: פרמטר עבור TrainingLoop שלך:

try! CSVLogger(path: "file.csv").log

כדוגמה, מדגם LeNet-MNIST משתמש בזה בתוך לולאת האימון שלו.

לוחות זמנים של שיעורי למידה

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

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

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

learningRateScheduler(
  schedule: makeSchedule(
    [
      ScheduleSegment(shape: linear, startRate: 0, endRate: peakLearningRate, stepCount: 10),
      ScheduleSegment(shape: linear, endRate: 0)
    ]
  )
)

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

אינטגרציה של TensorBoard

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

הדוגמה של GPT2-WikiText2 ממחישה כיצד להוסיף רישום TensorBoard לאימון המודל שלך. ראשית, ייבא את מודול TensorBoard . אז זה פשוט כמו הוספת tensorBoardStatisticsLogger() ל- callbacks: של TrainingLoop שלך: מערך.

כברירת מחדל, זה ירשום כל ריצת אימון בתוך ספריית run/tensorboard/stats . כדי להציג את זה בתוך Tensorboard, הפעל

tensorboard --logdir ./run/tensorboard/stats

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

העיצוב של השילוב של Swift for TensorFlow TensorBoard נוצר בהשראת tensorboardX . השיחות חוזרות של TensorBoard יוצרים ישירות את מאגרי פרוטוקול האירועים והסיכום המתאימים וכותבים אותם בתוך קובץ יומן במהלך האימון.

התקשרויות חוזרות מותאמות אישית

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

func customCallback<L: TrainingLoopProtocol>(_ loop: inout L, event: TrainingLoopEvent) throws
{
  if event == .updateStart {
    ...
  }
}

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

  • fitStart
  • fitEnd
  • epochStart
  • epochEnd
  • trainingStart
  • trainingEnd
  • validationStart
  • validationEnd
  • batchStart
  • batchEnd
  • updateStart
  • inferencePredictionEnd

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