Как нейросеть видит картинку

Для компьютера фотография — таблица чисел; как из неё получается ответ «кошка» и почему в этом месте нейросеть иногда ошибается.

С нуля 7 мин

Это продолжение серии о том, откуда взялись нейросети. Первая статья — «Что такое нейросеть, если без формул»: там разобрано, чем нейросеть отличается от обычной программы и как устроен нейрон-счётчик со слоями. Здесь — как этот же принцип работает применительно к картинке.

Для компьютера фотография — это таблица чисел

Человек смотрит на фотографию и сразу видит кошку. Компьютер не видит ничего — у него нет глаз. У него есть только числа.

Любая цифровая картинка — это сетка точек, пикселей. Каждый пиксель хранит число: насколько он светлый или тёмный, какого он цвета. Фотография из отпуска, скан документа, фото товара на складе — с точки зрения компьютера это одно и то же: прямоугольная таблица чисел, строка за строкой, столбец за столбцом. Чем больше картинка, тем больше в таблице чисел — счёт идёт на миллионы.

Нейросеть, которая «узнаёт» кошку на фото, на входе получает именно эту таблицу — и ничего больше. Она не знает, что такое кошка, шерсть или усы. Она умеет только одно: превращать входные числа в выходные, слой за слоем, так же, как это описано в первой статье серии для нейрона-счётчика.

Для компьютера картинка — таблица чисел Фото Увеличили 025535120
Рисунок 1. Фотография кошки крупным планом рассыпается на сетку пикселей — каждый со своим числом яркости; это и есть то, что получает нейросеть на входе.

Первый слой видит линии, следующий — формы

Слоёв в такой нейросети много, и каждый следующий работает с результатом предыдущего, а не с исходной картинкой.

Первый слой не ищет кошку — до неё ещё далеко. Он ищет самое простое: границу между светлым и тёмным, короткую линию, пятно одного цвета. Ничего осмысленного в этом ещё нет, просто перепады яркости.

Второй слой берёт находки первого и складывает из них кое-что более сложное: из нескольких линий получается угол или дуга, из нескольких пятен — контур. Третий слой из углов и контуров собирает уже узнаваемые фрагменты: очертание уха, край глаза, изгиб хвоста. И только один из последних слоёв сопоставляет набор таких фрагментов с тем, что нейросеть видела на тысячах примеров с подписью «кошка», и выдаёт ответ.

Ни один слой по отдельности «не знает», что такое кошка. Знание распределено по всей цепочке: первый слой отвечает за линии, средние — за формы, последний — за узнавание целого. Это тот же принцип «слои друг за другом», что показан в первой статье серии, — здесь мы просто разобрали его подробно.

Каждый следующий слой видит закономерность сложнееТочкислой 1Линии и пятнаслой 2Формы:ухо, глазслой 3Кошкарезультат
Рисунок 2. Лесенка слоёв: первый слой находит линии и пятна, следующий складывает из них формы и фрагменты — ухо, глаз, — и только один из последних слоёв узнаёт кошку целиком.

Почему нужны тысячи примеров

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

Одной фотографии кошки для этого мало. На одном примере нейросеть с равным успехом могла бы «решить», что кошку определяет конкретный цвет обоев на фоне или именно эта поза. Только когда примеров тысячи — разные породы, разные позы, разный свет, разный фон, — становится видно, что общего у всех этих фотографий и что в каждой из них случайность. Закономерность получается устойчивой ровно настолько, насколько разнообразны были примеры, на которых её искали.

Это прямое следствие того же механизма «обучение на примерах вместо правил»: правило «что такое кошка» никто не писал — оно вычислилось из массы случаев, и вычислилось тем точнее, чем шире была эта масса.

Почему нейросеть ошибается

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

Непривычный ракурс. Если среди примеров при обучении почти не было кошки, снятой строго сверху или в темноте, нейросеть может не узнать её в такой необычной съёмке — закономерность, которую она выучила, просто не рассчитана на этот случай.

Мало похожих примеров. Если какая-то порода или ситуация в обучающих примерах встречалась редко, для неё веса подстроены слабее, чем для частых случаев, — и ошибка здесь вероятнее.

Наклейка или шум на изображении. Нейросеть ориентируется на сочетания пикселей, а не на смысл предмета целиком. Достаточно добавить на фотографию посторонний узор, засветку или наклейку в нужном месте — и сочетание пикселей, на которые опирается один из слоёв, может измениться настолько, что собьёт итоговый ответ, даже если для человеческого глаза на снимке по-прежнему очевидная кошка.

Во всех трёх случаях причина одна: нейросеть не «понимает» кошку, она нашла статистическую закономерность в тех примерах, которые ей показали, — и точность ответа падает именно там, где новый случай сильно отличается от этих примеров.

Один и тот же кот — три ракурса Привычныйракурс → кошка Верно Непривычныйракурс → сомневается Не уверена Посторонний узорили наклейка → ошибается Ошибка
Рисунок 3. Один и тот же снимок кошки: привычный ракурс — уверенный ответ «кошка»; непривычный ракурс или посторонний узор на фото — нейросеть ошибается или сомневается.

Где это давно и надёжно работает

Несмотря на такие ошибки, для узких и хорошо отработанных задач распознавание изображений — не новость и не эксперимент. Ещё в статье об истории нейросетей упоминалось, что подобные сети десятилетиями назад уже учили читать рукописные почтовые индексы на конвертах — тот же принцип «пиксели → линии → формы → символ», просто применённый не к кошке, а к цифре.

Похожим образом давно и рутинно работает поиск лиц в фотогалерее на телефоне: приложение группирует снимки одного и того же человека не потому, что «знает» его, а потому что находит устойчивое сочетание черт лица на разных фотографиях — тот же механизм слоёв, что описан выше, только обученный на лицах, а не на кошках. Такие задачи хорошо освоены именно потому, что у них узкая цель и очень много обучающих примеров одного и того же типа.

Чего это не объясняет

Здесь описан общий принцип: картинка становится таблицей чисел, слои находят в ней сначала линии, потом формы, потом целое, а нейросеть учится на массе примеров. Это не объясняет, почему конкретная программа на вашем телефоне или сайте ошиблась в конкретном случае, — для этого нужно знать, на чём именно и как она обучена, а такие подробности редко публикуются. Это не означает, что любое распознавание изображений одинаково надёжно: точность сильно зависит от задачи и от того, насколько обучающие примеры похожи на реальные условия использования. И это не про понимание в человеческом смысле: нейросеть не видит кошку так, как её видит человек, — она находит числовую закономерность, которая в большинстве случаев с кошкой совпадает.

Похожий вопрос возникает и для текста: как нейросеть вообще «читает» слова, если на входе у неё тоже только числа. Разбираем в следующей статье — «Откуда нейросеть знает слова».

Все статьи · Курсы и лабораторные работы

Ещё по теме