Ранее мы уже познакомились с историей развития теории и практики искусственных нейронных сетей. Помните первую модель искусственного нейрона Маккаллока и Питтса, а также перцептрон Фрэнка Розенблатта? Потом были многочисленные модификации перцептрона, а потом Марвин Мински написал про это книгу, и тема была заморожена на долгие годы.
Ну и так же мы кратко пробежались по архитектурам некоторых нейронных сетей, которые были разработаны с тех давних времён по наши дни. Это было во время изучения нами структурного подхода.
И также мы изучили строение и физиологию нервной системы человека, как работают естественные нейроны, как устроен головной мозг и так далее. Вспоминайте...
Вспомнили? Ну а теперь давайте погрузимся в те таинственные процессы, которые происходят внутри нейронных сетей. Те из вас, кто много и внимательно тренировал нейросеть Playground Tensorflow, должны уже интуитивно это понимать. Но всё же давайте все прикоснёмся к этой магии.
Кратко напомню вам об основных понятиях нейронных сетей. Обычно нейронная сеть состоит из слоёв, которые, в свою очередь состоят из нейронов. Каждый нейрон работает как сумматор — он принимает входные значения от нейронов предыдущего слоя или извне нейросети, умножает каждое значение на весовой коэффициент и складывает все произведения. Если полученная сумма больше некоторого порога, то нейрон активируется и выдаёт на свой выход значение в соответствии со своей функцией активации.
Нейроны, которые получают сигналы из внешней по отношению к нейросети среды, называются входными. Соответственно, они составляют входной слой. Нейроны, выдающие сигнал вовне нейросети, называются выходными, и они, стало быть, формируют выходной слой. Все остальные нейроны и формируемые ими слои называются скрытыми.
У нейросети может не быть скрытых слоёв. В давние времена чаще всего количество скрытых слоёв в нейросетях не превышало одного, так как количество вычислительных мощностей было не таким объёмным. Но сегодня количество скрытых слоёв может быть тысячи и десятки тысяч. Нейронные сети, в которых более одного скрытого слоя, называются сетями глубинного обучения.
Работа с нейронными сетями сводится к двум этапам. Если есть задача, которую можно решить при помощи нейронных сетей, то для этого необходимо подготовить данные и провести обучение нейронной сети, а потом на втором этапе осуществить решение задачи.
Какие же задачи можно решать при помощи искусственных нейронных сетей? Перечислю их без погружения. Это задачи классификации или распознавания образов, кластеризации, аппроксимации, прогнозирования, сжатия данных, анализа данных и оптимизации.
И давайте рассмотрим два способа обучения нейронных сетей — это обучение с учителем и обучение без учителя. Есть ещё несколько вариантов обучения, но сегодня мы рассмотрим только два, а остальные вы узнаете в рамках более углублённых мероприятий. Итак, обучение с учителем и обучение без учителя.
Обучение с учителем основано на демонстрации нейронной сети множества примеров типа «стимул — реакция». То есть мы подаём нейронной сети на вход данные, а потом говорим ей, какой должна быть реакция. В результате многочисленных итераций этого процесса нейронная сеть настраивает свои весовые коэффициенты так, чтобы максимально соответствовать обучающей выборке. При этом по результатам обучения она сможет реагировать и на стимулы, которых не было в обучающей выборке.
В противоположность этому при обучении без учителя нейронная сеть самостоятельно обучается решать поставленную задачу без вмешательства извне. Такой подход пригоден только для некоторых задач, но зато в большей мере соответствует тому, как обучаются естественные нейросети.
Теперь давайте обратим своё внимание на то, как настраиваются весовые коэффициенты нейросети. Фактически, для этого есть два метода — метод коррекции ошибки, и метод обратного распространения ошибки.
Метод коррекции ошибки и несколько его модификаций для разных типов перцептронов был предложен Фрэнком Розенблаттом. Его суть заключается в том, что вес связей не изменяется до тех пор, пока текущая реакция перцептрона остается правильной. При появлении неправильной реакции вес изменяется на единицу, а знак изменения определяется противоположным от знака ошибки.
В противоположность этому метод обратного распространения ошибки, который был многократно переоткрыт различными исследователями, используется для обучения многослойных нейронных сетей и на сегодняшний момент является наиболее широко используемым методом. Так что на нём надо заострить внимание.
Суть метода в следующем. В зависимости от решаемой задачи задаётся некоторая функция ошибки — например, половина суммы квадратов разностей между фактическими и желаемыми выходами каждого выходного нейрона. Задачей обучения нейросети является минимизация функции ошибки на всех заданных для обучения стимулах.
Фактически у нас получается задача многомерной оптимизации в сложном пространстве. Эту задачу можно решить методом градиентного спуска, так что метод обратного распространения ошибки является разновидностью градиентного спуска, применяемого для обучения нейронных сетей. На каждой итерации обучения значения всех весовых коэффициентов модифицируются в зависимости от производной функции активации, а это значит, что такая функция должна быть дифференцируема. И сама ошибка распространяется назад от выходных нейронов к входным, поэтому метод так и называется.
Метод определяет вполне конкретные формулы, которые мы сейчас не будем рассматривать. Ваша главная задача сейчас — осознать, что для обучения нейросети есть хорошие методы, которые на сегодняшних вычислительных мощностях выполняются очень быстро. Особенно, если вид функций активации достаточно прост.
Давайте теперь кратко пробежимся по этапам решения задач при помощи нейронных сетей. Таких этапов собственно перед непосредственным решением девять: сбор данных для обучения, подготовка и нормализация данных, выбор архитектуры нейросети, экспериментальный подбор характеристик нейросети, экспериментальный подбор параметров обучения, обучение, проверка адекватности обучения, корректировка параметров и окончательное обучение, вербализация нейросети с целью дальнейшего использования. Кратко рассмотрим их.
Сбор данных для обучения — это чуть ли не важнейший этап. Данные должны быть репрезентативны и непротиворечивы. Если эти критерии качества не удовлетворить, то нет никаких гарантий того, что обученная на «мусорных» данных нейронная сеть будет работать корректно. Даже наоборот — можно доподлинно заявить, что она будет работать некорректно. Это называется принципом «GIGO» — Garbage in, garbage out.
Нормализация данных требуется для того, чтобы все входные параметры имели одинаковую размерность, чтобы, в свою очередь, ни один из параметров не заглушал другие параметры, а также чтобы обучение происходило быстрее. Для зашумлённых данных требуется предварительная очистка.
Выбор архитектуры нейросети осуществляется исходя из задачи. Обычно самым простым критерием выбора является такой. Если сеть должна обучаться с учителем, то выбирается многослойный перцептрон в той или иной модификации. Если же обучение с учителем невозможно, то выбирается сеть Хопфилда или самоорганизующаяся карта Кохонена.
Подбор характеристик нейросети тоже является важной задачей, поскольку позволяет конкретизировать выбранную архитектуру значениями таких параметров, как количество скрытых слоёв и нейронов в них, вид функций активации и так далее. Всё это вы делали на практическом занятии.
Далее необходимо осуществить подбор параметров обучения. В практическом занятии это было именно то, что я просил оставить вас без изменений — скорость обучения сети, сходимость, разделение обучающей выборки на собственно обучающую и тестовую. Поскольку параметры обучения влияют на сходимость процесса довольно противоречивым образом, их значения нужно выбирать экспериментально, руководствуясь критерием завершения обучения.
Далее запускается обучение. Тут может быть несколько проблем. Первая паралич сети — сеть перестаёт обучаться, её весовые коэффициенты как бы замерли. Очень частая ошибка, которая «лечится» возвратом к двум предыдущим шагам и перенастройкой. Другая проблема — залипание в локальном минимуме при градиентном спуске для минимизации ошибки. Лечится примерно так же. И, наконец, переобучение сети, когда она начинает просто запоминать предъявляемые ей для обучения образцы, не обобщая их. Переобучение видно, когда ошибка на обучающих данных постоянно уменьшается, а на тестовых начинает увеличиваться. В таких случаях обучение прекращают и опять начинают подбирать параметры обучения.
Далее осуществляется тестирование качества обучения. Это проводится на примерах, которые не участвовали в обучении. При этом число тестовых примеров должно быть тем больше, чем выше требуется качество обучения.
Оставшиеся этапы работы — это донастройка сети и её дообучение. После того как сеть обучена, ей даются уже «боевые» данные, и сеть начинает работать в штатном режиме. Результаты её работы в том или ином виде необходимо доводить до тех акторов, кому они требуются. И это задача последнего этапа вербализации.