Алгоритмы машинного обучения: базовый курс - страница 31



next_state, reward, done, _, _ = env.step(action) # Выполняем действие

total_reward += reward

state = next_state # Переход к следующему состоянию

# Если агент упал (закончилась игра), завершаем

if done:

break

# Выводим итоговую награду

print(f"Total Reward: {total_reward}")

```

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

Шаг 4: Алгоритм Q-learning

Q-learning – это один из популярных методов обучения с подкреплением, который помогает агенту учиться на основе награды, которую он получает за выполнение определённого действия в каждом состоянии. Агент заполняет таблицу значений Q (ценности состояния-действия), которая описывает, насколько выгодно выполнить действие в конкретном состоянии.

Мы начнем с создания таблицы Q для всех состояний и действий. Сначала пространство состояний среды CartPole сильно большое и непрерывное, поэтому нам нужно будет дискретизировать его, чтобы работать с таблицей Q.

Шаг 5: Реализация алгоритма Q-learning

Пример реализации алгоритма Q-learning для задачи CartPole:

```python

# Устанавливаем параметры

learning_rate = 0.1 # Скорость обучения

discount_factor = 0.99 # Дисконтирование будущих наград

epsilon = 0.1 # Вероятность выбора случайного действия (исследование)

num_episodes = 1000 # Количество эпизодов обучения

# Инициализация Q-таблицы

# Преобразуем состояния в дискретные

def discretize_state(state):

discrete_state = [

int(state[0] // 0.1),

int(state[1] // 0.1),

int(state[2] // 0.1),

int(state[3] // 0.1)

]

return tuple(discrete_state)

# Размеры Q-таблицы (по оси состояния и действия)

q_table = np.zeros((6, 6, 6, 6, env.action_space.n)) # для CartPole (4 признака, 2 действия)

# Функция для выбора действия с учётом epsilon-greedy стратегии

def epsilon_greedy(state):

if random.uniform(0, 1) < epsilon:

return random.choice([0, 1]) # Случайный выбор

else:

return np.argmax(q_table[state]) # Лучшее действие по таблице Q

# Обучение агента

for episode in range(num_episodes):

state = discretize_state(env.reset()) # Начальное состояние, дискретизация

done = False

total_reward = 0

while not done:

action = epsilon_greedy(state) # Выбор действия

next_state, reward, done, _, _ = env.step(action) # Выполнение действия

next_state = discretize_state(next_state) # Дискретизация следующего состояния

# Обновление Q-значения по формуле Q-learning

q_table[state][action] = q_table[state][action] + learning_rate * (

reward + discount_factor * np.max(q_table[next_state]) – q_table[state][action]

)

state = next_state # Переход к новому состоянию

total_reward += reward

if episode % 100 == 0:

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

```

Шаг 6: Тестирование обученного агента

После того как агент обучился с использованием Q-learning, мы можем протестировать его эффективность. В тестировании агент будет следовать стратегии, основанной на максимизации ценности действия, и применять её без случайных выборов.

```python

# Тестирование агента

state = discretize_state(env.reset())

done = False

total_reward = 0

while not done:

action = np.argmax(q_table[state]) # Лучшее действие по таблице Q

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

state = discretize_state(next_state) # Дискретизация следующего состояния