Як ініціалізувати елементи матриці фільтра?


24

Я намагаюся краще зрозуміти конволюційні нейронні мережі краще, записуючи код Python, який не залежить від бібліотек (наприклад, Convnet або TensorFlow), і я застрягаю в літературі про те, як вибрати значення для матриці ядра, коли виконання згортки на зображенні.

Я намагаюся зрозуміти деталі реалізації на кроці між картами функцій на зображенні нижче, що показує шари CNN.

Світові шари нейронної мережі

Відповідно до цієї схеми:

Складання зображення

Ядро матриці ядра "переступає" над зображенням, створюючи функційну карту, де кожен піксель - це сума всіх елементів, що належать до елементів, між кожною вагою ядра (або матриці фільтра) та відповідним значенням пікселя вхідного зображення.

Моє запитання: як ми ініціалізуємо ваги матриці ядра (або фільтра)?

На наведеній вище демонстрації вони просто 1 і 0, але я припускаю, що це спрощено з-за діаграми.

Навчаються ці ваги на якомусь етапі попередньої обробки? Або вибрано явно користувачем?

Відповіді:


19

Як правило, мережа ініціалізується з випадкового розподілу, як правило, означає нуль, і слід обережно вибирати її дисперсію. На сьогоднішній день з прогресом в технологіях оптимізації (SGD + імпульс серед інших методів) та нелінійностях активації (ReLUs та ReLU-подібні активації дозволяють покращити зворотне поширення градієнтних сигналів, навіть у більш глибоких мережах), можна реально навчити сучасну суворість нейронні мережі від рандомізованої ініціалізації.

Основні властивості:

  • Чому випадкові? Чому б не ініціалізувати їх усіх до 0? Тут важливим поняттям називають розрив симетрії . Якщо всі нейрони мають однакові ваги, вони дадуть однакові результати, і ми не будемо вивчати різні функції. Ми не будемо вивчати різні функції, оскільки під час кроку зворотного розповсюдження всі оновлення ваги будуть точно однаковими. Отже, починаючи з рандомізованого розподілу, ми можемо ініціалізувати нейрони на різні (з дуже високою ймовірністю) і дозволяє нам вивчити багату і різноманітну ієрархію функцій.

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

    Ми нульово центрируємо свої дані, і ми випадково ініціалізуємо ваги нашої мережі (матриці, як ви їх називали). Який тип розподілу нам вибрати? Розподіл вхідних даних до нашої мережі має середній нуль, оскільки ми орієнтовані на нуль. Скажімо, ми також ініціалізуємо наші умови упередження до нуля. Коли ми ініціалізуємо навчання нашої мережі, у нас немає причин надавати перевагу одному нейрону над іншим, оскільки всі вони випадкові. Однією з практик є випадкове ініціалізація ваги таким чином, що всі вони мають нульовий вихід активації в очікуванні. Таким чином, жоден нейрон не сприятливий для "активації" (має позитивне вихідне значення), ніж будь-який інший нейрон, одночасно порушуючи симетрію через випадкову ініціалізацію. Ну, простий спосіб досягти цього - вибрати середній нульовий розподіл.

  • Як ми обираємо варіанти? Ви не хочете вибирати дисперсію занадто великою, навіть якщо вона є середньою нульовою. Екстремальні значення у вагах глибокої сітки можуть призвести до виходів активації, які експоненціально збільшуються за величиною, і це питання може поєднуватися з глибиною мережі. Це може спричинити хаос у навчанні нашої мережі. Ви також не хочете, щоб він був занадто малим, оскільки це може уповільнити навчання, оскільки ми обчислюємо дуже малі значення градієнта. Отже, тут є рівновага, особливо якщо мова йде про більш глибокі мережі, оскільки ми не хочемо, щоб наші прямі чи відсталі поширення експоненціально збільшувалися чи зменшувалися в глибині.

    Існує дві дуже популярні схеми ініціалізації ваги: ​​Glorot Uniform ( Розуміння труднощів підготовки глибоких нейронних мереж подачі ) та ініціалізатор He Normal ( Delving Deep into Rectifiers: Surpassing Performance for Human Level на класифікації ImageNet ).

    Обидві вони побудовані з метою навчання глибоких мереж з таким основним принципом на увазі (цитата - зі статті Deving Deeper в Випрямлячі):

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

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

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


1
Але як щодо форми "X" (зробленої 1-м) жовтого фільтра в GIF вище? Я розумію, це те, що я хотів би використати для виявлення фігур "X" в будь-якому місці малюнка, але як я можу знати, що "X" - це форма, яку я хочу? Мені здається, що форма фільтра вивчається автоматично, але я не знаю як. Може, це було і питання ОП?
Феліпе Алмейда

2

Я не можу коментувати через низьку репутацію, тому пишу це у відповідь на запитання Феліпе Альмейди. Після ідеальної відповіді Інді АІ немає чого багато чого додати. Якщо ви хочете виявити конкретні фігури (наприклад, X), ви можете попередньо визначити конкретний фільтр, як це відбувається у випадку виявлення краю. Але це краса глибокого навчання, так багато шарів, стільки фільтрів і стільки ітерацій, що фільтри вивчають майже кожну необхідну форму об'єкта самостійно. Тож теоретично, якщо є X, який слід виявити, один з фільтрів навчиться визначати X (як жовтий фільтр)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.