Градиентный спуск и обратное распространение ошибки на Python
Обучение - это подстройка весов так, чтобы потеря уменьшалась. Градиент показывает направление, в котором потеря растёт, поэтому градиентный спуск делает небольшие шаги в обратную сторону. Обратное распространение ошибки вычисляет этот градиент для каждого веса по цепному правилу.
Суть простыми словами
Обучение - это подстройка весов так, чтобы потеря уменьшалась. Градиент показывает направление, в котором потеря растёт, поэтому градиентный спуск делает небольшие шаги в обратную сторону. Обратное распространение ошибки вычисляет этот градиент для каждого веса по цепному правилу.
Обучите нейрон градиентным спуском: с помощью цепного правила найдите, как каждый вес влияет на потерю, и сделайте шаг вниз по склону.
Главные идеи
- Градиент - это наклон потери по каждому весу.
- Скорость обучения задаёт длину шага: слишком большая проскакивает минимум, слишком маленькая работает медленно.
- Обратное распространение применяет цепное правило от выхода назад к первому слою.
- Эпоха - это один проход по всем обучающим данным.
Когда это использовать?
- Понять, что происходит внутри нейронных сетей и библиотек ИИ.
- Разобраться в идее до того, как реализовать её в соответствующих задачах.
- Подготовиться к курсам по машинному обучению, собеседованиям и проектам.
Посмотрите в действии
Нажмите Запуск, чтобы начать обучение. Прямая приближается к точкам, а оранжевый путь спускается по рельефу потерь к самой низкой точке.
Пример кода
# Train one neuron y = w * x + b to fit points on the line y = 2x + 1.
data = [(0, 1), (1, 3), (2, 5), (3, 7)]
w, b = 0.0, 0.0
learning_rate = 0.05
for epoch in range(1, 201):
grad_w = grad_b = 0.0
for x, y in data:
error = (w * x + b) - y # prediction minus target
# Chain rule: d(error²)/dw = 2 * error * x, d(error²)/db = 2 * error
grad_w += 2 * error * x
grad_b += 2 * error
# Step against the gradient to make the loss smaller.
w -= learning_rate * grad_w / len(data)
b -= learning_rate * grad_b / len(data)
if epoch in (1, 10, 50, 200):
loss = sum(((w * x + b) - y) ** 2 for x, y in data) / len(data)
print(f"epoch {epoch:>3}: w={w:.3f} b={b:.3f} loss={loss:.4f}")
Ожидаемый результат
epoch 1: w=0.850 b=0.400 loss=7.0587
epoch 10: w=2.009 b=0.958 loss=0.0009
epoch 50: w=2.005 b=0.989 loss=0.0000
epoch 200: w=2.000 b=1.000 loss=0.0000
Как это работает
Для каждой точки ошибка - это предсказание минус цель. Цепное правило даёт градиент квадратичной ошибки 2·error·x для w и 2·error для b. Если усреднить по данным и шагать против градиента, w и b приближаются к 2 и 1, а потеря падает почти до 0.
Измените значения и запустите программу в онлайн-компиляторе Python CodeUtility без локальной установки Python.
Практические задания
Изменяйте входные данные и проверяйте граничные случаи перед работой с большими наборами.
- Измените входные данные или веса и предскажите результат до запуска.
- Выводите промежуточные значения, чтобы проследить каждый шаг вычислений.
- Решите задачи по ссылкам ниже, чтобы самостоятельно реализовать идею.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
- Производные функций активации Вычислите производную sigmoid, ReLU, Leaky ReLU или tanh в каждой точке — наклоны, которые нужны обратному распространению. Легко
- Градиенты одного нейрона С помощью цепного правила найдите, как потери меняются в зависимости от каждого веса и смещения сигмоидного нейрона. Средне
- Обратное распространение ошибки в двухслойной сети Вычислите все градиенты весов и смещений сети с одним скрытым сигмоидным слоем и одним сигмоидным выходом. Сложно
- Обучение нейрона градиентным спуском Повторяйте прямой проход, вычисление градиентов и обновление весов, чтобы обучить сигмоидный нейрон на примерах. Средне
- Обучите нейросеть решать XOR Соберите всё вместе: обучите сигмоидную сеть 2-2-1 обратным распространением, пока она не выучит XOR. Сложно