Основи нейронних мереж

нейронних

Навчання нейронних мереж може дуже заплутати. Що таке хороший рівень навчання? Скільки прихованих шарів має мати ваша мережа? Чи справді корисний відсів? Чому ваші градієнти зникають?

У цьому дописі ми розв’яжемо завісу за деякими найбільш заплутаними аспектами нейронних мереж і допоможемо прийняти розумні рішення щодо архітектури нейронної мережі.

Ми також побачимо, як ми можемо використовувати ваги та відхилення всередині ядер Kaggle для контролю ефективності та вибору найкращої архітектури для нашої нейронної мережі!

Я настійно рекомендую розігнати це ядро ​​і пограти з різними будівельними блоками, щоб відточити свою інтуїцію.

Якщо у вас є якісь запитання, не соромтеся надсилати мені повідомлення. Удачі!

1. Основна структура нейронної мережі

  • Це кількість функцій, яку використовує ваша нейронна мережа для прогнозування.
  • Вхідному вектору потрібен один вхідний нейрон на ознаку. Для табличних даних це кількість відповідних функцій у вашому наборі даних. Ви хочете ретельно відібрати ці функції та видалити будь-які, що можуть містити шаблони, які не узагальнюватимуть за межі навчального набору (і спричинять переобладнання). Для зображень це розміри вашого зображення (28 * 28 = 784 у випадку MNIST).

  • Це кількість передбачень, які ви хочете зробити.
  • Регресія: для завдань регресії це може бути одне значення (наприклад, ціна житла). Для багатоваріантної регресії це один нейрон на передбачуване значення (наприклад, для обмежуючих блоків це може бути 4 нейрони - по одному для обмеження висоти, ширини, координати x, координати y).
  • Класифікація: Для двійкової класифікації (спам, а не спам) ми використовуємо один вихідний нейрон на позитивний клас, де вихід представляє ймовірність позитивного класу. Для багатокласової класифікації (наприклад, при виявленні об’єктів, де екземпляр може бути класифікований як автомобіль, собака, будинок тощо), ми маємо по одному вихідному нейрону на клас і використовуємо функцію активації softmax на вихідному рівні, щоб забезпечити остаточна сума ймовірностей до 1.

Приховані шари та нейрони на приховані шари

  • Кількість прихованих шарів сильно залежить від проблеми та архітектури вашої нейронної мережі. Ви, по суті, намагаєтесь пробитися в ідеальну нейромережеву архітектуру - не надто великий, не надто маленький, в самий раз.
  • Як правило, 1-5 прихованих шарів допоможуть вам вирішити більшість проблем. Працюючи з даними зображень або мови, ви хотіли б, щоб у вашій мережі були десятки-сотні шарів, не всі з яких можуть бути повністю зв’язані. Для цих випадків використання існують попередньо навчені моделі (YOLO, ResNet, VGG), які дозволяють використовувати великі частини їхніх мереж і навчати свою модель поверх цих мереж, щоб вивчати лише функції вищого порядку. У цьому випадку ваша модель все одно матиме лише кілька шарів для тренування.
  • Взагалі використання однієї кількості нейронів для всіх прихованих шарів буде достатнім. Для деяких наборів даних наявність великого першого шару та подальшого його використання за меншими шарами призведе до кращої продуктивності, оскільки перший шар може вивчити багато функцій нижчого рівня, які можуть перейти до кількох функцій вищого порядку в наступних шарах.

  • Зазвичай ви отримуєте більший приріст продуктивності, додаючи більше шарів, ніж додаючи більше нейронів у кожному шарі.
  • Я б рекомендував починати з 1-5 шарів і 1-100 нейронів і повільно додавати більше шарів і нейронів, поки ви не почнете переобладнання. Ви можете відстежувати свої втрати та точність на своїй інформаційній панелі Weights and Biases, щоб побачити, які приховані шари + приховані нейрони комбінують найкращі втрати.
  • Щось, про що слід пам’ятати, вибираючи меншу кількість шарів/нейронів, це те, що якщо це число занадто мало, ваша мережа не зможе вивчити основні закономірності ваших даних і, отже, буде марною. Підхід для протидії цьому полягає в тому, щоб почати з величезної кількості прихованих шарів + прихованих нейронів, а потім використовувати відсівання та ранню зупинку, щоб зменшити розмір нейронної мережі для вас. Знову ж таки, я б рекомендував спробувати кілька комбінацій і відстежити ефективність роботи на Вашій панелі ваг та відхилень, щоб визначити ідеальний розмір мережі для вашої проблеми.
  • Андрій Карпаті також рекомендує надмірне спорядження, а потім регулюйте підхід - „спочатку отримайте модель, достатньо велику, щоб вона могла переобладнатися (тобто зосередити увагу на втраті тренувань), а потім регулювати її належним чином (відмовитися від деяких втрат під час навчання, щоб покращити втрату під час перевірки).“
  • Регресія: Середня квадратична похибка є найпоширенішою функцією втрат для оптимізації, якщо немає значної кількості викидів. У цьому випадку використовуйте середню абсолютну помилку або втрату Губера.
  • Класифікація: перехресна ентропія в більшості випадків буде вам корисна.

  • Великі розміри партій можуть бути чудовими, оскільки вони можуть використовувати потужність графічних процесорів для обробки більшої кількості навчальних екземплярів за раз. OpenAI виявив, що більший розмір партії (від десятків тисяч для моделювання мов класифікації зображень В та В та мільйонів у випадку RL-агентів) добре слугує для масштабування та паралелізації.
  • Однак є також футляр для менших розмірів партії. Згідно з цією роботою Masters та Luschi, перевага, отримана завдяки збільшенню паралельності від запуску великих пакетів, компенсується збільшенням узагальнення продуктивності та меншим обсягом пам'яті, досягнутим меншими партіями. Вони показують, що збільшені розміри партій зменшують прийнятний діапазон темпів навчання, що забезпечує стабільну конвергенцію. Їх винос полягає в тому, що менший, насправді, кращий; і що найкращі показники забезпечуються розмірами міні-партій від 2 до 32.
  • Якщо ви не працюєте на масштабних масштабах, я б рекомендував починати з менших розмірів партії та повільно збільшувати розміри та ефективність моніторингу на вашій панелі ваг та відхилень, щоб визначити найкращу відповідність.

