Найти тему
The Dawn Project

Нейронные сети с нуля - 1. Основы нейронных сетей.

Оглавление

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

Что такое нейронная сеть?

Для начала нужно определится с термином нейронная сеть. Искусственная нейронная сеть - это совокупность взаимодействующих между с собой искусственных нейронов. А искусственный нейрон - это упрощенный биологический нейрон. Поэтому, чтобы понять, что такое нейронная сеть, нам нужно немного изучить строение биологического нейрона (рис. 1).

Рис. 1. Строение биологического нейрона
Рис. 1. Строение биологического нейрона

У биологического нейрона есть дендриты - это входы нейрона, благодаря ним поступает информация на нейрон. Есть тело биологического нейрона в нём происходит преобразование информации, которую получил с дендритов, и отправку этой информации следующему нейрону через аксон. Я рассказал очень сильно упрощенное строение, и искусственный нейрон (рис. 2) устроен также, только некоторые термины заменены: дендрит - вход, аксон - выход .

Рис. 2. Строение искусственного нейрона
Рис. 2. Строение искусственного нейрона

Также у биологического нейрона есть синапс - это место контакта между двумя нейронами, благодаря нему возможно, перестроить нейрон. Синапс может с разной амплитудой и частотой передавать сигнал и благодаря этому животные и люди, в том числе, могут обрабатывать информацию и обучаться. В искусственном нейроне роль синапса играет вес(w). Что такое вес? Вес - это параметр нейрона, который показывает насколько вход влияет на конечный выход.

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

Как работает нейронная сеть?

Строение и работу нейронной сети разберем на примере многослойного персептрона Розенблатта - это простая нейронная сеть, благодаря которой мы сможем понять, как работают и устроены нейронные сети.

У персептрона, как и у любой другой нейронной сети, есть входной слой (input layer), скрытый слой (hidden layer) и выходной слой (output layer). Каждый слой состоит из нейронов, которые взаимодействуют между собой. Нейроны в скрытом слое преобразует данные из предыдущего входного слоя, после преобразования применяется функция активации (о функциях активации расскажу в следующей статье). Выходной слой получает значения из последнего скрытого слоя и преобразует в выход нейронной сети.

Рис. 3. Модель персептрона Розенблатта с тремя входами, одним выходом и скрытым слоем, состоящий из трех нейронов.
Рис. 3. Модель персептрона Розенблатта с тремя входами, одним выходом и скрытым слоем, состоящий из трех нейронов.

Каждый нейрон, как и говорилось ранее, характеризуется уникальным вектор весовых коэффициентов.

Чтобы объяснить нейронной сети, что от неё требуется, нужно её обучить. Обучение нейронной сети делится на пару видов: обучение с учителем и обучение без учителя. Эти два подхода обладают одним общим свойством: они оба преобразуют один набор данных в другой. Но в обучении без учителя набор данных, в который происходит преобразование, прежде не был известен. В отличие от обучения с учителем, здесь нет «правильного ответа», который модель должна воспроизвести. Вы просто даете команду алгоритму «найти закономерности в этих данных и сообщить о них». В обучении с учителем существует готовый набор данных, по которому обучается нейронная сеть.

Обучение с учителем происходит следующим образом: для начала каждый образец подается на входы сети, после чего проходит обработку внутри структуры НС, вычисляется выходной сигнал сети, который сравнивается с соответствующим значением целевого вектора, представляющего собой требуемый выход сети. Затем по определенному правилу вычисляется ошибка, и после чего происходит изменение весовых коэффициентов связей внутри сети в зависимости от выбранного алгоритма. Векторы обучающего множества предъявляются последовательно, вычисляются ошибки и веса подстраиваются для каждого вектора до тех пор, пока ошибка по всему обучающему массиву не достигнет приемлемо низкого уровня.

При обучении без учителя обучающее множество состоит лишь из входных векторов. Обучающий алгоритм подстраивает веса сети так, чтобы получались согласованные выходные векторы, т.е. чтобы предъявление достаточно близких входных векторов давало одинаковые выходы. Процесс обучения, следовательно, выделяет статистические свойства обучающего множества и группирует сходные векторы в классы. Предъявление на вход вектора из данного класса даст определенный выходной вектор, но до обучения невозможно предсказать, какой выход будет производиться данным классом входных векторов. Следовательно, выходы подобной сети должны трансформироваться в некоторую понятную форму, обусловленную процессом обучения. Это не является серьезной проблемой. Обычно не сложно идентифицировать связь между входом и выходом, установленную сетью.

Математическая модель персептрона Розенблатта

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

Мы реализуем математическую модель, которая изображена на рисунке 3. Входные значения обозначим за матрицу X размером 1 на 3, веса между входным слоем и скрытым обозначим за матрицу W₁ размером 3 на 3, веса между скрытым слоем и выходом нейронной сети обозначим за матрицу W₂ размером 3 на 1, скрытый слой обозначим за матрицу H размером 1 на 3, и последний выходной слой обозначим за матрицу Y размером 1 на 1.

Теперь, чтобы вычислить выход нейронной сети Y нам нужно сначала найти значения скрытого слоя, чтобы его найти нужно просто перемножить матрицы: H = X * W₁. Точно также перемножаем матрицы H и W₂ и мы в итоге узнаем выход нейронной сети: Y = H * W₂.

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

Теперь вычисляем ответ из первого примера обозначим ответ, который предсказали за Y₀, а ответ, который должен получиться за Y:

H = X * W₁;

Y₀ = H * W₂.

После того, как вычислили ответ, мы вычисляем ошибку, она обозначается буквой δ:

δ = Y₀ - Y.

Тут мы вычислили ошибку только для выходного нейрона, теперь нам нужно вычислить ошибку для скрытого слоя, мы тут покажем только формулу, этой статьи не хватит, чтобы объяснить, почему нужно именно так вычислять:

δ₁ = δ * W₂ᵀ.

Теперь в конце обновляем веса:

W₁ = W₁ - (Xᵀ * δ₁).

W₂ = W₂ - (Hᵀ * δ).

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

Выводы

На этом первая статья из цикла "Нейронные сети с нуля" окончена. Благодарю за ваше внимание! Пишете комментарии. Надеюсь вам понравилось!