Працуем з нейрасеткамі: чэк-ліст для адладкі.

Працуем з нейрасеткамі: чэк-ліст для адладкі.

Код праграмных прадуктаў для машыннага навучання часта бывае складаным і даволі заблытаным. Выяўленне і ліквідацыя багаў у ім - рэсурсаёмістая задача. Нават найпростыя нейрасеткі з прамой сувяззю патрабуюць сур'ёзнага падыходу да сеткавай архітэктуры, ініцыялізацыі шаляў, аптымізацыі сеткі. Невялікая памылка можа прывесці да ўзнікнення непрыемных праблем.

Гэты артыкул прысвечаны алгарытму адладкі вашых нейронавых сетак.

Skillbox рэкамендуе: Практычны курс Python-распрацоўшчык з нуля.

Нагадваем: для ўсіх чытачоў "Хабра" - зніжка 10 000 рублёў пры запісе на любы курс Skillbox па промакодзе "Хабр".

Алгарытм складаецца з пяці этапаў:

  • просты старт;
  • пацвярджэнне страт;
  • праверка прамежкавых вынікаў і злучэнняў;
  • дыягностыка параметраў;
  • кантраляванне працы.

Калі вам нешта здаецца цікавейшым, чым астатняе, можаце адразу пераходзіць да гэтых частак.

Просты старт

Нейронную сетку са складанай архітэктурай, регуляризацией і планавальнікам хуткасці навучання дэбажыць складаней, чым звычайную. Мы тут крыху хітрым, паколькі сам пункт да адладкі мае апасродкаванае стаўленне, але гэта ўсё ж важная рэкамендацыя.

Просты старт заключаецца ў стварэнні спрошчанай мадэлі і навучанні яе на адным наборы (кропцы) даных.

Спачатку ствараем спрошчаную мадэль

Для хуткага старту ствараем невялікую сетку з адзіным утоеным пластом і правяраем, каб усё працавала карэктна. Затым паступова ўскладняем мадэль, правяраючы кожны новы аспект яе структуры (дадатковага пласта, параметра і да т.п.), і рухаемся далей.

Навучальны мадэль на адзіным наборы (кропцы) дадзеных

У якасці хуткай праверкі працаздольнасці вашага праекта можна выкарыстоўваць для навучання адну ці дзве кропкі дадзеных, каб пацвердзіць, ці карэктна працуе сістэма. Нейронавая сетка павінна паказаць 100% дакладнасці навучання і праверкі. Калі гэта не так, то альбо мадэль занадта малая, альбо ў вас ужо ёсць баг.

Нават калі ўсё добра, падрыхтуйце мадэль да праходу адной ці некалькіх эпох перш, чым ісці далей.

Ацэнка страт

Ацэнка страт - асноўны спосаб удакладніць прадукцыйнасць мадэлі. Вам неабходна пераканацца, што страта адпавядае задачы, а функцыі страт ацэньваюцца па карэктнай шкале. Калі вы выкарыстоўваеце больш аднаго тыпу страт, то пераканаецеся ў тым, што ўсе яны аднаго парадку і правільна маштабаваны.

Важна быць уважлівым да пачатковых страт. Праверце, наколькі блізкі рэальны вынік да чаканага, калі мадэль стартавала са выпадковай здагадкі. У працы Андрэя Карпаці прапануецца наступнае: «Упэўніцеся, што вы атрымліваеце вынік, чаканы пры пачатку працы з невялікім лікам параметраў. Лепш адразу праверыць страту дадзеных (з усталёўкай ступені рэгулярызацыі на нуль). Да прыкладу, для CIFAR-10 з класіфікатарам Softmax мы чакаем, што пачатковыя страты будуць 2.302, таму што чаканая дыфузная верагоднасць складае 0,1 для кожнага класа (бо існуе 10 класаў), а страта Softmax з'яўляецца адмоўнай лагарыфмічнай верагоднасцю карэктнага класа ln (0.1) = 2.302».

