حلقه آموزشی

هنگام آموزش یک مدل یادگیری ماشین، معمول است که یک حلقه وجود داشته باشد که در آن داده‌های آموزشی دریافت می‌شوند (یا تولید می‌شوند)، دسته‌ها از طریق یک مدل اجرا می‌شوند، گرادیان‌ها به‌دست می‌آیند، و مدل از طریق بهینه‌ساز به‌روزرسانی می‌شود. در حالی که می توانید برای هر برنامه آموزشی یک حلقه آموزشی از خودتان بنویسید، Swift for TensorFlow یک انتزاع حلقه آموزشی آزمایشی ارائه می دهد که ممکن است این فرآیند را ساده کند.

ماژول TrainingLoop در مخزن مدل ها حاوی نسخه فعلی این حلقه آموزشی تعمیم یافته تجربی است. ساختار آن به گونه‌ای است که با بسته‌بندی‌های داده‌ای که با API Epochs مطابقت دارند برای دریافت آسان داده‌ها، ادغام می‌شود، و تعامل مدل‌ها، مجموعه‌های داده، و بهینه‌سازها را با پشتوانه‌های شتاب‌دهنده برای دستیابی به عملکرد بهینه خودکار می‌کند. سفارشی سازی سنگین فرآیند آموزش را می توان با استفاده از تماس های برگشتی به دست آورد.

اکثر نمونه های مبتنی بر تصویر در مخزن مدل برای استفاده از این انتزاع حلقه آموزشی و همچنین نمونه های آموزش مدل متنی نظارت شده تبدیل شده اند. با این حال، حلقه آموزشی ممکن است در طراحی فعلی خود برای همه مدل‌های یادگیری ماشین مناسب نباشد.

اجرای Swift برای حلقه آموزشی تعمیم یافته TensorFlow به شدت تحت تأثیر Learner fastai است. برای اطلاعات بیشتر در مورد طراحی آنها، لطفاً به "fastai: یک API لایه ای برای یادگیری عمیق" و ارائه 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])

حلقه آموزشی فرض می‌کند که مجموعه داده‌ای که استفاده می‌کنید مطابق با Epochs API است و به شما امکان می‌دهد مشخص کنید که از کدام تقسیم‌بندی در مجموعه داده برای آموزش و اعتبارسنجی استفاده کنید. هر تابع از دست دادن را می توان پس از قرار دادن در یک پوشش سازگار استفاده کرد، مانند softmaxCrossEntropy اینجاست .

معیارهای فعلی که می توان ثبت کرد عبارتند از:

  • loss
  • accuracy
  • top5Accuracy
  • matthewsCorrelationCoefficient
  • perplexity

در نهایت برای انجام آموزش با شماره زیر تماس بگیرید:

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

این مدل را برای 10 دوره با استفاده از بخش شتاب دهنده ای که ما مشخص کردیم آموزش می دهد. آمار در طول آموزش با استفاده از یک فرمان متحرک به کنسول نمایش داده می شود.

تماس های تلفنی

سفارشی‌سازی این حلقه آموزشی تعمیم‌یافته از طریق استفاده از callbacks انجام می‌شود. این تماس‌ها را می‌توان به نقاط مختلفی در حلقه متصل کرد.

چندین کال بک داخلی عملکردی را ارائه می دهند که می تواند به هر حلقه آموزشی اضافه شود. این شامل:

  • ثبت آمار در فایل‌های با کاما جدا شده با ارزش (CSV).
  • تنظیم نرخ یادگیری بر اساس یک برنامه زمانی سفارشی
  • نظارت و نمودارسازی پیشرفت آموزش از طریق TensorBoard

علاوه بر اینها، می توانید تماس های سفارشی خود را ایجاد کنید تا طیف وسیعی از عملکردهای اضافی را به یک حلقه آموزشی استاندارد اضافه کنید.

ثبت CSV

کلاس CSVLogger یک callback را کپسوله می‌کند که آمارهای آموزشی را در قالب مقدار جدا شده با کاما در فایل مورد نظر شما می‌نویسد. این فایل با ستون هایی با برچسب epoch ، batch و هر معیاری که در حلقه آموزشی خود فعال کرده اید شروع می شود. سپس برای هر دسته یک ردیف با مقادیر فعلی آن ستون ها نوشته می شود.

برای افزودن گزارش CSV به حلقه آموزشی خود، چیزی شبیه به زیر را به آرایه ای از callbacks ارائه شده به 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() به callback های TrainingLoop callbacks: آرایه است.

به‌طور پیش‌فرض، هر دوره آموزشی در فهرستی از run/tensorboard/stats ثبت می‌شود. برای مشاهده این مورد در Tensorboard، اجرا کنید

tensorboard --logdir ./run/tensorboard/stats

و TensorBoard باید یک سرور محلی راه اندازی کند که در آن بتوانید معیارهای آموزشی خود را مشاهده کنید. نتایج آموزش و اعتبار سنجی باید به طور جداگانه نشان داده شوند و هر اجرا دارای یک مهر زمانی منحصر به فرد است تا امکان مقایسه آسان بین چندین اجرا از یک مدل را فراهم کند.

طراحی Swift برای ادغام TensorFlow TensorBoard از tensorboardX الهام گرفته شده است. تماس‌های TensorBoard مستقیماً بافرهای پروتکل رویداد و خلاصه مناسب را ایجاد می‌کنند و آنها را در طول آموزش در یک فایل گزارش می‌نویسند.

تماس های سفارشی

علاوه بر تماس‌های داخلی که در بالا توضیح داده شد، می‌توانید عملکرد حلقه‌های آموزشی را با ایجاد تماس‌های خود سفارشی کنید. این فراخوان ها توابعی هستند که دارای امضایی مشابه موارد زیر هستند:

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

تابع تماس شما می‌تواند منطق خود را در هر ترکیبی از حالت‌های بالا فعال کند، که امکان استخراج داده‌ها یا کنترل حلقه آموزشی را به طرق مختلف فراهم می‌کند.