Чому повнозвʼязна мережа не годиться

Ознаку справді можна вивчити з даних. Але не будь-якою мережею: найпростіша з них розвалюється на зображеннях — і рівно з трьох причин, з яких виростає згортковий шар.

Попередня тема закінчилась питанням, а не відповіддю. Цілий блок ми вигадували, що саме викинути із зображення: гістограма викидала координати, HOG — абсолютну яскравість, SIFT — масштаб і поворот. Кожне таке рішення — здогад інженера. І в кінці ми запитали: а чи не можна замість вигадувати — вивчити потрібне перетворення з розмічених даних?

Можна. Ця тема — про те, чому перша й найочевидніша спроба це зробити провалюється, і чому саме її провал підказує правильну конструкцію. Наприкінці ми не «дізнаємось про згортковий шар». Ми його виведемо — як список ліків від трьох конкретних хвороб, кожну з яких побачимо на числах.

СпробаПитання, з яким прийшли

З курсу машинного навчання ми вже знаємо навчувану модель загального призначення — повнозвʼязну нейронну мережу (fully connected network, її ще звуть багатошаровим перцептроном, MLP). Вона влаштована просто: є вхідний вектор чисел, є шар нейронів, і кожен нейрон шару приєднаний до кожного входу власною вагою. Далі ReLU, ще шар, softmax — і на виході ймовірності класів.

Ця конструкція має чудову властивість: вона нічого не припускає про дані. Вхід для неї — просто список чисел, і вона готова знайти в ньому будь-яку залежність, яку дозволить кількість шарів. Саме тому нею й розумно спробувати першою.

Щоб подати їй зображення, потрібен один крок. Зображення — це сітка пікселів, тобто двовимірний (а з кольором — тривимірний) масив. Мережа хоче одновимірний вектор. Операція, яка перетворює одне на інше, зветься розгортанням (flatten): беремо перший рядок пікселів, за ним другий, за ним третій — і склеюємо в один довгий рядок чисел.

зображення 28 × 28  →  вектор довжини 784

Наскрізний приклад теми — три фігури. Усі заміри далі зроблено на одному й тому самому наборі: чорно-білі картинки 28 × 28, на кожній одна з трьох фігур — коло, квадрат або ромб. Три класи взято навмисно: тема доводить свою думку зсувом предмета, а не складністю розпізнавання, і трьох добре відрізнюваних фігур для цього рівно досить. З трьох класів випливає й нуль відліку, до якого ми повертатимемось у кожній таблиці: мережа, яка просто тицяє навмання, влучає в одному випадку з трьох, тобто дає точність 0.333. Саме тому на виході мережі стоїть три числа.

Далі все як завжди: Linear(784, 64), ReLU, Linear(64, 3), крос-ентропія, градієнтний спуск. Жодної нової математики. І — це важливо сказати чесно — воно працює. На маленьких акуратних картинках, де предмет завжди по центру й завжди одного розміру, така мережа дає майже стовідсоткову точність. Історичний MNIST (рукописні цифри 28 × 28) повнозвʼязна мережа розвʼязує на 98 %.

Що знаємо наперед. Повнозвʼязний шар, ReLU, softmax, крос-ентропію й градієнтний спуск ми не пояснюємо — вони розібрані в курсі машинного навчання, у темах про нейронні мережі та зворотне поширення. Тут нас цікавить одне: що з цією конструкцією робить саме зображення.

Отже, план теми — не «MLP поганий». План такий: чесно застосувати найпростішу навчувану модель до зображень і подивитись, де саме вона ламається. Ламатиметься вона в трьох місцях, і кожне ми полагодимо окремо.

ЦінаСкільки це коштує в параметрах

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

Візьмімо не іграшкову картинку, а звичайне фото, яке подають нейромережам: 224 × 224 пікселі, три канали кольору. Скільки в ньому чисел?

крок 1 · скільки чисел на вході

Пікселів у сітці — ширина помножити на висоту. У кожного пікселя три числа: червоне, зелене, синє.

224 × 224 × 3 = 150 528

Сто пʼятдесят тисяч чисел. Це і є довжина вектора після розгортання.

крок 2 · скільки ваг у першого шару

Хай у першому шарі буде тисяча нейронів — не так уже й багато, звичайний розмір. Кожен нейрон приєднаний до кожного входу власною вагою, тому ваг рівно стільки, скільки пар «вхід — нейрон».

150 528 × 1000 = 150 528 000

