Размер шрифта
-
+

Искусственный интеллект. Машинное обучение - стр. 39


Пример 1

Примером задачи, решаемой с использованием алгоритма Deep Q-Networks (DQN), может быть обучение агента для игры в видеоигру, такую как игра в "Pong" на платформе Atari.

1. Определение среды: В этой задаче среда представляет собой видеоигру "Pong", где агент управляет ракеткой, пытаясь отбить мяч и забить его в сторону противника. Состояние среды определяется текущим кадром игры.

2. Действия агента: Действия агента включают движение ракетки вверх или вниз.

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

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

Алгоритм DQN использует глубокую нейронную сеть для аппроксимации функции Q. Во время обучения агент играет в игру множество раз, собирая опыт, состоящий из состояний, действий, наград и следующих состояний. Этот опыт используется для обновления параметров нейронной сети так, чтобы минимизировать ошибку между предсказанными и фактическими значениями функции Q.

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

Рассмотрим пример кода для обучения агента на основе алгоритма Deep Q-Networks (DQN) для игры в "Pong" с использованием библиотеки PyTorch и среды Atari:

```python

import gym

import torch

import torch.nn as nn

import torch.optim as optim

import random

import numpy as np

# Определение модели нейронной сети

class DQN(nn.Module):

def __init__(self, input_dim, output_dim):

super(DQN, self).__init__()

self.fc1 = nn.Linear(input_dim, 128)

self.fc2 = nn.Linear(128, 64)

self.fc3 = nn.Linear(64, output_dim)

def forward(self, x):

x = torch.relu(self.fc1(x))

x = torch.relu(self.fc2(x))

x = self.fc3(x)

return x

# Функция для выбора действия с использованием эпсилон-жадной стратегии

def select_action(state, epsilon):

if random.random() < epsilon:

return env.action_space.sample()

else:

with torch.no_grad():

return np.argmax(model(state).numpy())

# Параметры обучения

epsilon = 1.0

epsilon_min = 0.01

epsilon_decay = 0.995

gamma = 0.99

lr = 0.001

batch_size = 64

memory = []

memory_capacity = 10000

target_update = 10

num_episodes = 1000

# Инициализация среды и модели

env = gym.make('Pong-v0')

input_dim = env.observation_space.shape[0]

output_dim = env.action_space.n

model = DQN(input_dim, output_dim)

target_model = DQN(input_dim, output_dim)

target_model.load_state_dict(model.state_dict())

target_model.eval()

optimizer = optim.Adam(model.parameters(), lr=lr)

criterion = nn.MSELoss()

# Обучение

for episode in range(num_episodes):

state = env.reset()

total_reward = 0

done = False

while not done:

action = select_action(torch.tensor(state).float(), epsilon)

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

memory.append((state, action, reward, next_state, done))

state = next_state

total_reward += reward

if len(memory) >= batch_size:

batch = random.sample(memory, batch_size)

states, actions, rewards, next_states, dones = zip(*batch)

states = torch.tensor(states).float()

actions = torch.tensor(actions)

rewards = torch.tensor(rewards).float()

next_states = torch.tensor(next_states).float()

Страница 39