Еволюція нейромереж для розпізнавання зображень у 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 мережі - ось така конструкція:

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

Тому якщо у вагах якогось рівня буде скрізь 0, він просто пропустить далі чистий сигнал.

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

Виявляється, тренується добре і показує результати краще, ніж VGG!

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

MOAR LAYERS!!!

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

Було як зліва, зробимо як справа. Кількість і обчислень, і параметрів зменшується радикально.

І ось тут пацанам починає перти і вони починають тренувати версію на 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)

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

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

Загалом, у них є 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.

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