Сто пʼятдесят мільйонів чисел. І це тільки перший шар: далі буде другий, третій і вихідний.

крок 3 · скільки це важить

Кожна вага — дійсне число, у звичайному форматі float32 це чотири байти.

150 528 000 × 4 = 602 112 000 байтів ≈ 574 МіБ

Майже шістсот мільйонів байтів памʼяті — на один шар. Саме фото займає 150 528 байтів, тобто 147 КіБ. Памʼять під ваги першого шару в 4000 разів більша за сам знімок, який вони мають прочитати (602 112 000 проти 150 528 байтів). Самих ваг при цьому втисячу більше, ніж чисел у знімку.

Число незручне не тільки для памʼяті. Кожен параметр треба навчити, а для цього потрібні дані: модель зі ста пʼятдесятьма мільйонами вільних чисел на кількох тисячах фото просто запамʼятає навчальну вибірку — це класичне перенавчання з курсу машинного навчання.

А тепер найнеприємніше: як це число росте. Подвоїмо сторону зображення — площа зростає вчетверо, тобто й кількість ваг зростає вчетверо. Залежність квадратична від сторони.

Вхідчисел на входіваг у першому шарі (1000 нейронів)памʼять
28 × 28, сірий784784 0003 МіБ
64 × 64 × 312 28812 288 00047 МіБ
224 × 224 × 3150 528150 528 000574 МіБ
512 × 512 × 3786 432786 432 0002.9 ГіБ

Останній рядок варто прочитати повільно. Одна тисяча нейронів, один шар, фото 512 × 512 — і майже три гігабайти ваг. Жоден із цих параметрів ще нічого не вивчив.

Лічильник параметрів

Ліворуч повзунки роздільності й кількості нейронів. Стовпчики намальовані в логарифмічній шкалі: кожна поділка — це множення на десять, інакше коротший стовпчик просто зник би.

каналів
повнозвʼязний—
згортковий 3×3→16—
відношення—
памʼять шару—
Веди повзунок роздільності вправо й дивись на праву комірку. Стовпчик повнозвʼязного шару росте квадратично від сторони, а число в комірці «згортковий» не змінюється взагалі — воно не залежить від розміру зображення. Чому саме так, розберемо в розділі 07.

Можна заперечити: візьмімо не тисячу нейронів, а сто. Прожени це в інтерактиві — вийде пʼятнадцять мільйонів замість ста пʼятдесяти. Проблема не в конкретній цифрі, а в тому, що вона росте разом із розміром входу, тоді як складність самої задачі («чи є на фото кіт») від роздільності майже не залежить.

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

ГеометріяКуди дівається геометрія

Розгортання виглядає невинно: ми ж нічого не викинули, усі 784 числа на місці, просто переставили їх в один рядок. Насправді ми викинули найважливіше — інформацію про те, які пікселі поруч.

Подивись на два пікселі з координатами (10, 10) і (10, 11). На зображенні вони торкаються боками. Після розгортання вони опиняються на сусідніх місцях вектора — здається, сусідство збереглось. А тепер візьми (10, 10) і (11, 10): вони теж торкаються, але один під одним. У векторі між ними опиниться цілий рядок — при ширині 28 це 28 позицій, при ширині 224 — двісті двадцять чотири.

Але справжня біда навіть не в цьому. Повнозвʼязний шар узагалі не користується порядком входів. Для нього вхід — не рядок, а невпорядкований набір чисел, у кожного з яких є своя вага. Вага при вході номер 5 нічого не знає про вагу при вході номер 6; вони так само незалежні, як вага при вході 5 і при вході 700. Тобто після розгортання питання «які пікселі сусідні» для мережі просто не існує.

Розгортання руйнує сусідство

Зліва — сітка 8 × 8, обраний піксель і його чотири сусіди. Знизу — та сама сітка, розгорнута в рядок обраним порядком обходу. Дивись, куди розʼїхались кольорові клітинки.

порядок обходу
сусідів лишилось поруч—
найдальший сусід—
Прожени всі чотири порядки обходу по всіх позиціях. Жоден не зберігає всі чотири сусідства: обхід рядками рятує двох горизонтальних сусідів і відносить вертикальних на вісім клітинок, обхід стовпцями робить дзеркально те саме, змійка тримає поруч трохи більше сусідів, але розганяє найдальшого аж на пʼятнадцять клітинок, а блоки 2 × 2 лишають поруч щонайбільше одного. Більше ніж двох із чотирьох не втримає ніякий порядок — і це не вада конкретного алгоритму, а властивість самої задачі вкласти площину в рядок.

