প্রশিক্ষণ লুপ

একটি মেশিন লার্নিং মডেলকে প্রশিক্ষণ দেওয়ার সময়, এটি একটি লুপ থাকা সাধারণ ব্যাপার যেখানে প্রশিক্ষণের ডেটা ইনজেস্ট করা হয় (বা জেনারেট করা হয়), ব্যাচগুলি একটি মডেলের মাধ্যমে চলে, গ্রেডিয়েন্ট প্রাপ্ত হয় এবং মডেলটি একটি অপ্টিমাইজারের মাধ্যমে আপডেট হয়। যখন আপনি প্রতিটি প্রশিক্ষণ অ্যাপ্লিকেশনের জন্য নিজের একটি প্রশিক্ষণ লুপ লিখতে পারেন, তখন সুইফট ফর টেনসরফ্লো একটি পরীক্ষামূলক প্রশিক্ষণ লুপ বিমূর্ততা প্রদান করে যা এই প্রক্রিয়াটিকে সহজ করতে পারে।

মডেল সংগ্রহস্থলের মধ্যে TrainingLoop মডিউলটিতে এই পরীক্ষামূলক সাধারণ প্রশিক্ষণ লুপের বর্তমান সংস্করণ রয়েছে। এটি এমনভাবে গঠন করা হয়েছে যাতে ডেটাসেট র‍্যাপারগুলির সাথে একীভূত করা যায় যা সহজে ডেটা ইনজেশনের জন্য Epochs API-এর সাথে সামঞ্জস্যপূর্ণ হয় এবং সর্বোত্তম কর্মক্ষমতা অর্জনের জন্য অ্যাক্সিলারেটর ব্যাকএন্ডের সাথে মডেল, ডেটাসেট এবং অপ্টিমাইজারগুলির মিথস্ক্রিয়া স্বয়ংক্রিয় করে। প্রশিক্ষণ প্রক্রিয়ার ভারী কাস্টমাইজেশন কলব্যাক ব্যবহারের মাধ্যমে অর্জন করা যেতে পারে।

মডেল সংগ্রহস্থলের বেশিরভাগ চিত্র-ভিত্তিক উদাহরণ এই প্রশিক্ষণ লুপ বিমূর্ততা, সেইসাথে তত্ত্বাবধান করা পাঠ্য মডেল প্রশিক্ষণ উদাহরণগুলি ব্যবহার করতে রূপান্তরিত হয়েছে। যাইহোক, ট্রেনিং লুপ সব মেশিন লার্নিং মডেলের জন্য বর্তমান ডিজাইনে উপযুক্ত নাও হতে পারে।

টেনসরফ্লো-এর সাধারণ প্রশিক্ষণ লুপের জন্য সুইফটের বাস্তবায়ন ফাস্টাইয়ের লার্নার দ্বারা ব্যাপকভাবে প্রভাবিত। তাদের ডিজাইন সম্পর্কে আরও জানতে, অনুগ্রহ করে দেখুন "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])

প্রশিক্ষণ লুপ অনুমান করে যে আপনি যে ডেটাসেটটি ব্যবহার করছেন তা Epochs API-এর সাথে সঙ্গতিপূর্ণ, এবং আপনাকে প্রশিক্ষণ এবং বৈধতার জন্য ডেটাসেটের মধ্যে কোন বিভক্তগুলি ব্যবহার করতে হবে তা নির্দিষ্ট করার অনুমতি দেয়। যেকোন লস ফাংশন একবার একটি সামঞ্জস্যপূর্ণ র‍্যাপারে স্থাপন করা হলে ব্যবহার করা যেতে পারে, যেমন softmaxCrossEntropy এখানে রয়েছে।

বর্তমান মেট্রিক্স যা ক্যাপচার করা যেতে পারে তার মধ্যে রয়েছে:

  • loss
  • accuracy
  • top5Accuracy
  • matthewsCorrelationCoefficient
  • perplexity

