Нейронные Сети, «Вредные» Советы

Исторически искусственные нейронные сети за свою более чем полувековую историю переживали как периоды быстрого подъема и повышенного общественного внимания, так и последовавшие за ними периоды скептицизма и безразличия.

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

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

Профессиональные биологи наблюдают за этими дискуссиями со стороны, периодически срываясь и восклицая: «Да в реальной природе такого не бывает!» – и без особого эффекта, поскольку нейросетевые математики слушают биологов, как правило, только тогда, когда факты биологов согласуются с их собственными теориями.

Однако со временем постепенно накапливается пул задач, с которыми нейросети справляются откровенно плохо, и энтузиазм людей остывает. В наши дни нейронные сети вернулись в зенит славы благодаря изобретению метода предварительного обучения без учителя, основанного на Ограниченные машины Больцмана (Restricted Bolzmann Machines, RBM), что позволяет обучать глубокие нейронные сети (т.е.

с очень большим количеством нейронов, порядка десятков тысяч) и успехами глубоких нейронных сетей в практических задачах распознавания устной речи [1] и изображений [2].

Например, распознавание речи в Android реализовано специально на глубоких нейронных сетях.

Как долго это продлится и насколько хорошо глубокие нейронные сети оправдают возложенные на них ожидания, неизвестно.

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

Многие практические задачи классификации и прогнозирования хорошо решаются с помощью хорошо продуманных, относительно небольших моделей многослойного персептрона (MLP) и сетей радиальной базисной функции (RBF).

Эти нейронные сети были описаны много раз, я бы порекомендовал следующие книги, в порядке моей личной симпатии к ним: Осовский [3], Бишоп [4], Хайкин [5]; Есть также хорошие курсы на Coursera и подобных ресурсах.

Однако, что касается общего подхода к использованию нейронных сетей на практике, то он принципиально отличается от обычного детерминированного подхода разработки «запрограммировал — работает, значит, работает всегда».

Нейронные сети по своей природе являются вероятностными моделями, и подход к ним должен быть совершенно другим.

К сожалению, многие начинающие программисты технологий машинного обучения в целом и нейронных сетей в частности допускают системные ошибки при работе с ними, разочаровываются и бросают это дело.

Идея написать этот трактат на Хабре возникла после общения с такими разочарованными пользователями нейросетей — отличными, опытными, уверенными в себе программистами.

Вот мой список правил и распространенных ошибок при использовании нейронных сетей.

1. Если есть возможность не использовать нейросети — не используйте их.

Нейронные сети позволяют решить задачу, если невозможно предложить алгоритм путем многократного (или очень многократного) просмотра данных глазами.

Например, если данных много, они нелинейны, зашумлены и/или имеют большой размер.

2. Сложность нейронных сетей должна быть адекватна сложности задачи.

Современные персональные компьютеры (например, Core i5, 8 ГБ ОЗУ) позволяют в комфортное время обучать нейронные сети на выборках из десятков тысяч примеров, с размерностью входных данных до сотен.

Большие выборки представляют собой проблему для упомянутых выше глубоких нейронных сетей, которые обучаются на многопроцессорных графических процессорах.

Эти модели очень интересны, но выходят за рамки данной статьи на Хабре.

3. Данные обучения должны быть репрезентативными.

Обучающая выборка должна полностью и всесторонне представлять описываемое явление и включать различные возможные ситуации.

Хорошо иметь много данных, но это само по себе не всегда помогает. В узких кругах распространена шутка, когда геолог приходит к распознавателю, кладет перед ним кусок минерала и просит разработать с его помощью систему распознавания такого вещества.

«Можно ли мне получить больше примеров данныхЭ» - спрашивает узнаватель.

"Конечно!" - отвечает геолог, достает кирку и раскалывает свой кусок минерала еще на несколько частей.

Как вы понимаете, от такой операции толку не будет – такая увеличенная выборка не содержит никакой новой информации.

4. Перемешайте выделение.

После сбора векторов входных и выходных данных, если измерения независимы друг от друга, любым способом измените порядок векторов.

Это имеет решающее значение для правильного разделения выборки на обучение/тестирование/проверку и всех методов обучения выборка за выборкой.

5. Нормализовать и центрировать данные.

Для многослойных перцептронов, как и для многих других моделей, значения входных данных должны лежать в диапазоне [-1;1].

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

6. Разделите выборку на обучение, тестирование и проверку.

Основная ошибка новичков — обеспечить минимальную ошибку в работе нейросети на обучающей выборке, одновременно адски ее переобучая, а потом желать такого же хорошего качества на новых реальных данных.

