34-წუთიანი სამუშაო სესია იმაზე, თუ რა არის სინამდვილეში ნეირონული ქსელი, როგორ სწავლობს, რატომ ერგება ზედმეტად მონაცემებს, რომელი სამი არქიტექტურული ოჯახი ღირს ცოდნად და რომელ ინსტრუმენტებს მიმართავდით დღეს — გულახდილი შენიშვნებით იმაზე, როდის აჯობებს ჩვეულებრივი მანქანური სწავლება ღრმა ქსელს.
ეს დეკი გულისხმობს, რომ საფუძვლები უკვე იცით — მანქანური სწავლების საფუძვლები: ნიშნები, ლეიბლები, წვრთნა და ტესტი, ზედმეტი და არასაკმარისი მორგება. ღრმა სწავლება ML-ის ერთი შტოა: ის ბევრ მარტივ შრეს აწყობს ერთმანეთზე, რომ მოდელმა ნიშნები თავად აღმოაჩინოს ნედლ მონაცემებში, თქვენი ხელით შექმნის ნაცვლად.
კლასიკური ML ეყრდნობა ადამიანს, რომ ნიშნები შექმნას; ღრმა ქსელი კი საკუთარ ნიშნებს პირდაპირ ნედლი შესატანიდან სწავლობს.
გულახდილი ნაგულისხმევი: ჯერ მარტივი მოდელი სცადეთ. ღრმა ქსელი იშვიათად არის ყველაზე იაფი გზა მუშა საბაზისო შედეგამდე.
მთელი ეს ნაგებობა ერთი პატარა ოპერაციისგან შედგება, მილიონჯერ გამეორებულისგან: თითოეული შესატანი გაამრავლეთ წონაზე, შეკრიბეთ ისინი ბიასთან ერთად, შემდეგ კი შედეგი გაატარეთ არაწრფივ ფუნქციაში. დააწყვეთ ეს შრეებად და მიიღებთ ქსელს.
y = activation(w·x + b). წონები w ამბობს, რამდენად მნიშვნელოვანია თითოეული შესატანი, ბიასი b წანაცვლებს შედეგს, ხოლო აქტივაცია ამატებს არაწრფივობას, რომელიც დაწყობილ შრეებს მრუდების და არა მხოლოდ სწორი ხაზების სწავლის საშუალებას აძლევს.// one neuron, by hand function neuron(x: number[], w: number[], b: number) { let z = b for (let i = 0; i < x.length; i++) z += x[i] * w[i] // weighted sum return relu(z) // activation: max(0, z) } // a layer = many neurons; a network = stacked layers
შესატანები მრავლდება წონებზე, იკრიბება ბიასთან ერთად, შემდეგ კი აქტივაცია კუმშავს მათ — ეს ერთი ერთეული, გამეორებული, მთელი ქსელია.
პირდაპირი გავრცელების ქსელი: ერთი შრის ყოველი ერთეული კვებავს შემდეგი შრის ყოველ ერთეულს. თითოეულ კავშირს თავისი ნასწავლი წონა აქვს.
აქტივაციის გარეშე შრეების დაწყობა ერთ წრფივ ნაბიჯად იშლება — რაც არ უნდა ღრმა იყოს. სწორედ აქტივაცია აძლევს ქსელს მოხრის საშუალებას.
max(0, z). იაფია, სწრაფად იწვრთნება, სტანდარტული არჩევანი ფარული შრეებისთვის. ვარიანტები (LeakyReLU, GELU) კიდურა შემთხვევებს ასწორებს.
ნებისმიერ რიცხვს ასახავს (0, 1) შუალედში. გამოიყენება ერთი დიახ/არა პასუხისთვის. ბოლოებში იჯერება, ამიტომ ღრმად შიგნით მოერიდეთ.
sigmoid-ის ნულზე ცენტრირებული ბიძაშვილი. გავრცელებული იყო ძველ რეკურენტულ ქსელებში; პირდაპირი გავრცელების შრეებში ძირითადად ReLU-მ ჩაანაცვლა.
ქულების ვექტორს გარდაქმნის ალბათობათა განაწილებად, რომლის ჯამიც 1-ია — სტანდარტული ბოლო შრე მრავალკლასიანი კლასიფიკაციისთვის.
წვრთნა ციკლია. ქსელი აკეთებს პროგნოზს, დანაკარგის ფუნქცია აფასებს, რამდენად შეცდა, backpropagation ითვლის, რამდენად შეიტანა თითოეულმა წონამ წვლილი ამ შეცდომაში, გრადიენტული დაშვება კი ყოველ წონას ოდნავ ძრავს იმ მიმართულებით, სადაც შეცდომა მცირდება. ეს მეორდება მონაცემებზე მრავალი გავლის განმავლობაში.
ერთი საწვრთნელი ნაბიჯი: პროგნოზი, შეცდომის შეფასება, მისი უკან გავრცელება ყოველ წონამდე, შემდეგ განახლება. ციკლი ათასობითჯერ ტრიალებს.
ყოველი ნაბიჯი წონებს ცოტათი უფრო დაბლა აგორებს დანაკარგის მრუდზე. ძალიან დიდი სწავლის სიჩქარე გადააცილებს; ძალიან პატარა კი ძლივს მიცოცავს.
თითქოს ნისლში ხეობისკენ ეშვებით — ძირს ვერ ხედავთ, ამიტომ აგრძელებთ ნაბიჯებს იქით, სადაც დაღმართია.
მიზანი არის განზოგადება — კარგი შედეგი იმ მონაცემებზე, რომლებიც მოდელს არასდროს უნახავს. დიდ ქსელებს საწვრთნელი ნაკრების უბრალოდ დამახსოვრება შეუძლიათ, ამიტომ ღრმა სწავლების ოსტატობის დიდი ნაწილი სწორედ ის ხერხებია, რომლებიც ამას უშლის ხელს.
როცა სავალიდაციო დანაკარგი მაღლა იხრება, საწვრთნელი კი ისევ ეცემა, მოდელმა დამახსოვრება დაიწყო. გაჩერდით წყვეტილ ხაზზე.
ნაბიჯის ზომა თითოეული განახლებისთვის. ძალიან მაღალი — წვრთნა იშლება ან რხევაში გადადის; ძალიან დაბალი — თითქმის არ იძვრის. ჩვეულებრივ ეხმარება გრაფიკი, რომელიც მას დროთა განმავლობაში ამცირებს. ჯერ ეს დაარეგულირეთ.
დიდი პარტიები ერთ ეპოქას უფრო სწრაფად წვრთნის და გრადიენტებს გლუვს ხდის; პატარები სასარგებლო ხმაურს ამატებს და ნაკლებ მეხსიერებას ხარჯავს. ეს სწავლის სიჩქარესთან ურთიერთქმედებს — ერთად ცვალეთ.
ერთეულების წილი, რომელიც ყოველ ნაბიჯზე ითიშება, ხშირად 0.1–0.5. მაღალი უფრო ძლიერ ებრძვის ზედმეტ მორგებას, მაგრამ არასაკმარის მორგებამდეც შეიძლება მიგიყვანოთ. ინფერენსზე გამორთულია — პროგნოზისთვის სრული ქსელი გამოიყენება.
ეს არის ჰიპერპარამეტრები — პარამეტრები, რომლებსაც თქვენ ირჩევთ და არა მოდელი სწავლობს. მათი კარგად მოძებნა ყოველდღიური სამუშაოს დიდი ნაწილია.
ჩვეულებრივი პირდაპირი გავრცელების ქსელი ყოველ შესატანს დამოუკიდებლად ეპყრობა. რეალურ მონაცემებს სტრუქტურა აქვს — ახლომდებარე პიქსელები ერთმანეთს უკავშირდება, სიტყვები რიგზე მოდის — და ეს სამი ოჯახი ამ სტრუქტურას თავად ქსელში ჩაშენებს.
კონვოლუცია პატარა ფილტრს (kernel) ასრიალებს სურათზე და ერთსა და იმავე ლოკალურ ნიმუშს — კიდეს, ტექსტურას — იქ პოულობს, სადაც კი გამოჩნდება. შემდეგ pooling ამცირებს რუკას და კიდეებიდან ფორმებამდე, ფორმებიდან კი ობიექტებამდე აწყობს. ორი დიდი მოგება: ბევრად ნაკლები წონა, ვიდრე მკვრივ შრეს, და გადაადგილების ინვარიანტობა (კატა კატაა, სადაც არ უნდა იჯდეს).
ფილტრი ეძებს ლოკალურ ნიმუშებს; pooling კუმშავს; შრეები კიდეებს ობიექტებად აწყობს.
RNN მიმდევრობას ნაბიჯ-ნაბიჯ კითხულობს და ნაბიჯიდან ნაბიჯზე გადააქვს ფარული მდგომარეობა — მიმდინარე მეხსიერება. ჩვეულებრივ RNN-ებს გრძელი კონტექსტი ავიწყდებათ (ქრებადი გრადიენტის პრობლემა), ამიტომ LSTM და GRU ამატებს კარიბჭეებს, რომლებიც წყვეტს, რა შეინახონ და რა გადააგდონ, და ინფორმაციას უფრო ხანგრძლივად იჭერს.
ერთი და იგივე უჯრედი მუშაობს ყოველ ნაბიჯზე და ფარულ მდგომარეობას წინ გადასცემს, როგორც მეხსიერებას იმისა, რაც უკვე იყო.
მიმდევრობაზე ნაბიჯ-ნაბიჯ სიარულის ნაცვლად ტრანსფორმერი იყენებს თვით-ყურადღებას: ყოველი ტოკენი ერთბაშად უყურებს ყველა სხვა ტოკენს და წონის, რომელი რამდენად მნიშვნელოვანია მისი აზრისთვის. რეკურენცია რომ არ არის, მთელი მიმდევრობა პარალელურად იწვრთნება — სწორედ ამან გახადა ინტერნეტის მასშტაბის მონაცემებზე წვრთნა პრაქტიკული.
ყოველი ტოკენი (აქ "კატა") წონის ყველა სხვა ტოკენს, რომ თავისი კონტექსტი ააგოს — ყველაფერი პარალელურად.
ამათ ნულიდან იშვიათად ააგებთ. აირჩიეთ ოჯახი, რომელიც თქვენს მონაცემებს ერგება, და დაიწყეთ წინასწარ ნაწვრთნი მოდელიდან — შემდეგი სექცია.
მათემატიკა ერთია, მოდელის გაწვრთნა და გაშვება კი სულ სხვა. სამი რეალობა აყალიბებს ყოველ პროექტს — და ერთი მალსახმობი ღრმა სწავლებას ჩვეულებრივი გუნდებისთვის პრაქტიკულს ხდის.
წვრთნა ძირითადად დიდი მატრიცების გამრავლებაა და GPU ათასობით ასეთს პარალელურად ასრულებს — CPU-ზე რიგებით სწრაფად. Google-ის TPU სპეციალურად ამისთვის შექმნილი ალტერნატივაა. შერეული სიზუსტე (დაბალი სიზუსტის მათემატიკა) აჩქარებს პროცესს და მეხსიერებას ზოგავს.
ღრმა ქსელებს ბევრი ლეიბლიანი მაგალითი სჭირდება და ხარისხი უფრო მნიშვნელოვანია, ვიდრე ჭკვიანური ხრიკები. რეალური პროექტების უმეტესობა მეტ ძალისხმევას ხარჯავს მონაცემების შეგროვებაზე, გაწმენდასა და ლეიბლირებაზე, ვიდრე თავად მოდელზე. ნაგავი შედის — ნაგავი გამოდის.
დაიწყეთ მოდელიდან, რომელიც უკვე გაწვრთნილია უზარმაზარ მონაცემებზე, შემდეგ კი მოარგეთ იგი თქვენს ამოცანას მონაცემებისა და გამოთვლის მცირე ნაწილით. ეს ნაგულისხმევი ვორქფლოუა — ნულიდან წვრთნა გამონაკლისია.
შეინარჩუნეთ წინასწარ ნაწვრთნი ხერხემალი, მიაბით ამოცანაზე მორგებული პატარა თავი და მხოლოდ ის გაწვრთენით (ან დანარჩენს მსუბუქი ფაინთიუნინგი გაუკეთეთ).
თქვენ აღწერთ ქსელს, ფრეიმვორკი კი გრადიენტებს ავტომატურად ითვლის (autodiff) და GPU-ზე უშვებს. განსხვავებები ერგონომიკაზე, დეპლოიმენტსა და მასშტაბზეა.
Python-ური, ნაგულისხმევად eager (ჩვეულებრივი კოდივით ამართავთ) და დომინანტი არჩევანი კვლევაში, მოდელების უდიდესი ეკოსისტემით. torch.compile ძველ სიჩქარის სხვაობას დიდწილად ავსებს.
Keras მაღალი დონის API-ია, რომელსაც ნებისმიერი წაიკითხავს; Keras 3 PyTorch-ისა და JAX-ის ბექენდებზეც კი მუშაობს. TensorFlow მოაქვს მომწიფებული მომსახურება (TF Serving) და მოწყობილობაზე დეპლოიმენტი (LiteRT, ადრე TF Lite).
ფუნქციური, NumPy-ს მსგავსი ბირთვი კომპოზიციური გარდაქმნებით — grad, jit, vmap — რომლებიც XLA-თი კომპილირდება. წყვილდება ბიბლიოთეკებთან, როგორიცაა Flax და Optax; ფავორიტი დიდმასშტაბიანი წვრთნისთვის, განსაკუთრებით TPU-ებზე.
ნაგულისხმევად ნულიდან ნუ წვრთნით. Hugging Face Hub-ის წინასწარ ნაწვრთნი მოდელებისა და ჰოსტირებული API-ების პირობებში ამოცანას ხშირად საკუთარი საწვრთნელი პაიპლაინის გარეშეც გადაჭრით. საკუთარი მოდელი მაშინ ააგეთ, როცა მზა გადაწყვეტა ნამდვილად ვერ ართმევს თავს.
ხუთი სწრაფი შეკითხვა ნეირონებზე, წვრთნაზე, ზედმეტ მორგებაზე, არქიტექტურებსა და ინსტრუმენტებზე — მყისიერი უკუკავშირი, ავტორიზაციის გარეშე.
ნავიგაცია ← → ღილაკებით ან სქროლით · უკან ბიბლიოთეკაში