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