Отже, ідея «переставмо пікселі розумніше» не рятує. Але з цього ж місця росте найсильніший доказ, який узагалі є в цій темі, і він перевіряється дослідом.

Дослід, який усе вирішує: перемішування пікселів

Візьмімо одну випадкову перестановку — тобто фіксований список «піксель, який був на місці 0, іде на місце 317; той, що був на 1, іде на 44…». І застосуймо цю саму перестановку до всіх зображень датасету — і навчальних, і тестових. Людина після цього не впізнає на картинці нічого: замість фігури — рівномірне кришиво.

Питання: що станеться з точністю мережі? Відповідь для повнозвʼязної мережі — нічого. І це не спостереження, а те, що можна довести на трьох числах.

крок 1 · що робить шар

Один нейрон рахує зважену суму входів: кожен вхід множиться на свою вагу, усе додається. Для трьох пікселів це виглядає так:

s = w1·x1 + w2·x2 + w3·x3

Підставмо числа: ваги (0.5, −2.0, 1.0), пікселі (10, 4, 6).

s = 0.5·10 − 2.0·4 + 1.0·6 = 5 − 8 + 6 = 3
крок 2 · перемішуємо входи

Хай перестановка міняє пікселі місцями так: (10, 4, 6) → (6, 10, 4). Якщо ваги лишити старими, сума зіпсується: 0.5·6 − 2.0·10 + 1.0·4 = −13.

крок 3 · переставляємо й ваги

Але ваги ж не задані наперед — їх вивчає градієнтний спуск. Хай він знайде ваги, переставлені тією самою перестановкою: (1.0, 0.5, −2.0).

s = 1.0·6 + 0.5·10 − 2.0·4 = 6 + 5 − 8 = 3

Та сама трійка. Додавання не зважає на порядок доданків, тому для кожної повнозвʼязної мережі на початкових даних існує рівно так само хороша мережа на перемішаних — з тими самими вагами, лише переставленими.

Це і є вирок. Мережа, для якої перемішування пікселів нічого не міняє, не використовує зображення як зображення. Вона бачить набір незалежних вимірювань — так само, як бачила б рядок таблиці з віком, зростом і зарплатою клієнта. Уся геометрія, уся будова обʼєкта, усе, заради чого ми взагалі дивимось на фото, для неї не існує.

Дослід проведено на тому самому наборі з трьох фігур, зерна зафіксовані. Ось що показали дві мережі — точність на перевірочній вибірці:

Модельзвичайні зображенняперемішані однією перестановкою
Повнозвʼязна (MLP)0.9930.997
Згорткова (CNN)1.0000.970

Читай верхній рядок буквально: втрати немає взагалі. Повнозвʼязна мережа не помітила, що зображення знищили, — та й не могла помітити, ми щойно це довели. І збігається не тільки кінцеве число: збігається вся крива навчання, епоха за епохою.

Точність MLP після епохи123456
звичайні зображення0.6430.7900.9970.9230.9901.000
перемішані0.6400.7531.0000.9130.9901.000

Дві копії однієї й тієї самої мережі вчаться на даних, які людині здаються цілком різними, — і йдуть однією й тією самою дорогою. Тут показано перші шість епох із дванадцяти, і видно, що точність по дорозі гуляє в обидва боки — 0.997 на третій, 0.923 на четвертій; підсумкові числа з таблиці вище (0.993 і 0.997) — це те, до чого мережі прийшли на дванадцятій.

А тепер чесно про згорткову, бо її результат скромніший, ніж хотілося б. Вона просіла — з 1.000 до 0.970, — але не розвалилась. На 1 200 прикладах їй вистачає ємності, щоб вивчити навіть кришиво: ядро перестає бути детектором межі й перетворюється на детектор «оцього конкретного візерунка з випадкових пікселів», а голова з нього щось та й збирає. Різниця видніша в тому, як важко це далось: на звичайних зображеннях згорткова мережа виходить на 1.000 з восьмої епохи й більше звідти не сходить, а на перемішаних за всі дванадцять епох дістає лише 0.970 і продовжує повзти вгору. Вбудоване припущення не робить неможливе можливим — воно робить потрібне дешевим.