Особенно легко это сделать, если данных мало (или они все из одного куска).

Результат может оказаться весьма неутешительным: нейросеть максимально адаптируется к выборке и потеряет свою функциональность на реальных данных.

Чтобы контролировать обобщающие способности вашей модели, разделите все данные на три выборки в соотношении 70:20:10. Тренируйтесь на поезде, периодически проверяя качество модели на тесте.

Для итоговой объективной оценки – Валидация.

Техника перекрестной проверки, когда Train и Test генерируются несколько раз случайным образом из одних и тех же данных, может быть коварной и создавать ложное впечатление о хорошем качестве системы — например, если данные взяты из разных источников.

и это критично.

Используйте правильную валидацию! 7. Примените регуляризацию.

Регуляризация — это метод, который позволяет избежать переобучения нейронной сети во время обучения, даже если данных мало.

Если вы нашли флажок с этим словом, обязательно поставьте его.

Признаком переобученной нейронной сети являются большие значения весов, порядка сотен и тысяч; такая нейросеть не будет нормально работать на новых, ранее невиданных данных 8. Нет необходимости переобучать нейросеть онлайн.

Идея постоянно все время переобучать нейросеть на новых поступающих данных правильна сама по себе; в реальных биологических системах происходит именно это.

Мы учимся каждый день и редко сходим с ума.

Однако для обычных искусственных нейронных сетей на текущем этапе технического развития такая практика рискованна: сеть может переобучиться или адаптироваться к последним полученным данным — и потерять способности к обобщению.

Чтобы систему можно было использовать на практике, нейронной сети необходимо: 1) обучить, 2) протестировать качество на тестовых и проверочных выборках, 3) выбрать удачный вариант сети, зафиксировать ее веса и 4) использовать обученную нейронную сеть.

На практике вес сети не меняет использования.

9. Используйте новые алгоритмы обучения: Левенберга-Марквардта, BFGS, сопряженные градиенты и т. д. Я глубоко убеждён, что внедрение обратного распространения ошибки — священный долг каждого, кто работает с нейронными сетями.

Этот метод является наиболее простым, относительно легко программируемым и позволяет досконально изучить процесс обучения нейронных сетей.

Между тем, обратное распространение ошибки было изобретено в начале 70-х годов и стало популярным в середине 80-х годов прошлого века; с тех пор появились более совершенные методы, позволяющие существенно улучшить качество обучения.

Лучше используйте их.

10. Обучайте нейронные сети в MATLAB и аналогичных удобных для пользователя средах.

Если вы не ученый, разрабатывающий новые методы обучения нейронных сетей, а практикующий программист, я бы не рекомендовал самостоятельно кодировать процедуру обучения нейронных сетей.

Существует большое количество программных пакетов, в основном на MATLAB и Python, которые позволяют обучать нейронные сети, контролируя при этом процесс обучения и тестирования с помощью удобных инструментов визуализации и отладки.

Наслаждайтесь наследием человечества! Лично мне нравится подход «тренироваться в MATLAB с хорошей библиотекой — реализовывать обученную модель вручную»; он довольно мощный и гибкий.

Исключением является пакет STATISTICA, который содержит продвинутые методы обучения нейронных сетей и позволяет генерировать их в виде удобного для реализации программного кода на языке C. В следующей статье я планирую подробно описать полный производственный цикл подготовки нейронной сети, реализованной на основе описанных выше принципов, используемой для задач распознавания в коммерческом программном продукте.

Удачи!



Литература

[1] Хинтон Г.

, Денг Л.

, Ю Д.

, Даль Г.

, Мохамед А.

, Джейтли Н.

, Сеньор А.

, Ванхук В.

, Нгуен П.

, Сайнат Т.

и Кингсбери Б.

Deep Neural Сети для акустического моделирования в распознавании речи, журнал IEEE Signal Processing Magazine, Vol. 29, № 6, 2012, стр.

82 – 97. [2] Чиресан Д.

, Мейер У.

, Маски Дж.

и Шмидхубер Дж.

Многоколоночная глубокая нейронная сеть для классификации дорожных знаков.

Нейронные сети, Vol. 34 августа 2012 г.

, стр.

333–338. [3] С.

Осовский.

Нейронные сети для обработки информации - пер.

с польского.

М.

: Финансы и статистика, 2002. – 344 с.

[4] Епископ К.

М.

Распознавание образов и машинное обучение.

Спрингер, 2006 – 738 стр.

[5] С.

Хайкин.

Нейронные сети: полный курс.

Уильямс, 2006. Теги: #Машинное обучение #искусственный интеллект #нейронные сети

Вместе с данным постом часто просматривают: