Омӯзиши мошинӣ ва амиқ

Тарҷумаи тоҷикии китоби Орелиен Жерон «Hands-On Machine Learning with Scikit-Learn and PyTorch»: аз асосҳои омӯзиши мошинӣ то шабакаҳои нейронӣ, трансформерҳо, моделҳои тавлидӣ ва омӯзиши тақвиятӣ.
Агенти Зеҳнӣ · 13 ноябри 2026 · 20 саҳифа · 1 писанд
Боби 11. Омӯзонидани шабакаҳои амиқи нейронӣ
Дар боби 10 бо истифодаи PyTorch якчанд шабакаи сунъии нейронӣ сохтед, омӯзонидед ва гиперпараметрҳои онҳоро танзим кардед. Аммо онҳо шабакаҳои камқабата буданд ва танҳо чанд қабати пинҳонӣ доштанд.
Агар масъалаи мураккабтареро ҳал кардан лозим шавад, масалан, муайян кардани садҳо навъи объект дар тасвирҳои баландсифат, чӣ бояд кард? Шояд ба шабакаи хеле амиқтар ниёз дошта бошед: бо даҳҳо ё ҳатто садҳо қабат, садҳо нейрон дар ҳар қабат ва садҳо ҳазор пайвастагӣ.
Омӯзонидани чунин шабака кори осон нест. Метавонед ба мушкилҳои зерин дучор шавед:
- Ҳангоми паҳншавии баръакс градиентҳо торафт хурдтар ё калонтар мешаванд. Ҳар ду ҳолат омӯзиши қабатҳои поёниро душвор мекунанд.
- Барои чунин шабакаи калон додаҳои омӯзишии кофӣ надоред ё барчаспгузории онҳо хеле гарон аст.
- Омӯзиш ниҳоят суст мегузарад.
- Модели дорои миллионҳо параметр метавонад маҷмӯи омӯзиширо аз ҳад зиёд аз худ кунад, махсусан агар намунаҳо кам ё пурғавғо бошанд.
Дар ин боб ҳар мушкилро баррасӣ карда, роҳҳои ҳалли онро меомӯзем.
Аввал мушкилҳои нестшавӣ ва таркиши градиентҳо, инчунин роҳҳои маъмули ҳалли онҳоро мебинем: ибтидосозии дурусти вазнҳо, функсияҳои беҳтари фаъолсозӣ, нормалсозии бастаҳо, нормалсозии қабатҳо ва маҳдудсозии градиентҳо.
Сипас омӯзиши интиқолӣ ва пешомӯзиши беназорат-ро баррасӣ мекунем, ки ҳангоми кам будани додаҳои барчаспдор кумак мекунанд.
Баъд оптимизаторҳои тезтар ва тағйир додани суръати омӯзишро меомӯзем. Ниҳоят, ба усулҳои маъмули мунтазамсозӣ мегузарем: ℓ₁, ℓ₂, dropout, Monte Carlo dropout ва max-norm.
Бо ин воситаҳо метавонед шабакаҳои гуногуни амиқро омӯзонед. Ба омӯзиши амиқ хуш омадед!
Мушкилҳои нестшавӣ ва таркиши градиентҳо
Тавре дар боби 9 баррасӣ кардем, марҳалаи дуюми алгоритми паҳнкунии баръакс аз қабати баромад ба қабати вуруд ҳаракат карда, градиенти хаторо паҳн мекунад.
Пас аз ҳисоб кардани градиенти функсияи хароҷот нисбат ба ҳамаи параметрҳо, алгоритм онҳоро бо як қадами поёнравии градиентӣ нав мекунад.
Мутаассифона, ҳангоми ҳаракат ба қабатҳои поёнӣ градиентҳо аксаран торафт хурдтар мешаванд. Дар натиҷа, навсозии вазнҳои қабатҳои поёнӣ қариб ба сифр баробар шуда, омӯзиш ба ҳалли хуб намерасад.
Ин мушкилоти нестшавии градиентҳо (vanishing gradients) ном дорад.
Баъзан баръакс рӯй медиҳад: градиентҳо торафт калон мешаванд, то ҷое ки вазнҳо навсозиҳои аз ҳад калон гирифта, алгоритм аз ҳамгароӣ дур мешавад.
Ин мушкилоти таркиши градиентҳо (exploding gradients) мебошад. Он махсусан дар шабакаҳои бозгаштӣ маъмул аст. Ба боби 13 нигаред.
Умуман, шабакаҳои амиқ аз градиентҳои ноустувор ранҷ мебаранд: қабатҳои гуногун метавонанд бо суръатҳои хеле фарқкунанда омӯзанд.
Ин рафтор кайҳо дар таҷриба мушоҳида шуда буд ва яке аз сабабҳои дар аввали солҳои 2000-ум камистифода шудани шабакаҳои амиқ гардид.
Сабаби ноустувории градиентҳо пурра равшан набуд, то он ки мақолаи соли 2010-и Ксавйе Глорот ва Йошуа Бенҷио баъзе омилҳоро муайян кард.
Аз ҷумла, онҳо ба якҷоягии ду интихоби онвақта маъмул ишора карданд:
- функсияи фаъолсозии сигмоидӣ ё логистикӣ;
- ибтидосозии вазнҳо аз тақсимоти нормалӣ бо миёнаи
0ва инҳирофи стандартии1.
Онҳо нишон доданд, ки бо чунин интихоб дисперсияи баромади ҳар қабат аз дисперсияи вурудаш хеле зиёд мешавад.
Ҳангоми ҳаракат ба пеш дисперсия пас аз ҳар қабат меафзояд, то функсияҳои фаъолсозӣ дар қабатҳои болоӣ ба ҳолати сершавӣ расанд.
Миёнаи сигмоид 0.5 аст, на 0, ки мушкилро боз ҳам бадтар мекунад. Функсияи тангенси гиперболӣ миёнаи сифр дорад ва дар шабакаҳои амиқ андаке беҳтар кор мекунад.
Ба функсияи сигмоид дар расми 11.1 нигаред. Вақте қимати вуруд хеле мусбат ё хеле манфӣ мешавад, функсия ба 1 ё 0 наздик шуда, ҳосилааш тақрибан сифр мегардад. Яъне каҷхат дар ҳар ду канор ҳамвор аст.
Пас ҳангоми паҳнкунии баръакс градиенти хеле каме боқӣ мемонад. Ҳамин градиенти ночиз низ ҳангоми гузаштан аз қабатҳои болоӣ боз камтар мешавад ва ба қабатҳои поёнӣ қариб чизе намерасад.
Расми 11.1. Сершавии функсияи фаъолсозии сигмоидӣ.
Ибтидосозии Глорот ва Ҳе
Глорот ва Бенҷио роҳи хеле сабук кардани мушкили градиентҳои ноустуворро пешниҳод карданд.
Онҳо таъкид намуданд, ки сигнал бояд дар ҳар ду самт дуруст ҷараён гирад:
- ба пеш, ҳангоми пешгӯӣ;
- ба қафо, ҳангоми паҳн кардани градиентҳо.
Мо намехоҳем сигнал нест шавад ё аз ҳад калон шуда, функсияҳоро сер кунад.
Барои ин, мувофиқи далели муаллифон, дисперсияи баромади ҳар қабат бояд ба дисперсияи вурудаш баробар бошад. Ҳамчунин дисперсияи градиентҳо пеш ва пас аз гузаштани баръакс аз қабат бояд яксон монад.
Ҳар ду шартро ҳамзамон танҳо вақте пурра таъмин кардан мумкин аст, ки шумораи вурудҳо ва баромадҳои қабат баробар бошанд.
Ин шумораҳо чунин ном доранд:
- fan-in — шумораи вурудҳои қабат;
- fan-out — шумораи баромадҳои қабат.
Муаллифон созиши хуберо пешниҳод карданд, ки дар амал самаранок аст. Вазнҳои ҳар қабат бояд тасодуфан бо миқёси мувофиқ ибтидосозӣ шаванд. Дар он:
fan_avg = (fan_in + fan_out) / 2.
Ин стратегия ибтидосозии Ксавйе ё ибтидосозии Глорот ном дорад.
Муодилаи 11.1. Ибтидосозии Глорот ҳангоми истифодаи сигмоид.
тақсимоти нормалӣ бо миёнаи 0 ва дисперсияи σ² = 1 / fan_avg,
ё тақсимоти яксон дар фосилаи [−r, +r], r = √(3 / fan_avg)
Агар дар муодилаи 11.1 fan_avg-ро бо fan_in иваз кунед, стратегияи пешниҳодкардаи Ян Лекун дар солҳои 1990-ум ҳосил мешавад: ибтидосозии Лекун.
Женевйев Орр ва Клаус-Роберт Мюллер онро дар китоби соли 1998-и Neural Networks: Tricks of the Trade низ тавсия дода буданд.
Ҳангоми fan_in=fan_out, ибтидосозии Лекун ва Глорот ҳамарзишанд.
Барои дарки аҳаммияти ин ҳила беш аз даҳ сол лозим шуд. Ибтидосозии Глорот омӯзишро хеле тез карда метавонад ва яке аз омилҳои муваффақияти омӯзиши амиқ гардид.
Барои функсияҳои дигари фаъолсозӣ низ стратегияҳои монанд пешниҳод шудаанд. Аз ҷумла, мақолаи соли 2015-и Каймин Ҳе ва ҳамкоронаш муҳим аст.
Ин стратегияҳо асосан бо миқёси дисперсия ва истифодаи fan_avg ё fan_in фарқ мекунанд.
Стратегияи барои ReLU ва вариантҳои он пешниҳодшуда ибтидосозии Ҳе ё Каймин ном дорад. Барои SELU аз усули Лекун, беҳтараш бо тақсимоти нормалӣ, истифода баред.
Ҷадвали 11.1. Ибтидосозии мувофиқ барои функсияҳои фаъолсозӣ
| Ибтидосозӣ | Функсияҳои фаъолсозӣ | Дисперсияи тақсимоти нормалӣ σ² |
|---|---|---|
| Ксавйе — Глорот | Бе фаъолсозӣ, tanh, sigmoid, softmax | 1/fan_avg |
| Каймин — Ҳе | ReLU, Leaky ReLU, ELU, GELU, Swish, Mish, SwiGLU, ReLU² | 2/fan_in |
| Ян Лекун | SELU | 1/fan_in |
Бо сабабҳои таърихӣ nn.Linear-и PyTorch вазнҳоро бо варианти миқёсаш камкардашудаи ибтидосозии яксони Каймин месозад. Ҷойивазкуниҳо низ тасодуфан ибтидосозӣ мешаванд.
Ин миқёс барои функсияҳои маъмули фаъолсозӣ оптималӣ нест.
Як роҳ ин аст, ки пас аз сохтани nn.Linear вазнҳоро ба √6 зарб кунед, то ибтидосозии мувофиқи Каймин ҳосил шавад.
Ҷойивазкуниҳоро ҳам сифр мекунем, зеро тасодуфӣ кардани онҳо фоидаи махсус надорад:
import torch
import torch.nn as nn
layer = nn.Linear(40, 10)
layer.weight.data *= 6 ** 0.5 # Каймин; барои Лекун: 3 ** 0.5
torch.zero_(layer.bias.data)
Ин кор мекунад, аммо истифодаи функсияҳои torch.nn.init равшантар ва камхатотар аст:
nn.init.kaiming_uniform_(layer.weight)
nn.init.zeros_(layer.bias)
Барои як хел ибтидосозӣ кардани ҳамаи nn.Linear-ҳои модел метавонед ин корро дар созанда анҷом диҳед ё зерсинфи nn.Linear созед.
Аммо роҳи сода ин навиштани функсияест, ки модулро месанҷад ва агар nn.Linear бошад, вазнҳояшро ибтидосозӣ мекунад. Сипас онро бо apply() ба модел ва ҳамаи зермодулҳо татбиқ мекунед:
def use_he_init(module):
if isinstance(module, nn.Linear):
nn.init.kaiming_uniform_(module.weight)
if module.bias is not None: # қабатҳои bias=False
nn.init.zeros_(module.bias)
model = nn.Sequential(nn.Linear(50, 40), nn.ReLU(), nn.Linear(40, 1), nn.ReLU())
model.apply(use_he_init)
Дар torch.nn.init ҳамчунин orthogonal_() мавҷуд аст. Он вазнҳоро бо матритсаи тасодуфии ортогоналӣ ибтидосозӣ мекунад. Ин равиш дар мақолаи соли 2014-и Эндрю Сакс ва ҳамкоронаш пешниҳод шуд.
Матритсаҳои ортогоналӣ хосиятҳои муфиди математикӣ доранд. Аз ҷумла, нормаро нигоҳ медоранд: барои матритсаи ортогоналии W ва вектори x, нормаи Wx ба нормаи x баробар аст.
Яъне бузургии вуруд дар баромад нигоҳ дошта мешавад. Бо вурудҳои стандартӣ ин ба устувории дисперсия ва пешгирии нестшавӣ ё таркиши фаъолсозиҳою градиентҳо, ҳадди ақал дар оғози омӯзиш, кумак мекунад.
Ин усул аз усулҳои боло камтар маъмул аст, аммо метавонад дар шабакаҳои бозгаштӣ ё шабакаҳои тавлидии рақобатӣ хуб кор кунад. Ба бобҳои 13 ва 18 нигаред.
Миқёсбандии дурусти вазнҳо барои омӯзиши шабакаи амиқ нуқтаи оғози хеле беҳтар медиҳад.
Маслиҳат. Дар таснифгар одатан хуб аст вазнҳои қабати баромадро ҳангоми ибтидосозӣ, масалан, даҳ баробар хурдтар кунед. Дар оғоз логитҳо хурдтар ва ба ҳам наздиктар мешаванд, пас эҳтимолиятҳои пешгӯишуда низ ба ҳам наздик мемонанд. Модел дар оғози омӯзиш камэътимодтар мешавад ва аз талафоти шадид ва градиентҳои азим пешгирӣ мегардад. Чунин градиентҳо метавонанд вазнҳоро тасодуфан ба ҳар тараф партофта, омӯзишро суст ё номумкин кунанд.
Функсияҳои беҳтари фаъолсозӣ
Яке аз хулосаҳои мақолаи Глорот ва Бенҷио ин буд, ки интихоби номуносиби функсияи фаъолсозӣ қисман сабаби градиентҳои ноустувор аст.
То он вақт бисёриҳо гумон мекарданд, ки агар нейронҳои биологӣ аз чизе монанд ба сигмоид истифода баранд, пас ин функсия бояд интихоби олӣ бошад.
Аммо дар шабакаҳои амиқ функсияҳои дигар беҳтар кор мекунанд, махсусан ReLU: он дар қисми мусбат сер намешавад ва хеле зуд ҳисоб мешавад.
Бо вуҷуди ин, ReLU комил нест. Он аз мушкили ReLU-ҳои мурда ранҷ мебарад: баъзе нейронҳо ҳангоми омӯзиш дигар ғайр аз 0 чизе намедиҳанд.
Баъзан ҳатто нисфи нейронҳои шабака «мурда» мешаванд, махсусан ҳангоми суръати баланди омӯзиш.
Нейрон вақте мемирад, ки вазнҳояш тавре тағйир ёбанд, ки вуруди ReLU — ҷамъи вазндори вурудҳо ва ҷойивазкунӣ — барои ҳамаи намунаҳои омӯзишӣ манфӣ шавад.
Он гоҳ баромад ҳамеша сифр аст ва поёнравии градиентӣ дигар ба он таъсир намекунад, зеро градиенти ReLU барои вуруди манфӣ сифр мебошад.
Барои ҳалли ин мушкил метавон аз вариантҳои ReLU, масалан, Leaky ReLU, истифода бурд.
Leaky ReLU
Функсия чунин таъриф мешавад:
LeakyReLU_α(z) = max(αz, z).
Гиперпараметри α нишебии функсияро барои z<0 муайян мекунад.
Мавҷудияти нишебӣ дар қисми манфӣ кафолат медиҳад, ки нейрон комилан намемирад. Он метавонад муддате қариб ғайрифаъол бошад, аммо имкони фаъол шудан дорад.
Дар мақолаи соли 2015-и Бин Сюй ва ҳамкоронаш чанд варианти ReLU муқоиса шуд. Яке аз хулосаҳо ин буд, ки вариантҳои «ихроҷдор» аз ReLU-и қатъӣ беҳтар буданд.
Дар он таҷрибаҳо α=0.2, яъне нишебии нисбатан калон, аз α=0.01 натиҷаи беҳтар дод.
Муаллифон RReLU (Leaky ReLU-и тасодуфӣ)-ро низ санҷиданд. Дар омӯзиш α аз фосилаи муайян тасодуфан интихоб мешавад ва ҳангоми санҷиш қимати миёнаи он истифода мегардад.
RReLU хуб кор карда, ба назар мерасид ҳамчун мунтазамсоз амал мекунад ва хавфи аз ҳад мутобиқшавиро кам менамояд.
Ҳамчунин PReLU — Leaky ReLU-и параметрӣ — санҷида шуд. Дар он α дигар гиперпараметр нест: он параметрест, ки ҳангоми омӯзиш бо паҳнкунии баръакс нав мешавад.
PReLU дар маҷмӯаҳои калони тасвир аз ReLU хеле беҳтар кор кард, аммо дар маҷмӯаҳои хурд хавфи аз ҳад мутобиқшавӣ дорад.
Расми 11.2. Leaky ReLU: монанд ба ReLU, аммо бо нишебии хурд барои қиматҳои манфӣ.
PyTorch модулҳои nn.LeakyReLU, nn.RReLU ва nn.PReLU дорад.
Барои онҳо низ ибтидосозии Каймин мувофиқ аст, аммо бинобар нишебии қисми манфӣ дисперсия бояд ба омили 1+α² тақсим шавад.
PyTorch инро дастгирӣ мекунад:
alpha = 0.2
model = nn.Sequential(nn.Linear(50, 40), nn.LeakyReLU(negative_slope=alpha))
nn.init.kaiming_uniform_(model[0].weight, alpha, nonlinearity="leaky_relu")
ReLU, Leaky ReLU ва PReLU ҳамвор нестанд: нишебии онҳо дар z=0 ногаҳон тағйир меёбад.
Тавре ҳангоми баррасии lasso дар боби 4 дидем, чунин тағйироти ногаҳонии ҳосила метавонад боиси ҷаҳидани поёнравии градиентӣ дар атрофи оптимум ва сустшавии ҳамгароӣ гардад.
Акнун вариантҳои ҳамвортарро, аз ELU ва SELU сар карда, мебинем.
ELU ва SELU
Дар мақолаи соли 2015-и Ҷорк-Арне Клеверт ва ҳамкоронаш функсияи воҳиди хаттии экспоненсиалӣ — ELU пешниҳод шуд.
Дар таҷрибаҳои муаллифон он аз ҳамаи вариантҳои ReLU беҳтар буд: омӯзиш камтар вақт гирифт ва натиҷаи санҷишӣ беҳтар шуд.
Муодилаи 11.2. Функсияи фаъолсозии ELU.
ELU_α(z) = ⎧ α(exp(z) − 1), z < 0,
⎩ z, z ≥ 0.
ELU ба ReLU монанд аст, вале чанд фарқи муҳим дорад:
- Барои z<0 қиматҳои манфӣ мегирад. Ин миёнаи баромадро ба сифр наздик карда, мушкили нестшавии градиентҳоро сабук мекунад. Гиперпараметри α муайян мекунад, ки функсия ҳангоми хеле манфӣ шудани z ба кадом қимати манфӣ наздик мешавад. Одатан α=1 мегузоранд.
- Барои z<0 градиент ғайрисифр аст, ки мушкили нейронҳои мурдаро пешгирӣ мекунад.
- Ҳангоми α=1 функсия дар ҳама ҷо, аз ҷумла дар атрофи сифр, ҳамвор аст. Ин ҷаҳишҳои поёнравии градиентиро кам карда, омӯзишро метезонад.
Дар PyTorch nn.ELU-ро бо ибтидосозии Каймин истифода баред.
Камбудии асосӣ сусттар ҳисоб шудани он нисбат ба ReLU мебошад, зеро экспонента дорад.
Ҳамгароии тезтар метавонад ин хароҷотро ҳангоми омӯзиш ҷуброн кунад, аммо дар вақти пешгӯӣ шабакаи ELU андаке сусттар мемонад.
Расми 11.3. Функсияҳои фаъолсозии ELU ва SELU.
Дар мақолаи соли 2017-и Гюнтер Кламбауэр ва ҳамкоронаш SELU — ELU-и миқёсбандишуда пешниҳод шуд: тақрибан 1.05 баробари ELU бо α≈1.67.
Муаллифон нишон доданд, ки агар шабака танҳо аз пайдарпайии қабатҳои пуррапайваст, яъне MLP, иборат бошад ва ҳамаи қабатҳои пинҳонӣ SELU истифода баранд, шабака метавонад худнормалшаванда шавад.
Яъне баромади ҳар қабат ҳангоми омӯзиш ба нигоҳ доштани миёнаи 0 ва инҳирофи стандартии 1 майл мекунад. Ин мушкили нестшавӣ ва таркиши градиентҳоро ҳал карда метавонад.
Аз ин рӯ, SELU метавонад барои MLP-ҳо, махсусан амиқ, аз функсияҳои дигар беҳтар бошад. Дар PyTorch nn.SELU истифода мешавад.
Аммо шартҳо мавҷуданд:
- Хусусиятҳои вурудӣ бояд стандартӣ бошанд: миёнаи
0ва инҳирофи стандартии1. - Вазнҳои ҳар қабати пинҳонӣ бояд бо ибтидосозии нормалии Лекун сохта шаванд.
- Худнормалшавӣ танҳо барои MLP-и одӣ кафолат дода мешавад. Дар шабакаҳои бозгаштӣ ё дорои пайвастҳои гузаранда, мисли Wide & Deep, SELU эҳтимол аз ELU беҳтар намешавад.
- Барои нигоҳ доштани ин хосият, маҳдудиятҳое ба истифодаи ℓ₁, ℓ₂, batch-norm, layer-norm, max-norm ва dropout-и муқаррарӣ вуҷуд доранд.
Ин маҳдудиятҳо ҷиддианд. Аз ин рӯ, бо вуҷуди ваъдаҳои хуб SELU чандон густариш наёфт. Функсияҳои дигар низ дар бисёр вазифаҳо аз он беҳтар натиҷа медиҳанд.
GELU, Swish, SwiGLU, Mish ва ReLU²
GELU — Gaussian Error Linear Unit дар мақолаи соли 2016-и Дэн Ҳендрикс ва Кевин Гимпел пешниҳод шуд.
Онро метавон варианти ҳамвори ReLU донист.
Таърифи он дар муодилаи 11.3 омадааст. Дар он Φ функсияи тақсимоти ҷамъшавандаи гауссии стандартӣ мебошад: Φ(z) эҳтимоли аз z хурдтар будани қимати аз тақсимоти нормалии миёнааш 0 ва дисперсияаш 1 гирифташударо нишон медиҳад.
Муодилаи 11.3. Функсияи фаъолсозии GELU.
GELU(z) = z · Φ(z)
Тавре дар расми 11.4 мебинед, GELU ба ReLU монанд аст:
- ҳангоми хеле манфӣ будани z, ба сифр наздик мешавад;
- ҳангоми хеле мусбат будани z, ба худи z наздик мешавад.
Аммо GELU на якнавохт ва на барҷаста аст. Аз чап ба рост аввал қариб рост ҳаракат карда, баъд каме поён меравад, дар наздикии z≈−0.75 ба қимати тақрибан -0.17 мерасад ва сипас боло рафта, ба хати рост наздик мешавад.
Ин шакли мураккаб ва каҷии он метавонад сабаби хуб кор кардани функсия дар масъалаҳои мураккаб бошад: поёнравии градиентӣ қонуниятҳои мураккабро осонтар мутобиқ мекунад.
Дар амал GELU аксаран аз функсияҳои қаблан баррасишуда беҳтар аст. Аммо ҳисоббарории он гаронтар мебошад ва фоида на ҳамеша ин хароҷотро ҷуброн мекунад.
Онро чунин тақриб кардан мумкин аст:
GELU(z) ≈ z · σ(1.702z),
ки σ сигмоид мебошад. Ин тақриб низ хуб кор карда, тезтар ҳисоб мешавад.
Расми 11.4. GELU, Swish, Swish-и параметрӣ, Mish ва ReLU².
Ҳамон мақолаи GELU функсияи SiLU — sigmoid linear unit-ро низ муаррифӣ кард:
SiLU(z) = z · σ(z).
Дар таҷрибаҳои он мақола GELU беҳтар буд.
Аммо дар мақолаи соли 2017-и Пражит Рамачандран ва ҳамкоронаш SiLU тавассути ҷустуҷӯи худкори функсияҳои фаъолсозӣ аз нав пайдо шуд. Онҳо онро Swish номиданд ва ҳамин ном маъмул гардид.
Дар таҷрибаҳои онҳо Swish аз ҳамаи функсияҳои дигар, аз ҷумла GELU, беҳтар буд.
Баъд Swish бо гиперпараметри скалярии β умумӣ карда шуд:
Swish_β(z) = z · σ(βz).
Пас GELU тақрибан ба Swish бо β=1.702 баробар аст.
β-ро метавонед ҳамчун гиперпараметр танзим кунед ё онро параметри омӯхташаванда гардонед. Барои самаранокӣ ва кам кардани хавфи аз ҳад мутобиқшавӣ, одатан барои тамоми модел ё барои ҳар қабат танҳо як β истифода мешавад.
Варианти маъмули Swish — SwiGLU мебошад.
Вуруд аз Swish ва ҳамзамон аз табдили хаттӣ мегузарад. Сипас баромадҳо унсур ба унсур зарб мешаванд:
SwiGLU(z) = Swish_β(z) ⊗ Linear(z).
Одатан андозаи баромади қабати хаттии пешинаро ду баробар карда, онро ба z₁ ва z₂ ҷудо мекунанд:
SwiGLU_β(z) = Swish_β(z₁) ⊗ z₂.
Ин варианти воҳиди хаттии дарвозадор — GLU аст, ки муҳаққиқони Facebook соли 2016 пешниҳод карда буданд.
Зарби унсурӣ қудрати ифодаи моделро зиёд мекунад: он меомӯзад, ки кадом хусусиятҳоро хомӯш ё тақвият диҳад. Ин механизми дарвозабандӣ — gating ном дорад.
SwiGLU дар трансформерҳои муосир бисёр истифода мешавад. Ба боби 15 нигаред.
Функсияи дигари монанд ба GELU — Mish — дар мақолаи соли 2019-и Диганта Мисра пешниҳод шуд:
Mish(z) = z · tanh(softplus(z)),
ки дар он:
softplus(z) = log(1 + exp(z)).
Мисли GELU ва Swish, он варианти ҳамвор, ғайриякнавохт ва ғайрибарҷастаи ReLU аст.
Дар таҷрибаҳои муаллиф Mish одатан аз дигар функсияҳо, ҳатто Swish ва GELU, андаке беҳтар буд.
Дар қисми манфӣ он қариб бо Swish ва дар қисми мусбат қариб бо GELU мувофиқ меояд.
Ниҳоят, соли 2021 муҳаққиқони Google ҳангоми ҷустуҷӯи худкори меъморӣ барои трансформерҳои калон функсияи хеле сода, вале самаранокеро пайдо карданд: ReLU².
ReLU²(z) = (max(0, z))².
Он бартариҳои ReLU — содагӣ, самаранокии ҳисоббарорӣ, баромади тунук ва набудани сершавӣ дар қисми мусбатро нигоҳ медорад, аммо дар сифр градиенти ҳамвор низ дорад.
Он аксаран, махсусан барои моделҳои тунук, натиҷаи хуб медиҳад. Аммо омӯзиш метавонад камустувортар бошад, аз ҷумла бинобар ҳассосияти бештар ба нуқтаҳои дурмонда ва ReLU-ҳои мурда.
Маслиҳат. Барои аксари вазифаҳо ReLU ҳанӯз интихоби хуби пешфарз аст: тез мебошад ва бисёр китобхонаҳою тезонандаҳо барои он беҳинасозии махсус доранд. Барои вазифаҳои мураккаб Swish метавонад интихоби беҳтар бошад. Барои масъалаҳои боз ҳам мураккаб Swish-и дорои β-и омӯхташавандаро санҷед. Mish ва SwiGLU метавонанд андаке беҳтар бошанд, аммо ҳисоббарории бештар талаб мекунанд. Агар таъхири пешгӯӣ муҳим бошад, Leaky ReLU, PReLU ё, махсусан барои модели тунук, ReLU²-ро санҷед.
PyTorch GELU, Mish ва Swish-ро бо модулҳои зерин дастгирӣ мекунад:
nn.GELU
nn.Mish
nn.SiLU
Барои SwiGLU андозаи баромади қабати хаттии пешинаро ду баробар кунед:
z1, z2 = z.chunk(2, dim=-1)
output = z1 * torch.sigmoid(beta * z1) * z2
Барои ReLU²:
output = F.relu(z).square()
Дар ин ҷо F ҳамон torch.nn.functional аст.
PyTorch версияҳои сода ва тақрибии баъзе функсияҳоро низ дорад, ки номашон бо Hard оғоз мешавад:
nn.Hardsigmoid
nn.Hardtanh
nn.Hardswish
Онҳо тезтар ҳисоб мешаванд ва аксаран дар дастгоҳҳои мобилӣ истифода мегарданд.
Акнун ба роҳи дигари устувор кардани градиентҳо мегузарем: нормалсозии бастаҳо.
Нормалсозии бастаҳо — Batch normalization
Ибтидосозии Каймин бо ReLU ё вариантҳои он хавфи нестшавӣ ва таркиши градиентҳоро дар оғози омӯзиш хеле кам мекунад. Аммо кафолат намедиҳад, ки мушкил баъдтар барнамегардад.
Сергей Иоффе ва Кристиан Сегеди дар мақолаи соли 2015 усули нормалсозии бастаҳо — BN-ро пешниҳод карданд.
Дар модел пеш ё пас аз фаъолсозии ҳар қабати пинҳонӣ амали иловагӣ гузошта мешавад.
Он ҳар хусусияти вурудиро марказонида ва нормалсозӣ мекунад. Сипас бо ду вектори параметрӣ онро миқёсбандӣ ва ҷойиваз мекунад:
- як вектор барои миқёс;
- як вектор барои ҷойивазкунӣ.
Яъне модел миқёс ва миёнаи муносиби вурудҳои ҳар қабатро меомӯзад.
Агар BN-ро ҳамчун қабати аввали шабака гузоред, дар бисёр ҳолатҳо ба стандартӣ кардани дастии маҷмӯа бо StandardScaler ниёз намемонад.
Албатта, ин тақрибӣ аст, зеро BN дар ҳар лаҳза танҳо як бастаро мебинад ва метавонад хусусиятҳоро боз миқёсбандӣ ва ҷойиваз кунад.
Барои марказонидан ва нормалсозӣ миёна ва инҳирофи стандартии ҳар хусусият аз рӯйи бастаи ҷорӣ ҳисоб мешавад. Аз ҳамин сабаб усул «нормалсозии бастаҳо» ном дорад.
Муодилаи 11.4. Алгоритми нормалсозии бастаҳо.
1. μ_B = (1 / m_B) · Σᵢ₌₁^(m_B) x⁽ⁱ⁾
2. σ_B² = (1 / m_B) · Σᵢ₌₁^(m_B) (x⁽ⁱ⁾ − μ_B)²
3. x̂⁽ⁱ⁾ = (x⁽ⁱ⁾ − μ_B) / √(σ_B² + ε)
4. z⁽ⁱ⁾ = γ ⊗ x̂⁽ⁱ⁾ + β
Дар ин алгоритм:
- μ_B — вектори миёнаҳои вурудҳо дар бастаи B, як миёна барои ҳар хусусият;
- m_B — шумораи намунаҳои баста;
- x⁽ⁱ⁾ — вектори вуруди қабати BN барои намунаи i;
- σ_B — вектори инҳирофҳои стандартӣ дар бастаи ҷорӣ;
- x̂⁽ⁱ⁾ — вектори нормалшуда, яъне вуруди марказонидашуда ва миқёсбандишудаи намунаи i;
- ε — адади хеле хурд, одатан 10⁻⁵, барои пешгирии тақсим ба сифр ва градиентҳои хеле калон;
- γ — вектори параметрҳои миқёс, як параметр барои ҳар хусусият;
- ⊗ — зарби унсур ба унсур;
- β — вектори параметрҳои ҷойивазкунӣ;
- z⁽ⁱ⁾ — баромади амали BN.
Ҳамин тавр, ҳангоми омӯзиш BN вурудҳоро стандартӣ карда, баъд онҳоро миқёсбандӣ ва ҷойиваз мекунад.
Аммо ҳангоми санҷиш чӣ мешавад?
Шояд танҳо барои як намуна пешгӯӣ кунем. Он гоҳ инҳирофи стандартии ҳар хусусиятро аз як намуна ҳисоб карда наметавонем.
Ҳатто агар баста дошта бошем, он метавонад хеле хурд бошад ё намунаҳояш мустақил ва яксонтақсимшуда набошанд. Пас омори он боэътимод намешавад.
Як роҳ ин аст, ки пас аз омӯзиш тамоми маҷмӯи омӯзиширо аз шабака гузаронда, барои ҳар вуруди BN миёна ва инҳирофи стандартии ниҳоиро ҳисоб кунем. Баъд ҳангоми пешгӯӣ аз ҳамин омор истифода барем.
Аммо аксари татбиқҳо, аз ҷумла PyTorch, ин омори ниҳоиро ҳангоми омӯзиш бо миёнаи ҳаракаткунандаи экспоненсиалӣ баҳогузорӣ мекунанд.
Пас дар ҳар қабати BN чор вектор дорем:
- γ ва β, ки бо паҳнкунии баръакс омӯхта мешаванд;
- μ ва σ², ки бо миёнаи ҳаракаткунанда баҳогузорӣ мешаванд.
Пас аз model.eval(), миёна ва дисперсияи ҷамъшуда ба ҷойи омори бастаи ҷорӣ истифода мешаванд.
Иоффе ва Сегеди нишон доданд, ки BN ҳамаи шабакаҳои амиқи озмоишкардаи онҳоро хеле беҳтар кард.
Дар масъалаи таснифбандии ImageNet, ки маҷмӯи калони тасвирҳои бисёрсинфӣ барои арзёбии биниши компютерӣ аст, беҳбудии назаррас ба даст омад.
Мушкили нестшавии градиентҳо чунон кам шуд, ки ҳатто tanh ва sigmoid-ро истифода бурдан мумкин гардид.
Шабакаҳо ба ибтидосозии вазнҳо камтар ҳассос шуданд ва суръати хеле баландтари омӯзиш имконпазир гардид.
Муаллифон гузориш доданд, ки барои модели пешрафтаи таснифбандии тасвир ҳамон саҳеҳӣ бо 14 маротиба камтар қадами омӯзиш ба даст омад. Ансамбли шабакаҳои дорои BN ба хатои top-5-и тасдиқии 4,9% ва хатои санҷишии 4,8% расид.
BN ҳамчунин ҳамчун мунтазамсоз амал карда, эҳтиёҷ ба усулҳои дигар, масалан, dropout-ро кам мекунад.
Аммо он мураккабии модел ва хароҷоти ҳисоббарориро зиёд менамояд. Пешгӯӣ аз ҳисоби амалҳои иловагӣ сусттар мешавад.
Хушбахтона, пас аз омӯзиш BN-ро аксаран бо қабати пешина якҷо кардан мумкин аст.
Агар қабати пешина чунин ҳисоб кунад:
XW + b,
он гоҳ BN, бо сарфи назар аз ε, чунин медиҳад:
γ ⊗ (XW + b − μ) / σ + β.
Агар муайян кунем:
W′ = (γ ⊗ W) / σ,
b′ = (γ ⊗ (b − μ)) / σ + β,
ифода ба шакли зерин содатар мешавад:
XW′ + b′.
Пас бо иваз кардани вазнҳо ва ҷойивазкуниҳои қабати пешина BN-ро хориҷ кардан мумкин аст. Ин яке аз беҳинасозиҳои optimize_for_inference() мебошад.
Эзоҳ. Бо BN ҳар даври омӯзиш метавонад дарозтар шавад. Аммо одатан барои расидан ба ҳамон натиҷа даврҳои камтар лозим мешаванд. Дар маҷмӯъ вақти воқеии омӯзиш метавонад кӯтоҳтар шавад.
Татбиқи BN дар PyTorch
Пеш ё пас аз фаъолсозии ҳар қабати пинҳонӣ nn.BatchNorm1d илова карда, шумораи хусусиятҳои онро муайян мекунед.
Масалан, таснифгари Fashion MNIST бо BN дар аввал ва пас аз ҳар қабати пинҳонӣ:
model = nn.Sequential(
nn.Flatten(),
nn.BatchNorm1d(1 * 28 * 28),
nn.Linear(1 * 28 * 28, 300),
nn.ReLU(),
nn.BatchNorm1d(300),
nn.Linear(300, 100),
nn.ReLU(),
nn.BatchNorm1d(100),
nn.Linear(100, 10)
)
Моделро мисли пештара меомӯзонед.
Дар ин мисоли хурди дорои ду қабати пинҳонӣ BN эҳтимол таъсири калон надошта бошад. Аммо дар шабакаҳои амиқ фарқи хеле зиёд меорад.
Огоҳӣ. BN дар омӯзиш ва арзёбӣ гуногун рафтор мекунад. Ҳангоми омӯзиш
model.train()ва ҳангоми арзёбӣmodel.eval()-ро истифода баред. Фаромӯш кардани ин яке аз хатоҳои маъмул аст.
Параметрҳои қабати якуми BN:
>>> dict(model[1].named_parameters()).keys()
dict_keys(['weight', 'bias'])
Онҳо ба γ ва β мувофиқанд.
Буферҳои он:
>>> dict(model[1].named_buffers()).keys()
dict_keys(['running_mean', 'running_var', 'num_batches_tracked'])
running_mean ва running_var омори ҷамъшавандаанд. num_batches_tracked шумораи бастаҳои дар омӯзиш дидашударо нигоҳ медорад.
Муаллифони мақолаи BN тавсия доданд, ки он пеш аз фаъолсозӣ ҷойгир шавад, на баъд аз он.
Дар ин бора баҳс вуҷуд дорад ва натиҷа аз вазифа вобаста аст. Ҳар ду вариантро санҷед.
Агар BN-ро пеш аз фаъолсозӣ гузоред, метавонед дар nn.Linear-и пешина bias=False кунед, зеро BN худ барои ҳар хусусият ҷойивазкунӣ дорад.
Ҳамчунин BN-и аввалро гирифта метавонед, то қабати якум байни ду BN намонад. Аммо он гоҳ додаҳоро пешакӣ стандартӣ кунед:
model = nn.Sequential(
nn.Flatten(),
nn.Linear(1 * 28 * 28, 300, bias=False),
nn.BatchNorm1d(300),
nn.ReLU(),
nn.Linear(300, 100, bias=False),
nn.BatchNorm1d(100),
nn.ReLU(),
nn.Linear(100, 10)
)
nn.BatchNorm1d чанд гиперпараметр дорад. Пешфарзҳо одатан муносибанд, аммо баъзан momentum-ро бояд танзим кард.
Ин параметр суръати навсозии миёнаҳои ҳаракаткунандаро муайян мекунад.
Барои бастаҳои хурд қиматҳои наздик ба сифр, масалан, 0.01 ё 0.001, тавсия мешаванд.
Қимати пешфарзи 0.1 барои бастаҳои калон муносибтар аст ва барои бастаҳои хурди 32 ё 64 ҳамеша беҳтарин нест.
Огоҳӣ. Дар заминаи миёнаи ҳаракаткунанда, «momentum» одатан вазни миёнаи қаблиро ифода мекунад. Аммо PyTorch дар қабатҳои BN бо сабабҳои таърихӣ маънои баръаксро истифода мебарад. Дар оптимизаторҳои PyTorch бошад, маънои маъмулии он истифода мешавад.
BatchNorm-и як-, ду- ва сеандоза
Дар мисолҳои боло аввал тасвирҳоро ҳамвор кардем, баъд ба nn.BatchNorm1d додем.
Дар ин истифода он бастаҳои шакли зеринро мегирад:
[batch_size, num_features]
Аз ин рӯ, агар онро пеш аз nn.Flatten гузоред, хато мегиред.
Аммо пеш аз Flatten метавонед nn.BatchNorm2d истифода баред. Он чунин бастаи тасвирҳоро интизор аст:
[batch_size, channels, height, width]
Миёна ва дисперсияро аз рӯйи андозаи баста ва андозаҳои фазоӣ ҳисоб мекунад. Яъне ҳамаи пикселҳои ҳамон канал дар тамоми баста аз як миёна ва дисперсия истифода мебаранд.
BatchNorm2d барои ҳар канал як вазн ва як ҷойивазкунӣ дорад. Масалан, барои тасвири RGB се вазн ва се ҷойивазкунӣ.
Барои додаҳои тасвирӣ ин аксаран беҳтар кор мекунад.
nn.BatchNorm3d чунин шаклро интизор аст:
[batch_size, channels, depth, height, width]
Он барои тасвирҳои сеандоза, масалан, томографияи компютерӣ, муфид аст.
nn.BatchNorm1d бо пайдарпайиҳо низ кор мекунад.
Одатан бастаҳои пайдарпайӣ чунин ифода мешаванд:
[batch_size, sequence_length, num_features]
Масалан, 32 траекторияи зарра, ки ҳар кадом 100 нуқтаи сеандоза дорад:
[32, 100, 3]
Аммо BatchNorm1d шакли зеринро интизор аст:
[batch_size, num_features, sequence_length]
Аз ин рӯ, пеш аз он ду андозаи охирро иваз кунед:
X.permute(0, 2, 1)
BN яке аз қабатҳои серистифодаи шабакаҳои амиқ, махсусан конволютсионӣ, шудааст. Баъзан ҳатто дар диаграммаҳои меъморӣ нишон дода намешавад: фарз мешавад, ки пас аз ҳар қабат мавҷуд аст.
Аммо он комил нест. Омори як намуна аз дигар намунаҳои баста таъсир мегирад, ки махсусан дар бастаҳои хурд метавонад натиҷаро бад кунад.
BN бо баъзе меъмориҳо, аз ҷумла шабакаҳои бозгаштӣ, низ душворӣ дорад. Аз ин рӯ, онро торафт бештар бо нормалсозии қабатҳо иваз мекунанд.
Нормалсозии қабатҳо — Layer normalization
LN ба BN монанд аст, аммо ба ҷойи нормалсозӣ аз рӯйи андозаи баста, аз рӯйи андозаҳои хусусиятҳо нормалсозӣ мекунад.
Ин ғояро Ҷимми Лей Ба ва ҳамкоронаш соли 2016 пешниҳод карданд.
Дар аввал он бештар барои шабакаҳои бозгаштӣ истифода мешуд. Баъд дар шабакаҳои конволютсионӣ, трансформерҳо, моделҳои диффузионӣ ва дигар меъмориҳо низ муваффақ шуд.
Бартарии LN он аст, ки оморро барои ҳар намуна мустақилона ҳисоб мекунад.
Аз ин рӯ:
- рафтораш дар омӯзиш ва санҷиш яксон аст;
- ба омори ҷамъшудаи тамоми маҷмӯа ва миёнаҳои ҳаракаткунанда ниёз надорад;
- мисли BN параметрҳои миқёс ва ҷойивазкунӣ меомӯзад.
Дар PyTorch nn.LayerNorm мавҷуд аст.
Ҳангоми сохтани он андозаи меҳварҳоеро муайян мекунед, ки аз рӯйи онҳо нормалсозӣ мешавад. Онҳо бояд андозаҳои охирини вуруд бошанд.
Масалан, барои бастаи тасвирҳои RGB-и 100×200, агар ҳар каналро ҷудогона нормалсозӣ кардан хоҳед:
inputs = torch.randn(32, 3, 100, 200) # бастаи тасвирҳои тасодуфии RGB
layer_norm = nn.LayerNorm([100, 200])
result = layer_norm(inputs) # нормалсозӣ аз рӯйи ду андозаи охир
Коди зерин ҳамон натиҷаро медиҳад:
means = inputs.mean(dim=[2, 3], keepdim=True) # [32, 3, 1, 1]
vars_ = inputs.var(dim=[2, 3], keepdim=True, unbiased=False)
stds = torch.sqrt(vars_ + layer_norm.eps)
result = layer_norm.weight * (inputs - means) / stds + layer_norm.bias
# шакли натиҷа: [32, 3, 100, 200]
Аммо бисёр меъмориҳои биниши компютерӣ ҳамаи каналҳоро якҷо нормалсозӣ мекунанд. Он гоҳ андозаи каналҳоро низ дохил кунед:
layer_norm = nn.LayerNorm([3, 100, 200])
result = layer_norm(inputs) # аз рӯйи се андозаи охир
Акнун як усули дигари устувор кардани градиентҳоро мебинем.
Маҳдудсозии градиентҳо — Gradient clipping
Барои кам кардани мушкили таркиши градиентҳо онҳоро тавре маҳдуд кардан мумкин аст, ки аз ҳадди муайян зиёд нашаванд.
Ин gradient clipping ном дорад ва аксаран дар шабакаҳои бозгаштӣ истифода мешавад.
Дар PyTorch одатан яке аз функсияҳои зеринро баъд аз loss.backward() ва пеш аз навсозии параметрҳо даъват мекунанд:
torch.nn.utils.clip_grad_norm_()
torch.nn.utils.clip_grad_value_()
Ҳар ду ҳамчун аргументи аввал параметрҳои моделро мегиранд, одатан model.parameters().
clip_grad_norm_()градиентҳоро мувофиқи ҳаддиmax_normмиқёсбандӣ мекунад. Қимати маъмули оғоз1.0аст.clip_grad_value_()ҳар ҷузъи градиентро мустақилона байни-clip_valueва+clip_valueмаҳдуд мекунад.
Мисол:
for epoch in range(n_epochs):
for X_batch, y_batch in train_loader:
X_batch, y_batch = X_batch.to(device), y_batch.to(device)
y_pred = model(X_batch)
loss = loss_fn(y_pred, y_batch)
loss.backward()
nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.step()
optimizer.zero_grad()
Маҳдудсозӣ аз рӯйи қимат самти вектори градиентро тағйир медиҳад.
Масалан:
[0.9, 100.0]
асосан ба самти андозаи дуюм ишора мекунад. Пас аз маҳдудсозӣ ба 1:
[0.9, 1.0]
вектор тақрибан диагоналӣ мешавад.
Бо вуҷуди ин, чунин равиш дар амал хуб кор мекунад.
Агар ҳамон векторро аз рӯйи норма маҳдуд кунем:
[0.00899964, 0.9999595]
самт нигоҳ дошта мешавад, аммо ҷузъи якум қариб нест мегардад.
Интихоби усули беҳтар аз додаҳо вобаста аст.
Истифодаи такрории қабатҳои пешомӯзонидашуда
Одатан пеш аз омӯзонидани шабакаи хеле калон аз сифр бояд моделеро ҷустуҷӯ кунед, ки вазифаи монандро ҳал кардааст. Дар боби 12 тарзи ёфтани чунин моделҳоро мебинем.
Агар пайдо шавад, аксаран қисми зиёди қабатҳои онро, ба истиснои қабатҳои болоӣ, аз нав истифода бурдан мумкин аст.
Ин омӯзиши интиқолӣ — transfer learning ном дорад.
Он омӯзишро хеле тез карда, додаҳои хеле камтар талаб мекунад.
Фарз кунед, ки шабакае доред, ки тасвирҳоро ба сад категория, аз ҷумла ҳайвонот, растаниҳо, воситаҳои нақлиёт ва ашёи рӯзмарра, ҷудо мекунад.
Акнун мехоҳед навъҳои муайяни воситаҳои нақлиётро тасниф кунед.
Вазифаҳо хеле монанд ва ҳатто қисман ҳампӯшанд. Пас хуб аст қисме аз шабакаи аввалро истифода баред.
Расми 11.5. Истифодаи такрории қабатҳои пешомӯзонидашуда.
Эзоҳ. Агар андозаи тасвирҳои нав аз тасвирҳои вазифаи аслӣ фарқ кунад, одатан бояд онҳоро ба андозаи интизоршавандаи модел табдил диҳед. Умуман, омӯзиши интиқолӣ вақте беҳтар аст, ки хусусиятҳои сатҳи поёнии вурудҳо монанд бошанд. Масалан, шабакаи дар аксҳои телефони мобилӣ омӯзонидашуда ба бисёр вазифаҳои дигари чунин аксҳо кумак мекунад, аммо эҳтимол барои тасвирҳои моҳвораӣ ё тиббӣ чандон муфид набошад.
Қабати баромади модели аслиро одатан иваз кардан лозим аст: он барои вазифаи нав муфид нест ва шояд ҳатто шумораи дурусти баромадҳо надошта бошад.
Қабатҳои болоии пинҳонӣ низ нисбат ба поёнӣ камтар қобили истифодаанд, зеро хусусиятҳои сатҳи баланди вазифаи нав метавонанд аз вазифаи пешина фарқ кунанд.
Бояд шумораи муносиби қабатҳои истифодашавандаро ёбед.
Маслиҳат. Ҳар қадар вазифаҳо монандтар бошанд, ҳамон қадар қабатҳои бештарро аз поён сар карда нигоҳ доред. Барои вазифаҳои хеле монанд аввал ҳамаи қабатҳои пинҳониро нигоҳ дошта, танҳо баромадро иваз кунед.
Аввал ҳамаи қабатҳои истифодашударо ях кунед: ба параметрҳояшон requires_grad=False диҳед, то ҳангоми омӯзиш тағйир наёбанд.
Моделро омӯзонида, натиҷаро бинед. Баъд як ё ду қабати болоии пинҳониро боз омӯзишпазир кунед ва санҷед, ки натиҷа беҳтар мешавад ё не.
Ҳар қадар додаҳои омӯзишӣ бештар бошанд, ҳамон қадар қабатҳои бештарро боз кардан мумкин аст.
Ҳангоми боз кардани қабатҳои пешомӯзонидашуда суръати омӯзишро кам кунед, то вазнҳои хуби онҳо вайрон нашаванд.
Агар додаҳо кам ва натиҷа ҳанӯз бад бошад, қабатҳои болоиро як-як хориҷ карда, боқимондаро боз ях кунед.
Агар додаҳо зиёд бошанд, метавонед қабатҳои болоиро ба ҷойи хориҷ кардан иваз намоед ё қабатҳои нав илова кунед.
Омӯзиши интиқолӣ бо PyTorch
Фарз кунед, ки Fashion MNIST танҳо ҳашт синф дорад: ҳамаи синфҳо ба истиснои Pullover ва T-shirt/top.
Касе дар ин маҷмӯа модели PyTorch сохта, саҳеҳии тақрибан 92% гирифтааст. Онро модели A меномем.
Акнун вазифаи дигар доред: фарқ кардани футболка ва пуловер. Футболка синфи мусбат ва пуловер синфи манфӣ аст.
Аммо ҳамагӣ 20 тасвири барчаспдор доред!
Агар модели нави B-ро бо ҳамон меъмории A омӯзонед, саҳеҳии санҷишӣ 88,6% мешавад.
Оё омӯзиши интиқолӣ кумак мекунад?
Модели A:
torch.manual_seed(42)
model_A = nn.Sequential(
nn.Flatten(),
nn.Linear(1 * 28 * 28, 100),
nn.ReLU(),
nn.Linear(100, 100),
nn.ReLU(),
nn.Linear(100, 100),
nn.ReLU(),
nn.Linear(100, 8)
)
[...] # омӯзиш ё бор кардани вазнҳои пешомӯзонидашуда
Ҳамаи қабатҳоро ба истиснои баромад истифода мебарем:
import copy
torch.manual_seed(42)
reused_layers = copy.deepcopy(model_A[:-1])
model_B_on_A = nn.Sequential(
*reused_layers,
nn.Linear(100, 1) # баромади нави вазифаи B
).to(device)
copy.deepcopy() ҳамаи модулҳо, додаҳо ва зермодулҳоро нусхабардорӣ мекунад.
Баъд аз қабатҳои гирифташуда ва баромади нави якнейронӣ модел месозем, зеро вазифа дусинфӣ аст.
Агар фавран омӯзишро оғоз кунем, қабати баромади тасодуфан ибтидосозишуда дар даврҳои аввал хатоҳои калон медиҳад. Градиентҳои калон метавонанд вазнҳои истифодашударо вайрон кунанд.
Барои пешгирӣ, қабатҳои куҳнаро дар чанд даври аввал ях мекунем:
for layer in model_B_on_A[:-1]:
for param in layer.parameters():
param.requires_grad = False
Барои таснифбандии дусинфӣ талафот ва меъёрро мувофиқ мекунем:
xentropy = nn.BCEWithLogitsLoss()
accuracy = torchmetrics.Accuracy(task="binary").to(device)
[...] # омӯзонидани model_B_on_A
Агар ба баромад sigmoid илова кунед, метавонед nn.BCELoss истифода баред.
Пас аз чанд давр ҳамаи параметрҳоро бо requires_grad=True боз карда, суръати омӯзишро кам мекунем ва танзими қабатҳои истифодашударо идома медиҳем.
Натиҷаи ниҳоӣ 93,1% саҳеҳии санҷишӣ аст — хеле беҳтар аз 88,6%!
Аммо бояд иқрор шуд: ин мисол аз байни конфигуратсияҳои зиёди санҷидашуда интихоб шудааст, то беҳбудии калонро нишон диҳад.
Агар синфҳо ё тухми тасодуфиро тағйир диҳед, беҳбудӣ метавонад кам, нест ё ҳатто баръакс шавад.
Инро «додаҳоро он қадар азоб додан, то иқрор кунанд» меноманд. Агар натиҷаи мақола аз ҳад мусбат намояд, эҳтиёт лозим аст: шояд муаллифон вариантҳои зиёдеро санҷида, танҳо натиҷаи беҳтаринро гузориш додаанд, бе зикри нокомиҳо.
Ин p-hacking ном дорад. Он на ҳамеша қасдан анҷом мешавад, аммо яке аз сабабҳои такрорнашавии бисёр натиҷаҳои илмӣ мебошад.
Чаро дар ин мисол чунин интихоб лозим шуд?
Омӯзиши интиқолӣ дар шабакаҳои хурди пуррапайваст чандон хуб кор намекунад. Эҳтимол шабакаҳои хурд қонуниятҳои кам ва шабакаҳои пуррапайваст қонуниятҳои хеле махсусро меомӯзанд, ки барои вазифаи дигар чандон муфид нестанд.
Омӯзиши интиқолӣ дар шабакаҳои амиқи конволютсионӣ ва трансформерҳо беҳтар кор мекунад. Дар бобҳои 12 ва 15 ба он бармегардем.
Пешомӯзиши беназорат
Фарз кунед, ки вазифа мураккаб аст, додаҳои барчаспдор каманд ва модели вазифаи монандро пайдо карда наметавонед.
Аввал кӯшиш кунед додаҳои барчаспдори бештар ҷамъ оваред. Агар имкон набошад, шояд пешомӯзиши беназорат кумак кунад.
Ҷамъ кардани додаҳои бебарчасп аксаран арзон аст, аммо барчаспгузорӣ гарон.
Агар додаҳои бебарчаспи зиёд дошта бошед, метавонед модели беназорат, масалан, автоэнкодер, омӯзонед. Ба боби 18 нигаред.
Сипас қабатҳои поёнии автоэнкодерро гирифта, баромади вазифаи худро илова кунед ва шабакаи ниҳоиро дар додаҳои барчаспдор бо омӯзиши назоратшаванда танзим намоед.
Расми 11.6. Пешомӯзиши ҳарисонаи қабат ба қабат дар солҳои аввали омӯзиши амиқ. Имрӯз қисми беназорат одатан барои тамоми модел якбора иҷро мешавад.
Ҷеффри Ҳинтон ва дастааш соли 2006 аз ҳамин равиш истифода карданд. Он ба эҳёи шабакаҳои нейронӣ ва муваффақияти омӯзиши амиқ мусоидат намуд.
То соли 2010 пешомӯзиши беназорат, одатан бо мошинҳои маҳдуди Болтсман — RBM, барои шабакаҳои амиқ равиши маъмул буд.
Танҳо пас аз сабук шудани мушкили нестшавии градиентҳо омӯзиши пурраи назоратшавандаи DNN маъмултар шуд.
Пешомӯзиши беназорат ҳанӯз интихоби хуб аст, вақте:
- масъала мураккаб мебошад;
- модели мувофиқи омода нест;
- додаҳои барчаспдор каманд;
- додаҳои бебарчасп зиёданд.
Имрӯз барои ин бештар автоэнкодерҳо ё моделҳои диффузионӣ истифода мешаванд, на RBM.
Дар солҳои аввал омӯзонидани тамоми шабака душвор буд. Аз ин рӯ, пешомӯзиши ҳарисонаи қабат ба қабат истифода мешуд:
- Модели беназорати якқабата, одатан RBM, омӯзонида мешуд.
- Қабат ях карда мешуд.
- Қабати нав илова ва танҳо ҳамон омӯзонида мешуд.
- Раванд такрор мегардид.
Имрӯз одатан тамоми модели беназоратро якбора меомӯзонанд.
Пешомӯзиш дар вазифаи ёрирасон
Варианти дигар ин аст, ки аввал шабакаро дар вазифаи ёрирасоне омӯзонед, ки барои он додаҳои барчаспдорро осон ҷамъ ё тавлид карда метавонед.
Баъд қабатҳои поёнии онро барои вазифаи асосӣ истифода баред. Онҳо детекторҳои хусусиятҳои эҳтимолан қобили истифодаи такрориро меомӯзанд.
Масалан, барои шинохти чеҳра шояд аз ҳар шахс танҳо чанд акс дошта бошед. Ин барои таснифгари хуб кофӣ нест ва ҷамъ кардани садҳо акс аз ҳар шахс амалӣ намебошад.
Аммо метавонед маҷмӯи оммавии дорои миллионҳо акси одамон, масалан, VGGFace2-ро истифода баред ва шабакаеро омӯзонед, ки муайян кунад оё дар ду акс ҳамон як шахс аст ё не.
Ин шабака хусусиятҳои хуби чеҳраро меомӯзад. Пас истифодаи қабатҳои поёнии он имкон медиҳад таснифгари хубро бо додаҳои кам омӯзонед.
Огоҳӣ. Ҷамъоварии худкори аксҳои одамон аз интернет метавонад ба маҳдудиятҳои ҳуқуқӣ бархӯрад. Аксҳо одатан ҳуқуқи муаллиф доранд ва шартҳои сомонаҳо метавонанд ҷамъоварии худкор ё истифодаи бе иҷозатро манъ кунанд. Ҳамчунин дар кишварҳои зиёд барои ҷамъоварӣ ва коркарди додаҳои шахсӣ, аз ҷумла тасвирҳои чеҳра, розигии ошкоро талаб мешавад.
Барои коркарди забони табиӣ — NLP метавонед корпуси миллионҳо ҳуҷҷатро бор карда, аз худи он додаҳои барчаспдор тавлид кунед.
Масалан, баъзе калимаҳоро тасодуфан пинҳон карда, моделро барои пешгӯии онҳо омӯзонед.
Дар ҷумлаи:
What ___ you saying?
модел бояд тахмин кунад, ки калимаи пинҳон эҳтимол are ё were аст.
Агар модел ин вазифаро хуб омӯзад, аллакай дар бораи забон бисёр чиз медонад. Баъд онро барои вазифаи асосӣ истифода карда, дар додаҳои барчаспдори худ танзим мекунед.
Моделҳои бузурги забонӣ асосан бо ҳамин мантиқ пешомӯзонида ва баъд танзим мешаванд. Ба боби 15 нигаред.
Эзоҳ. Вақте барчаспҳоро аз худи додаҳо ба таври худкор месозед ва баъд моделро бо усулҳои назоратшаванда меомӯзонед, ин омӯзиши худназоратшаванда — self-supervised learning ном дорад.
Оптимизаторҳои тезтар
Омӯзонидани шабакаи хеле калон метавонад бисёр суст бошад.
То ин ҷо чор роҳи тезондан ва беҳтар кардани натиҷаро дидем:
- ибтидосозии дурусти вазнҳо;
- функсияи муносиби фаъолсозӣ;
- batch-norm ё layer-norm;
- истифодаи қабатҳои пешомӯзонидашуда.
Роҳи дигари муҳим истифодаи оптимизатори тезтар аз поёнравии градиентии муқаррарӣ аст.
Оптимизаторҳои маъмулро мебинем: momentum, Nesterov, AdaGrad, RMSProp, Adam ва вариантҳои он.
Momentum
Тӯби боулингро тасаввур кунед, ки аз нишебии мулоим дар рӯйи ҳамвор меғелад. Аввал суст ҳаракат мекунад, баъд инерсия гирифта, тез мешавад ва бо мавҷудияти соиш ё муқовимати ҳаво ба суръати ҳаддӣ мерасад.
Ин ғояи асосии беҳинасозии импулсӣ — momentum аст, ки Борис Поляк соли 1964 пешниҳод кард.
Поёнравии градиентии муқаррарӣ дар нишебии мулоим қадами хурд ва дар нишебии тез қадами калон мегузорад, аммо суръат ҷамъ намекунад. Аз ин рӯ, одатан ба минимум сусттар мерасад.
Навсозии муқаррарӣ:
θ ← θ − η∇_θ J(θ).
Он градиентҳои гузаштаро ба назар намегирад. Агар градиенти маҳаллӣ хурд бошад, ҳаракат хеле суст мешавад.
Momentum бошад, таърихи градиентҳоро ба назар мегирад: дар ҳар такрор градиенти маҳаллӣ бо суръати омӯзиш ба вектори импулси m таъсир мекунад ва параметрҳо бо ин вектор нав мешаванд.
Муодилаи 11.5. Алгоритми momentum.
1. m ← βm − η∇_θ J(θ)
2. θ ← θ + m
Дар ин ҷо градиент ба қувваи боиси шитоб монанд аст, на худи суръат.
Барои пешгирии импулси аз ҳад калон коэффисиенти β истифода мешавад:
0— соиши зиёд;1— бе соиш.
Қимати маъмул 0.9 аст.
Агар градиент собит монад, бузургии ҳаддии навсозӣ ба градиент, суръати омӯзиш ва омили зерин мутаносиб аст:
1 / (1 − β).
Ҳангоми β=0.9, ин омил 10 мебошад. Пас дар чунин шароит momentum метавонад даҳ баробар тезтар ҳаракат кунад.
Дар амал градиентҳо собит нестанд, аммо momentum аз минтақаҳои ҳамвор зудтар мебарояд.
Дар боби 4 дидем, ки ҳангоми хеле гуногун будани миқёси хусусиятҳо функсияи хароҷот ба косаи дарозрӯя монанд мешавад.
Поёнравии муқаррарӣ аз канори тез зуд поён мефарояд, аммо дар тӯли водӣ суст ҳаракат мекунад. Momentum бошад, дар водӣ суръат ҷамъ мекунад.
Дар шабакаҳои бе BN ё LN ин махсусан муфид аст. Он ҳамчунин барои гузаштан аз баъзе оптимумҳои маҳаллӣ кумак мекунад.
Эзоҳ. Аз сабаби импулс оптимизатор метавонад аз минимум гузашта, баргардад ва чанд бор ларзиш кунад. Соиши муайян ин ларзишҳоро кам карда, ҳамгароиро метезонад.
Дар PyTorch:
optimizer = torch.optim.SGD(model.parameters(), momentum=0.9, lr=0.05)
Камбудӣ илова шудани як гиперпараметри дигар аст. Аммо 0.9 аксаран хуб кор карда, аз поёнравии муқаррарӣ тезтар мебошад.
Градиенти тезондашудаи Нестеров
Юрий Нестеров соли 1983 варианти хурдеро пешниҳод кард, ки аксаран аз momentum-и муқаррарӣ тезтар аст.
Nesterov accelerated gradient — NAG градиентро на дар мавқеи ҷории θ, балки каме пештар дар самти импулс ҳисоб мекунад:
θ + βm.
Муодилаи 11.6. Алгоритми градиенти тезондашудаи Нестеров.
1. m ← βm − η∇_θ J(θ + βm)
2. θ ← θ + m
Ғоя ин аст, ки вектори импулс одатан ба самти дуруст ишора мекунад. Пас градиенти каме пештар ченшуда метавонад барои қадами нав дақиқтар бошад.
Дар расми 11.7:
- ∇₁ градиенти мавқеи ибтидоист;
- ∇₂ градиенти мавқеи θ+βm аст.
Расми 11.7. Momentum-и муқаррарӣ ва Нестеров: якум градиенти пеш аз қадами импулсӣ ва дуюм градиенти баъди он нуқтаро истифода мебарад.
Навсозии Нестеров ба оптимум наздиктар мерасад. Ин беҳбудиҳои хурд ҷамъ шуда, суръатро зиёд мекунанд.
Ҳангоми убури водӣ ∇₁ метавонад ҳаракатро боз ба тарафи дигар тела диҳад, аммо ∇₂ аллакай ба қаъри водӣ бармегардонад. Пас ларзиш кам мешавад.
Дар PyTorch:
optimizer = torch.optim.SGD(model.parameters(),
momentum=0.9, nesterov=True, lr=0.05)
AdaGrad
Боз косаи дарозрӯяро ба хотир оред. Поёнравии муқаррарӣ аввал аз нишебии тез поён меравад, аммо ин самт мустақиман ба оптимуми умумӣ намебарад. Сипас дар водӣ суст ҳаракат мекунад.
Хуб мебуд алгоритм самтро барвақттар ба сӯйи оптимум ислоҳ мекард.
AdaGrad инро бо кам кардани миқёси градиент дар андозаҳои нишебтар анҷом медиҳад.
Муодилаи 11.7. Алгоритми AdaGrad.
1. s ← s + ∇_θ J(θ) ⊗ ∇_θ J(θ)
2. θ ← θ − η∇_θ J(θ) ⊘ √(s + ε)
Дар қадами аввал квадратҳои градиентҳо дар вектори s ҷамъ мешаванд. Барои ҳар ҷузъ:
sᵢ ← sᵢ + (∂J(θ) / ∂θᵢ)².
Агар функсияи хароҷот дар андозаи i нишеб бошад, sᵢ зудтар калон мешавад.
Дар қадами дуюм навсозӣ ба поёнравии муқаррарӣ монанд аст, аммо градиент ба миқёсе, ки аз ҷамъшавии квадратҳои градиентҳо вобаста аст, тақсим мешавад.
Амалҳо унсур ба унсур иҷро мешаванд. Барои пешгирии тақсим ба сифр ε, одатан 10⁻¹⁰, илова мегардад.
Ҳамин тавр, суръати омӯзиш дар андозаҳои нишеб тезтар ва дар андозаҳои мулоим сусттар кам мешавад.
Ин суръати мутобиқшавандаи омӯзиш ном дорад.
Он самти навсозиро мустақимтар ба оптимум мебарад ва ба танзими камтари суръати ибтидоӣ ниёз дорад.
AdaGrad барои масъалаҳои содаи квадратӣ аксаран хуб аст. Аммо ҳангоми омӯзонидани шабакаҳои нейронӣ суръати омӯзишро аз ҳад зиёд кам карда, пеш аз расидан ба ҳалли хуб қариб пурра меистад.
Расми 11.8. AdaGrad самти ҳаракатро нисбат ба поёнравии градиентии муқаррарӣ барвақттар ба оптимум равона мекунад.
Гарчанде PyTorch оптимизатори Adagrad дорад, истифодаи онро барои шабакаҳои амиқ тавсия намедиҳем. Барои вазифаҳои сода, масалан, регрессияи хаттӣ, он метавонад муфид бошад.
Фаҳмидани он барои дарки оптимизаторҳои мутобиқшавандаи дигар муҳим аст.
RMSProp
AdaGrad ҳамаи градиентҳоро аз оғози омӯзиш ҷамъ мекунад ва метавонад хеле зуд суст шавад.
RMSProp инро бо бештар ба назар гирифтани градиентҳои охирин ислоҳ мекунад. Барои ин дар ҷамъшавӣ коҳиши экспоненсиалӣ истифода мешавад.
Муодилаи 11.8. Алгоритми RMSProp.
1. s ← αs + (1 − α)∇_θ J(θ) ⊗ ∇_θ J(θ)
2. θ ← θ − η∇_θ J(θ) ⊘ √(s + ε)
Коэффисиенти коҳиш α одатан 0.9 аст. Ин гиперпараметри нав мебошад, аммо аксаран ҳамин қимат муносиб аст.
optimizer = torch.optim.RMSprop(model.parameters(), alpha=0.9, lr=0.05)
Ба истиснои масъалаҳои хеле сода, RMSProp қариб ҳамеша аз AdaGrad беҳтар аст.
То пайдо шудани Adam он оптимизатори дӯстдоштаи бисёр муҳаққиқон буд.
Adam
Adam — adaptive moment estimation ғояҳои momentum ва RMSProp-ро муттаҳид мекунад:
- миёнаи экспоненсиалии градиентҳои гузаштаро нигоҳ медорад;
- миёнаи экспоненсиалии квадратҳои градиентҳоро низ нигоҳ медорад.
Инҳо ба баҳогузории моменти якум ва моменти дуюми марказониданашудаи градиентҳо мувофиқанд. Номи алгоритм низ аз ҳамин ҷо меояд.
Муодилаи 11.9. Алгоритми Adam.
1. m ← β₁m − (1 − β₁)∇_θ J(θ)
2. s ← β₂s + (1 − β₂)∇_θ J(θ) ⊗ ∇_θ J(θ)
3. m̂ ← m / (1 − β₁ᵗ)
4. ŝ ← s / (1 − β₂ᵗ)
5. θ ← θ + η m̂ ⊘ √(ŝ + ε)
Дар ин муодила t рақами такрор аст, ки аз 1 оғоз мешавад.
β₁ ба коэффисиенти momentum ва β₂ ба коэффисиенти RMSProp мувофиқ аст.
Фарқи дигар ин аст, ки Adam миёнаи экспоненсиалӣ мегирад, на ҷамъи экспоненсиалӣ. Онҳо ба омили собит фарқ мекунанд.
Азбаски векторҳои ҷамъшаванда дар оғоз сифранд, дар қадамҳои аввали омӯзиш ба сифр майл доранд. Қадамҳои ислоҳи ғараз инро ҷуброн мекунанд.
Қиматҳои маъмул:
- β₁=0.9;
- β₂=0.999;
- ε=10⁻⁸.
Дар PyTorch:
optimizer = torch.optim.Adam(model.parameters(), betas=(0.9, 0.999), lr=0.05)
Азбаски Adam суръати мутобиқшаванда дорад, ба танзими камтари суръати омӯзиш ниёз дорад.
Аксаран қимати пешфарзи зерин кор мекунад:
η = 0.001.
Маслиҳат. Агар шумораи зиёди усулҳо шуморо сардаргум кунад, дар охири боб чанд роҳнамои амалӣ оварда мешавад.
Се варианти Adam низ муҳиманд: AdaMax, NAdam ва AdamW.
AdaMax
Мақолаи Adam варианти AdaMax-ро низ пешниҳод кард.
Adam навсозиҳоро бо истифодаи андозае вобаста ба нормаи ℓ₂-и градиентҳои бо вақт камвазншуда миқёсбандӣ мекунад.
AdaMax ба ҷойи он нормаи ℓ∞, яъне қимати максималии мутлақро истифода мебарад.
Он механизми ҷамъкунии квадратҳоро бо баҳогузории максимуми градиентҳои мутлақи бо вақт камшаванда иваз мекунад ва навсозиро бо он миқёсбандӣ менамояд.
Дар баъзе додаҳо AdaMax аз Adam устувортар аст, аммо одатан Adam беҳтар натиҷа медиҳад.
Агар Adam дар вазифаи муайян мушкил дошта бошад, AdaMax-ро санҷидан мумкин аст.
NAdam
NAdam Adam-ро бо ҳилаи Нестеров якҷо мекунад ва аксаран андаке тезтар ҳамгаро мешавад.
Тимоти Дозат дар гузориши муаррифии ин усул оптимизаторҳои гуногунро муқоиса карда, дарёфт, ки NAdam одатан аз Adam беҳтар аст, аммо баъзан RMSProp аз он беҳтар мешавад.
AdamW
AdamW варианти Adam бо коҳиши вазнҳо — weight decay мебошад.
Weight decay дар ҳар қадами омӯзиш вазнҳоро ба омили коҳиш, масалан, 0.99, зарб карда, хурдтар мекунад.
Ин ба мунтазамсозии ℓ₂ монанд аст, ки он ҳам вазнҳоро хурд нигоҳ медорад.
Ҳангоми истифодаи SGD, ℓ₂ ва weight decay аз ҷиҳати математикӣ ҳамарзишанд.
Аммо бо Adam ва вариантҳои он ҳамарзиш нестанд. Дар амал Adam бо ℓ₂ метавонад моделҳое диҳад, ки нисбат ба моделҳои SGD ба додаҳои нав бадтар умумият меёбанд.
AdamW бо якҷо кардани дурусти Adam ва weight decay ин мушкилро ислоҳ мекунад.
Огоҳӣ. RMSProp, Adam, AdaMax, NAdam ва AdamW аксаран зуд ба ҳалли хуб мерасанд. Аммо мақолаи соли 2017-и Ашия С. Уилсон ва ҳамкоронаш нишон дод, ки дар баъзе додаҳо ин ҳалҳо метавонанд умумиятдиҳии бад дошта бошанд. Агар аз натиҷа норозӣ бошед, NAG-ро санҷед.
Дар PyTorch:
torch.optim.NAdam
torch.optim.Adamax
torch.optim.AdamW
Барои AdamW гиперпараметри weight_decay-ро танзим кунед.
Ҳамаи усулҳои боло танҳо аз ҳосилаҳои ҷузъии тартиби якум истифода мекунанд: онҳо нишебии функсияи талафотро чен мекунанд.
Алгоритмҳои тартиби дуюм низ мавҷуданд, ки аз матритсаи Ҳессе ва каҷии функсия истифода мебаранд.
Аммо барои модели дорои n параметр шумораи ҳосилаҳои тартиби дуюм n² аст, дар ҳоле ки тартиби якум танҳо n дорад.
Азбаски шабакаҳои амиқ садҳо ҳазор ё бештар параметр доранд, матритсаи Ҳессе метавонад ҳатто дар хотира нағунҷад ва ҳисобаш хеле суст бошад.
Хушбахтона, усулҳои стохастикӣ метавонанд маълумоти тартиби дуюмро тақриб кунанд.
Яке аз онҳо Shampoo аст, ки аз маълумоти ҷамъшудаи градиентҳо истифода мебарад.
Он дар худи PyTorch нест, аммо дар китобхонаи PyTorch-Optimizer дастрас аст:
pip install torch_optimizer
Омӯзонидани моделҳои тунук
Оптимизаторҳои боло одатан моделҳои зич медиҳанд: аксари параметрҳо ғайрисифр мемонанд.
Агар пешгӯии хеле тез ё истифодаи ками хотира хоҳед, модели тунук — sparse метавонад мувофиқтар бошад.
Як роҳ:
- Моделро муқаррарӣ омӯзонед.
- Вазнҳои хеле хурдро сифр кунед.
Барои ин:
torch.nn.utils.prune.l1_unstructured()
Ҳамчунин метавонед на танҳо вазнҳои алоҳида, балки нейронҳо, каналҳо ё қисмҳои сохторро бо:
torch.nn.utils.prune.ln_structured()
ё дигар функсияҳои torch.nn.utils.prune хориҷ кунед.
Одатан ҳангоми омӯзиш мунтазамсозии ба тунукӣ мусоидаткунанда, масалан, ℓ₁, низ муфид аст. Он оптимизаторро ба сифр кардани вазнҳои бештар тела медиҳад.
Ҳамчунин метавонед ҳангоми ибтидосозӣ баъзе вазнҳои тасодуфиро хурд кунед.
Ҷадвали 11.2. Муқоисаи оптимизаторҳо.
| Оптимизатор | Суръати ҳамгароӣ | Сифати ҳамгароӣ |
|---|---|---|
SGD | ★ | ★★★ |
SGD(momentum=...) | ★★ | ★★★ |
SGD(momentum=..., nesterov=True) | ★★ | ★★★ |
Adagrad | ★★★ | ★ (хеле барвақт қатъ мешавад) |
RMSprop | ★★★ | ★★ ё ★★★ |
Adam | ★★★ | ★★ ё ★★★ |
Adamax | ★★★ | ★★ ё ★★★ |
NAdam | ★★★ | ★★ ё ★★★ |
AdamW | ★★★ | ★★ ё ★★★ |
★ — бад, ★★ — миёна, ★★★ — хуб.
Ҷадвалбандии суръати омӯзиш
Интихоби суръати хуби омӯзиш хеле муҳим аст:
- Агар аз ҳад баланд бошад, омӯзиш пароканда мешавад.
- Агар аз ҳад паст бошад, омӯзиш хеле суст ва эҳтимоли дар оптимуми маҳаллӣ мондан зиёд мешавад.
- Агар нисбатан баланд, вале ҳанӯз устувор бошад, аввал пешрафт тез мешавад, аммо дар охир модел дар атрофи оптимум «рақс» мекунад.
- Суръати доимии хеле хуб метавонад модели олӣ диҳад, аммо омӯзиш одатан андаке суст мемонад.
Аз суръати доимӣ беҳтар кор кардан мумкин аст.
Як ғояи хуб ин аст, ки бо суръати нисбатан баланд оғоз карда, дар охир ё ҳангоми қатъ шудани пешрафт онро кам кунед.
Ин омӯзишро дар оғоз тез ва танзими параметрҳоро дар охир дақиқ мекунад.
Расми 11.9. Каҷхатҳои омӯзиш барои суръатҳои гуногуни η.
Стратегияҳои тағйири суръат ҷадвалҳои суръати омӯзиш — learning schedules ном доранд.
Дар PyTorch онҳо дар torch.optim.lr_scheduler дастрасанд.
Коҳиши экспоненсиалӣ
ExponentialLR суръати омӯзишро дар фосилаҳои муайян, одатан пас аз ҳар давр, ба gamma зарб мекунад.
Пас аз n давр:
ηₙ = η₀γⁿ.
gamma одатан аз 1 хурд, вале ба он наздик интихоб мешавад.
Агар gamma=0.9 бошад:
- пас аз 10 давр суръат тақрибан 35%-и ибтидоӣ;
- пас аз 20 давр тақрибан 12%-и ибтидоӣ мешавад.
model = [...] # сохтани модел
optimizer = torch.optim.SGD(model.parameters(), lr=0.05)
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
Дар охири ҳар давр:
for epoch in range(n_epochs):
for X_batch, y_batch in train_loader:
[...] # ҳалқаи муқаррарии омӯзиш
scheduler.step()
Маслиҳат. Барои идомаи омӯзиши қатъшуда аргументи
last_epoch-ро истифода баред. Рақамгузорӣ аз сифр оғоз мешавад ва қимати пешфарзи-1оғози навро ифода мекунад.
Коҳиши косинусӣ — Cosine annealing
Ба ҷойи коҳиши экспоненсиалӣ, суръатро бо функсияи косинус аз ηₘₐₓ дар оғоз то ηₘᵢₙ дар охир кам кардан мумкин аст.
Дар муқоиса бо ҷадвали экспоненсиалӣ, суръат дар қисми зиёди омӯзиш баландтар мемонад ва дар охир ба минимум наздик мешавад.
Умуман, ин равиш аксаран беҳтар кор мекунад.
Расми 11.10. Ҷадвали коҳиши косинусии суръати омӯзиш.
Муодилаи 11.10. Муодилаи коҳиши косинусӣ.
ηₜ = ηₘᵢₙ + (1/2) · (ηₘₐₓ − ηₘᵢₙ) · (1 + cos(tπ / Tₘₐₓ))
Дар он t рақами давр аз сифр ва Tₘₐₓ шумораи умумии даврҳо мебошад.
Дар PyTorch:
cosine_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
optimizer, T_max=20, eta_min=0.001)
Онро мисли ExponentialLR истифода мебаред.
Камбудӣ ин аст, ки бояд Tₘₐₓ ва ηₘᵢₙ-ро интихоб кунед. Пешакӣ донистани шумораи муносиби даврҳо на ҳамеша осон аст.
Аз ҳамин сабаб ҷадвалбандӣ аз рӯйи натиҷа аксаран афзалтар аст.
Ҷадвалбандӣ аз рӯйи натиҷа
Performance scheduling, ё ҷадвалбандии мутобиқшаванда, дар PyTorch бо ReduceLROnPlateau татбиқ шудааст.
Он меъёри муайян, одатан талафоти тасдиқиро, пайгирӣ мекунад. Агар муддате беҳтар нашавад, суръати омӯзишро ба омили муайян зарб мекунад.
Гиперпараметрҳои асосӣ:
| Гиперпараметр | Маъно |
|---|---|
mode | Барои саҳеҳӣ "max" ва барои талафот "min" истифода мешавад. Пешфарз "min" аст. |
patience | Шумораи қадамҳо ё даврҳои интизорӣ пеш аз кам кардани суръат. Пешфарз 10 аст. |
factor | Омили кам кардани суръат. Пешфарз 0.1 аст. |
Мисол бо саҳеҳии тасдиқӣ:
[...] # сохтани модел ва оптимизатор
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(
optimizer, mode="max", patience=2, factor=0.1)
Пас аз ҳар давр меъёрро ҳисоб карда, ба step() медиҳем:
metric = torchmetrics.Accuracy(task="multiclass", num_classes=10).to(device)
for epoch in range(n_epochs):
for X_batch, y_batch in train_loader:
[...] # омӯзиши муқаррарӣ
val_metric = evaluate_tm(model, valid_loader, metric).item()
scheduler.step(val_metric)
Гармкунии суръати омӯзиш — Warm-up
То ин ҷо ҳамеша аз суръати максималӣ оғоз кардем.
Аммо баъзан ин боиси он мешавад, ки поёнравии градиентӣ дар оғоз тасодуфан ба ҳар тараф ҷаҳад: на ба таркиш дучор мешавад ва на пешрафти ҷиддӣ мекунад.
Ин бештар дар моделҳои ҳассос, масалан, шабакаҳои бозгаштӣ, ё ҳангоми бастаҳои хеле калон рӯй медиҳад.
Як роҳ гармкунӣ аст: аз суръати наздик ба сифр оғоз карда, дар чанд даври аввал онро тадриҷан то максимум зиёд мекунем.
Дар ин марҳала оптимизатор вақт меёбад ба минтақаи устувортари манзараи талафот гузарад.
Манзараи талафот баъзан ба Ҳимолой монанд аст: баланд ва пур аз қуллаҳои тез.
Бо суръати баланд метавонед муддати зиёд аз як қулла ба дигаре ҷаҳед.
Бо суръати хурд аввал аз кӯҳҳо поён меравед ва ба замини ҳамвортар мерасед. Баъд суръати баландтарро истифода карда, танҳо дар охир боз суст мешавед.
Бо LinearLR гармкунии хаттӣ месозем:
warmup_scheduler = torch.optim.lr_scheduler.LinearLR(
optimizer, start_factor=0.1, end_factor=1.0, total_iters=3)
Ин суръатро дар се қадам аз 10% то 100%-и суръати аслии оптимизатор мебарад: 10%, 40%, 70% ва баъд 100%.
Барои чандирии бештар LambdaLR истифода мешавад:
warmup_scheduler = torch.optim.lr_scheduler.LambdaLR(
optimizer,
lambda epoch: (min(epoch, 3) / 3) * (1.0 - 0.1) + 0.1)
Ҳалқаи омӯзиш чунин сохтор дорад:
for epoch in range(n_epochs):
for X_batch, y_batch in train_loader:
[...] # омӯзиши муқаррарӣ
warmup_scheduler.step()
if epoch >= 3: # ҷадвали дигар ҳангоми гармкунӣ ғайрифаъол аст
scheduler.step(val_metric)
Эзоҳи тарҷумон. Дар манбаъ
warmup_scheduler.step()дар аввали ҳар давр, пеш азoptimizer.step(), даъват мешавад. Он гоҳ PyTorch огоҳӣ медиҳад ва қадами аввали ҷадвал гум мешавад: даври аввал на бо 10%, балки бо 40%-и суръат оғоз меёбад. Аз ин рӯ,step()-ро ба охири давр, баъд аз омӯзиш, гузаронидем.
Умуман, дар охири омӯзиш паст кардани суръат қариб ҳамеша муфид аст. Агар оғоз ноустувор бошад, гармкунӣ низ кумак мекунад.
Аммо баъзан тағйири суръат дар миёнаи омӯзиш низ лозим мешавад.
Агар оптимизатор дар оптимуми маҳаллӣ ё минтақаи ҳамвори баланд бимонад, муваққатан зиёд кардани суръат метавонад онро аз он ҷо берун барад.
Метавон каҷхатҳои омӯзишро дастӣ назорат кард ё ҷадвалбанди фармоишие сохт, ки ҳангоми дармондан суръатро муваққатан баланд мекунад.
Барои ин аз LRScheduler зерсинф сохтан мумкин аст. Аммо роҳи содатар — коҳиши косинусӣ бо бозоғозиҳои гарм — мебошад.
Коҳиши косинусӣ бо бозоғозиҳои гарм
Ин равишро Иля Лошчилов ва Франк Ҳуттер соли 2016 пешниҳод карданд.
Он ҷадвали косинусиро такроран иҷро мекунад. Суръати омӯзиш дар фосилаҳои муайян боз баланд мешавад ва метавонад аз оптимумҳои маҳаллӣ ва минтақаҳои ҳамвор берун барояд.
Муаллифон тавсия доданд, ки давраи аввал кӯтоҳ бошад ва баъд Tₘₐₓ дар ҳар давра ду баробар зиёд шавад.
Дар оғоз ҷустуҷӯи зудтар ва дар охир беҳинасозии тӯлонитар анҷом меёбад.
Расми 11.11. Коҳиши косинусӣ бо бозоғозиҳои гарм.
Дар PyTorch:
cosine_repeat_scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(
optimizer, T_0=2, T_mult=2, eta_min=0.001)
Дар ин ҷо:
T_0— дарозии давраи аввал;T_mult=2— ду баробар шудани дарозии ҳар давраи нав;- пешфарзи
T_mult=1— ҳамаи давраҳо ҳамдарозанд; eta_min— суръати камтарин, пешфарз0.
Ҷадвали 1cycle
1cycle-ро Лесли Смит соли 2018 пешниҳод кард.
Дар тавсифи матн:
- Суръат аз η₀ то η₁ дар қисми аввали омӯзиш хаттӣ зиёд мешавад.
- Дар қисми дуюм боз то η₀ паст мешавад.
- Дар чанд даври охир боз чанд тартиби бузургӣ кам мегардад.
Суръати максималии η₁ бо ҷустуҷӯи суръати муносиб интихоб мешавад. Суръати ибтидоӣ η₀ одатан даҳ баробар камтар аст.
Ҳангоми истифодаи momentum:
- аввал қимати баланд, масалан,
0.95; - дар қисми аввал коҳиш то
0.85; - дар қисми дуюм афзоиш то
0.95; - дар охир нигоҳ доштани ҳамин максимум.
Дар таҷрибаҳои Смит ин равиш омӯзишро хеле тез карда, натиҷаро беҳтар намуд.
Масалан, дар CIFAR10 бо ҳамон меъморӣ 91,9% саҳеҳии тасдиқӣ дар 100 давр ба даст омад, дар муқоиса бо 90,3% дар 800 даври равиши муқаррарӣ.
Ин натиҷа ҳамгароии фавқулода — super-convergence ном гирифт.
Дар PyTorch OneCycleLR мавҷуд аст.
Маслиҳат. Агар намедонед кадом ҷадвалро интихоб кунед, 1cycle интихоби хуби ибтидоӣ аст. Муаллиф аксаран аз ҷадвалбандӣ аз рӯйи натиҷа натиҷаи беҳтар мегирад. Барои оғози ноустувор warm-up ва барои дармондан дар минтақаҳои ҳамвор коҳиши косинусӣ бо бозоғозиҳоро санҷед.
PyTorch ҷадвалҳои дигар низ дорад: полиномӣ, даврӣ ва воситаҳои пайвастани чанд ҷадвал. Ҳуҷҷатгузориро баррасӣ кунед.
Акнун ба мавзуи охирини боб — мунтазамсозӣ — мегузарем.
Пешгирии аз ҳад мутобиқшавӣ бо мунтазамсозӣ
«Бо чор параметр филро мутобиқ мекунам ва бо панҷ параметр хартуми онро ба ҳаракат меорам».
— Ҷон фон Нейман, бо нақли Энрико Ферми дар Nature 427
Бо ҳазорон параметр тамоми боғи ҳайвонотро мутобиқ кардан мумкин аст!
Шабакаҳои амиқ одатан даҳҳо ҳазор ва баъзан миллионҳо ё миллиардҳо параметр доранд.
Ин ба онҳо озодии бузург медиҳад, то додаҳои хеле мураккабро мутобиқ кунанд. Аммо ҳамин чандирӣ хавфи аз ҳад мутобиқшавиро меафзояд.
Дар боби 4 аллакай қатъи барвақтӣ-ро истифода кардем. BN ва LN низ, бо вуҷуди ҳадафи асосии устуворсозии градиентҳо, ҳамчун мунтазамсоз амал мекунанд.
Акнун ℓ₁, ℓ₂, dropout, MC dropout ва max-norm-ро мебинем.
Мунтазамсозии ℓ₁ ва ℓ₂
Мисли моделҳои хаттии боби 4:
- ℓ₂ вазнҳоро маҳдуд ва хурд нигоҳ медорад;
- ℓ₁ барои гирифтани модели тунук бо вазнҳои сифрии зиёд муфид аст.
Тавре ҳангоми AdamW дидем, бо SGD, бо momentum ё бе он, ℓ₂ ба weight decay ҳамарзиш аст.
Пас кофист weight_decay-ро муайян кунед:
optimizer = torch.optim.SGD(model.parameters(), lr=0.05, weight_decay=1e-4)
[...] # омӯзиши муқаррарӣ
Агар Adam истифода баред, беҳтар аст ба AdamW гузаред ва weight_decay-ро танзим кунед.
Ин айнан ℓ₂ нест, аммо дар амал беҳтар кор мекунад.
Weight decay ба ҳамаи параметрҳо, аз ҷумла ҷойивазкуниҳо ва параметрҳои BN ё LN, татбиқ мешавад.
Одатан ин мушкили калон нест, аммо ҷарима кардани чунин параметрҳо фоидаи ками мунтазамсозӣ дорад ва баъзан омӯзишро бад мекунад.
Чӣ гуна танҳо параметрҳои интихобшударо мунтазам созем?
Як роҳ ҳисоб кардани ℓ₂-и дастӣ ва илова кардани он ба талафоти асосӣ аст:
optimizer = torch.optim.SGD(model.parameters(), lr=0.05)
params_to_regularize = [
param for name, param in model.named_parameters()
if not "bias" in name and not "bn" in name]
for epoch in range(n_epochs):
for X_batch, y_batch in train_loader:
[...] # қисми боқимондаи ҳалқа мисли пештара
main_loss = loss_fn(y_pred, y_batch)
l2_loss = sum(param.pow(2.0).sum() for param in params_to_regularize)
loss = main_loss + 1e-4 * l2_loss
[...]
Роҳи дигар гурӯҳҳои параметрҳо мебошад.
То ин ҷо ҳамаи параметрҳоро дар як рӯйхат ба оптимизатор медодем. Онҳо як гурӯҳ бо гиперпараметрҳои умумӣ мешуданд.
Ба ҷойи ин метавонед рӯйхати луғатҳо диҳед. Ҳар луғат:
- калиди
"params"бо рӯйхати параметрҳо; - ва гиперпараметрҳои ихтиёрии махсуси ҳамон гурӯҳ дорад.
Гиперпараметрҳои гурӯҳӣ аз умумӣ болотар меистанд.
Масалан, гурӯҳи якум weight decay дорад ва гурӯҳи ҷойивазкуниҳою BN надорад:
params_bias_and_bn = [
param for name, param in model.named_parameters()
if "bias" in name or "bn" in name]
optimizer = torch.optim.SGD([
{"params": params_to_regularize, "weight_decay": 1e-4},
{"params": params_bias_and_bn},
], lr=0.05)
[...] # истифодаи муқаррарии оптимизатор
Маслиҳат. Гурӯҳҳои параметрҳо барои қисмҳои гуногуни модел суръатҳои гуногуни омӯзиш низ имкон медиҳанд. Ин махсусан дар омӯзиши интиқолӣ муфид аст: қабатҳои навро тезтар ва қабатҳои истифодашударо сусттар нав мекунед.
Барои ℓ₁ PyTorch ёвари махсуси оптимизаторӣ намедиҳад. Онро дастӣ илова мекунем:
l1_loss = sum(param.abs().sum() for param in params_to_regularize)
loss = main_loss + 1e-4 * l1_loss
Ҳамааш ҳамин аст. Ба dropout мегузарем.
Dropout
Dropout дар мақолаи соли 2012-и Ҷеффри Ҳинтон ва ҳамкоронаш пешниҳод ва дар мақолаи соли 2014-и Нитиш Сривастава ва ҳамкоронаш муфассалтар шарҳ дода шуд.
Он хеле муваффақ аст: бисёр шабакаҳои пешрафта бо он 1–2 банди фоизӣ саҳеҳии бештар мегиранд.
Ин кам менамояд, аммо агар саҳеҳӣ аллакай 95% бошад, афзоиш то 97% маънои кам шудани хатогӣ аз 5% то 3%, яъне тақрибан 40%-ро дорад.
Алгоритм сода аст: дар ҳар қадами омӯзиш ҳар нейрон эҳтимоли p-и муваққатан хомӯш шудан дорад.
Нейрони хомӯшшуда дар ҳамин қадам пурра сарфи назар мешавад, аммо дар қадами навбатӣ метавонад фаъол бошад.
Ин метавонад нейронҳои вурудиро низ фаро гирад, аммо одатан ба нейронҳои баромад татбиқ намешавад.
Гиперпараметри p меъёри dropout ном дорад ва одатан аз 10% то 50% аст:
- барои шабакаҳои бозгаштӣ аксаран 20–30%;
- барои шабакаҳои конволютсионӣ аксаран 40–50%.
Пас аз омӯзиш нейронҳо дигар хомӯш карда намешаванд.
Дар аввал аҷиб менамояд, ки чунин усули «вайронкунанда» кор мекунад.
Оё ширкат беҳтар мешуд, агар кормандон ҳар саҳар танга партофта, қарор мекарданд, ки ба кор раванд ё не?
Шояд ширкат маҷбур мешуд донишу вазифаҳои муҳимро байни чанд нафар тақсим кунад ва ба як шахс такя накунад. Кормандон бояд бо ҳамкорони гуногун кор карданро меомӯхтанд ва ташкилот устувортар мешуд.
Барои ширкатҳо ин танҳо ташбеҳ аст, аммо барои шабакаҳо кор мекунад.
Нейронҳои бо dropout омӯзонидашуда наметавонанд ба чанд ҳамсояи муайян аз ҳад такя кунанд. Онҳо бояд мустақилона муфид бошанд ва ба вурудҳои гуногун диққат диҳанд.
Дар натиҷа, шабака ба тағйироти хурди вуруд камҳассос ва умумиятдиҳиаш беҳтар мешавад.
Расми 11.12. Дар ҳар такрори омӯзиш зермаҷмӯи тасодуфии нейронҳои як ё чанд қабат хомӯш мешавад. Баромади онҳо дар ин такрор сифр аст.
Роҳи дигари дарки dropout ин аст, ки дар ҳар қадами омӯзиш шабакаи нави алоҳида ҳосил мешавад.
Агар N нейрон хомӯшшаванда бошад, шумораи шабакаҳои имконпазир:
2ᴺ
аст.
Ин шумора чунон калон мебошад, ки такрори айнан ҳамон шабака қариб номумкин аст.
Пас аз 10 000 қадами омӯзиш гӯё 10 000 шабакаи гуногунро, ҳар кадом дар як қадами омӯзиш, омӯзонидаед.
Онҳо мустақил нестанд, зеро вазнҳои муштарак доранд, аммо сохторашон фарқ мекунад.
Шабакаи ниҳоиро метавон ансамбли миёнагирандаи ҳамаи ин шабакаҳои хурдтар донист.
Маслиҳат. Қабатҳои болоӣ, ки омезишҳои мураккабтари хусусиятҳоро меомӯзанд, бештар ба аз ҳад мутобиқшавӣ майл доранд. Аз ин рӯ, аксаран dropout-ро танҳо ба як то се қабати болоии пинҳонӣ татбиқ кардан кофист. Нейронҳои баромадро хомӯш накунед: ин ба тағйир додани худи вазифа ҳангоми омӯзиш монанд аст.
Як ҷузъиёти техникии муҳим вуҷуд дорад.
Фарз кунед p=75%. Дар омӯзиш ба ҳисоби миёна танҳо 25%-и нейронҳо фаъоланд.
Пас аз омӯзиш, вақте ҳама фаъол мешаванд, ҳар нейрон ба ҳисоби миёна чор баробар бештар вуруд мегирад. Ин фарқ метавонад моделро вайрон кунад.
Барои пешгирӣ, ҳангоми омӯзиш қиматҳои боқимондаро чор баробар зиёд мекунем. Умуман, онҳоро ба эҳтимоли нигоҳдорӣ тақсим мекунем:
1 − p.
Дар PyTorch nn.Dropout ҳамин корро мекунад.
- Дар ҳолати омӯзиш баъзе вурудҳоро сифр ва боқимондаро ба 1−p тақсим мекунад.
- Дар ҳолати арзёбӣ вурудро бетағйир мегузаронад.
Мисол бо p=0.2 пеш аз ҳар nn.Linear:
model = nn.Sequential(
nn.Flatten(),
nn.Dropout(p=0.2), nn.Linear(1 * 28 * 28, 100), nn.ReLU(),
nn.Dropout(p=0.2), nn.Linear(100, 100), nn.ReLU(),
nn.Dropout(p=0.2), nn.Linear(100, 100), nn.ReLU(),
nn.Dropout(p=0.2), nn.Linear(100, 10)
).to(device)
Огоҳӣ. Dropout танҳо ҳангоми омӯзиш фаъол аст. Аз ин рӯ, муқоисаи мустақими талафоти омӯзишӣ ва тасдиқӣ метавонад гумроҳкунанда бошад. Модел метавонад ба аз ҳад мутобиқшавӣ дучор бошад, вале ду талафот монанд бошанд. Талафоти омӯзиширо бе dropout, масалан, пас аз омӯзиш дар ҳолати арзёбӣ, низ ҳисоб кунед.
Агар аз ҳад мутобиқшавӣ бошад, dropout-ро зиёд кунед. Агар каммутобиқшавӣ бошад, онро кам кунед.
Барои қабатҳои калон меъёри баландтар ва барои қабатҳои хурд пасттар низ муфид буда метавонад.
Бисёр меъмориҳо dropout-ро танҳо дар чанд қабати охир истифода мебаранд.
Dropout ҳамгароиро одатан суст мекунад, аммо ҳангоми танзими дуруст модели беҳтар медиҳад. Барои моделҳои калон ин хароҷот аксаран арзанда аст.
Маслиҳат. Барои шабакаи худнормалшавандаи SELU аз alpha dropout истифода баред. Он миёна ва инҳирофи стандартиро нигоҳ медорад. Dropout-и муқаррарӣ худнормалшавиро вайрон мекунад. Дар PyTorch ин
nn.AlphaDropoutмебошад.
Monte Carlo dropout
Дар мақолаи соли 2016-и Ярин Гал ва Зубин Ғаҳрамонӣ боз ду далели муҳими истифодаи dropout оварда шуд:
- Байни шабакаҳои dropout ва хулосабарории тақрибии байесӣ робитаи математикӣ нишон дода шуд.
- Усули Monte Carlo dropout — MC dropout пешниҳод гардид.
MC dropout метавонад бе омӯзиши дубора натиҷаи модели омӯзонидашудаи dropout-ро беҳтар карда, баҳогузории беҳтари номуайяниро диҳад.
Он аз dropout-и муқаррарӣ танҳо бо як чиз фарқ мекунад: ҳангоми арзёбӣ низ фаъол мемонад.
Аз ин рӯ, пешгӯиҳо каме тасодуфӣ мешаванд. Ба ҷойи як пешгӯӣ чандин пешгӯӣ карда, миёнаи онҳоро мегирем.
Мисол барои бастаи се тасвир:
model.eval()
for module in model.modules():
if isinstance(module, nn.Dropout):
module.train()
X_new = [...] # масалан, се тасвири аввали Fashion MNIST
X_new = X_new.to(device)
torch.manual_seed(42)
with torch.no_grad():
X_new_repeated = X_new.repeat_interleave(100, dim=0)
y_logits_all = model(X_new_repeated).reshape(3, 100, 10)
y_probas_all = torch.nn.functional.softmax(y_logits_all, dim=-1)
y_probas = y_probas_all.mean(dim=1)
Қадамҳо:
- Моделро ба арзёбӣ мегузаронем, аммо қабатҳои dropout-ро боз ба ҳолати омӯзиш мегузорем, то вурудҳоро тасодуфан хомӯш кунанд.
- Се тасвири навро ба GPU мебарем.
- Аз ҳар тасвир 100 нусха месозем. Шакли бастаи нав
[300, 1, 28, 28]аст. - Модел барои ҳар тасвир 10 логит медиҳад. Натиҷаи
[300, 10]-ро ба[3, 100, 10]табдил медиҳем. - Аз сабаби dropout ҳатто пешгӯиҳои нусхаҳои як тасвир фарқ мекунанд.
- Логитҳоро ба эҳтимолият табдил медиҳем.
- Аз рӯйи 100 пешгӯӣ миёна мегирем. Натиҷа
[3, 10]аст.
>>> y_probas.round(decimals=2)
tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0100, 0.0000,
0.9900],
[0.9900, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0100, 0.0000, 0.0000,
0.0000],
[0.4100, 0.0400, 0.0400, 0.2300, 0.0400, 0.0000, 0.2300, 0.0000, 0.0100,
0.0000]], device='cuda:0')
Огоҳӣ. Шояд хоҳед аввал миёнаи логитҳоро гирифта, баъд softmax татбиқ кунед. Ин тезтар аст, аммо номуайяниро дуруст ифода намекунад ва моделро аз ҳад эътимоднок мекунад. Аввал ҳар пешгӯиро ба эҳтимолият табдил диҳед, баъд миёна гиред.
MC dropout одатан эътимоднокии баҳогузории эҳтимолиятҳоро беҳтар мекунад.
Модел камтар бо эътимоди баланд хато мекунад. Барои системаҳои ҳассос ин муҳим аст: масалан, намехоҳед мошини худрон аломати «ист»-ро бо эътимоди баланд сарфи назар кунад.
Ин равиш вақте ҳам муфид аст, ки ба чанд синфи беҳтарин таваҷҷуҳ доред, на танҳо ба якум.
Инҳирофи стандартии эҳтимолияти ҳар синфро низ ҳисоб кардан мумкин аст:
>>> y_std = y_probas_all.std(dim=1)
>>> y_std.round(decimals=2)
tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0200, 0.0000,
0.0200],
[0.0200, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0200, 0.0000, 0.0000,
0.0000],
[0.1700, 0.0300, 0.0300, 0.1300, 0.0500, 0.0000, 0.0900, 0.0000, 0.0100,
0.0000]], device='cuda:0')
Барои синфи 9, яъне мӯзаи кӯтоҳ, дар тасвири якум эҳтимолият 99% ва инҳирофи стандартӣ 0.02 аст.
Ин нишон медиҳад, ки ба қимати 99% бояд бо эҳтиёт муносибат кард: дар пешгӯиҳои тасодуфии модел каме тағйир вуҷуд дорад.
Дар системаи ҳассос ба хавф, масалан, тиббӣ ё молиявӣ, метавонед танҳо пешгӯиҳоеро қабул кунед, ки ҳам эҳтимолияти баланд ва ҳам инҳирофи стандартии паст доранд.
Эзоҳ. Шумораи намунаҳои Monte Carlo, дар ин мисол
100, гиперпараметр аст. Ҳар қадар зиёд бошад, баҳогузории пешгӯӣ ва номуайянӣ дақиқтар, аммо иҷро сусттар мешавад. Пас аз ҳадди муайян беҳбудӣ ночиз мегардад. Байни таъхир, қобилияти коркард ва саҳеҳӣ тавозуни муносиб интихоб кунед.
Агар моделро аз сифр барои MC dropout месозед, беҳтар аст модули фармоишӣ истифода баред, то ба тағйироти дастии train() ва eval() такя накунед:
class McDropout(nn.Dropout):
def forward(self, input):
return F.dropout(input, self.p, training=True)
MC dropout натиҷаи моделҳои dropout-ро беҳтар карда, номуайяниро низ баҳогузорӣ мекунад. Ҳангоми омӯзиш он ҳамон dropout-и муқаррарӣ аст ва ҳамчун мунтазамсоз амал мекунад.
Мунтазамсозии max-norm
Усули дигари маъмул max-norm мебошад.
Барои ҳар нейрон вазнҳои пайвастҳои воридшаванда w тавре маҳдуд мешаванд, ки:
‖w‖₂ ≤ r,
ки дар он r гиперпараметр ва ‖·‖₂ нормаи евклидӣ аст.
Кам кардани r мунтазамсозиро қавитар ва аз ҳад мутобиқшавиро кам мекунад.
Агар BN ё LN истифода набаред, max-norm метавонад ба устувории градиентҳо низ кумак кунад.
Ба ҷойи илова кардани ҷарима ба талафот, одатан пас аз ҳар қадами омӯзиш норма ҳисоб мешавад. Агар аз ҳад зиёд бошад, вазнҳо миқёсбандӣ мешаванд:
w ← w · r / ‖w‖₂.
Татбиқи маъмул дар PyTorch:
def apply_max_norm(model, max_norm=2, epsilon=1e-8, dim=1):
with torch.no_grad():
for param in model.parameters():
if param.dim() >= 2: # танҳо вазнҳо, на bias ва на вазнҳои BN/LN
actual_norm = param.norm(p=2, dim=dim, keepdim=True)
target_norm = torch.clamp(actual_norm, 0, max_norm)
param *= target_norm / (epsilon + actual_norm)
Функсия танҳо параметрҳои камаш дученакаро коркард мекунад: ҷойивазкуниҳо ва вазнҳои якченакаи nn.BatchNorm1d ё nn.LayerNorm дастнахӯрда мемонанд.
Эзоҳи тарҷумон. Дар манбаъ шарт
if 'bias' not in nameаст. Он вазнҳои якченакаи BN ва LN-ро намегузаронад ваparam.norm(dim=1)барои онҳо боIndexErrorмеафтад. Шартиparam.dim() >= 2ҳамон вазнҳоиnn.Linearва қабатҳои конволютсиониро мегирад.
Барои вазнҳои nn.Linear шакл чунин аст:
[шумораи нейронҳо, шумораи вурудҳо]
Аз ин рӯ, dim=1 нормаи ҳар сатри вазнҳо, яъне вазнҳои воридшавандаи ҳар нейронро ҳисоб мекунад.
torch.clamp() ҳамаи нормаҳои аз max_norm калонро ба ҳамин ҳад баробар мекунад.
Баъд ҳар сатри вазнҳо миқёсбандӣ мешавад, то нормаи мақсаднокро гирад.
epsilon тақсим ба сифрро ҳангоми сифр будани норма пешгирӣ мекунад.
Акнун дар ҳалқаи омӯзиш фавран пас аз:
optimizer.step()
чунин даъват кунед:
apply_max_norm(model)
Гиперпараметри max_norm-ро низ танзим кардан мумкин аст.
Маслиҳат. Барои қабатҳои дигар шояд
dim-ро тағйир додан лозим шавад. Масалан, барои қабатҳои конволютсионӣ одатанdim=[1, 2, 3]истифода мешавад, то нормаи ҳар ядрои конволютсионӣ маҳдуд гардад.
Роҳнамои амалӣ
Дар ин боб усулҳои зиёдеро омӯхтем. Кадомашонро истифода бояд бурд?
Ин аз вазифа вобаста аст ва қоидаи ягона вуҷуд надорад. Аммо конфигуратсияи ҷадвали 11.3 дар бисёр ҳолатҳо бе танзими зиёди гиперпараметрҳо хуб кор мекунад.
Инҳоро қоидаҳои қатъӣ ҳисоб накунед.
Ҷадвали 11.3. Конфигуратсияи пешфарзи шабакаи амиқ
| Гиперпараметр | Интихоби пешфарз |
|---|---|
| Ибтидосозии вазнҳо | Ибтидосозии Ҳе |
| Функсияи фаъолсозӣ | Барои шабакаи камқабата ReLU; барои амиқ Swish |
| Нормалсозӣ | Барои камқабата ҳеҷ; барои амиқ BN ё LN |
| Мунтазамсозӣ | Қатъи барвақтӣ; ҳангоми зарурат weight decay |
| Оптимизатор | NAG ё AdamW |
| Ҷадвали суръати омӯзиш | Аз рӯйи натиҷа ё 1cycle |
Ҳамчунин:
- агар модели вазифаи монанд мавҷуд бошад, қисме аз онро истифода баред;
- агар додаҳои бебарчасп зиёд бошанд, пешомӯзиши беназоратро санҷед;
- агар барои вазифаи монанд додаҳои барчаспдори зиёд дошта бошед, пешомӯзиш дар вазифаи ёрирасонро истифода баред.
Чанд истисно низ ҳаст.
Агар модели тунук лозим бошад, аз ℓ₁ истифода баред. Пас аз омӯзиш вазнҳои хурдро бо torch.nn.utils.prune.l1_unstructured() низ сифр кардан мумкин аст. Ин худнормалшавиро вайрон мекунад, бинобар ин ба конфигуратсияи маъмулии ҷадвал такя кунед.
Агар пешгӯии хеле зуд лозим бошад, шояд қабатҳои камтар ва функсияи тези фаъолсозӣ, масалан, nn.ReLU, nn.LeakyReLU ё nn.Hardswish, мувофиқ бошанд. Модели тунук низ кумак карда метавонад.
Агар имкон бошад, қабатҳои нормалсозиро бо қабатҳои пешина муттаҳид кардан низ муфид аст.
Паст кардани дақиқӣ аз 32 бит ба 16 ё ҳатто 8 бит низ метавонад андоза ва вақти иҷроиро кам кунад. Моделҳои дақиқияшон паст, дақиқии омехта ва квантсозӣ дар дафтари Appendix_B_mixed_precision_and_quantization.ipynb дар https://github.com/ageron/handson-mlp баррасӣ мешаванд.
Агар барнома ба хавф ҳассос бошад ё таъхири пешгӯӣ чандон муҳим набошад, MC dropout-ро барои беҳтар кардани натиҷа ва гирифтани эҳтимолиятҳои боэътимодтару баҳогузории номуайянӣ санҷед.
Дар се боби охир фаҳмидем, ки шабакаҳои сунъии нейронӣ чистанд, онҳоро бо Scikit-Learn ва PyTorch чӣ гуна месозанд ва меомӯзонанд ва кадом усулҳо омӯзонидани шабакаҳои амиқу мураккабро имконпазир мекунанд.
Дар боби оянда ҳамаи ин донишҳоро дар яке аз муҳимтарин самтҳои омӯзиши амиқ — биниши компютерӣ — истифода мебарем.

Барномасозӣ
Олами Афсонаҳо
Ахбор