Де різниця стає прірвою. Зменш вибірку вчетверо — і побачиш те саме в чистому вигляді. На 300 прикладах замість 1 200 повнозвʼязна мережа тримає ті самі 0.963 і на звичайних зображеннях, і на перемішаних — знову рівно нічого не втративши. Згорткова на такій вибірці за ті самі дванадцять епох доходить лише до 0.643 на звичайних, а на перемішаних падає до 0.323, тобто рівно до вгадування: у неї відібрали єдине, на що вона спиралась, і надолужити ємністю вже нічим. Це загальне правило, до якого ми ще повернемось у темі 12 «Перенос навчання»: правильне припущення важить тим більше, чим менше в тебе даних.

Перемішування: спробуй сам

Перемикач угорі вмикає ту саму фіксовану перестановку. Подивись на картинку й натисни, яка це фігура. Твої влучання рахуються поруч із машинними.

що показуємо
твоя відповідь
ти: влучив0 / 0
твоя точність—
MLP тут—
CNN тут—
Дай собі десяток спроб у режимі «перемішано». Твоя точність сяде приблизно на 0.33 — рівень чесного вгадування з трьох варіантів, — тоді як повнозвʼязна мережа на тих самих даних лишається на 0.997. Тобі перемішування відібрало все; їй — нічого. Це і є вимірювання того, наскільки різні речі ви двоє називаєте «дивитись на зображення».

ЛокальністьКожна вага бачить одне місце

Третя проблема тонша за перші дві, і саме вона найдорожча на практиці.

Вага в повнозвʼязному шарі — це число, привʼязане до однієї пари: цей конкретний нейрон і цей конкретний піксель. Вага з номером 317 усе життя множитиме піксель 317, тобто піксель із координатами (11, 9), і ніякий інший.

Тепер уяви, що мережа під час навчання виробила корисну штуку: група ваг у лівому верхньому куті навчилась відгукуватись на вертикальну межу. Чудово. Що станеться, коли та сама вертикальна межа зʼявиться в правому нижньому куті?

Нічого. Там інші пікселі, отже, інші ваги, а вони про відкриття сусідів нічого не знають. Щоб мережа впізнавала вертикальну межу і там, вона мусить вивчити її заново, з нуля, окремим набором ваг — і для цього їй потрібні приклади, де межа стоїть саме там.

Одна вага — одне місце

Сірий квадрат — предмет 7 × 7 на полотні 28 × 28. Ліворуч видно, які пікселі він накриває; праворуч — карта ваг першого нейрона, де світяться рівно ті ваги, які цей предмет узагалі здатен розворушити. Бурштинова рамка — еталонне положення по центру.

ваг задіяно49
спільних з еталоном49
частка спільних ваг100 %
Зсунь предмет на сім пікселів у будь-який бік. Частка спільних ваг падає до нуля: набір, який мережа вивчила для центру, для нового положення не працює взагалі — там інші ваги, і їх треба вчити окремими прикладами. Предмет 7 × 7 на полотні 28 × 28 має 484 різні положення, і повнозвʼязна мережа мусить побачити кожне.

Порахуймо, у що це обходиться. Предмет розміром 7 × 7 на полотні 28 × 28 можна поставити в 22 положення по горизонталі й у 22 по вертикалі — це 484 різні розташування. Якщо мережа має впізнавати фігуру всюди, вона мусить окремо навчитись цього для кожного з 484 місць. Той самий приклад, показаний мережі, навчає рівно одне з них.

Ось де ховається справжня ціна. Не памʼять — дані. Кількість прикладів, потрібних, щоб вивчити ознаку «всюди», множиться на кількість позицій. А зображення 224 × 224 має не 484 положення, а 47 524: предмет 7 × 7 можна поставити в 224 − 7 + 1 = 218 позицій по горизонталі й у стільки ж по вертикалі, а 218 × 218 = 47 524.

Аугментація не скасовує проблему. Досвідчений читач одразу скаже: та навчімо на зсунутих копіях, це ж стандартний прийом. Так, і він допомагає — про нього буде окрема тема 10 «Аугментація даних». Але зверни увагу, що саме він робить: він докуповує приклади, щоб мережа вивчила ту саму ознаку в кожному з 484 місць окремо. Ліки лікують симптом і коштують того самого множника в даних і часі навчання. Правильне лікування — зробити так, щоб ознаку не треба було вчити двічі.

ДослідЗсув: головний дослід

Перевіримо це не міркуванням, а вимірюванням. Дослід улаштований так.

