Работим с невронни мрежи: чеклист за отстраняване на грешки

Работим с невронни мрежи: чеклист за отстраняване на грешки

Кодът на софтуерните продукти за машинно обучение често е сложен и доста объркващ. Откритията и отстраняването на недостатъците в него е изтощителна задача. Дори най-простите нейронни мрежи с пряка връзка изискват сериозен подход към архитектурата на мрежата, инициализацията на теглата и оптимизацията на мрежата. Малка грешка може да доведе до неприятни проблеми.

Тази статия е посветена на алгоритъма за отстраняване на грешки в невронните мрежи.

Skillbox препоръчва: Практически курс Python разработчик от нулата.

Напомняме: за всички читатели на «Хабра» — отстъпка от 10 000 рубли при записване на всеки курс Skillbox с промокод «Хабр».

Алгоритъмът се състои от пет етапа:

  • просто начало;
  • потвърждение на загубите;
  • проверка на междинни резултати и връзки;
  • диагностика на параметрите;
  • контрол на работата.

Ако нещо ви изглежда по-интересно от другите, можете да преминете директно към тези раздели.

Просто начало

Невронна мрежа с сложно архитектурно решение, регуляризация и планировчик на скоростта на обучение е по-трудна за отстраняване на грешки, в сравнение с обикновените. Тук малко хитруваме, тъй като самата точка за отстраняване на грешки има косвено отношение, но това все пак е важна препоръка.

Простото начало включва създаването на опростен модел и обучението му на един набор (точка) данни.

Първо създаваме опростен модел

За бърз старт създаваме малка мрежа с един скрит слой и проверяваме дали всичко работи коректно. След това постепенно усложняваме модела, проверявайки всеки нов аспект на неговата структура (допълнителен слой, параметър и т.н.) и продължаваме нататък.

Обучаваме модела на един набор (точка) данни

Като бърза проверка на функционалността на проекта можете да използвате една или две точки данни за обучение, за да потвърдите дали системата работи правилно. Невронната мрежа трябва да покаже 100% точност на обучението и проверката. Ако не е така, вероятно моделът е твърде малък или вече имате бъг.

Дори ако всичко е наред, подгответе модела за преминаване на една или няколко епохи, преди да продължите напред.

Оценка на загубите

Оценката на загубите е основният начин за уточняване на производителността на модела. Трябва да се уверите, че загубата съответства на задачата, а функциите на загубите се оценяват по правилна скала. Ако използвате повече от един вид загуби, уверете се, че всички те са от един ред и правилно мащабирани.

Важно е да бъдете внимателни с началните загуби. Проверете колко близък е реалният резултат до очаквания, ако моделът е стартирал с произволно предположение. В работата на Андрей Карпати се предлага следното: „Убедете се, че получавате резултата, очакван при стартиране с малък брой параметри. Най-добре е веднага да проверите загубата на данни (с настройка на степента на регуляризация на нула). Например, за CIFAR-10 с класификатор Softmax очакваме, че началните загуби ще бъдат 2.302, защото очакваната дифузна вероятност е 0.1 за всеки клас (тъй като има 10 класа), а загубата Softmax е отрицателна логаритмична вероятност на правилния клас, която е –ln (0.1) = 2.302“.

За бинарен пример просто се прави аналогичен изчисление за всеки от класовете. Например, данните са: 20% 0-ти и 80% 1-ви. Очакваната начална загуба ще бъде до –0.2ln (0.5) –0.8ln (0.5) = 0.693147. Ако резултатът е над 1, това може да укаже, че теглата на невронната мрежа не са добре балансирани или данните не са нормализирани.

Проверяваме междинните резултати и връзките

За отстраняване на грешки в невронната мрежа е необходимо да разберете динамиката на процесите вътре в мрежата и ролята на отделните междинни слоеве, тъй като те са взаимосвързани. Ето типични грешки, с които можете да се сблъскате:

  • неправилни изрази за обновления на градиентите;
  • не се прилагат обновления на теглата;
  • изчезващи или експлодиращи градиенти (exploding gradients).

Ако стойностите на градиента са нулеви, това означава, че скоростта на обучение в оптимизатора е прекалено малка, или че сте се сблъскали с неправилен израз за обновление на градиента.

Освен това е необходимо да се следят стойностите на функциите на активация, теглата и обновленията на всеки от слоевете. Например, величината на обновленията на параметрите (теглата и отстъпленията) трябва да бъде 1-e3.

Съществува явление, наречено „Dying ReLU“ или „проблем на изчезващия градиент“, когато невроните ReLU ще дават нула след изучаване на голямо отрицателно значение (отстъпление) за тяхните тегла. Тези неврони никога повече няма да се активират никъде в данните.

Можете да използвате проверка на градиента, за да откриете тези грешки, чрез апроксимация на градиента с използване на числен подход. Ако той е близък до изчислените градиенти, значи обратното разпространение е реализирано правилно. За да създадете проверка на градиента, запознайте се с тези чудесни ресурси от CS231 тук и тук, както и с урока на Андрю Нга (Andrew Nga) по тази тема.