Кількість епох

  • Я б рекомендував починати з великої кількості епох і використовувати Дочасне зупинення (див. Розділ 4. Зникаючі + Вибухові градієнти), щоб припинити навчання, коли продуктивність перестає покращуватися.

Масштабування ваших функцій

  • Коротке зауваження: Перш ніж використовувати їх як вхідні дані до нейронної мережі, переконайтесь, що всі ваші функції мають подібний масштаб. Це забезпечує більш швидку конвергенцію. Коли ваші функції мають різні масштаби (наприклад, зарплати у тисячах років та досвід у десятках), функція витрат буде виглядати як витягнута чаша зліва. Це означає, що вашому алгоритму оптимізації знадобиться багато часу, щоб пройти долину порівняно із використанням нормалізованих функцій (праворуч).

2. Швидкість навчання

  • Вибір рівня навчання дуже важливий, і ви хочете переконатися, що ви правильно це зрозуміли! В ідеалі ви хочете повторно налаштувати швидкість навчання, коли ви налаштовуєте інші гіперпараметри своєї мережі.
  • Щоб знайти найкращу швидкість навчання, починайте з дуже низьких значень (10 ^ -6) і повільно множте її на константу, поки вона не досягне дуже високого значення (наприклад, 10). Виміряйте ефективність вашої моделі (проти журналу вашого рівня навчання) на вазі ваг та Biasesdashboard, щоб визначити, який показник вам добре підходив для вирішення вашої проблеми. Потім ви можете перекваліфікувати свою модель, використовуючи цю оптимальну швидкість навчання.
  • Найкраща швидкість навчання, як правило, становить половину темпу навчання, що змушує модель розходитися. Не соромтеся встановлювати різні значення для learn_rate у супровідному коді та бачите, як це впливає на продуктивність моделі, щоб розвинути вашу інтуїцію щодо швидкості навчання.
  • Я також рекомендую використовувати метод пошуку швидкості навчання, запропонований Леслі Сміт. Це чудовий спосіб знайти хорошу швидкість навчання для більшості градієнтних оптимізаторів (більшість варіантів SGD) і працює з більшістю мережевих архітектур.
  • Також див. Розділ про планування темпів навчання нижче.