умова

Датасет — три фігури 28 × 28: коло, квадрат, ромб. Три класи, тож випадкове вгадування дає точність 0.333, і це наш нуль відліку.

навчання

Обидві мережі вчаться на предметах, які стоять майже по центру: центр гуляє лише на ±1 піксель.

перевірка

Двічі. Перший тест — з того самого розподілу (теж по центру). Другий — на тих самих фігурах, зсунутих на ±6 пікселів. Форма та сама, клас той самий, змінилось лише місце.

Модельпараметрівтой самий розподілзсунуті предмети
Повнозвʼязна (MLP)50 4350.9930.253
Згорткова (CNN)4 0031.0000.647

Прочитай таблицю по стовпчиках, бо кожен говорить своє.

Стовпчик «параметрів». У згорткової мережі їх у 13 разів менше. Не на кілька відсотків — у 13 разів.

Стовпчик «той самий розподіл». Обидві мережі розвʼязали задачу. Якби ми зупинились тут — а так роблять частіше, ніж хочеться, — ми б написали у звіті, що модель працює бездоганно, і були б формально праві.

Стовпчик «зсунуті предмети». Повнозвʼязна мережа впала до 0.253 — це нижче за рівень випадкового вгадування 0.333. Читати це треба буквально: якби вона просто підкидала монетку, вийшло б краще. Маючи в 13 разів більше параметрів, вона не впізнає ту саму фігуру, зсунуту на шість пікселів, — не «трохи гірше розпізнає», а не впізнає взагалі. Згорткова на тих самих даних тримає 0.647.

Чому нижче за вгадування, а не рівно на ньому? Бо мережа не вагається — вона впевнена. Зсунутий квадрат накриває ті пікселі, які в навчанні належали, скажімо, краю ромба, і мережа рішуче відповідає «ромб». Модель, яка навчилась не тій ознаці, помиляється систематично, а не випадково; випадкові 0.333 треба ще заслужити.

Що робить зсув

Повзунок відсуває предмет від центру. Ліворуч видно, як виглядає зображення на перевірці; праворуч — заміряна точність обох мереж проти величини зсуву. Пунктир — рівень випадкового вгадування 0.333.

MLP—
CNN—
перевага CNN—
Веди повзунок від 0 до 8 і дивись на обидві криві. Повнозвʼязна просідає вже на другому пікселі, а на четвертому падає нижче за рівень вгадування 0.333 і далі там і лишається. Згорткова тримається краще на всій дистанції — але й вона сповзає. Це важливо: згортка дає часткову терпимість до зсуву, а не незалежність від нього.
Чесно про згорткову мережу. 0.647 на зсунутих предметах — це набагато краще за 0.253, але дуже далеко від 1.000. Згортка сама собою не робить мережу нечутливою до положення предмета: вона робить так, що ознака знаходиться в будь-якому місці, — але те, де саме вона знайшлась, у нашій маленькій мережі досі впливає на відповідь, бо голова в неї повнозвʼязна. Терпимість до зсуву добудовується окремо, і про це наступні теми: спершу 08 «Пулінг і зменшення розмірності», потім тема 10 «Аугментація даних». Тут ми показали напрямок, а не готове рішення.

ЛікиТри ліки

Ми маємо три діагнози, і кожен вимагає свого лікування. Далі — найважливіші три абзаци теми: з них цілком виводиться згортковий шар. Читай так, ніби ти його зараз винаходиш.

Ліки перші: локальність

Хвороба: кожен нейрон дивиться на всі 150 528 входів одразу, звідси мільйони ваг.

Спостереження: а навіщо йому всі? Щоб зрозуміти, чи є в точці (10, 10) вертикальна межа, треба подивитись на пікселі навколо цієї точки. Піксель у протилежному куті кадру для цього питання не потрібен. Локальні ознаки — межі, кути, плями, текстура — живуть у маленькому вікні.

Ліки: хай нейрон дивиться не на все зображення, а лише на вікно k × k навколо своєї точки. При k = 3 це девʼять пікселів замість ста пʼятдесяти тисяч. Це і зветься локальністю (locality), а вікно, яке нейрон бачить, — його рецептивним полем (receptive field).

Локальне вікно проти повного звʼязку

Полотно 28 × 28. Підсвічені пікселі — ті, які бачить один нейрон. Повзунок міняє розмір вікна; на самому правому краї вікно доростає до цілого зображення — і це рівно повнозвʼязний шар.

