Диагностика Mock-интервью
Главная · Нейронные сети

Распознавание цифр из пикселей

MNIST — «hello world» компьютерного зрения: 70 000 рукописных цифр 28×28. На этой задаче проще всего понять, как картинка превращается в вектор чисел, а классификатор — в набор «шаблонов», которые можно буквально увидеть.

Интуиция

Для компьютера картинка — это таблица яркостей. Изображение 28×28 пикселей — просто 784 числа от 0 (чёрный фон) до 1 (белый штрих). Вытянем таблицу в один длинный вектор x ∈ ℝ⁷⁸⁴ — и задача «узнать цифру» превращается в знакомую задачу классификации: по вектору признаков выбрать один из 10 классов.

Самый простой классификатор — линейный: у каждого класса свой набор из 784 весов и bias. Считаем score каждого класса как скалярное произведение:

scorek = wk · x + bk,   k = 0…9

Скалярное произведение — это мера совпадения: score велик, когда яркие пиксели картинки попадают на большие положительные веса класса. Поэтому вектор весов wk можно развернуть обратно в картинку 28×28 — и увидеть «шаблон» (template) класса: у нуля это светлое кольцо, у единицы — вертикальная полоса. Линейный классификатор — это буквально сопоставление с шаблонами (template matching), которые он сам выучил из данных.

Как это работает: пайплайн

Параметров у такой модели всего 784×10 + 10 = 7850 — обучается за секунды даже на CPU.

💡 Ключевая мысль Линейный классификатор картинок — это 10 выученных шаблонов: предсказание = «на какой шаблон картинка похожа больше всего» (скалярное произведение + softmax).

Почему линейного классификатора мало

Обученный на MNIST линейный классификатор даёт около 92% точности. Звучит неплохо, пока не вспомнишь, что это 8 ошибок на каждые 100 цифр — почтовый индекс из 6 цифр будет прочитан верно лишь в ~60% случаев. Проблема фундаментальная: у класса всего один шаблон, а семёрку люди пишут десятком способов (с перекладиной и без, под разным наклоном). Все стили усредняются в один размытый шаблон, и границы классов остаются прямыми плоскостями в пространстве пикселей.

Иерархия решений выглядит так:

Кстати, «вытягивание» картинки в вектор — само по себе преступление против данных: соседние пиксели перестают быть соседями, и модель должна переоткрывать 2D-структуру заново. CNN эту структуру сохраняют.

Зачем MNIST сегодня

В продакшене цифры давно распознают не так, но MNIST остался идеальной песочницей: на нём за минуты проверяют, что пайплайн жив (данные → лосс → градиенты → метрика), отлаживают новые идеи и учатся читать ошибки модели — смотреть глазами на картинки, где она путает 4 и 9. Правило «сначала заведи простейший линейный бейзлайн, потом усложняй» — одна из самых полезных привычек ML-инженера, и родом она именно отсюда.

⚠️ Подводный камень Линейный классификатор (и MLP без свёрток) не инвариантен к сдвигу: сдвинь цифру на 3 пикселя в угол — и скалярные произведения с шаблонами развалятся, хотя для человека картинка та же. Проверь в интерактиве: нарисуй единицу у левого края.
🎤 На собеседовании
  • «Сколько параметров у линейного классификатора MNIST?» — 784×10 весов + 10 bias = 7850. Умение быстро посчитать параметры проверяют постоянно.
  • «Что увидим, если визуализировать веса как картинки?» — размытые шаблоны цифр: положительные веса там, где обычно проходит штрих класса.
  • «Почему softmax + кросс-энтропия, а не MSE?» — кросс-энтропия даёт сильный градиент при уверенной ошибке и правильно работает с вероятностями классов.
  • «Зачем нормировать пиксели?» — единый масштаб входов ускоряет и стабилизирует градиентный спуск; сами предсказания идеальной модели от масштаба бы не изменились.