3. Імпульс

  • Градієнтний спуск робить крихітні послідовні кроки до місцевих мінімумів, і коли градієнти незначні, може знадобитися багато часу, щоб сходитися. Імпульс, з іншого боку, враховує попередні градієнти і прискорює зближення, швидше просуваючи долини і уникаючи місцевих мінімумів.
  • Загалом ви хочете, щоб ваше значення імпульсу було дуже близьким до одиниці. 0,9 - це гарне місце для початку для менших наборів даних, і ви хочете поступово наближатись до одного (0,999), чим більший ваш набір даних. (Установка nesterov = True дозволяє імпульсу враховувати градієнт функції витрат на кілька кроків попереду поточної точки, що робить її трохи точнішою та швидшою.)

4. Зникаючі + вибухові градієнти

  • Так само, як і люди, не всі рівні нейронної мережі вчаться з однаковою швидкістю. Отже, коли алгоритм зворотного зв’язку поширює градієнт помилок від вихідного шару до перших шарів, градієнти стають все меншими і меншими, поки вони майже не будуть незначними, коли досягнуть перших шарів. Це означає, що ваги перших шарів суттєво не оновлюються на кожному кроці.
  • Це проблема зникнення градієнтів. (Подібна проблема вибуху градієнтів виникає, коли градієнти для певних шарів поступово збільшуються, що призводить до значного оновлення ваги для деяких шарів, на відміну від інших.)
  • Є кілька способів протидії зникаючим градієнтам. Погляньмо на них зараз!

Метод ініціалізації ваги

  • Правильний метод ініціалізації ваги може значно пришвидшити час до конвергенції. Вибір методу ініціалізації залежить від вашої функції активації. Деякі речі, які потрібно спробувати:
  • При використанні ReLU або негерметичному RELU використовуйте ініціалізацію He
  • При використанні SELU або ELU використовуйте ініціалізацію LeCun
  • Використовуючи softmax, logistic або tanh, використовуйте ініціалізацію Glorot
  • Більшість методів ініціалізації мають рівномірний та нормальний розподіл.

  • BatchNorm просто вивчає оптимальні засоби та масштаби входів кожного шару. Він робить це, центрируючи нуль та нормалізуючи свої вхідні вектори, потім масштабуючи та зсуваючи їх. Він також діє як регулятор, що означає, що нам не потрібно відсівати або реєструвати L2.
  • Використання BatchNorm дозволяє нам використовувати більші показники навчання (що призводить до швидшої конвергенції) і призвести до значних поліпшень у більшості нейронних мереж за рахунок зменшення проблеми зникаючих градієнтів. Єдиним недоліком є ​​те, що він трохи збільшує час навчання через додаткові обчислення, необхідні для кожного шару.

  • Чудовий спосіб зменшити градієнти від вибуху, особливо під час навчання RNN, - це просто відсікти їх, коли вони перевищують певне значення. Я рекомендую спробувати clipnorm замість clipvalue, що дозволяє вам підтримувати напрямок вашого вектора градієнта узгодженим. Clipnorm містить будь-які градієнти, норма l2 яких перевищує певний поріг.
  • Спробуйте кілька різних порогових значень, щоб знайти найкраще для вас.

  • Дочасне зупинення дозволяє вам реалізувати це, тренуючи модель із більшою кількістю прихованих шарів, прихованих нейронів і протягом більше епох, ніж вам потрібно, і просто припиняючи тренування, коли продуктивність перестає послідовно покращуватися протягом n епох. Це також зберігає для вас найкращу модель. Ви можете ввімкнути Дочасне зупинення, встановивши зворотний дзвінок, коли підходить Вашій моделі, і встановивши save_best_only = True.

