На этом шаге мы опишем общие принципы работы нейронной сети.
В последние годы популярность нейронных сетей сильно возросла. В частности, благодаря усовершенствованию алгоритмов и методик обучения в этой сфере,
но также и вследствие усовершенствования аппаратного обеспечения и возникновения технологии универсальных GPU (GPGPU). Здесь мы расскажем
вам о многослойном перцептроне (multilayer perception, MLP) - одном из самых популярных нейросетевых представлений. Прочитав этот материал,
вы сможете создать собственную нейронную сеть в одной строке кода Python!
Для этого однострочника мы по посвященной Python рассылке подготовили специальный набор данных. Мы ставили перед собой задачу создания
правдоподобного набора данных.
Если вы читаете эти строки, значит, вас интересует изучение Python. Для создания интересного набора данных мы сформулировали шесть анонимных вопросов об опыте работы с Python и доходах. Ответы на эти вопросы и будут играть роль обучающих данных для простого примера нейронной сети (реализованной в однострочнике Python).
В основе обучающих данных лежат ответы на следующие шесть вопросов.
Ответы на первые пять вопросов - входной сигнал нейронной сети, а шестой - выходной. В этом однострочнике мы производим регрессию на основе нейронной сети. Другими словами, мы предсказываем числовое значение (уровень владения Python) по числовым входным признакам. Мы не станем изучать классификацию с помощью нейронных сетей - еще одну их сильную сторону.
Ответ на шестой вопрос приближенно описывает уровень владения Python программистом. Finxter (https://finxter.com/) - приложение, обучающее с помощью маленьких задач на Python и присваивающее программистам на Python рейтинг в зависимости от успешности решения ими этих задач. Таким образом, оно помогает количественно выразить уровень владения Python.
Начнем с визуализации степени влияния на выходной сигнал каждого из вопросов (рейтинг владения Python разработчиком), как показано на рисунке 1.
Рис.1. Взаимосвязь между ответами на опросник и рейтингом владения Python на Finxter
Обратите внимание, что эти графики демонстрируют лишь влияние отдельных признаков (ответов на вопросы) на итоговый рейтинг Finxter, но ничего
не говорят о влиянии сочетаний двух или более признаков. Отметим также, что некоторые разработчики Python не ответили на всех шесть вопросов;
в подобных случаях использовалось фиктивное значение -1.
Идея создания теоретической модели человеческого мозга (естественной нейронной сети) всесторонне изучается в последние десятилетия. Но основы искусственных нейронных сетей были заложены еще в 1940-х и 1950-х! С тех пор идеи искусственных нейронных сетей непрерывно пересматривались и усовершенствовались.
Основная идея состоит в разбиении обширной задачи обучения и вывода на множество микрозадач, не независимых друг от друга, а напротив, тесно взаимосвязанных. Мозг содержит миллиарды нейронов, связанных с помощью триллионов синапсов. В упрощенной модели обучение представляет собой просто подстройку мощности синапсов (называемых также в искусственных нейронных сетях весами, или параметрами). Как же создать в такой модели новый синапс? Очень просто - всего лишь увеличить его вес с нуля до ненулевого значения.
На рисунке 2 приведена простейшая нейронная сеть из трех слоев (входной, скрытый и выходной), каждый из которых состоит из нескольких нейронов, связанных между собой, начиная от входного слоя через скрытый и до выходного.
Рис.2. Простая нейронная сеть для классификации животных
В этом примере нейронная сеть обучается обнаруживать животных на изображениях. На практике в качестве входного слоя используется по одному входному нейрону на каждый пиксель изображения. В результате получаются миллионы входных нейронов, связанных с миллионами скрытых нейронов. Обычно каждый выходной нейрон отвечает за один бит общего выходного сигнала. Например, для обнаружения двух различных животных (скажем, кошки и собаки) можно воспользоваться одним нейроном выходного слоя, моделирующим два различных состояния (0=кошка, 1=собака).
Идея заключается в активации (возбуждении) нейрона при попадании в него определенного входного импульса. При этом каждый нейрон возбуждается (или не возбуждается) отдельно от других, в зависимости от мощности его входного сигнала. Таким образом моделируется человеческий мозг, в котором нейроны активируют друг друга через импульсы. Активация входных нейронов распространяется по сети, пока не достигнет выходных нейронов. Часть их будет активирована, а часть - нет. Конкретная картина возбуждения выходных нейронов и формирует итоговый выходной сигнал (предсказание) искусственной нейронной сети. Возбужденный выходной нейрон в модели, допустим, может кодировать 1, а невозбужденный - 0. Таким образом можно обучить нейронную сеть предсказывать все, что только можно кодировать с помощью последовательности 0 и 1 (то есть все, что может представить компьютер).
Посмотрим на математическую картину работы нейронов (рисунок 3).
Рис.3. Математическая модель отдельного нейрона: выходной сигнал представляет собой функцию трех входных сигналов
Каждый нейрон соединен с другими, но не все соединения равноценны, у каждого - свой вес. Строго говоря, возбужденный нейрон распространяет импульс 1 на следующие нейроны, а невозбужденный распространяет импульс 0. Вес, образно говоря, задает долю импульса возбуждающегося входного нейрона, передаваемую в следующий нейрон через соединение. Математически входной сигнал следующего нейрона вычисляется путем умножения импульса на вес соединения.
В нашем примере нейрон просто вычисляет свой выходной сигнал, суммируя все входные сигналы. Конкретная схема генерации нейроном выходного сигнала на основе входных называется его функцией активации (activation function). В нашем примере вероятность возбуждения нейрона выше, если соответствующие входные нейроны также возбуждаются. Именно так импульсы и распространяются по нейронной сети.
Как работает алгоритм обучения? Обучающие данные используются для выбора весов w нейронной сети. При фиксированном входном значении x различные веса w приводят к различным выходным сигналам. Поэтому алгоритм обучения постепенно меняет веса w - за много итераций, - пока выходной слой не начинает выдавать результаты, аналогичные обучающим данным. Другими словами, алгоритм обучения постепенно сокращает погрешность предсказания обучающих данных.
Существует множество схем сетей, алгоритмов обучения и функций активации. Здесь показан практичный подход, позволяющий воспользоваться нейронной сетью прямо сейчас, с помощью одной строки кода. Если захотите, то можете изучить потом дополнительные подробности (например, можете начать с чтения статьи "Нейронная сеть" в "Википедии", https://ru.wikipedia.org/wiki/Нейронная_сеть).
На следующем шаге мы закончим изучение этого вопроса.