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

У мене тут синхронізується VM надовго, тому є час розповісти про те, що я недавно читав.
Наприклад, про GoogLeNet.
GoogLeNet — це перша інкарнація так званої Inception architecture, яка референс всім зрозуміло на що:
image
(до речі, посилання на нього йде першою в списку референсов статті, чуваки джгут)
Вона виграла ImageNet recognition challenge в 2014-му році з результатом 6.67% top 5 error. Нагадаю, top 5 error — метрика, в якій алгоритм може видати 5 варіантів класу картинки і помилка зараховується, якщо серед всіх цих варіантів немає правильної. Всього в тестовому датасете 150K картинок і 1000 категорій, тобто завдання вкрай нетривіальна.
Щоб зрозуміти навіщо, як і чому влаштований GoogLeNet, як зазвичай, трохи контексту.
Disclaimer: пост написаний на основі відредагованих лог чату closedcircles.com, звідси і стиль викладу, і уточнюючі питання.
У 2012 році відбувається епохальна подія — ImageNet challenge виграє deep convolutional network
Причому не просто виграє, а показує помилку майже в два рази менше другого місця (15% проти 26% top5 error)
(щоб показати розвиток області, поточний топовий результат — 3%)
Сітка називається AlexNet по імені Alex Krizhevsky, студента Хінтона. У ній всього 8 рівнів (5 convolutional і 3 fully-connected), але в цілому вона товста і жырная — аж 60M параметрів. Її тренування не влазить в один GPU з 3 ГБ пам'яті і Алексу аж доводиться придумати трюк як тренувати таке на двох GPU.
І ось люди в Гуглі працюють над тим, щоб зробити її практичніше
Наприклад, щоб можна було її використовувати на девайсах поменше і взагалі.
GoogLeNet ми любимо не стільки навіть за точність, скільки саме за ефективність у розмірі моделі і необхідній кількості обчислень.
Власне пейпер — http://arxiv.org/abs/1409.4842.
Основні ідеї у них такі:
  • Початковий AlexNet робив великі пакунки, які вимагають багато параметрів, спробуємо робити згортки поменше з великою кількістю лееров.
  • А потім будемо агресивно зменшувати кількість вимірювань, щоб компенсувати більш товсті шари. Розумно це робити можна з допомогою 1x1 convolutions — по суті, лінійного фільтра застосовується по всій картинці, щоб взяти поточне кількість вимірювань, і лінійно їх змішати в меншу. Так як він теж навчається, виходить дуже ефективно.
  • На кожному рівні будемо проганяти кілька convolution kernels різного розміру, щоб витягувати фічі різного масштабу. Якщо масштаб занадто великий для поточного рівня, він розпізнається на наступному.
  • Не робимо hidden FC layers взагалі, тому що в них дуже багато параметрів. Замість цього на останньому рівні робимо global average pool і подцепляем його до output layer безпосередньо.
Ось так виглядає один "inception" module:
image
Видно ті самі кернелы різного розміру, видно 1x1 convolutions для зменшення розмірності.
І ось мережа складається з 9 таких блоків. У такій конструкції приблизно в 10 разів менше параметрів, ніж у AlexNet, і обчислюється вона теж швидше, тому що dimensionality reduction працює добре.
А потім виявилося, що вона ще і власне класифікує картинки краще — як було написано вище, 6.67% top5 error.
image
Ось картинка повної мережі. Вона виглядає страшно, але коли розумієш, що це повторювані блоки, простіше.
Які ще подробиці розповісти...
У неї три training head (жовті квардратики) — це було зроблено для того, щоб простіше було тренувати таку глибоку мережу. У кожному додатковому training head є трохи FC layers, які передбачають той же клас на основі низьких рівнів, щоб до нижніх рівнів сигнал доходив швидше (щоправда, у наступних роботах виявилося, що вони допомагають швидше тому що є додатковою регуляризацией).
У релізі все веде до допоміжним training heads викидається. Така техніка використовується в інших місцях в літературі, але з тих пір ми навчилися краще deepnets тренувати, тому часто вже потрібно.
Така архітектура, крім власне GoogLeNet, називається Inception-v1.
Inception-BN — це та ж сітка, тільки натренована з використанням Batch Normalization (здесь гарне пояснення на пальцях).
А Inception-v2 і далі — вже більш складні архітектури, про які я розповім наступного разу, а то тут можуть почати годувати скоро.
"Le" в GoogLeNet — референс на LeNet 5, першу сітку, опубліковану ЛеКуном before deep learning was a thing.
Про стиснення мереж я теж недавно дещо читав. Там беруть мережа, обрізають з неї зайві ваги, мережа зменшується раз у сто, точність майже не страждає. Тобто, ніби як, прямо з гігабайт до мегабайт, можна пхати в пам'ять мобільника. Відчуваю, ще років десять і кожна камера почне бачити по-справжньому.
Про стиснення пейпер, до речі, якщо цікаво — http://arxiv.org/abs/1510.00149.
Ага. Це ігри трохи різного рівня.
Можна оптимізувати на рівні архітектури та навчання, а можна на низькому рівні — працюючи вже з вивченими вагами.
Швидше за все, на практиці потрібно і те, і інше.

до Речі, питання в космос.
А можна з цього всього зробити якийсь глобальний висновок?
Чому це все працює? Або хоча б — як краще дизайн мережі з урахуванням цього досвіду?
Відмінні питання, про це багато м'яса в наступній частині розповіді. Stay tuned!
Джерело: Хабрахабр

0 коментарів

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