banner banner banner
Нейросети. Основы
Нейросети. Основы
Оценить:
Рейтинг: 0

Полная версия:

Нейросети. Основы

скачать книгу бесплатно


loss.backward()

optimizer.step()

# Основной цикл обучения

for episode in range(num_episodes):

state = env.reset()

total_reward = 0

done = False

while not done:

action = select_action(state, epsilon)

next_state, reward, done, _ = env.step(action)

total_reward += reward

if done:

next_state = None

store_transition(state, action, next_state, reward)

state = next_state

optimize_model()

if epsilon > epsilon_min:

epsilon *= epsilon_decay

if episode % target_update == 0:

target_net.load_state_dict(policy_net.state_dict())

print(f"Episode {episode}, Total Reward: {total_reward}")

# Тестирование агента после обучения

state = env.reset()

done = False

total_reward = 0

while not done:

action = select_action(state, epsilon=0.0) # Без ?-жадной стратегии

state, reward, done, _ = env.step(action)

total_reward += reward

env.render()

print(f"Total reward after training: {total_reward}")

env.close()

```

Объяснение кода

1. Определение архитектуры нейронной сети:

– Сеть состоит из трех полносвязных слоев. Входной слой принимает состояние среды, а выходной слой предсказывает Q-значения для каждого возможного действия.

2. Параметры обучения:

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

3. Память для опыта:

– Используется `deque` для хранения недавних переходов, что позволяет повторно использовать их в процессе обучения.

4. Инициализация сети и оптимизатора:

– Инициализируются две сети: `policy_net` для предсказания Q-значений и `target_net` для стабильного обучения.

– `target_net` копирует веса из `policy_net` каждые несколько эпизодов.

5. Функция для выбора действия:

– Выбирается действие на основе ?-жадной стратегии.

6. Функция для обновления памяти:

– Сохраняются переходы (состояние, действие, следующее состояние, вознаграждение) в памяти.

7. Функция для обучения сети:

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

– Вычисляются текущие Q-значения и целевые Q-значения.

– Обновляются параметры сети путем минимизации ошибки MSE.

8. Основной цикл обучения:

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

– Периодически обновляются веса целевой сети.

– Постепенно уменьшается вероятность случайного действия.

9. Тестирование агента:

– После завершения обучения агент тестируется в среде, используя политику, основанную на максимальных Q-значениях.

– Выводится общее вознаграждение, полученное агентом.

Глава 4. Основные алгоритмы обучения

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

Градиентный спуск

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

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

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

2. Вычисление градиента

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

3. Обновление параметров

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

Пример работы градиентного спуска

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

1. Инициализация параметров: Мы начинаем с случайных значений для наклона и смещения линии.

2. Вычисление градиента: Мы рассчитываем, как изменить наклон и смещение, чтобы уменьшить среднеквадратичную ошибку (разность между реальными значениями и предсказанными значениями на линии).

3. Обновление параметров: Мы корректируем наклон и смещение в направлении, которое уменьшает ошибку.

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

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

Пример кода

```python

import numpy as np

import matplotlib.pyplot as plt

# Генерация данных для примера

np.random.seed(42)

X = 2 * np.random.rand(100, 1)

y = 4 + 3 * X + np.random.randn(100, 1)

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

theta = np.random.randn(2, 1)

# Добавление столбца единиц к X (для смещения)

X_b = np.c_[np.ones((100, 1)), X]

# Параметры градиентного спуска

learning_rate = 0.1

n_iterations = 1000

m = len(X_b)

# Функция для вычисления градиентов

def compute_gradient(X_b, y, theta):

gradients = 2/m * X_b.T.dot(X_b.dot(theta) – y)

return gradients

# Градиентный спуск

for iteration in range(n_iterations):

gradients = compute_gradient(X_b, y, theta)

theta = theta – learning_rate * gradients

print("Найденные параметры:", theta)