NeuroPro

нейронные сети
и анализ данных

Начало
Новости
Услуги
Нейронные сети
Программы
Статьи
Заметки
Ссылки
Вопросы и ответы
Об авторе / контакты
Заметки

Роль ноу-хау в эффективности создания и применения нейронных сетей

Снова буду повторять уже сказанное, но иначе не получается. Поисковик Яндекс какое-то время за запрос "сверточные нейронные сети" выдавал на первом месте ссылку на статью [1], являющуюся в своей содержательной части пересказом описания сверточных нейросетей из статьи [2] и существенно новой информации не несущую. Две указанные статьи отделяют друг от друга 10 лет. Посмотрим, как опубликованные в 1998г результаты воспроизводятся сегодня на практике.

Точность многослойного персептрона для задачи MNIST Первое. Точность обучения многослойного персептрона алгоритмом обратного распространения ошибки в изучаемой в этих работах задаче MNIST. Авторы [2] дают цифры только для нейросети с 300 нейронами в скрытом слое - 4.7% ошибки распознавания отдельной тестовой выборки. В [1] для нейросети с 50 нейронами в скрытом слое дана ошибка обобщения в 13.52%. Последний результат - очень и очень плох по сравнению с моими экспериментами - у меня для 50 нейронов достигается ошибка обобщения в 5.47%, а для 300-нейронной сети мне удалось чуть-чуть превзойти результат [2] - достичь 4.54%. Полученные мной результаты ошибок обобщения для сетей с 50, 100, 150, 200, 250 и 300 нейронами представлены на рисунке. Т.е. я старый результат [2] воспроизвести могу, и результат моей программы для 50-нейронной сети существенно лучше, чем результат из [1]. Более того, ошибка в 13.52% для многослойного персептрона из [1] просто громким голосом орёт о некомпетентности автора этой работы и, возможно, об ошибке в его программе - точность хуже, чем указанная в [2] ошибка в 12% для линейного классификатора (более простой модели, чем многослойный персептрон).

Второе. Точность для сверточной нейронной сети. В [1] указана ошибка обобщения в 2.16%, что хуже как результатов для этой нейросети в [2], так и иных результатов, например, [3,4]. Я пользовался другой архитектурой сверточной нейросети (предложенной в [3] и являющейся упрощением архитектуры [2]). И для такой сверточной нейросети даже довольно малых размеров (4-20-50-10 сверточных плоскостей и нейронов) я без использования генератора нелинейных искажений изображений символов получал среднюю ошибку обобщения ниже, чем 1.3%. Т.е. опять - у меня существенно лучший, чем в [1], результат, более близкий к результатам [2-4], и полученный на нейросети меньшего размера, чем в [1]. С генератором искажений и на сети размером побольше - ошибка у меня меньше 1% неправильных ответов на тестовой выборке, "как в лучших домах Парижа" [2,3].

Третье. Поскольку в [1] на русском языке воспроизводятся указанные в [4] на английском языке цифры о скорости работы нейросетевой программы [4], то я их специально и точно сопоставлю тут с моими (другие мои данные в заметке про гиперболический тангенс относились к нейросети иного размера). Так вот, для сверточной нейронной сети размерами 6-50-100-10 работа [4] дает для процессора AMD Athlon X2 4400+ (2,21гГц) скорость обработки в 12 и 23 обучающих примера в секунду для однопоточного и двухпоточного режимов исполнения. Моя же сверточная нейросеть такого же размера при обучении всех примеров (т.е. без отказа от коррекции на тех примерах, которые распознаются с нужной точностью, что может привести к ускорению процесса обучения), при самой медленной (следуя ранжированию из заметки про гиперболический тангенс) реализации нелинейных функций нейронов, в однопоточном режиме на процессоре Intel Core2Duo 6420 (2,13гГц) щёлкает 327 примеров в секунду. Т.е. даже в однопоточном режиме моя программа реализации сверточных нейронных сетей работает на порядок быстрее двухпоточной программы [4], как я и говорил. А процессоры при этом сравнимы по производительности (мой пошустрее не более чем в полтора раза).

Резюме. Смотрим на название заметки - если кто-то может, а кто-то не может воспроизвести точность работ 10-летней давности, если чья-то нейросетевая программа работает на порядок быстрее другой, то это и означает обладание или не обладание некоторым ноу-хау в теории и практике применения нейронных сетей, а также в программировании. Какой вывод отсюда следует? Что у каждого новичка, желающего попробовать нейросети (или сначала попробовать их запрограммировать, а потом попробовать использовать), может отсутствовать какое-то нейросетевое или программистское ноу-хау, требуемое для хороших и даже правильных результатов. Поэтому советую всем потребителям нейросетей думать, не возникнут ли у них подобные риски от необладания нужными компетенциями. Ведь есть возможность сделать заказ мне и получить, как говорилось в телерекламе, "неизменно превосходный результат".

Литература
1. Прохоров В.Г. Использование сверточных нейронных сетей для распознавания рукописных символов // УкрПрог, Киев, Украина. 2008.
2. LeCun Y., Bottou L., Bengio Y., Haffner P. Gradient-based learning applied to document recognition / Proc. IEEE, 1998. Vol.86, №11. - pp.2278-2324.
3. Simard P.Y., Steinkraus D., Platt J. Best practices for convolutional neural networks applied to visual document analysis / Proc. Int. Conf. on Document Analysis and Recognition (ICDAR), IEEE Computer Society, Los Alamitos, 2003. - pp.958-962.
4. O'Neill M. Neural network for recognition of handwritten digits. 2006.

PS. Выявился еще один случай десятикратного превосходства в скорости моей программной реализации сверточной нейронной сети перед сторонней разработкой - см. середину данного форумного обсуждения.

PPS. А вот и третья чужая разработка - и тоже проигрывает в скорости на порядок (автор пишет: "Скорость обучения пока не велика (>10 ч)"). Правда, автор обещает её на порядок ускорить - "будем посмотреть", получится ли у него и позволит ли Матлаб это сделать. "Однако, тенденция!" - говорил чукча из анекдота: народ совершенно не умеет разрабатывать быстрые нейросетевые программы (и быстрые программы для сложных расчетов тоже, т.к. кроме алгоритмов играют роль знания и техника программирования плюс выбор адекватного инструмента).