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

Продовжую розповідати про життя Inception architecture - ^ еткури Гугла для convnets.

(перша частина - ось тут)

Отже, минає рік, мужики публікують успіхи розвитку з часу GoogLeNet.

Ось страшна картинка як виглядає фінальна мережа:

Що ж за жах там відбувається?

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

Цього разу автори намагаються сформулювати якісь основні принципи побудови архітектури ефективних мереж (власне стаття - http://arxiv.org/abs/1512.00567).

(нагадаю, мета Inception architecture - бути насамперед ефективною в обчисленнях і кількості параметрів для реальних програм, за те і любимо)

Принципи вони формулюють такі:

  • Дуже багато сигналів близькі один до одного в просторі (тобто в сусідніх "" пікселях "), і цим можна користуватися, щоб робити convolution меншого розміру.

Мовляв, раз сусідні сигнали часто скорельовані, то можна зменшити розмірність перед convolution без втрати інформації.

  • Для ефективного використання ресурсів потрібно збільшувати і ширину, і глибину мережі. Тобто. якщо ресурсів стало наприклад в два рази більше, найефективніше і зробити шари ширшими, і мережа глибше. Якщо зробити тільки глибше, буде неефективно.
  • Погано мати різкі bottlenecks, тобто леєр з різким зменшенням параметрів, особливо на початку.
  • «» Широкі «» шари швидше навчаються, що особливо важливо на високих рівнях (але локально, тобто цілком можна після них зменшувати розмірність)

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

Які вони роблять у ньому модифікації

  • По-перше, помічаємо, що можна замінити великий і жирний 5x5 convolution на два послідовних по 3x3, і мовляв так як сигнали скорельовані, трохи втратимо. Експериментально виявляється, що робити між цими 3x3 нелінійність краще, ніж не робити.
  • По-друге, раз вже така пиятика, давайте замінимо 3x3 на 3x1 + 1x3.

Тут ми виявляємо, що згортки-то робити стає дешево, і тоді чому б взагалі робити не 3x1 + 1x3, а відразу nx1 + 1xn!

І роблять, аж на 7, правда не на початку сітки. З усіма цими апгрейдами основна цегла стає такою:

  • По-третє, слідуючи заповіту «» не створюй боттлнеків «», думають про пулінг.

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

Можна зробити пул, а потім convolution в меншій роздільній здатності, а можна спочатку convolution, а потім пул.

Ось ці варіанти на картинці:

Проблема в тому, що перший варіант - якраз різко зменшить кількість активацій, а другий - неефективний з точки зору обчислень, тому що потрібно проводити convolution на повній роздільній здатності.

Тому вони пропонують гібридну схему - давайте зробимо на половину фіч пул, а на половину - convolution.

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

  • Нарешті, вони трохи модифікують цеглинку для останніх леєрів, щоб вона була поширена, хоч і менш глибока. Щоб мовляв краще навчався, в кінці мережі це найважливіше.

І ось мережа - це кілька ранніх convolutions, а потім ось такі цеглинки, що перемежуються пулом. Всього в мережі 11 inception layers.

Звідси і той жах на першому малюнку.

Ще вони виявили, що додаткові класифікатори з боків не сильно прискорюють тренування, а швидше допомагають, тому що працюють як регуляризатори - коли вони до них підключили Batch Normalization, мережа стала передбачати краще.

Що ще...

Вони пропонують ще один трюк для додаткової регуляризації - так званий label smoothing.

Ідея коротко така: зазвичай target label для конкретного семпла це 1 там де клас правильний, і 0 де клас неправильний.

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

Вони пропонують змішувати one-off target з розподілом пропорційним тупо розподілу класів по датасету, щоб в інших класах були не нулі, а якісь маленькі значення. Це дає виграти ще процентик читолі, тобто чимало.

Разом

І ось вся ця машинерія жере в 2.5 разів більше обчислювальних ресурсів, ніж Inception-v1 і досягає значно кращих результатів.

Вони називають основну архітектуру Inception-v2, а версію, де додаткові класифікатори працюють з BN - Inception-v3.

Ось ця Inception-v3 досягає 4.2% top5 classification error на Imagenet, а ансамбль з чотирьох моделей - 3.58%.

І ось з цим добром мужики з Гугла зібралися виграти Imagenet в 2015-му.

Однак, трапилися ResNets і виграли Kaiming He сотоварищи з Microsoft Research Asia з результатом... 3.57%!!!

(треба зазначити, що в object localization результат у них принципово кращий)

Але про ResNets я мабуть в інший раз розповім.

цікаво середній хомо сапієнс яку помилку покаже на цих картинках.

Єдиний експеримент, що широко обговорюється, був проведений Andrey «» наше все «» Karpathy.

http://karpathy.github.io/2014/09/02/what-i-learned-from-competing-against-a-convnet-on-imagenet/

Він протестував себе на якійсь частині датасета і у нього вийшло 5.1%.

Це теж top5, але може людині складніше top5 вибирати.

До речі можна самому перевіритися - http://cs.stanford.edu/people/karpathy/ilsvrc/

І це реально складно. Покажуть тобі якийсь підвид середземноморського зяблика і гадай.