Концепции ИИ на Python

Градиентный спуск и обратное распространение ошибки на Python

Обучение - это подстройка весов так, чтобы потеря уменьшалась. Градиент показывает направление, в котором потеря растёт, поэтому градиентный спуск делает небольшие шаги в обратную сторону. Обратное распространение ошибки вычисляет этот градиент для каждого веса по цепному правилу.

Суть простыми словами

Обучение - это подстройка весов так, чтобы потеря уменьшалась. Градиент показывает направление, в котором потеря растёт, поэтому градиентный спуск делает небольшие шаги в обратную сторону. Обратное распространение ошибки вычисляет этот градиент для каждого веса по цепному правилу.

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

Главные идеи

  • Градиент - это наклон потери по каждому весу.
  • Скорость обучения задаёт длину шага: слишком большая проскакивает минимум, слишком маленькая работает медленно.
  • Обратное распространение применяет цепное правило от выхода назад к первому слою.
  • Эпоха - это один проход по всем обучающим данным.

Когда это использовать?

  • Понять, что происходит внутри нейронных сетей и библиотек ИИ.
  • Разобраться в идее до того, как реализовать её в соответствующих задачах.
  • Подготовиться к курсам по машинному обучению, собеседованиям и проектам.

Посмотрите в действии

Нажмите Запуск, чтобы начать обучение. Прямая приближается к точкам, а оранжевый путь спускается по рельефу потерь к самой низкой точке.

Пример кода

Запустить код →
main.py
# 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.

Практические задания

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

  1. Измените входные данные или веса и предскажите результат до запуска.
  2. Выводите промежуточные значения, чтобы проследить каждый шаг вычислений.
  3. Решите задачи по ссылкам ниже, чтобы самостоятельно реализовать идею.
Запустить в Python IDE →

Попрактикуйтесь на задаче

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

Все задачи