5. Вибування

  • Випадання - це фантастичний прийом регуляризації, який дає значний приріст продуктивності (

2% для найсучасніших моделей) наскільки проста методика насправді. Все, що відпадає, випадковим чином вимикає відсоток нейронів на кожному шарі на кожному етапі навчання. Це робить мережу більш надійною, оскільки вона не може покладатися на будь-який конкретний набір вхідних нейронів для прогнозування. Знання розподіляються по всій мережі. Близько 2 ^ n (де n - кількість нейронів в архітектурі) під час тренувального процесу генеруються злегка унікальні нейронні мережі, які збираються разом для прогнозування.

  • Хороший рівень відсіву - від 0,1 до 0,5; 0,3 для RNN та 0,5 для CNN. Використовуйте більші норми для більших шарів. Збільшення рівня відсіву зменшує переобладнання, а зменшення рівня корисно для боротьби з недостатньо пристосованими.
  • Ви хочете поекспериментувати з різними показниками випадаючих значень на попередніх рівнях вашої мережі та перевірити свою панель ваг та відхилень, щоб вибрати найбільш ефективну. Ви точно не хочете використовувати відсіву у вихідних шарах.
  • Прочитайте цю статтю перед тим, як використовувати Dropout разом із BatchNorm.
  • У цьому ядрі я використовував AlphaDropout, аромат ванільного відсіву, який добре працює з функціями активації SELU, зберігаючи середнє значення та стандартні відхилення вводу.
  • 6. Оптимізатори

    • Gradient Descent - це не єдина гра-оптимізатор у місті! На вибір є кілька різних. Ця публікація добре описує деякі оптимізатори, з яких ви можете вибрати.

    • Моя загальна порада - використовувати стохастичний градієнтний спуск, якщо ви дуже дбаєте про якість конвергенції і якщо час не є суттєвим.
    • Якщо ви дбаєте про час до конвергенції, і точки, близької до оптимальної конвергенції, буде достатньо, експериментуйте з оптимізаторами Адама, Надама, RMSProp та Adamax. Інформаційна панель Ваг та відхилень направить вас до оптимізатора, який найкраще вам підходить!
    • Адам/Надам, як правило, є хорошими вихідними точками, і вони, як правило, досить прощають до пізнього пізнього навчання та інших неоптимальних гіперпараметрів.
    • За словами Андрія Карпаті, "налагоджений SGD майже завжди трохи перевершить Адама" у випадку з ConvNets.
    • У цьому ядрі я отримав найкращу продуктивність від Nadam, яка є лише вашим звичайним оптимізатором Адама з фокусом Нестерова, і таким чином сходиться швидше, ніж Адам.

    7. Планування навчання

    Введіть сюди підпис зображення (необов’язково)

    8. Ще небагато речей

    • Спробуйте EfficientNets для оптимального масштабування вашої мережі.
    • Прочитайте цю статтю, щоб переглянути огляд деяких додаткових темпів навчання, розмірів партій, імпульсів та методів зменшення ваги.
    • А цей про стохастичне усереднення ваги (SWA). Це показує, що кращого узагальнення можна досягти шляхом усереднення кількох точок вздовж траєкторії SGD із циклічною або постійною швидкістю навчання.
    • Прочитайте чудовий посібник Андрея Карпаті щодо того, як отримати максимум користі від своїх нейронних мереж.

    Результати

    У цій публікації ми дослідили багато різних аспектів нейронних мереж!

    Ми розглянули, як налаштувати базову нейронну мережу (включаючи вибір кількості прихованих шарів, прихованих нейронів, розмірів партії тощо)

    Ми дізналися про те, яку роль відіграє імпульс та темпи навчання у впливі на ефективність моделі.

    І нарешті, ми дослідили проблему зникнення градієнтів та способи вирішення цієї проблеми за допомогою ненасичуючих функцій активації, BatchNorm, кращих методів ініціалізації ваги та ранньої зупинки.

    Ви можете порівняти показники точності та втрат для різних прийомів, які ми випробували, на одній діаграмі, відвідавши свою інформаційну панель "Ваги та відхилення".

    Нейронні мережі - це потужні звірі, які дають вам багато важелів, які можна налаштувати, щоб отримати найкращу ефективність для вирішення проблем, які ви намагаєтеся вирішити! Сам розмір налаштувань, який вони пропонують, може бути приголомшливим навіть для досвідчених практикуючих. Такі інструменти, як Ваги та Ухили, є вашими найкращими друзями у навігації по країні гіперпараметрів, випробуванні різних експериментів та виборі найпотужніших моделей.

    Сподіваюся, цей путівник послужить хорошим відправною точкою для ваших пригод. Удачі!

    Я настійно рекомендую розігнати це ядро ​​і пограти з різними будівельними блоками, щоб відточити свою інтуїцію. І ось демонстрація, яка допоможе вам пройти через W + B, щоб вибрати ідеальну архітектуру нейронної мережі.