December 09, 2016

Распознавание образов - все оказывается просто

@snakers41

Edit 1/

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

  • Простейшие регрессии - оказывается это делается 1 строчкой кода или одним выражением с перемножением матриц;
  • Финансовые модели - все, оказывается весьма тривиально - по сути нужно знать 1 формулу и уметь пользоваться Excel;
  • Работа с популярными дистрибутивами Linux. Оказывается в 2016 году уже 99% всех ситуаций, нужных юзеру, описаны на форумах и в оф. документации на сайте, которая гуглится (!). Да, если вас кейс отличается от стандартного, то вы ничего не сделаете, но со временем может даже количество перейдет в качество;
  • Внезапно, если у вас 32-битная Ubuntu, то вы даже в танки сможете на ней играть;
  • Инвестиционные сделки. Оказывается, что все инвестиционные документы очень похожи, геморрой состоит только в переговорах (и поиске предмета сделки...);

Теперь к этому списку добавилось простейшее распознавание образов. In a nutshell, если ваша картинка маленькая, а обучающая выборка велика, то можно прогнать простейшую логистическую регрессию, которая сравнит каждый пиксель картинки с картинкой из обучающей выборки.

Простейший интуитивный пример такого алгоритма. Кружочки и крестики.
Говоря про простейший - я имею в виду именно простейший. Если вы решили закоптиться на реальную капчу - то есть сервисы и гайды на 3-4 страницы кода с визуальными фильтрами итд итп

Не считая кода для загрузки-выгрузки данных и использования данных и итератора для оптимизации (он встроен), весь business end состоит из такого выражения:

function [J, grad] = lrCostFunction(theta, X, y, lambda)

m = length(y); % number of training examples

J = 0;

grad = zeros(size(theta));


delta = ( -y.*log(sigmoid(X*theta)) - (1-y).*log(1-sigmoid(X*theta)) );

J = 1/(m)*sum(delta) + lambda/(2*m)*sum((theta(2:size(theta))).^2);


delta = (sigmoid(X*theta) - y);

delta2 = delta'*X;

delta3 = delta2(1);

grad = (1/m) * delta2' + lambda / m * theta;

grad (1) = (1/m) * delta3;

end

Выражение по сути просто считает значение функции J, которая по является сигма функцией от отклонения модели от реальных данных и производную в некой начальной точке. Потом оптимизация идет методом градиентного спуска.

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

Пример распознавания - Prediction: 10 (digit 0).

А вот так выглядит то, как такая нейронная сеть видит "штрихи":


@snakers41:

Написать автору.

Почитать еще что-то.

Нагадить в комментах (нельзя).


Как настроение американцев меняется от времени суток