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

PPPS. Нет, я так больше не могу... Вот четвертая программа (см. статью Изотов П.Ю., Суханов С.В., Головашкин Д.Л. "Технология реализации нейросетевого алгоритма в среде CUDA на примере распознавания рукописных цифр" // Компьютерная оптика. 2010: Т.34, №2. - C243-251), сравниваемая с программой О'Нейлла [4] и имеющая скорость в 4 раза выше той. Для указанного в статье размера свёрточной сети (6-48-112-10) и при 20 эпохах её обучения моя программа обучает сеть за 310 секунд процессорного времени. Правда, результат даю уже для моей программы со всеми "наворотами": с отказом от обучения на тех примерах, которые сеть надёжно распознает, с аппроксимированным вычислением значений нелинейных функций нейронов и с задействованием SSE-команд процессора везде, где это только возможно (ну и с выравниваем блоков памяти на границу параграфа, чтобы можно было использовать наиболее быстрые SSE-команды). Не знаю, правильно или неправильно авторы указанной статьи померяли время обучения их сети (10529 секунд - см. Таблицу 1 в статье), но при сравнимых по скорости процессорах (мой Core2Duo 6420 2,13ГГц и авторский Pentium D 925 3ГГц - оба процессора двухъядерные, мой при меньшей частоте имеет бОльший размер кэша) разница в скорости обучения нейросети почти в 30 раз (310сек и 10529сек) - это что-то из области непонимаемого логически. Ну и думаю, что CUDA-вариант (для видеокарты) программы авторов я тоже обгоню своей программой для обычного процессора.
И по поводу CUDA. Организовать, что-ли, еще один "чемпионат", написав нейросетевую программу для GPU (для видеокарт)? Или хватит уже издеваться над народом?

PPPPS. Счёт дошёл до 5:0. Правда, при помощи заграницы - см. статью тайваньцев Hsu, Huang, Chang, Lee Periodic step-size adaptation in second-order gradient descent for single-pass on-line structured learning / Machine Learning, 2009. Vol.77. - pp.195-224. Там, правда, использовалась чуть усложнённая архитектура нейронной сети (добавились слои ресэмплинга - но очень, очень убогие по сравнению с использованными в [2]), а остальные слои остались тех же размеров (6-50-100-10). При процессоре AMD Athlon 64 X2 3800+ авторы для запрограммированных ими алгоритмов указали время от 254 до 312 секунд для одной эпохи обучения свёрточной сети на всё той же задаче MNIST. У меня, напоминаю, при более быстром (не более чем в 2 раза) процессоре 20 эпох обучения требуют примерно 300 секунд процессорного времени (т.е. при одинаковых процессорах моя программа работает примерно в десять раз быстрее).