ISBN :
Возрастное ограничение : 12
Дата обновления : 17.07.2024
# Определение памяти для опыта
Transition = namedtuple('Transition', ('state', 'action', 'next_state', 'reward'))
memory = deque(maxlen=memory_size)
# Инициализация сети и оптимизатора
policy_net = DQN(state_size, action_size)
target_net = DQN(state_size, action_size)
target_net.load_state_dict(policy_net.state_dict())
target_net.eval()
optimizer = optim.Adam(policy_net.parameters(), lr=learning_rate)
# Функция для выбора действия
def select_action(state, epsilon):
if random.random() < epsilon:
return env.action_space.sample()
else:
with torch.no_grad():
return policy_net(torch.tensor(state, dtype=torch.float32)).argmax().item()
# Функция для обновления памяти
def store_transition(state, action, next_state, reward):
memory.append(Transition(state, action, next_state, reward))
# Функция для обучения сети
def optimize_model():
if len(memory) < batch_size:
return
transitions = random.sample(memory, batch_size)
batch = Transition(*zip(*transitions))
state_batch = torch.tensor(batch.state, dtype=torch.float32)
action_batch = torch.tensor(batch.action).unsqueeze(1)
reward_batch = torch.tensor(batch.reward, dtype=torch.float32)
non_final_mask = torch.tensor(tuple(map(lambda s: s is not None, batch.next_state)), dtype=torch.bool)
non_final_next_states = torch.tensor([s for s in batch.next_state if s is not None], dtype=torch.float32)
state_action_values = policy_net(state_batch).gather(1, action_batch)
next_state_values = torch.zeros(batch_size)
next_state_values[non_final_mask] = target_net(non_final_next_states).max(1)[0].detach()
expected_state_action_values = reward_batch + (gamma * next_state_values)
loss = nn.functional.mse_loss(state_action_values.squeeze(), expected_state_action_values)
optimizer.zero_grad()
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. Основные алгоритмы обучения
Обучение моделей машинного обучения часто сводится к оптимизации функции потерь, чтобы улучшить предсказательные способности модели. В этой главе мы рассмотрим три ключевых алгоритма, которые широко используются для этой цели: градиентный спуск, обратное распространение ошибки и стохастический градиентный спуск.
Градиентный спуск
Градиентный спуск – это метод оптимизации, который используется для минимизации функции потерь. Цель метода – найти значения параметров модели, которые минимизируют ошибку между предсказаниями модели и реальными значениями.
Все книги на сайте предоставены для ознакомления и защищены авторским правом