Для бінарнага прыкладу проста робіцца аналагічны разлік для кожнага класа. Вось, напрыклад, дадзеныя: 20% 0's і 80% 1's. Чаканая пачатковая страта складзе да -0,2 ln (0,5) -0,8 ln (0,5) = 0,693147. Калі вынік больш 1, гэта можа паказваць на тое, што вагі нейросетки не збалансаваны належным чынам або дадзеныя не нармалізаваны.

Правяраем прамежкавыя вынікі і злучэнні

Для адладкі нейрасеткі неабходна разумець дынаміку працэсаў усярэдзіне сетак і роля асобных прамежкавых пластоў, паколькі яны злучаны. Вось тыповыя памылкі, з якімі вы можаце сутыкнуцца:

  • няправільныя выразы для абнаўленняў градыенту;
  • не прымяняюцца абнаўлення вагі;
  • знікаючыя або выбухаюць градыенты (exploding gradients).

Калі значэнні градыенту нулявыя, гэта азначае, што хуткасць навучання ў аптымізатары занадта малая, альбо тое, што вы сутыкнуліся з некарэктным выразам для абнаўлення градыенту.

Акрамя таго, неабходна сачыць за значэннямі функцый актывацый, шаляў і абнаўленняў кожнага з пластоў. Да прыкладу, велічыня абнаўленняў параметраў (шаляў і зрушэнняў) павінна складаць 1-e3.

Існуе з'ява, якая атрымала назву “Dying ReLU” ці «праблема знікаючага градыенту», Калі нейроны ReLU будуць выводзіць нуль пасля вывучэння вялікага адмоўнага значэння (bias) зрушэння для яго вагаў. Гэтыя нейроны больш ніколі не актывуюцца ні ў адным месцы дадзеных.

Вы можаце выкарыстоўваць праверку градыенту для выяўлення гэтых памылак шляхам апраксімацыі градыенту з выкарыстаннем лікавага падыходу. Калі ён блізкі да разлічаных градыентаў, тое зваротнае распаўсюджванне было рэалізавана правільна. Каб стварыць праверку градыенту, азнаёмцеся з гэтымі выдатнымі рэсурсамі з CS231 тут и тут, а таксама з урокам Эндру Ына (Andrew Nga) па гэтай тэме.

Файзан Шэйх паказвае тры асноўныя спосабы візуалізацыі нейрасеткі:

  • Папярэднія - простыя метады, якія паказваюць нам агульную структуру навучанай мадэлі. Яны ўключаюць вывад формаў або фільтраў асобных пластоў нейронавай сеткі і параметраў у кожным пласце.
  • Заснаваныя на актывацыі. У іх мы расшыфроўваем актывацыі асобных нейронаў ці групы нейронаў, каб зразумець іх функцыі.
  • Заснаваныя на градыентах. Гэтыя метады маюць тэндэнцыю маніпуляваць градыентамі, якія фармуюцца з праходу наперад і назад пры навучанні мадэлі (уключаючы карты значнасці і карты актывацыі класа).

Ёсць некалькі карысных прылад для візуалізацыі актывацый і злучэнняў асобных пластоў, напрыклад, ConX и Tensorboard.

Працуем з нейрасеткамі: чэк-ліст для адладкі.

Дыягностыка параметраў

У нейросетей маса параметраў, якія ўзаемадзейнічаюць сябар з сябрам, што ўскладняе аптымізацыю. Уласна, гэты раздзел - прадмет актыўных даследаванняў спецыялістаў, таму прапановы ніжэй павінны разглядацца толькі як парады, пачатковыя кропкі, ад якіх можна адштурхвацца.

Памер пакета (batch size) - калі неабходна, каб памер пакета быў досыць вялікім для атрымання дакладных адзнак градыенту памылкі, але досыць малым, каб стахастычны градыентны спуск (SGD) мог упарадкаваць вашу сетку. Невялікія памеры пакетаў прывядуць да хуткага сыходжання за кошт шуму ў працэсе навучання і ў далейшым - да цяжкасцяў аптымізацыі. Падрабязней гэта апісана тут.

