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

Продовжую розповідати про життя Inception architecture — архитеткуры Гугла для convnets.
(перша частина — ось тут
Отже, минає рік, мужики публікують успіхи розвитку з часу GoogLeNet.
Ось страшна картинка як виглядає фінальна мережа:
image
Що за жах там відбувається?
Disclaimer: пост написаний на основі відредагованих лог чату closedcircles.com, звідси і стиль викладу, і уточнюючі питання.
В цей раз автори намагаються сформулювати якісь основні принципи побудови архітектури ефективних мереж (власне стаття — http://arxiv.org/abs/1512.00567).
(нагадаю, мета Inception architecture — бути насамперед ефективною в обчисленнях і кількості параметрів для реальних додатків, за те і любимо)
Принципи вони формулюють наступні:
  • Дуже багато сигналів близькі один до одного в просторі (тобто в сусідніх "пікселях"), і цим можна користуватися, щоб робити convolution меншого розміру.
    Мовляв, раз сусідні сигнали часто скорельовані, то можна зменшити розмірність перед convolution без втрати інформації.
  • Для ефективного використання ресурсів потрібно збільшувати ширину і глибину мережі. Тобто якщо ресурсів стало наприклад в два рази більше, найефективніше і зробити шари ширше, і мережа глибше. Якщо зробити тільки глибше, буде неефективно.
  • Погано мати різкі bottlenecks, тобто леєр з різким зменшенням параметрів, особливо на початку.
  • "Широкі" шари швидше навчаються, що особливо важливо на високих рівнях (але локально, тобто цілком можна після них зменшувати розмірність)
Нагадаю, минула версія цеглинки побудови мережі виглядала ось так:

Які вони роблять в ньому модифікації
  • По-перше, помічаємо, що можна замінити великий і жырный 5x5 convolution на два послідовних по 3x3, і мовляв так як сигнали скорельовані, трохи втратимо. Експериментально виявляється, що робити між цими 3x3 нелінійність краще, ніж не робити.
  • По-друге, раз вже така п'янка, давайте замінимо 3x3 на 3x1 + 1x3.
image
Тут ми виявляємо, що згортки робити стає дешево, і тоді чому б взагалі робити не 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/
І це реально складно. Покажуть тобі якийсь підвид середземноморського зяблика і гадай.
Джерело: Хабрахабр

0 коментарів

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