готові положення
входів у нейрона9
менше за повний×87
шар із 16 таких нейронів—
Доведи повзунок до самого правого краю. Вікно 28 × 28 накриває все полотно, і кількість ваг стає такою самою, як у повнозвʼязного шару. Повнозвʼязний шар — це не інша конструкція, а граничний випадок локального вікна, розтягнутого на все зображення.

Ліки другі: спільні ваги

Хвороба: ознака, вивчена в одному куті, не працює в іншому, тому потреба в даних множиться на кількість положень — а їх на нашому полотні 484.

Спостереження: вертикальна межа в лівому куті виглядає точнісінько так само, як вертикальна межа в правому. Це та сама картинка, просто в іншому місці. Тоді навіщо нам два різні набори ваг?

Ліки: хай буде одне вікно ваг — назвемо його ядром (kernel), точно як у темі 04, — і хай воно ковзає по всьому зображенню, застосовуючись у кожній точці. Одні й ті самі девʼять чисел рахують відповідь скрізь. Це і зветься спільними вагами (weight sharing), і наслідків у цього два, обидва величезні: параметрів стає мало, а кожен приклад навчає ядро в усіх позиціях одразу.

Спільне ядро проти окремих ваг

Ліворуч ядро ковзає полотном. Праворуч дві бухгалтерії: скільки параметрів і скільки уроків дає один приклад, якщо ваги спільні — і якщо в кожній позиції свій набір.

спільне ядро—
окремі ваги—
позицій—
уроків з одного прикладу—
Розтягни полотно повзунком. Число в комірці «спільне ядро» не зрушить із місця — воно залежить тільки від розміру ядра. Число в комірці «окремі ваги» росте квадратично. І дивись на нижню праву комірку: один приклад дає спільному ядру стільки уроків, скільки в полотні позицій, — окремим вагам він дає рівно один.

Ліки треті: зменшення розмірності

Хвороба: навіть якщо перший шар дешевий, зображення досі велике, і тягти всі 150 528 позицій до самого виходу — це знову мільйони ваг у голові мережі.

Спостереження: що глибше в мережі, то грубіша потрібна точність розташування. На першому шарі важливо, де саме межа — з точністю до пікселя. На останньому питання інше: «є десь у кадрі колесо?» — і відповідь «десь угорі праворуч» цілком достатня.

Ліки: поступово зменшувати просторовий розмір, лишаючи натомість більше каналів: 28 × 28 → 14 × 14 → 7 × 7 → 3 × 3. Найпростіший спосіб огрубити сітку вдвічі — поділити її на квадратики 2 × 2 і від кожного лишити тільки найбільше число. Ця операція зветься пулінгом за максимумом (max pooling); тут ми беремо її як готовий інструмент, а розберемо як слід у темі 08 — там же побачимо, що саме вона додає до терпимості до зсуву. Після трьох таких огрублень до голови мережі приходить не 784 пікселі, а 16 карт по 3 × 3, тобто 144 числа.

Драбина огрублень

Кожне огрублення 2 × 2 ділить сторону карти навпіл. Праворуч — скільки ваг після цього коштує повнозвʼязна голова, яка видає три класи.

сторона карти—
чисел до голови—
ваг у голові на три класи—
Веди повзунок від нуля до трьох. Сторона карти падає вдвічі за крок, а кількість чисел у ній — учетверо, бо чисел стільки, скільки клітинок площі. Голова дешевшає рівно в тій самій пропорції: 37 635 ваг без жодного огрублення проти 435 після трьох. Ознаки при цьому нікуди не діваються — 16 карт лишаються шістнадцятьма, грубішає тільки сітка, на якій вони записані.

Ось і все. Три ліки — локальність, спільні ваги і зменшення розмірності — і є згортковий шар. Його не вигадали як гарну ідею; його вивели, полагодивши три конкретні хвороби повнозвʼязного шару на зображеннях. Ядро, що ковзає картинкою, ти вже бачив у темі 04, коли рахував Собеля руками. Різниця лише в тому, що там числа ядра придумав Собель, а тут їх знайде градієнтний спуск.

АрифметикаСкільки параметрів у згорткового шару

Порахуймо ту саму суму, що й на початку теми, але для згорткового шару. Умови ті самі: вхід 224 × 224 × 3.

крок 1 · одне ядро