অবশেষে, প্রশিক্ষণ সঞ্চালন করতে, আপনি নিম্নলিখিত কল করুন:

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

এটি আমাদের নির্দিষ্ট করা অ্যাক্সিলারেটর ব্যাকএন্ড ব্যবহার করে 10টি যুগের জন্য মডেলটিকে প্রশিক্ষণ দেবে। একটি অ্যানিমেটেড প্রম্পট ব্যবহার করে কনসোলে প্রশিক্ষণের সময় পরিসংখ্যান প্রদর্শন করা হবে।

কলব্যাক

এই সাধারণ প্রশিক্ষণ লুপের কাস্টমাইজেশন কলব্যাক ব্যবহারের মাধ্যমে ঘটে। এই কলব্যাকগুলি লুপের মধ্যে বিভিন্ন পয়েন্টে আটকানো যেতে পারে।

বেশ কিছু অন্তর্নির্মিত কলব্যাক কার্যকারিতা প্রদান করে যা যেকোনো প্রশিক্ষণ লুপে যোগ করা যেতে পারে। এর মধ্যে রয়েছে:

  • কমা-বিভাজিত-মান (CSV) ফাইলগুলিতে পরিসংখ্যান লগ করা হচ্ছে
  • একটি কাস্টম সময়সূচী অনুযায়ী শেখার হার সামঞ্জস্য করা
  • টেনসরবোর্ডের মাধ্যমে প্রশিক্ষণের অগ্রগতি পর্যবেক্ষণ এবং গ্রাফিং

এগুলি ছাড়াও, আপনি একটি স্ট্যান্ডার্ড প্রশিক্ষণ লুপে অতিরিক্ত কার্যকারিতার একটি পরিসর যোগ করতে আপনার নিজস্ব কাস্টম কলব্যাক তৈরি করতে পারেন।

CSV লগিং

CSVLogger ক্লাস একটি কলব্যাককে এনক্যাপসুলেট করে যা আপনার পছন্দের ফাইলে একটি কমা-বিভক্ত-মান বিন্যাসে প্রশিক্ষণের পরিসংখ্যান লিখবে। এই ফাইলটি epoch , batch লেবেলযুক্ত কলামগুলি দিয়ে শুরু হবে এবং আপনার প্রশিক্ষণ লুপের মধ্যে আপনি যে মেট্রিকগুলি সক্ষম করেছেন তা দিয়ে শুরু হবে৷ সেই কলামগুলির বর্তমান মান সহ প্রতিটি ব্যাচের জন্য একটি সারি লেখা হবে।

আপনার প্রশিক্ষণ লুপে CSV লগিং যোগ করতে, callbacks: আপনার TrainingLoop এর জন্য প্যারামিটার:

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

একটি উদাহরণ হিসাবে, LeNet-MNIST নমুনা তার প্রশিক্ষণ লুপের মধ্যে এটি ব্যবহার করে।

শেখার হার সময়সূচী

প্রশিক্ষণ প্রক্রিয়া চলাকালীন একটি অপ্টিমাইজারকে দেওয়া শেখার হার পরিবর্তন করার জন্য একটি মডেলকে প্রশিক্ষণ দেওয়ার সময় এটি সাধারণ। এটি সময়ের সাথে একটি রৈখিক হ্রাসের মতো সহজ বা জটিল ফাংশন দ্বারা বর্ণিত ওয়ার্মআপ এবং হ্রাস চক্রের মতো জটিল হতে পারে।

learningRateScheduler কলব্যাক বিভিন্ন সেগমেন্টের সমন্বয়ে গঠিত শেখার হারের সময়সূচী বর্ণনা করার উপায় প্রদান করে, প্রতিটির নিজস্ব স্বতন্ত্র আকৃতি রয়েছে। ScheduleSegment সমন্বয়ে গঠিত একটি LearningRateSchedule সংজ্ঞায়িত করার মাধ্যমে এটি সম্পন্ন করা হয় যার প্রতিটির একটি Shape , একটি প্রাথমিক শেখার হার এবং একটি চূড়ান্ত শেখার হার দ্বারা সংজ্ঞায়িত একটি আকার থাকে।

