Алгоритмы машинного обучения: базовый курс - страница 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) # Дискретизация следующего состояния