Ядро 3 × 3 дивиться у вікно з девʼяти пікселів, але в кожного пікселя три канали кольору, тож чисел у вікні втричі більше.

3 × 3 × 3 = 27 ваг в одному ядрі
крок 2 · багато ядер

Одне ядро вміє шукати одну річ — скажімо, вертикальну межу. Нам потрібні різні: горизонтальні межі, кути, плями. Візьмімо 16 ядер; кожне дасть свою карту ознак (feature map).

27 × 16 = 432 ваги
крок 3 · зсуви

У кожного ядра є ще один вільний параметр — зсув (bias), одне число на ядро.

432 + 16 = 448 параметрів

Чотириста сорок вісім. Порівняймо чесно, у тих самих умовах — і в обох рядках рахуємо усі параметри, разом зі зсувами: у повнозвʼязного шару це 150 528 000 ваг плюс 1 000 зсувів, у згорткового — 432 ваги плюс 16 зсувів.

Перший шар над фото 224 × 224 × 3параметрів
повнозвʼязний, 1000 нейронів150 529 000
згортковий, 16 ядер 3 × 3448

Різниця — приблизно в 336 тисяч разів. Але найважливіше в цьому підрахунку інше, і це варто сказати окремо: у виразі 3 × 3 × 3 × 16 + 16 немає розміру зображення. Ті самі 448 параметрів обслужать і фото 224 × 224, і кадр 4K. Зміниться кількість обчислень — ядро доведеться прикласти в більшій кількості місць, — але кількість чисел, які треба вивчити, лишиться тією самою.

Таку арифметику варто вміти робити на папері, і перевіряється вона одним рядком: sum(p.numel() for p in model.parameters()) додає розміри всіх тензорів моделі. Для двох мереж нашого досліду це дає 50 435 у повнозвʼязної (784 × 64 + 64 у першому шарі, 64 × 3 + 3 у другому) і 4 003 у згорткової. Якщо паперове число й машинне розійшлися, розійшлись вони завжди в одному місці: або забуто зсуви, або шар зібрано не з тими каналами.

ПрипущенняЧому це не просто економія

Найлегше зрозуміти згортку як спосіб заощадити памʼять. Це правда, але це найменш важлива правда. Головне інше.

Коли ми змусили одне ядро працювати в усіх місцях зображення, ми заявили щось про світ. А саме: «те, що корисно розпізнавати тут, корисно розпізнавати й там». Мережа більше не має свободи вирішити інакше — ми забрали цю свободу в неї руками, ще до першого прикладу.

Таке вбудоване припущення зветься індуктивним зміщенням (inductive bias). Слово «зміщення» тут означає не помилку, а нахил: модель заздалегідь нахилена до певного класу розвʼязків. У згорткового шару їх два:

Чому обмеження допомагає. Здається дивним: ми відібрали в моделі свободу — а вона стала кращою. Але саме так і працює будь-яке правильне припущення. Мережа більше не витрачає дані на перевірку гіпотези «а раптом лівий верхній кут живе за іншими законами, ніж правий нижній». Ми відповіли на це питання за неї — правильно, — і всі приклади пішли на те, що справді треба вивчити. Це та сама думка, що й регуляризація в курсі машинного навчання: менше свободи — менше перенавчання.

І тут же — плата, про яку кажуть рідше. Індуктивне зміщення не безкоштовне. Там, де припущення хибне, воно шкодить.

Найпростіший приклад — звичайна таблиця. Хай у рядку три колонки: вік клієнта, місто, залишок на рахунку. Спробуй застосувати до неї згортку 1 × 3 — тобто заявити, що «вік» і «місто» сусіди, а «місто» й «залишок» теж сусіди, і те саме правило годиться для обох пар. Це неправда: у стовпців таблиці немає жодного сусідства, їх узагалі можна переставити місцями без втрати сенсу. Згорткова мережа тут буде гіршою за повнозвʼязну, і причина рівно та, з якої на зображеннях вона краща.

Той самий підступ буває і всередині зору. Якщо задача така, що положення важливе абсолютно — скажімо, у документі підпис завжди внизу, а шапка завжди вгорі, — то припущення «правило не залежить від місця» відбирає корисну підказку, і її доводиться повертати окремими прийомами.

І останнє, що чесно тут сказати: припущення виграє тим менше, чим більше в тебе даних. Коли прикладів мільярди, модель може вивести правильні правила сама, і жорстко вбудоване зміщення починає заважати. Саме цим виграють Vision Transformer із блоку 4, у яких локальності й спільних ваг у згортковому сенсі немає — але за це вони платять апетитом до даних. До теми 20 «Vision Transformer» ми дійдемо із цим питанням уже сформульованим.