উদাহরণস্বরূপ, BERT-CoLA নমুনা ওয়ার্মআপ সময়কালে শেখার হারে একটি রৈখিক বৃদ্ধি এবং তার পরে একটি রৈখিক হ্রাস ব্যবহার করে। এটি করার জন্য, শেখার হার শিডিউল কলব্যাক নিম্নরূপ সংজ্ঞায়িত করা হয়েছে:

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

দুটি ScheduleSegment একটি শেখার হারকে সংজ্ঞায়িত করে যা 0 থেকে শুরু হয় এবং 10টি বিচ্ছিন্ন ধাপের একটি সিরিজে রৈখিকভাবে peakLearningRate এ বৃদ্ধি পায়, তারপরে পূর্ববর্তী ধাপ থেকে চূড়ান্ত শেখার হারে শুরু হয় এবং প্রশিক্ষণ প্রক্রিয়ার শেষে রৈখিকভাবে 0-এ কমে যায়।

টেনসরবোর্ড ইন্টিগ্রেশন

TensorBoard হল একটি শক্তিশালী ভিজ্যুয়ালাইজেশন টুল যা মডেল ট্রেনিং নিরীক্ষণ করা, প্রশিক্ষণ শেষ হলে বিশ্লেষণ করা বা ট্রেনিং রানের তুলনা করা। সুইফ্ট ফর টেনসরফ্লো মডেল রিপোজিটরিতে TensorBoard মডিউল ব্যবহারের মাধ্যমে টেনসরবোর্ড ভিজ্যুয়ালাইজেশন সমর্থন করে, যা কলব্যাক প্রদান করে যা প্রশিক্ষণ মেট্রিক্স লগ করে।

GPT2-WikiText2 নমুনা আপনার মডেল প্রশিক্ষণে TensorBoard লগিং কিভাবে যোগ করতে হয় তা ব্যাখ্যা করে। প্রথমে, TensorBoard মডিউল আমদানি করুন। তারপর এটি আপনার TrainingLoop এর callbacks: অ্যারেতে tensorBoardStatisticsLogger() যোগ করার মতোই সহজ।

ডিফল্টরূপে, এটি run/tensorboard/stats ডিরেক্টরির মধ্যে চালানো প্রতিটি প্রশিক্ষণ লগ করবে। টেনসরবোর্ডের মধ্যে এটি দেখতে, চালান

tensorboard --logdir ./run/tensorboard/stats

এবং TensorBoard একটি স্থানীয় সার্ভার শুরু করা উচিত যেখানে আপনি আপনার প্রশিক্ষণ মেট্রিক্স দেখতে পারেন। প্রশিক্ষণ এবং যাচাইকরণের ফলাফলগুলি আলাদাভাবে দেখানো উচিত এবং একই মডেলের একাধিক রানের মধ্যে সহজ তুলনা করার জন্য প্রতিটি রানের একটি অনন্য টাইমস্ট্যাম্প রয়েছে।

টেনসরফ্লো টেনসরবোর্ড ইন্টিগ্রেশনের জন্য সুইফটের ডিজাইনটি টেনসরবোর্ডএক্স দ্বারা অনুপ্রাণিত হয়েছিল। 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

আপনার কলব্যাক ফাংশন উপরের অবস্থার যেকোন সংমিশ্রণে এর যুক্তি সক্রিয় করতে বেছে নিতে পারে, যা বিভিন্ন উপায়ে প্রশিক্ষণ লুপ থেকে ডেটা বের করতে বা অন্যথায় নিয়ন্ত্রণ করতে দেয়।