Понимание основ нейронной сети

Существует множество библиотек Python для создания и обучения нейронных сетей, таких как Tensorflow и Keras. Но чтобы по-настоящему понять нейронные сети, нам нужно понять их базовую структуру и иметь возможность создавать и обучать собственную сеть.

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

Нейронная сеть состоит из:

  • Один входной слой, x
  • Произвольное количество скрытых слоев
  • Один выходной слой, y`

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

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

Базовый алгоритм нейронной сети должен быть примерно таким.

for n epochs:
    1. forward_propagation() #predicting output
    2. backward_propagation() #updating parameters according to loss

Имена функций предполагают основную структуру алгоритма. В этой статье мы построим двухслойную нейронную сеть.

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

Z — это линейное прямое значение, т. е. Z = W.X, а A — активация узла, т. е. A = sigmoid(Z). Мы будем использовать сигмовидную функцию активации для нашей сети.

1. Инициализация параметров

Во-первых, мы инициализируем веса и размеры слоев для нашей нейронной сети.

Определим переменные следующим образом:

  • [num_samples, n_x] : Форма ввода
  • n_x : Количество функций входа X
  • n_h: Узлы в скрытом слое
  • n_y : Количество целевых значений для каждого образца

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

Затем мы инициализируем веса на основе размеров слоя.

  • На приведенной выше диаграмме для первого слоя нам нужно определить наши веса таким образом, чтобы иметь возможность вычислить 4 (n_h) линейных регрессии, по одной для каждого узла в следующем слое.
  • Таким образом, веса в первом слое, W1, должны быть (3,4) или (n_x,n_h) (четыре (n_h) линейных регрессий по трем (n_x) входным функциям).

С помощью этой аналогии вы можете легко угадать форму весов W2 в приведенной выше сети.

Давайте определим нашу функцию для инициализации весов.

2. Прямое распространение

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

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

Прямое распространение довольно просто, если вы правильно определили веса.

выход = сигмоид ((W2 * сигмоид (W1 * X + b1)) + b2)

Давайте определим нашу прямую функцию.

3. Обратное распространение

Это сложная часть. Обратное распространение соответственно обновляет параметры веса в направлении, где потери минимальны. Мы будем использовать среднеквадратичную ошибку (MSE)для нашей сети. Вычисление выглядит сложным, но на самом деле это простое исчисление.

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

4. Обучение

Одна эпоха в обучении состоит из одного шага прямого и обратного распространения.

Мы будем использовать набор данных о раке молочной железы из модуля sklearn.datasets. Набор данных имеет 30 функций и 569 образцов и обучает нашу сеть на 1000 эпох с 4 узлами в скрытом слое.

Сравнение прогнозируемых и выходных значений 10 случайных выборок.

Похоже, наша сеть работала очень хорошо!

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

Вывод

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