- Оригинальный адрес:How to build your own Neural Network from scratch in Python
- Оригинальный автор:James Loy
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:JackEggie
- Корректор:lsvih, xionglong58
Руководство для начинающих, чтобы понять внутреннюю работу глубоких нейронных сетей
Мотивация написания:Чтобы лучше понять глубокое обучение, я решил построить нейронную сеть с нуля без библиотеки глубокого обучения, такой как TensorFlow. Я считаю, что понимание внутренней работы нейронных сетей важно для любого начинающего специалиста по данным.
Этот пост содержит то, что я узнал, и, надеюсь, он будет полезен и вам.
Что такое нейронная сеть?
Большинство статей о нейронных сетях описывают их по аналогии с мозгом. Не углубляясь в параллели с мозгом, мне легче понять нейронную сеть, просто описав ее как математическую функцию, которая отображает заданный вход в желаемый результат.
Нейронная сеть состоит из следующих частей:
- Одинвходной слой,x
- любое количествоскрытый слой
- Одинвыходной слой,ŷ
- Набор слоев между слоямиВесаиотклонение,Wиb
- Необязательный элемент, включенный в каждый скрытый слойфункция активации,о. В этом уроке мы будем использовать функцию активации Sigmoid.
На следующем рисунке показана архитектура двухслойной нейронной сети (Примечание. При подсчете количества слоев в нейронной сети обычно исключается входной слой.)
Архитектура двухслойной нейронной сети
Создать класс нейронной сети в Python очень просто.
class NeuralNetwork:
def __init__(self, x, y):
self.input = x
self.weights1 = np.random.rand(self.input.shape[1],4)
self.weights2 = np.random.rand(4,1)
self.y = y
self.output = np.zeros(y.shape)
обучать нейронную сеть
Выход простой двухслойной нейронной сетиŷследующее:
Вы могли заметить, что в приведенном выше уравнении только весаWи предвзятостьbЭти две переменные будут выводитьŷоказать влияние.
Конечно, разумные веса и смещения будут определять, насколько точны прогнозы. Процесс точной настройки весов и смещений для входных данныхобучать нейронную сетьпроцесс.
Каждая итерация процесса обучения включает следующие этапы:
- Рассчитать значение прогнозируемого выходаŷ,Сейчаспрямая связь
- Обновите веса и смещения, т.е.обратное распространение
На приведенной ниже диаграмме последовательности показан этот процесс.
процесс прямой связи
Как мы можем видеть на диаграмме последовательности выше, упреждающая связь — это просто простой вычислительный процесс, и для базовой двухслойной нейронной сети его вывод:
Для этого добавим в код Python функцию прямой связи. Обратите внимание, что для простоты мы принимаем смещение равным 0.
class NeuralNetwork:
def __init__(self, x, y):
self.input = x
self.weights1 = np.random.rand(self.input.shape[1],4)
self.weights2 = np.random.rand(4,1)
self.y = y
self.output = np.zeros(self.y.shape)
def feedforward(self):
self.layer1 = sigmoid(np.dot(self.input, self.weights1))
self.output = sigmoid(np.dot(self.layer1, self.weights2))
Однако нам по-прежнему нужен способ оценить, насколько «точны» прогнозы (т. е. насколько хороши наши прогнозы)? ифункция потерьпозволяет нам это сделать.
функция потерь
Существует много доступных функций потерь, и наш выбор функции потерь должен определяться характером самой проблемы. В этом уроке мы будем использовать простойошибка суммы квадратовкак наша функция потерь.
Другими словами, сумма квадратов ошибок — это просто сумма разницы между каждым прогнозируемым значением и фактическим значением. Мы возводим разницу в квадрат перед ее вычислением, чтобы мы могли оценить абсолютное значение ошибки.
Цель обучения — найти оптимальный набор весов и смещений, минимизирующий функцию потерь.
процесс обратного распространения
Теперь, когда у нас есть ошибка (проигрыш) предсказания, нам также нужно найти способраспространятьВернитесь и обновите наши веса и смещения.
Чтобы получить соответствующую сумму для корректировки весов и смещений, нам нужно рассчитатьПроизводные функции потерь по весам и смещениям.
Вспомним из исчисления, что вычисление производной функции — это просто вычисление наклона функции.
Алгоритм градиентного спуска
Если мы уже рассчитали производные, мы можем обновить веса и смещения, просто увеличив/уменьшив производные (см. изображение выше). Это называетсяградиентный спуск.
Однако мы не можем напрямую вычислить производную функции потерь по весам и смещениям, поскольку веса и смещения не включены в уравнение функции потерь. Поэтому нам нужноПравило цепичтобы помочь нам с расчетами.
Используйте цепное правило для решения производной функции, чтобы обновить веса. Обратите внимание, что для простоты мы показываем только частные производные нейронной сети, которая считается однослойной.
Ой! Это уродливо, но дает нам то, что нам нужно — производную (наклон) функции потерь по отношению к весам, чтобы мы могли соответствующим образом скорректировать веса.
Теперь, когда мы знаем, что делать, давайте добавим функцию обратного распространения в наш код Python.
class NeuralNetwork:
def __init__(self, x, y):
self.input = x
self.weights1 = np.random.rand(self.input.shape[1],4)
self.weights2 = np.random.rand(4,1)
self.y = y
self.output = np.zeros(self.y.shape)
def feedforward(self):
self.layer1 = sigmoid(np.dot(self.input, self.weights1))
self.output = sigmoid(np.dot(self.layer1, self.weights2))
def backprop(self):
# 应用链式法则求出损失函数对于 weights2 和 weights1 的导数
d_weights2 = np.dot(self.layer1.T, (2*(self.y - self.output) * sigmoid_derivative(self.output)))
d_weights1 = np.dot(self.input.T, (np.dot(2*(self.y - self.output) * sigmoid_derivative(self.output), self.weights2.T) * sigmoid_derivative(self.layer1)))
# 用损失函数的导数(斜率)更新权重
self.weights1 += d_weights1
self.weights2 += d_weights2
Если вам нужно более глубокое понимание исчисления и цепного правила, применяемого к обратному распространению, я настоятельно рекомендую учебник 3Blue1Brown.
смотретьвидеоурок
Интегрировать
Теперь, когда у нас есть полный код Python для прямого и обратного распространения, давайте применим нейронную сеть к примеру и посмотрим, как это работает.
Наша нейронная сеть должна научиться получать идеальный набор весов для представления этой функции. Обратите внимание, что процесс простого решения весов для нас тоже не прост.
Запустим нейронную сеть на 1500 обучающих итераций и посмотрим, что получится. Глядя на изменение потерь для каждой итерации на графике ниже, мы ясно видим потериМонотонно убывает к минимуму. Это согласуется с алгоритмом градиентного спуска, который мы обсуждали ранее.
Давайте посмотрим на окончательный прогноз (выход) нейронной сети после 1500 итераций.
Результаты прогнозирования после 1500 итераций обучения
Мы сделали это! Наши алгоритмы прямого и обратного распространения успешно обучают нейронную сеть, и прогнозы сходятся к истинному значению.
Обратите внимание, что будут небольшие отклонения между прогнозируемыми и фактическими значениями. Нам нужна эта предвзятость, потому что она мешаетпереоснащение, и позволить нейронной сети лучшепродвигатьк невидимым данным.
последующие учебные задачи
К счастью, наш учебный путь еще не закончен. Что касается нейронных сетей и глубокого обучения, у нас также естьполноСодержание нужно выучить. Например:
- Что еще мы можем использовать, кроме сигмоидальной функции?функция активации?
- используется при обучении нейронных сетейскорость обучения
- использоватьсверткавыполнять задачи классификации изображений
Я буду писать больше на эти темы, подписывайтесь на меня на Medium и следите за обновлениями!
Эпилог
Конечно, я тоже многому научился в процессе написания собственной нейросети с нуля.
В то время как библиотеки глубокого обучения, такие как TensorFlow и Keras, упрощают создание глубоких нейронных сетей, даже если вы не полностью понимаете внутреннюю работу нейронных сетей, я обнаружил, что для начинающих специалистов по данным глубокое понимание нейронных сетей очень полезно.
Это упражнение заняло у меня массу времени, и я надеюсь, что оно поможет и вам!
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.