Как компьютер научился отличать кошку от собаки
Ты узнаёшь кошку за долю секунды и даже не думаешь как. А вот компьютеру для этого пришлось пройти долгий путь — от тупиковых правил до нейросетей, которые сами учатся видеть. Рассказываем, как это вышло.
Ты глянул на картинку и за полсекунды понял: это кошка. А спроси тебя, как ты это понял — и ответа не будет. Именно эта задачка десятилетиями ставила в тупик лучших программистов мира. Как же компьютер в итоге научился делать то, что ты делаешь не задумываясь?
Картинка — это просто куча чисел
Для начала разберёмся, что вообще видит компьютер. А видит он не кошку и не собаку — он видит таблицу чисел. Любая фотография для машины — это сетка из крошечных квадратиков, пикселей. Каждый пиксель — три числа: сколько в нём красного, зелёного и синего, от 0 до 255.
Фотография кошки размером 300 на 300 пикселей — это больше 270 тысяч чисел. И нигде в этой простыне цифр не написано «кошка». Нет числа, которое значит «усы», нет колонки «хвост». Есть только яркости точек. Задача звучит почти безумно: глядя на 270 тысяч ничего не значащих по отдельности чисел, выдать ответ «кошка» или «собака».
Почему нельзя просто написать правила
Первая мысль любого программиста: ну так давайте напишем правила! У кошки острые треугольные ушки — проверим, есть ли треугольники сверху. У собаки морда вытянутее — измерим. Звучит логично. И не работает совсем.
Подумай сам. Кошка может сидеть, лежать клубочком, отвернуться, спрятаться наполовину за диваном. Бывают вислоухие кошки — и где там твои острые треугольники? Бывают собаки чихуахуа размером с котёнка и с такими же ушами. Фото может быть тёмным, размытым, снятым сбоку. Чтобы покрыть правилами все случаи, понадобились бы миллионы условий — и всё равно нашлась бы кошка, которая их нарушает.
Главное озарение оказалось таким: не нужно объяснять компьютеру, как выглядит кошка. Нужно показать ему очень много кошек и собак — и пусть разбирается сам.
Учим на примерах, а не на правилах
Это и есть машинное обучение. Вместо того чтобы прописывать признаки вручную, мы даём программе огромную пачку картинок, и к каждой приклеен ярлык: вот это кошка, вот это собака. Таких размеченных фотографий могут быть миллионы.
Сравни с тем, как учится ребёнок. Никто не диктует малышу определение: «кошка — это млекопитающее с такой-то длиной усов и таким-то углом ушей». Ему просто показывают: смотри, киса. Смотри, ещё киса. А это собачка. После сотни-другой примеров ребёнок начинает узнавать кошек, которых раньше в глаза не видел — даже мультяшных, даже на странных ракурсах. Машинное обучение работает по тому же принципу: учимся на примерах, а правила выводим сами.
Внутри программы спрятаны тысячи «ручек» — настраиваемых чисел, их называют весами. Сначала они выставлены наугад, и программа угадывает кошку или собаку буквально как монетку подбрасывает. Но дальше начинается самое интересное.
Метод проб, ошибок и подкрутки
Программе показывают картинку кошки. Она отвечает: «собака, я уверена на 80%». Ошибка! И тут включается главный механизм обучения: программа чуть-чуть подкручивает все свои тысячи «ручек» — так, чтобы в следующий раз на этой же картинке ответ был ближе к правильному. Совсем чуть-чуть. Потом следующая картинка, снова подкрутка. И так миллионы раз.
Это похоже на то, как ты учишься попадать баскетбольным мячом в кольцо. Первый бросок — мимо, перелетел. Ты не вычисляешь формулы — ты просто чувствуешь: «надо чуть слабее». Бросаешь снова — недолёт, «чуть сильнее». С каждым броском твои движения подстраиваются. Нейросеть «бросает» миллионы раз и после каждого промаха капельку поправляет себя.
Постепенно «ручки» сами собой настраиваются так, что внутри сети рождаются полезные распознаватели. Самые ранние слои учатся видеть простое — границы, пятна, переходы света и тени. Слои поглубже складывают из них кусочки посложнее — что-то похожее на ухо, на текстуру шерсти, на форму носа. А самые верхние уже собирают из этих деталей целое: «вот это сочетание признаков обычно бывает у кошек». Такую слоистую конструкцию называют свёрточной нейросетью — именно она совершила прорыв в распознавании картинок.
Так компьютер «понимает» картинку?
Важная оговорка, чтобы не было иллюзий. Нейросеть не понимает, что кошка мурлычет, царапает диван и боится пылесоса. Для неё кошка — это просто очень характерный узор из чисел, который она научилась отличать от другого характерного узора. Никакого смысла, как у тебя в голове, там нет.
Поэтому такие сети можно и обмануть. Если показать кошку в нелепом месте или картинку, которой не было среди примеров, сеть может уверенно ляпнуть глупость. Она знает ровно то, что ей показали, — и ни капли больше.
- Компьютер видит числа, а не образы — картинка для него таблица яркостей.
- Правила вручную не работают — слишком много исключений в реальном мире.
- Учим на примерах — показываем миллионы размеченных фото.
- Сеть сама подкручивает тысячи внутренних чисел, уменьшая ошибку шаг за шагом.
И всё же результат впечатляет. Тот же подход, что отличает кошку от собаки, сегодня помогает врачам находить опухоли на снимках, беспилотным машинам — замечать пешеходов, а телефону — узнавать твоё лицо. Всё началось с простого вопроса: кошка или собака? А привело к машинам, которые научились видеть. Не понимать — но видеть. И, кажется, это только начало.