Алгоритмы машинного обучения: базовый курс. Тайлер Венс
обучении с подкреплением важным моментом является создание агента, который будет принимать решения, основываясь на текущем состоянии среды. Агент должен выбрать действие на основе текущего состояния. Для простоты давайте реализуем случайный агент, который будет случайным образом выбирать действия, чтобы исследовать пространство.
```python
# Инициализация состояния среды
state = env.reset()
# Действия агента: 0 – двигаться влево, 1 – двигаться вправо
actions = [0, 1]
# Количество шагов
num_steps = 200
# Суммарная награда
total_reward = 0
# Сеанс игры с случайным агентом
for _ in range(num_steps):
action = random.choice(actions) # случайный выбор действия
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