Эссе о разработке игр, мышлении и книгах

Kaggle: Digit Recognizer (MNIST) точность 0.99585

Примеры цифр из набора MNIST.

Примеры цифр из набора MNIST.

Продолжаю путешествие по занимательным землям Deep Learning.

В прошлый раз я учился заводить deep learning на локальной машине и делал совсем детскую, искусственную и неспецифическую для DL задачу.

В этот раз решил попробовать что-то более диплёрничное — научиться решать задачи на Kaggle. Есть предположение, что Kaggle — самый простой и интересный способ учить DL.

На этом сервисе есть задачи для новичков, одну такую — Digit Recognizer — я выбрал для тренировки. Соревнование по распознаванию рукописных цифр из набора MNIST. Этот набор должны были встречать даже люди далёкие от ML.

Notebook с решением и комментариями опубликован на github.

На момент отправки решение занимало 467 место из ~7000. На мой взгляд неплохой результат, учитывая, что первые мест 150 занимают читерские решения. MNIST — общедоступный набор данных, их можно скачать вне kaggle и залить в качестве решения готовые ответы, или переобучить сеть на полном наборе.

Разместил notebook не на Kaggle, так как результаты из рейтингов учебных соревнований трутся через несколько месяцев, а отдельных notebooks для MNIST там и без моего хватает, есть и лучше.

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

После нескольких запусков решения на Colab у меня сложилось впечатление, что он тормознее моей видеокарты (GeForce GTX 1070) раза в 3. Это справедливо по крайней мере для части машин облака — пользователь Colab не может выбирать конкретное железо —, запускает на том, что дают.

Скорость обучения на TPU посмотреть не удалось: tensorflow бросал ошибки, а переписывать пайплайн, в надежде их обойти, не хотелось.

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

Множество нюансов и неизвестных переменных затрудняет усложнение углубление архитектуры сети, особенно для новичка. Дело выглядит более сложным чем, например, развитие программы в обычном программировании. Инкрементальная организация разработки помогает, но не всегда.