Файзан Шейх изброява три основни метода за визуализация на невронни мрежи:

  • Предварителни — простички методи, които показват общата структура на обучената модел. Те включват извеждане на формите или филтрите на отделните слоеве на невронната мрежа и параметрите в всеки слой.
  • Базирани на активация. В тях декодираме активирането на отделни неврони или групи неврони, за да разберем функциите им.
  • Базирани на градиенти. Тези методи обикновено манипулират градиентите, които се образуват по време на напредналото и обратно преминаване при обучението на модела (включвайки карти за значимост и карти за активирация на клас).

Има няколко полезни инструмента за визуализация на активирането и свързванията на отделните слоеве, например, ConX и Tensorboard.

Работим с невронни мрежи: чеклист за отстраняване на грешки

Диагностика на параметри

Невронните мрежи имат много параметри, които взаимодействат помежду си, което усложнява оптимизацията. Всъщност, този раздел е предмет на активни изследвания от специалисти, така че предложенията по-долу трябва да се разглеждат само като съвети, отправни точки, от които да се започне.

Размер на пакета (batch size) — ако е необходимо, размерът на пакета трябва да бъде достатъчно голям, за да се получат точни оценки на градиента на грешката, но достатъчно малък, за да може стохастичният градиентен спуск (SGD) да нареди вашата мрежа. Малките размери на пакета ще доведат до бързо схващане благодарение на шума в процеса на обучение и по-нататък — до трудности с оптимизацията. По-подробно е описано тук.

Скорост на обучение — твърде ниска ще доведе до бавна конвергенция или риск от застраховка в локални минимуми. В същото време, висока скорост на обучение ще предизвика разминаване в оптимизацията, тъй като рискувате да "скочите" през дълбоката, но тясна част от функцията на загуба. Опитайте да използвате планиране на скоростта, за да я намалите в процеса на обучение на невронната мрежа. В курса CS231n има голяма секция, посветена на този проблем.

Ограничаване на градиента— ограничава градиентите на параметрите по време на обратното разпространение по максималната стойност или лимитната норма. Полезно е за решаване на проблеми с всякакви експлодиращи градиенти, с които можете да се сблъскате в третата точка.

Нормализация на партиди — използва се за нормализация на входните данни на всеки слой, което позволява да се реши проблемът с вътрешния ковариантен преразпределение. Ако използвате Dropout и Batch Norma заедно, разгледайте тази статия.

Стохастичен градиентен спуск (SGD) — съществуват няколко разновидности на SGD, които използват импулс, адаптивни скорости на обучение и метод на Нестерова. При това нито една от тях няма очевидно предимство нито по ефективност на обучението, нито по обобщение (подробности тук).

Регуляризация — е от решаващо значение за изграждането на обобщаваща модел, тъй като добавя наказание за сложност на модела или екстремни стойности на параметрите. Това е начин да се намали вариацията на модела без значително увеличаване на неговото отклонение. По- подробна информация — тук.

За да оцените всичко сами, е необходимо да деактивирате регуляризацията и да проверите градиента на загубата сами.

Изпадане — още един метод за организиране на вашата мрежа, за да се предотврати претоварване. По време на обучението, изпадане се извършва само чрез поддържане на активността на неврон с определена вероятност p (хиперпараметър) или чрез задаване на нула в обратния случай. В резултат на това мрежата трябва да използва различен подмножество от параметри за всяка обучаваща партида, което намалява промените в определени параметри, които стават доминиращи.

Важно: ако използвате както изпадане, така и нормализация на партиди, бъдете внимателни с реда на тези операции или дори с тяхното съвместно използване. Всичко това все още активно се обсъжда и допълва. Ето два важни дискусии по темата в Stackoverflow и Arxiv.

Контрол на работата

Става въпрос за документиране на работните процеси и експерименти. Ако не документирате нищо, можете да забравите, например, коя скорост на обучение или тежест на класовете се използва. Благодарение на контрола, можете лесно да преглеждате и възпроизвеждате предишни експерименти. Това позволява да се намали броят на дублиращите се експерименти.

Истината е, че ръчното документиране може да стане сложна задача в случай на голямо количество работа. Тук на помощ идват инструменти като Comet.ml, които помагат автоматично да се записват набори от данни, изменения на кода, история на експериментите и производствени модели, включително ключова информация за вашия модел (хиперпараметри, показатели за производителността на модела и данни за средата).

Невронната мрежа може да бъде доста чувствителна към малки промени, което може да доведе до спад в производителността на модела. Следенето и документирането на работата е първата стъпка, която трябва да предприемете за стандартизиране на средата и моделирането.

Работим с невронни мрежи: чеклист за отстраняване на грешки

Надявам се, че този пост ще може да послужи като отправна точка, от която да започнете отстраняването на проблеми с вашата невронна мрежа.

Skillbox препоръчва:

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster