Еволюція нейромереж для розпізнавання зображень в Google: Inception-ResNet

Буду потихеньку дорассказывать про Inception.
Попередня частина тут — https://habrahabr.ru/post/302242/.
Ми зупинилися на тому, Inception-v3 не виграв Imagenet Recognition Challange в 2015-му, тому що з'явилися ResNets (Residual Networks).

Що таке взагалі ResNets?


Disclaimer: пост написаний на основі відредагованих лог чату closedcircles.com, звідси і стиль викладу, і уточнюючі питання.

Це результат роботи людей в Microsoft Research Asia над проблемою тренування дуже глибоких мереж (http://arxiv.org/abs/1512.03385).
Відомо, що якщо тупо збільшувати кількість рівнів у якому-небудь VGG — він почне тренуватися все гірше і гірше, і в сенсі точності на тренувальному сеті, і на validation.

Що в деякому сенсі дивно — більш глибока мережа має строго більшою representational power.
І, взагалі кажучи, можна тривіально отримати більш глибоку модель, яка не гірше менш глибокою, тупо додавши кілька identity layers, тобто рівнів, які просто пропускають сигнал далі без змін. Однак, дотренировать звичайним способом до такої точності глибокі моделі не виходить.

Ось це спостереження, що не повинно бути вже identity і є основна думка ResNets.
Давайте сформулюємо задачу так, щоб більш глибокі рівні передбачали різницю між тим, що видають попередні лееры і таргетом, тобто завжди могли відвести ваги в 0 і просто пропустити сигнал.
Звідси назва — Deep Residual Learning, тобто навчаємося передбачати відхилення від минулих лееров.

Більш конкретно це виглядає наступним чином.
Основний building block мережі — ось така конструкція:

image

Два шару з вагами (можуть бути convolution, можуть бути ні), і shortcut connection, який тупо identity. Результат після двох лееров додається до цього identity. Чому кожні два рівня, а не кожен перший? Пояснень немає, мабуть на практиці запрацювало ось так.
Тому якщо у вагах певного рівня буде скрізь 0, він просто пропустить далі чистий сигнал.

І ось спочатку вони будують версію VGG на 34 леєри, в якій вставлені такі блоки і все лееры зроблені поменше, щоб не роздувати кількість параметрів.
Виявляється, тренується добре і показує кращі результати, ніж VGG!

Як розвинути успіх?
MOAR LAYERS!!!

Щоб вийшло більше лееров, треба робити їх легше — є ідея замість двох convolutions робити наприклад один і меншої товщини:

image

Було як зліва, зробимо як праворуч. Кількість і обчислень, і параметрів зменшується радикально.
І ось тут пацанам починає перти і вони починають тренувати версію на 101 і 152(!) леєри. Причому навіть у таких понад глибоких мереж кількість параметрів менше, ніж у товстих версій VGG.

Фінальний результат на ансамблі, як було згадано раніше — 3.57% top5 на Imagenet.
Хіба там головна ідея була не в тому, що в дуже глибоких мережах гостро стоїть проблема Vanishing Gradients, а Residual архітектура дозволяє її якось вирішити?
Це хороше питання!
Автори ResNets досліджують це питання у міру сил, і їм здається, що проблема vanishing gradients добре вирішується розумною ініціалізацією і Batch Normalization. Вони дивляться на величину градієнтів, які потрапляють у нижні шари, вона в цілому розумна і не згасає.
Їх теорія в тому, що більш глибокі сітки просто експоненціально повільніше сходяться в процесі тренування, і тому такої ж точності ми просто не встигаємо дочекатися з тими ж обчислювальними ресурсами.

питання — як працює back propagation c identity link?
Передає одиницю, звичайна похідна.


Окремо потрібно сказати, що в області йде активний розвиток та обговорення механізмів ResNets, з'єднувати результати шарів арифметичними операціями виявилося благодатній ідеєю.
Ось лише кілька прикладів:
http://torch.ch/blog/2016/02/04/resnets.html — мужики в Facebook досліджують, де краще вставляти residual connections.
https://arxiv.org/abs/1605.06431 — теорія про те, що ResNets являють собою величезний ансамбль вкладених мереж.
https://arxiv.org/abs/1605.07146 — застосування ідей ResNets для тренування дуже широких, а не глибоких мереж. До речі, топовий результат на CIFAR-10, for what it's worth.
https://arxiv.org/abs/1605.07648 — спроба конструювати і тренувати глибокі мережі residual connections в чистому вигляді, але все ж з арифметикою між виходами шарів.

Ну так от, мужики в Гуглі дивляться на цей світ і продовжують працювати

Результат роботи — Inception-v4 і Inception-Resnet (http://arxiv.org/abs/1602.07261

Крім ResNets, основне, що змінилося — це поява TensorFlow.
У статті розповідається, що до TensorFlow модель Inception не влазила в пам'ять однієї машини, і доводилося її тренувати распределенно, що обмежує можливості оптимізації. А ось тепер можна не стримувати креатив.
(я не дуже розумію, як конкретно це відбувалося, ось обговорення припущень — https://closedcircles.com/chat?circle=14&msg=6207386)

Після цієї фрази пацани перестають пояснювати, чим були викликані зміни в архітектурі, і тупо постять три сторінки повні ось таких картинок:

image

І є у мене відчуття, що багато там автоматики в побудові архітектури, але вони поки не палятся.

Загалом, у них є Inception-v4, в якій немає Residual connections, і Inception-ResNet-2, у якій порівнянне кількість параметрів, але є residual connections. На рівні однієї моделі результати у них дуже близькі, ResNet виграє трохи.
А ось ансамбль з однієї v4 і трьох ResNet-2 показує новий рекорд на Imagenet — 3.08%.

Нагадаю минулі віхи. Перша сітка, яка перемогла в Imagenet Recongition challenge, зробила це з помилкою 15% в 2012. В кінці 2015 допиляли до 3.08%. Розумна оцінка середнього результату людини — ~5%. Прогрес, як мені здається, вражає.

В цілому, Inception — це приклад прикладного R&D в світі deep learning

Спочатку дуже проста архітектура з набором convolution layers, після яких слідують кілька fully connected layers, з кожним роком стає все більш і більш потужною заради ефективності. І, можливо, є одна людина, яка розуміє всі деталі архітектурних микрорешений. А може і немає вже.

Повну архітектуру Inception-ResNet на одній картинці я вже зразу не знайшов. Схоже, нікому не прийшло в голову її намалювати.
Повна схема на сторінці 7, рис 15, тільки там всі верстви не розмальовані цілком, а просто блоками позначені. Думаю інакше тільки на ватман довелося б друкувати, а особливо розуміння не додало б.
Я мав на увазі, що повна з точністю до фінальних блоків. Для минулих версій я такі картинки постив.

Тут в три рази ширше вийде картинка :)
Дада.


Забавна незв'язана з іншим деталь — вони часто роблять non-padded convolutions, тобто convolution layers, які зменшують розмір картинки на 2 пікселя з кожної сторони. Оптимізують байти, практично!
ти порівнюєш дивні речі. людський результат — це топ1, а компутерный — це топ5, коли вибираються 5 відповідних категорій. в топ1 у компутеров результати досі десь в районі double digits...
Не, людський — це теж top5. Top1 людині на imagenet теж нічого робити, занадто велика невизначеність.
Ось як приклад —

Який клас у цієї картинки? Наприклад, є класи "horse" і "woman's clothing".
Але правильна відповідь, звичайно, "hay".
good luck with top1.

зрозуміло. сіна-то он скільки. а баби з конем ледве-ледве!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.