प्रशिक्षण पाश

मशीन लर्निंग मॉडल को प्रशिक्षित करते समय, एक लूप होना आम बात है जहां प्रशिक्षण डेटा अंतर्ग्रहण (या उत्पन्न) होता है, बैच एक मॉडल के माध्यम से चलते हैं, ग्रेडिएंट प्राप्त होते हैं, और मॉडल को एक ऑप्टिमाइज़र के माध्यम से अपडेट किया जाता है। जबकि आप प्रत्येक प्रशिक्षण एप्लिकेशन के लिए अपना स्वयं का एक प्रशिक्षण लूप लिख सकते हैं, TensorFlow के लिए स्विफ्ट एक प्रयोगात्मक प्रशिक्षण लूप एब्स्ट्रैक्शन प्रदान करता है जो इस प्रक्रिया को सरल बना सकता है।

मॉडल रिपॉजिटरी के TrainingLoop मॉड्यूल में इस प्रयोगात्मक सामान्यीकृत प्रशिक्षण लूप का वर्तमान संस्करण शामिल है। इसे इस तरह से संरचित किया गया है कि डेटासेट रैपर के साथ एकीकृत किया जा सके जो आसान डेटा अंतर्ग्रहण के लिए एपोच एपीआई के अनुरूप है, और इष्टतम प्रदर्शन प्राप्त करने के लिए एक्सेलेरेटर बैकएंड के साथ मॉडल, डेटासेट और ऑप्टिमाइज़र की बातचीत को स्वचालित करता है। कॉलबैक के उपयोग के माध्यम से प्रशिक्षण प्रक्रिया का व्यापक अनुकूलन प्राप्त किया जा सकता है।

मॉडल रिपॉजिटरी में अधिकांश छवि-आधारित उदाहरणों को इस प्रशिक्षण लूप एब्स्ट्रैक्शन के साथ-साथ पर्यवेक्षित टेक्स्ट मॉडल प्रशिक्षण उदाहरणों का उपयोग करने के लिए परिवर्तित किया गया है। हालाँकि, प्रशिक्षण लूप सभी मशीन लर्निंग मॉडल के लिए अपने वर्तमान डिज़ाइन में उपयुक्त नहीं हो सकता है।

टेन्सरफ्लो के सामान्यीकृत प्रशिक्षण लूप के लिए स्विफ्ट का कार्यान्वयन फास्टाई के लर्नर से काफी प्रभावित है। उनके डिज़ाइन के बारे में अधिक जानकारी के लिए, कृपया "फास्टाई: डीप लर्निंग के लिए एक स्तरित एपीआई" और सिल्वेन गुग्गर की प्रस्तुति "फास्ट.एआई - एक असीम रूप से अनुकूलन योग्य प्रशिक्षण लूप" देखें।

प्रयोग

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])

प्रशिक्षण लूप मानता है कि आप जिस डेटासेट का उपयोग कर रहे हैं वह एपोच एपीआई के अनुरूप है, और आपको यह निर्दिष्ट करने की अनुमति देता है कि प्रशिक्षण और सत्यापन के लिए उपयोग करने के लिए डेटासेट के भीतर कौन सा विभाजन होता है। किसी भी हानि फ़ंक्शन का उपयोग एक बार संगत रैपर में रखने पर किया जा सकता है, जैसे कि softmaxCrossEntropy यहाँ है।

वर्तमान मेट्रिक्स जिन्हें कैप्चर किया जा सकता है उनमें शामिल हैं:

  • loss
  • accuracy
  • top5Accuracy
  • matthewsCorrelationCoefficient
  • perplexity

अंत में, प्रशिक्षण करने के लिए, आप निम्नलिखित को कॉल करें:

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

यह हमारे द्वारा निर्दिष्ट त्वरक बैकएंड का उपयोग करके मॉडल को 10 युगों के लिए प्रशिक्षित करेगा। प्रशिक्षण के दौरान एक एनिमेटेड प्रॉम्प्ट का उपयोग करके कंसोल पर आँकड़े प्रदर्शित किए जाएंगे।

