Название | Нейросети. Основы |
---|---|
Автор произведения | Дэвид Рид |
Жанр | |
Серия | |
Издательство | |
Год выпуска | 2024 |
isbn |
Цель агента – найти оптимальный путь от начальной позиции до цели, минимизируя общие штрафы (отрицательные вознаграждения) и избегая обрыва.
Основные компоненты задачи
1. Окружение:
– `CliffWalking-v0` представляет собой сетку размером 4x12.
– Агент начинает в ячейке (3, 0) и должен достичь ячейки (3, 11).
2. Действия:
– Агент может двигаться в четырех направлениях: влево, вправо, вверх и вниз.
3. Награды:
– Каждое движение агента дает штраф -1.
– Падение с обрыва приводит к большому штрафу (например, -100) и возвращает агента в начальную позицию.
4. Конечное состояние:
– Когда агент достигает цели в ячейке (3, 11), эпизод заканчивается.
Примерный процесс выполнения задачи
1. Инициализация:
– Создаем окружение и инициализируем параметры Q-обучения.
– Инициализируем Q-таблицу нулями.
2. Цикл обучения:
– В каждом эпизоде агент начинает в начальной позиции и выполняет действия, выбираемые согласно ε-жадной стратегии.
– Обновляем Q-таблицу на основе полученного опыта (текущее состояние, действие, вознаграждение и следующее состояние).
– Эпизод продолжается, пока агент не достигнет цели или не упадет в обрыв.
3. Тестирование:
– После завершения обучения тестируем агента, чтобы увидеть, как он выполняет задачу, используя обученную политику (выбор действий с максимальными Q-значениями).
Этот код демонстрирует, как агент учится принимать решения на основе опыта взаимодействия со средой, чтобы достичь цели с минимальными потерями.
Для начала нужно установить OpenAI Gym, если он еще не установлен:
```bash
pip install gym
```
Пример кода
```python
import numpy as np
import gym
# Создаем окружение "CliffWalking-v0"
env = gym.make('CliffWalking-v0')
# Параметры Q-обучения
alpha = 0.1 # Скорость обучения
gamma = 0.99 # Коэффициент дисконтирования
epsilon = 0.1 # Вероятность выбора случайного действия
# Инициализация Q-таблицы
q_table = np.zeros((env.observation_space.n, env.action_space.n))
def choose_action(state):
if np.random.uniform(0, 1) < epsilon:
return env.action_space.sample() # Случайное действие
else:
return np.argmax(q_table[state]) # Действие с максимальным Q-значением
def update_q_table(state, action, reward, next_state):
best_next_action = np.argmax(q_table[next_state])
td_target = reward + gamma * q_table[next_state][best_next_action]
td_error = td_target – q_table[state][action]
q_table[state][action] += alpha * td_error
# Основной цикл обучения
num_episodes = 500
for episode in range(num_episodes):
state = env.reset()
done = False
while not done:
action = choose_action(state)
next_state, reward, done, _ = env.step(action)
update_q_table(state, action, reward, next_state)
state = next_state
# Тестирование агента после обучения
state = env.reset()
done = False
total_reward