ГоловаДе повнозвʼязний шар лишається

Після всього сказаного легко зробити неправильний висновок: повнозвʼязний шар поганий, викиньмо його. Ні. Він стоїть майже в кожній згортковій мережі — просто не на вході, а в кінці, і зветься там головою (head).

Чому там він уже не коштує мільйонів — видно з арифметики. Згортки із зменшенням розмірності вже стиснули картинку: у нашій маленькій мережі з досліду 28 × 28 × 1 перетворилось на 16 карт по 3 × 3, тобто на 144 числа. Повнозвʼязний шар над ними, який видає три класи, коштує:

144 × 3 + 3 = 435 параметрів

Тобто в реальній мережі повнозвʼязний шар працює не над пікселями, а над ознаками. Пікселів було 150 528, і кожен окремо нічого не означав; ознак — кілька сотень або тисяч, і кожна вже щось означає («тут є колесо», «тут смугаста текстура»). Обʼєднувати такі ознаки в остаточну відповідь — саме та робота, для якої повнозвʼязний шар годиться ідеально: тут справді потрібен кожен з кожним, бо жодного сусідства між ознаками немає.

Заодно це відповідь на питання, чому в темі про «повнозвʼязна не годиться» ми будуємо згорткову мережу, яка закінчується повнозвʼязним шаром. Порядок має значення. Спершу згортки перетворюють пікселі на ознаки, потім повнозвʼязний шар перетворює ознаки на відповідь. Помилка — не в самому шарі, а в тому, щоб подати йому сирі пікселі.

ІсторіяЧому це зрозуміли не одразу

Три ліки вище виглядають майже очевидними — коли їх уже перелічили. Насправді дорога до них зайняла десятиліття, і корисно розуміти чому.

Перша конструкція з локальністю й спільними вагами зʼявилась у 1980 році: японський дослідник Куніхіко Фукусіма описав неокогнітрон — мережу, натхнену будовою зорової кори, де прості клітини реагували на локальні візерунки, а складніші збирали з них цілі. Ідея була правильна, але навчати її нормально не вміли: зворотного поширення в тій роботі не було. Наприкінці 1980-х Ян ЛеКун поєднав дві половини — згорткову будову й навчання зворотним поширенням, — і в 1998-му вийшла LeNet-5, мережа, що читала суми на банківських чеках у промисловому масштабі.

Після цього настала пауза років на десять. Причини були прозаїчні: бракувало розмічених даних і не було на чому рахувати; згортки визнали остаточно тільки коли зійшлися великий датасет і графічні процесори — про це буде тема 13 «AlexNet і VGG».

Але є й змістовна причина, і вона цікавіша. Загальний настрій тих років радив розширювати свободу моделі, а не звужувати її: чим гнучкіша модель, тим більше вона зможе. Думка «зафіксуймо ваги однаковими в усіх позиціях, бо ми впевнені, що так правильно» звучала як крок назад, як штучне обмеження. Знадобився час, щоб стало загальновизнаним протилежне: правильно вбудоване припущення коштує дешевше за будь-яку кількість даних, витрачених на те, щоб мережа здогадалась про нього сама.

ПідсумокПідсумок

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

І три ліки, які з цих поломок виводяться однозначно: локальність (нейрон дивиться у вікно, а не на все), спільні ваги (одне ядро на всю картинку) і зменшення розмірності (не тягти всі пікселі до кінця). Разом вони — згортковий шар. Плюс одне поняття, яке лишиться з тобою до кінця курсу: індуктивне зміщення — вбудоване припущення, яке виграє, поки воно правдиве, і програє, щойно перестало.

І чесна межа, яку ми не заховали: згортка не зробила мережу незалежною від положення предмета. Вона дала часткову терпимість — 0.647 замість 0.253, — і цього мало. Терпимість до зсуву доведеться добудовувати, і робити це ми почнемо в темі 08.

Наступна тема бере перше з трьох ліків і розбирає його по гвинтику. Що саме рахує згортковий шар над кольоровим зображенням; звідки беруться канали й чому їх кількість — окреме число; що таке padding і stride і як від них залежить розмір виходу; і скільки в шарі параметрів насправді — з формулою, яку ми звіримо з nn.Conv2d.