कॉलबैक

इस सामान्यीकृत प्रशिक्षण लूप का अनुकूलन कॉलबैक के उपयोग के माध्यम से होता है। इन कॉलबैक को लूप के भीतर विभिन्न बिंदुओं से जोड़ा जा सकता है।

कई अंतर्निहित कॉलबैक कार्यक्षमता प्रदान करते हैं जिन्हें किसी भी प्रशिक्षण लूप में जोड़ा जा सकता है। इसमे शामिल है:

  • अल्पविराम से अलग किए गए मान (CSV) फ़ाइलों में आँकड़े लॉग करना
  • एक कस्टम शेड्यूल के अनुसार सीखने की दर को समायोजित करना
  • TensorBoard के माध्यम से प्रशिक्षण प्रगति की निगरानी और रेखांकन

इनके अलावा, आप मानक प्रशिक्षण लूप में अतिरिक्त कार्यक्षमता की एक श्रृंखला जोड़ने के लिए अपने स्वयं के कस्टम कॉलबैक बना सकते हैं।

सीएसवी लॉगिंग

CSVLogger वर्ग एक कॉलबैक को समाहित करता है जो आपके द्वारा चुनी गई फ़ाइल में अल्पविराम से अलग किए गए मान प्रारूप में प्रशिक्षण आँकड़े लिखेगा। यह फ़ाइल epoch , batch और आपके द्वारा अपने प्रशिक्षण लूप में सक्षम किए गए किसी भी मेट्रिक्स लेबल वाले कॉलम से शुरू होगी। फिर प्रत्येक बैच के लिए उन कॉलमों के वर्तमान मानों के साथ एक पंक्ति लिखी जाएगी।

अपने प्रशिक्षण लूप में सीएसवी लॉगिंग जोड़ने के लिए, कॉलबैक को प्रदान की गई कॉलबैक की सरणी में निम्न जैसा कुछ जोड़ें 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 हो जाती है।

टेंसरबोर्ड एकीकरण

टेन्सरबोर्ड मॉडल प्रशिक्षण की निगरानी करने, पूरा होने पर प्रशिक्षण का विश्लेषण करने या प्रशिक्षण रन की तुलना करने के लिए एक शक्तिशाली विज़ुअलाइज़ेशन टूल है। TensorFlow के लिए स्विफ्ट मॉडल रिपॉजिटरी में TensorBoard मॉड्यूल के उपयोग के माध्यम से TensorBoard विज़ुअलाइज़ेशन का समर्थन करता है, जो प्रशिक्षण मेट्रिक्स को लॉग करने वाले कॉलबैक प्रदान करता है।

GPT2-WikiText2 नमूना बताता है कि अपने मॉडल प्रशिक्षण में TensorBoard लॉगिंग कैसे जोड़ें। सबसे पहले, TensorBoard मॉड्यूल आयात करें। फिर यह आपके TrainingLoop के callbacks: ऐरे में tensorBoardStatisticsLogger() जोड़ने जितना आसान है।

डिफ़ॉल्ट रूप से, वह प्रत्येक प्रशिक्षण रन को run/tensorboard/stats निर्देशिका में लॉग करेगा। इसे टेंसरबोर्ड में देखने के लिए चलाएँ

tensorboard --logdir ./run/tensorboard/stats

और TensorBoard को एक स्थानीय सर्वर शुरू करना चाहिए जहां आप अपने प्रशिक्षण मेट्रिक्स देख सकते हैं। प्रशिक्षण और सत्यापन परिणाम अलग-अलग दिखाए जाने चाहिए, और एक ही मॉडल के कई रनों के बीच आसान तुलना की अनुमति देने के लिए प्रत्येक रन में एक अद्वितीय टाइमस्टैम्प होता है।

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

आपका कॉलबैक फ़ंक्शन उपरोक्त राज्यों के किसी भी संयोजन पर अपने तर्क को सक्रिय करना चुन सकता है, जो कई तरीकों से प्रशिक्षण लूप से डेटा निकालने या नियंत्रित करने की अनुमति देता है।