Попередня тема закінчилась питанням, а не відповіддю. Цілий блок ми вигадували, що саме викинути із зображення: гістограма викидала координати, HOG — абсолютну яскравість, SIFT — масштаб і поворот. Кожне таке рішення — здогад інженера. І в кінці ми запитали: а чи не можна замість вигадувати — вивчити потрібне перетворення з розмічених даних?
Можна. Ця тема — про те, чому перша й найочевидніша спроба це зробити провалюється, і чому саме її провал підказує правильну конструкцію. Наприкінці ми не «дізнаємось про згортковий шар». Ми його виведемо — як список ліків від трьох конкретних хвороб, кожну з яких побачимо на числах.
СпробаПитання, з яким прийшли
З курсу машинного навчання ми вже знаємо навчувану модель загального призначення — повнозвʼязну нейронну мережу (fully connected network, її ще звуть багатошаровим перцептроном, MLP). Вона влаштована просто: є вхідний вектор чисел, є шар нейронів, і кожен нейрон шару приєднаний до кожного входу власною вагою. Далі ReLU, ще шар, softmax — і на виході ймовірності класів.
Ця конструкція має чудову властивість: вона нічого не припускає про дані. Вхід для неї — просто список чисел, і вона готова знайти в ньому будь-яку залежність, яку дозволить кількість шарів. Саме тому нею й розумно спробувати першою.
Щоб подати їй зображення, потрібен один крок. Зображення — це сітка пікселів, тобто двовимірний (а з кольором — тривимірний) масив. Мережа хоче одновимірний вектор. Операція, яка перетворює одне на інше, зветься розгортанням (flatten): беремо перший рядок пікселів, за ним другий, за ним третій — і склеюємо в один довгий рядок чисел.
Наскрізний приклад теми — три фігури. Усі заміри далі зроблено на одному й тому самому наборі: чорно-білі картинки 28 × 28, на кожній одна з трьох фігур — коло, квадрат або ромб. Три класи взято навмисно: тема доводить свою думку зсувом предмета, а не складністю розпізнавання, і трьох добре відрізнюваних фігур для цього рівно досить. З трьох класів випливає й нуль відліку, до якого ми повертатимемось у кожній таблиці: мережа, яка просто тицяє навмання, влучає в одному випадку з трьох, тобто дає точність 0.333. Саме тому на виході мережі стоїть три числа.
Далі все як завжди: Linear(784, 64), ReLU, Linear(64, 3),
крос-ентропія, градієнтний спуск. Жодної нової математики. І — це важливо сказати чесно —
воно працює. На маленьких акуратних картинках, де предмет завжди по центру
й завжди одного розміру, така мережа дає майже стовідсоткову точність. Історичний MNIST
(рукописні цифри 28 × 28) повнозвʼязна мережа розвʼязує на 98 %.
Отже, план теми — не «MLP поганий». План такий: чесно застосувати найпростішу навчувану модель до зображень і подивитись, де саме вона ламається. Ламатиметься вона в трьох місцях, і кожне ми полагодимо окремо.
ЦінаСкільки це коштує в параметрах
Перша проблема видно з арифметики, ще до будь-якого навчання. Порахуймо руками.
Візьмімо не іграшкову картинку, а звичайне фото, яке подають нейромережам: 224 × 224 пікселі, три канали кольору. Скільки в ньому чисел?
Пікселів у сітці — ширина помножити на висоту. У кожного пікселя три числа: червоне, зелене, синє.
Сто пʼятдесят тисяч чисел. Це і є довжина вектора після розгортання.
Хай у першому шарі буде тисяча нейронів — не так уже й багато, звичайний розмір. Кожен нейрон приєднаний до кожного входу власною вагою, тому ваг рівно стільки, скільки пар «вхід — нейрон».
Сто пʼятдесят мільйонів чисел. І це тільки перший шар: далі буде другий, третій і вихідний.
Кожна вага — дійсне число, у звичайному форматі float32 це чотири
байти.
Майже шістсот мільйонів байтів памʼяті — на один шар. Саме фото займає 150 528 байтів, тобто 147 КіБ. Памʼять під ваги першого шару в 4000 разів більша за сам знімок, який вони мають прочитати (602 112 000 проти 150 528 байтів). Самих ваг при цьому втисячу більше, ніж чисел у знімку.
Число незручне не тільки для памʼяті. Кожен параметр треба навчити, а для цього потрібні дані: модель зі ста пʼятдесятьма мільйонами вільних чисел на кількох тисячах фото просто запамʼятає навчальну вибірку — це класичне перенавчання з курсу машинного навчання.
А тепер найнеприємніше: як це число росте. Подвоїмо сторону зображення — площа зростає вчетверо, тобто й кількість ваг зростає вчетверо. Залежність квадратична від сторони.
| Вхід | чисел на вході | ваг у першому шарі (1000 нейронів) | памʼять |
|---|---|---|---|
| 28 × 28, сірий | 784 | 784 000 | 3 МіБ |
| 64 × 64 × 3 | 12 288 | 12 288 000 | 47 МіБ |
| 224 × 224 × 3 | 150 528 | 150 528 000 | 574 МіБ |
| 512 × 512 × 3 | 786 432 | 786 432 000 | 2.9 ГіБ |
Останній рядок варто прочитати повільно. Одна тисяча нейронів, один шар, фото 512 × 512 — і майже три гігабайти ваг. Жоден із цих параметрів ще нічого не вивчив.
Лічильник параметрів
Ліворуч повзунки роздільності й кількості нейронів. Стовпчики намальовані в логарифмічній шкалі: кожна поділка — це множення на десять, інакше коротший стовпчик просто зник би.
Можна заперечити: візьмімо не тисячу нейронів, а сто. Прожени це в інтерактиві — вийде пʼятнадцять мільйонів замість ста пʼятдесяти. Проблема не в конкретній цифрі, а в тому, що вона росте разом із розміром входу, тоді як складність самої задачі («чи є на фото кіт») від роздільності майже не залежить.
І все ж це лише перша, найменш цікава проблема. Памʼять можна докупити. Наступні дві докупити не можна.
ГеометріяКуди дівається геометрія
Розгортання виглядає невинно: ми ж нічого не викинули, усі 784 числа на місці, просто переставили їх в один рядок. Насправді ми викинули найважливіше — інформацію про те, які пікселі поруч.
Подивись на два пікселі з координатами (10, 10) і (10, 11). На зображенні вони торкаються боками. Після розгортання вони опиняються на сусідніх місцях вектора — здається, сусідство збереглось. А тепер візьми (10, 10) і (11, 10): вони теж торкаються, але один під одним. У векторі між ними опиниться цілий рядок — при ширині 28 це 28 позицій, при ширині 224 — двісті двадцять чотири.
Але справжня біда навіть не в цьому. Повнозвʼязний шар узагалі не користується порядком входів. Для нього вхід — не рядок, а невпорядкований набір чисел, у кожного з яких є своя вага. Вага при вході номер 5 нічого не знає про вагу при вході номер 6; вони так само незалежні, як вага при вході 5 і при вході 700. Тобто після розгортання питання «які пікселі сусідні» для мережі просто не існує.
Розгортання руйнує сусідство
Зліва — сітка 8 × 8, обраний піксель і його чотири сусіди. Знизу — та сама сітка, розгорнута в рядок обраним порядком обходу. Дивись, куди розʼїхались кольорові клітинки.
Отже, ідея «переставмо пікселі розумніше» не рятує. Але з цього ж місця росте найсильніший доказ, який узагалі є в цій темі, і він перевіряється дослідом.
Дослід, який усе вирішує: перемішування пікселів
Візьмімо одну випадкову перестановку — тобто фіксований список «піксель, який був на місці 0, іде на місце 317; той, що був на 1, іде на 44…». І застосуймо цю саму перестановку до всіх зображень датасету — і навчальних, і тестових. Людина після цього не впізнає на картинці нічого: замість фігури — рівномірне кришиво.
Питання: що станеться з точністю мережі? Відповідь для повнозвʼязної мережі — нічого. І це не спостереження, а те, що можна довести на трьох числах.
Один нейрон рахує зважену суму входів: кожен вхід множиться на свою вагу, усе додається. Для трьох пікселів це виглядає так:
Підставмо числа: ваги (0.5, −2.0, 1.0), пікселі (10, 4, 6).
Хай перестановка міняє пікселі місцями так: (10, 4, 6) → (6, 10, 4). Якщо ваги лишити старими, сума зіпсується: 0.5·6 − 2.0·10 + 1.0·4 = −13.
Але ваги ж не задані наперед — їх вивчає градієнтний спуск. Хай він знайде ваги, переставлені тією самою перестановкою: (1.0, 0.5, −2.0).
Та сама трійка. Додавання не зважає на порядок доданків, тому для кожної повнозвʼязної мережі на початкових даних існує рівно так само хороша мережа на перемішаних — з тими самими вагами, лише переставленими.
Це і є вирок. Мережа, для якої перемішування пікселів нічого не міняє, не використовує зображення як зображення. Вона бачить набір незалежних вимірювань — так само, як бачила б рядок таблиці з віком, зростом і зарплатою клієнта. Уся геометрія, уся будова обʼєкта, усе, заради чого ми взагалі дивимось на фото, для неї не існує.
Дослід проведено на тому самому наборі з трьох фігур, зерна зафіксовані. Ось що показали дві мережі — точність на перевірочній вибірці:
| Модель | звичайні зображення | перемішані однією перестановкою |
|---|---|---|
| Повнозвʼязна (MLP) | 0.993 | 0.997 |
| Згорткова (CNN) | 1.000 | 0.970 |
Читай верхній рядок буквально: втрати немає взагалі. Повнозвʼязна мережа не помітила, що зображення знищили, — та й не могла помітити, ми щойно це довели. І збігається не тільки кінцеве число: збігається вся крива навчання, епоха за епохою.
| Точність MLP після епохи | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| звичайні зображення | 0.643 | 0.790 | 0.997 | 0.923 | 0.990 | 1.000 |
| перемішані | 0.640 | 0.753 | 1.000 | 0.913 | 0.990 | 1.000 |
Дві копії однієї й тієї самої мережі вчаться на даних, які людині здаються цілком різними, — і йдуть однією й тією самою дорогою. Тут показано перші шість епох із дванадцяти, і видно, що точність по дорозі гуляє в обидва боки — 0.997 на третій, 0.923 на четвертій; підсумкові числа з таблиці вище (0.993 і 0.997) — це те, до чого мережі прийшли на дванадцятій.
А тепер чесно про згорткову, бо її результат скромніший, ніж хотілося б. Вона просіла — з 1.000 до 0.970, — але не розвалилась. На 1 200 прикладах їй вистачає ємності, щоб вивчити навіть кришиво: ядро перестає бути детектором межі й перетворюється на детектор «оцього конкретного візерунка з випадкових пікселів», а голова з нього щось та й збирає. Різниця видніша в тому, як важко це далось: на звичайних зображеннях згорткова мережа виходить на 1.000 з восьмої епохи й більше звідти не сходить, а на перемішаних за всі дванадцять епох дістає лише 0.970 і продовжує повзти вгору. Вбудоване припущення не робить неможливе можливим — воно робить потрібне дешевим.
Перемішування: спробуй сам
Перемикач угорі вмикає ту саму фіксовану перестановку. Подивись на картинку й натисни, яка це фігура. Твої влучання рахуються поруч із машинними.
ЛокальністьКожна вага бачить одне місце
Третя проблема тонша за перші дві, і саме вона найдорожча на практиці.
Вага в повнозвʼязному шарі — це число, привʼязане до однієї пари: цей конкретний нейрон і цей конкретний піксель. Вага з номером 317 усе життя множитиме піксель 317, тобто піксель із координатами (11, 9), і ніякий інший.
Тепер уяви, що мережа під час навчання виробила корисну штуку: група ваг у лівому верхньому куті навчилась відгукуватись на вертикальну межу. Чудово. Що станеться, коли та сама вертикальна межа зʼявиться в правому нижньому куті?
Нічого. Там інші пікселі, отже, інші ваги, а вони про відкриття сусідів нічого не знають. Щоб мережа впізнавала вертикальну межу і там, вона мусить вивчити її заново, з нуля, окремим набором ваг — і для цього їй потрібні приклади, де межа стоїть саме там.
Одна вага — одне місце
Сірий квадрат — предмет 7 × 7 на полотні 28 × 28. Ліворуч видно, які пікселі він накриває; праворуч — карта ваг першого нейрона, де світяться рівно ті ваги, які цей предмет узагалі здатен розворушити. Бурштинова рамка — еталонне положення по центру.
Порахуймо, у що це обходиться. Предмет розміром 7 × 7 на полотні 28 × 28 можна поставити в 22 положення по горизонталі й у 22 по вертикалі — це 484 різні розташування. Якщо мережа має впізнавати фігуру всюди, вона мусить окремо навчитись цього для кожного з 484 місць. Той самий приклад, показаний мережі, навчає рівно одне з них.
Ось де ховається справжня ціна. Не памʼять — дані. Кількість прикладів, потрібних, щоб вивчити ознаку «всюди», множиться на кількість позицій. А зображення 224 × 224 має не 484 положення, а 47 524: предмет 7 × 7 можна поставити в 224 − 7 + 1 = 218 позицій по горизонталі й у стільки ж по вертикалі, а 218 × 218 = 47 524.
ДослідЗсув: головний дослід
Перевіримо це не міркуванням, а вимірюванням. Дослід улаштований так.
Датасет — три фігури 28 × 28: коло, квадрат, ромб. Три класи, тож випадкове вгадування дає точність 0.333, і це наш нуль відліку.
Обидві мережі вчаться на предметах, які стоять майже по центру: центр гуляє лише на ±1 піксель.
Двічі. Перший тест — з того самого розподілу (теж по центру). Другий — на тих самих фігурах, зсунутих на ±6 пікселів. Форма та сама, клас той самий, змінилось лише місце.
| Модель | параметрів | той самий розподіл | зсунуті предмети |
|---|---|---|---|
| Повнозвʼязна (MLP) | 50 435 | 0.993 | 0.253 |
| Згорткова (CNN) | 4 003 | 1.000 | 0.647 |
Прочитай таблицю по стовпчиках, бо кожен говорить своє.
Стовпчик «параметрів». У згорткової мережі їх у 13 разів менше. Не на кілька відсотків — у 13 разів.
Стовпчик «той самий розподіл». Обидві мережі розвʼязали задачу. Якби ми зупинились тут — а так роблять частіше, ніж хочеться, — ми б написали у звіті, що модель працює бездоганно, і були б формально праві.
Стовпчик «зсунуті предмети». Повнозвʼязна мережа впала до 0.253 — це нижче за рівень випадкового вгадування 0.333. Читати це треба буквально: якби вона просто підкидала монетку, вийшло б краще. Маючи в 13 разів більше параметрів, вона не впізнає ту саму фігуру, зсунуту на шість пікселів, — не «трохи гірше розпізнає», а не впізнає взагалі. Згорткова на тих самих даних тримає 0.647.
Чому нижче за вгадування, а не рівно на ньому? Бо мережа не вагається — вона впевнена. Зсунутий квадрат накриває ті пікселі, які в навчанні належали, скажімо, краю ромба, і мережа рішуче відповідає «ромб». Модель, яка навчилась не тій ознаці, помиляється систематично, а не випадково; випадкові 0.333 треба ще заслужити.
Що робить зсув
Повзунок відсуває предмет від центру. Ліворуч видно, як виглядає зображення на перевірці; праворуч — заміряна точність обох мереж проти величини зсуву. Пунктир — рівень випадкового вгадування 0.333.
ЛікиТри ліки
Ми маємо три діагнози, і кожен вимагає свого лікування. Далі — найважливіші три абзаци теми: з них цілком виводиться згортковий шар. Читай так, ніби ти його зараз винаходиш.
Ліки перші: локальність
Хвороба: кожен нейрон дивиться на всі 150 528 входів одразу, звідси мільйони ваг.
Спостереження: а навіщо йому всі? Щоб зрозуміти, чи є в точці (10, 10) вертикальна межа, треба подивитись на пікселі навколо цієї точки. Піксель у протилежному куті кадру для цього питання не потрібен. Локальні ознаки — межі, кути, плями, текстура — живуть у маленькому вікні.
Ліки: хай нейрон дивиться не на все зображення, а лише на вікно k × k навколо своєї точки. При k = 3 це девʼять пікселів замість ста пʼятдесяти тисяч. Це і зветься локальністю (locality), а вікно, яке нейрон бачить, — його рецептивним полем (receptive field).
Локальне вікно проти повного звʼязку
Полотно 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 ділить сторону карти навпіл. Праворуч — скільки ваг після цього коштує повнозвʼязна голова, яка видає три класи.
Ось і все. Три ліки — локальність, спільні ваги і зменшення розмірності — і є згортковий шар. Його не вигадали як гарну ідею; його вивели, полагодивши три конкретні хвороби повнозвʼязного шару на зображеннях. Ядро, що ковзає картинкою, ти вже бачив у темі 04, коли рахував Собеля руками. Різниця лише в тому, що там числа ядра придумав Собель, а тут їх знайде градієнтний спуск.
АрифметикаСкільки параметрів у згорткового шару
Порахуймо ту саму суму, що й на початку теми, але для згорткового шару. Умови ті самі: вхід 224 × 224 × 3.
Ядро 3 × 3 дивиться у вікно з девʼяти пікселів, але в кожного пікселя три канали кольору, тож чисел у вікні втричі більше.
Одне ядро вміє шукати одну річ — скажімо, вертикальну межу. Нам потрібні різні: горизонтальні межі, кути, плями. Візьмімо 16 ядер; кожне дасть свою карту ознак (feature map).
У кожного ядра є ще один вільний параметр — зсув (bias), одне число на ядро.
Чотириста сорок вісім. Порівняймо чесно, у тих самих умовах — і в обох рядках рахуємо усі параметри, разом зі зсувами: у повнозвʼязного шару це 150 528 000 ваг плюс 1 000 зсувів, у згорткового — 432 ваги плюс 16 зсувів.
| Перший шар над фото 224 × 224 × 3 | параметрів |
|---|---|
| повнозвʼязний, 1000 нейронів | 150 529 000 |
| згортковий, 16 ядер 3 × 3 | 448 |
Різниця — приблизно в 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 числа. Повнозвʼязний шар над ними, який видає три класи, коштує:
Тобто в реальній мережі повнозвʼязний шар працює не над пікселями, а над ознаками. Пікселів було 150 528, і кожен окремо нічого не означав; ознак — кілька сотень або тисяч, і кожна вже щось означає («тут є колесо», «тут смугаста текстура»). Обʼєднувати такі ознаки в остаточну відповідь — саме та робота, для якої повнозвʼязний шар годиться ідеально: тут справді потрібен кожен з кожним, бо жодного сусідства між ознаками немає.
Заодно це відповідь на питання, чому в темі про «повнозвʼязна не годиться» ми будуємо згорткову мережу, яка закінчується повнозвʼязним шаром. Порядок має значення. Спершу згортки перетворюють пікселі на ознаки, потім повнозвʼязний шар перетворює ознаки на відповідь. Помилка — не в самому шарі, а в тому, щоб подати йому сирі пікселі.
ІсторіяЧому це зрозуміли не одразу
Три ліки вище виглядають майже очевидними — коли їх уже перелічили. Насправді дорога до них зайняла десятиліття, і корисно розуміти чому.
Перша конструкція з локальністю й спільними вагами зʼявилась у 1980 році: японський дослідник Куніхіко Фукусіма описав неокогнітрон — мережу, натхнену будовою зорової кори, де прості клітини реагували на локальні візерунки, а складніші збирали з них цілі. Ідея була правильна, але навчати її нормально не вміли: зворотного поширення в тій роботі не було. Наприкінці 1980-х Ян ЛеКун поєднав дві половини — згорткову будову й навчання зворотним поширенням, — і в 1998-му вийшла LeNet-5, мережа, що читала суми на банківських чеках у промисловому масштабі.
Після цього настала пауза років на десять. Причини були прозаїчні: бракувало розмічених даних і не було на чому рахувати; згортки визнали остаточно тільки коли зійшлися великий датасет і графічні процесори — про це буде тема 13 «AlexNet і VGG».
Але є й змістовна причина, і вона цікавіша. Загальний настрій тих років радив розширювати свободу моделі, а не звужувати її: чим гнучкіша модель, тим більше вона зможе. Думка «зафіксуймо ваги однаковими в усіх позиціях, бо ми впевнені, що так правильно» звучала як крок назад, як штучне обмеження. Знадобився час, щоб стало загальновизнаним протилежне: правильно вбудоване припущення коштує дешевше за будь-яку кількість даних, витрачених на те, щоб мережа здогадалась про нього сама.
ПідсумокПідсумок
Ми чесно спробували найпростішу навчувану модель на зображеннях і знайшли три поломки, кожну з яких заміряли.
- Параметрів надто багато. Фото 224 × 224 × 3 і тисяча нейронів дають 150 528 000 ваг у першому шарі — майже 574 МіБ, і росте це квадратично від сторони.
- Геометрія зникає. Розгортання перетворює сітку на рядок, і для повнозвʼязного шару сусідства більше немає. Доказ — перемішування пікселів однією перестановкою: точність MLP не змінюється (0.993 → 0.997), точність CNN падає (1.000 → 0.970).
- Кожна вага прикута до свого місця. Ознака, вивчена в одному куті, не працює в іншому; потреба в даних множиться на кількість положень. Заміряно зсувом: 0.253 проти 0.647 при 13-кратній різниці в параметрах на користь згорткової.
І три ліки, які з цих поломок виводяться однозначно: локальність (нейрон дивиться у вікно, а не на все), спільні ваги (одне ядро на всю картинку) і зменшення розмірності (не тягти всі пікселі до кінця). Разом вони — згортковий шар. Плюс одне поняття, яке лишиться з тобою до кінця курсу: індуктивне зміщення — вбудоване припущення, яке виграє, поки воно правдиве, і програє, щойно перестало.
І чесна межа, яку ми не заховали: згортка не зробила мережу незалежною від положення предмета. Вона дала часткову терпимість — 0.647 замість 0.253, — і цього мало. Терпимість до зсуву доведеться добудовувати, і робити це ми почнемо в темі 08.
Наступна тема бере перше з трьох ліків і розбирає його по гвинтику. Що саме рахує
згортковий шар над кольоровим зображенням; звідки беруться канали й чому їх кількість —
окреме число; що таке padding і stride і як від них залежить
розмір виходу; і скільки в шарі параметрів насправді — з формулою, яку ми звіримо
з nn.Conv2d.