Хуткасць навучання - занадта нізкая прывядзе да павольнай канвергенцыі або рызыцы затрымацца ў лакальных мінімумах. У той жа час высокая хуткасць навучання выкліча разыходжанне аптымізацыі, паколькі вы рызыкуеце "скокнуць" праз глыбокую, але пры гэтым вузкую частку функцыі страты. Паспрабуйце выкарыстоўваць планаванне хуткасці, каб знізіць яе ў працэсе навучання нейрасеткі. У курсе CS231n ёсць вялікі раздзел, прысвечаны гэтай праблеме.

Gradient clipping  - Абразанне градыентаў параметраў падчас зваротнага распаўсюджвання па максімальным значэнні або лімітавай норме. Карысна для вырашэння праблем з любымі выбуховымі градыентамі, з якімі вы можаце сутыкнуцца ў трэцім пункце.

Пакетная нармалізацыя - выкарыстоўваецца для нармалізацыі ўваходных дадзеных кожнага пласта, што дазваляе вырашыць праблему ўнутранага каварыятнага зруху. Калі вы карыстаецеся Dropout і Batch Norma разам, азнаёмцеся з гэтым артыкулам.

Стахастычны градыентны спуск (SGD) - Існуе некалькі разнавіднасцяў SGD, якія выкарыстоўваюць імпульс, адаптыўныя хуткасці навучання і метад Несцерава. Пры гэтым ні ў адной з іх няма відавочнай перавагі як па эфектыўнасці навучання, так і па абагульненні (падрабязнасці тут).

Рэгулярызацыя - мае вырашальнае значэнне для пабудовы абагульняемай мадэлі, паколькі дадае штраф за складанасць мадэлі або экстрэмальныя значэння параметраў. Гэта спосаб зменшыць дысперсію мадэлі без істотнага павелічэння яе зрушэння. Больш падрабязная інфармацыя - тут.

Каб самому ўсё ацаніць, неабходна адключыць регуляризацию і праверыць градыент страты дадзеных самастойна.

выпадзенне - Яшчэ адзін метад упарадкавання вашай сеткі для прадухілення перагрузкі. Падчас навучання выпадзенне ажыццяўляецца толькі падтрыманнем актыўнасці нейрона з некаторай верагоднасцю p (гіперпараметр) ці ўсталёўкай яго на нуль у зваротным выпадку. У выніку сетка павінна выкарыстоўваць іншае падмноства параметраў для кожнай навучальнай партыі, што памяншае змены вызначаных параметраў, якія становяцца дамінантнымі.

Важна: калі вы выкарыстоўваеце як выпадзенне, так і пакетную нармалізацыю, будзьце асцярожныя з парадкам гэтых аперацый ці нават з іх сумесным выкарыстаннем. Усё гэта яшчэ актыўна абмяркоўваецца і дапаўняецца. Вось дзве важныя дыскусіі па гэтай тэме на Stackoverflow и Arxiv.

Кантроль працы

Размова ідзе аб дакументаванні рабочых працэсаў і эксперыментаў. Калі нічога не дакументаваць, можна забыцца, напрыклад, якая выкарыстоўваецца хуткасць навучання ці вага класаў. Дзякуючы кантролю можна без праблем праглядаць і прайграваць папярэднія эксперыменты. Гэта дазваляе зменшыць колькасць дублюючых эксперыментаў.

Праўда, ручное дакументаванне можа стаць складанай задачай у выпадку вялікага аб'ёму работ. Тут прыходзяць на дапамогу такія прылады, як Comet.ml, якія дапамагаюць аўтаматычна лагіраваць наборы дадзеных, змены кода, гісторыю эксперыментаў і вытворчыя мадэлі, уключаючы ключавыя звесткі аб вашай мадэлі (гіперпараметры, паказчыкі прадукцыйнасці мадэлі і звесткі аб асяроддзі).

Нейронавая сетка можа быць вельмі адчувальнай да невялікіх змен, а гэта прывядзе да падзення прадукцыйнасці мадэлі. Адсочванне і дакументаванне працы - першы крок, які варта зрабіць для стандартызацыі асяроддзя і мадэлявання.

Працуем з нейрасеткамі: чэк-ліст для адладкі.

Спадзяюся, што гэты пост зможа стаць адпраўной кропкай, з якой вы пачнеце адладку вашай нейрасеці.

Skillbox рэкамендуе:

Крыніца: habr.com

Дадаць каментар