Дэвид Рид "Нейросети. Основы"

Глубокое погружение в мир нейросетей начинается здесь. От основных концепций до практических проектов, эта книга исследует все аспекты создания и использования нейронных сетей. Вы узнаете, как работают различные типы сетей, научитесь применять их для решения реальных задач и овладеете методами оптимизации и тестирования моделей. Незаменимый ресурс для всех, кто стремится освоить и применить мощь искусственного интеллекта в своих проектах.

date_range Год издания :

foundation Издательство :Автор

person Автор :

workspaces ISBN :

child_care Возрастное ограничение : 12

update Дата обновления : 17.07.2024

# Определение памяти для опыта

Transition = namedtuple('Transition', ('state', 'action', 'next_state', 'reward'))

memory = deque(maxlen=memory_size)

# Инициализация сети и оптимизатора

policy_net = DQN(state_size, action_size)

target_net = DQN(state_size, action_size)

target_net.load_state_dict(policy_net.state_dict())

target_net.eval()

optimizer = optim.Adam(policy_net.parameters(), lr=learning_rate)

# Функция для выбора действия

def select_action(state, epsilon):

if random.random() < epsilon:

return env.action_space.sample()

else:

with torch.no_grad():

return policy_net(torch.tensor(state, dtype=torch.float32)).argmax().item()

# Функция для обновления памяти

def store_transition(state, action, next_state, reward):

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

# Функция для обучения сети

def optimize_model():

if len(memory) < batch_size:

return

transitions = random.sample(memory, batch_size)

batch = Transition(*zip(*transitions))

state_batch = torch.tensor(batch.state, dtype=torch.float32)

action_batch = torch.tensor(batch.action).unsqueeze(1)

reward_batch = torch.tensor(batch.reward, dtype=torch.float32)

non_final_mask = torch.tensor(tuple(map(lambda s: s is not None, batch.next_state)), dtype=torch.bool)

non_final_next_states = torch.tensor([s for s in batch.next_state if s is not None], dtype=torch.float32)

state_action_values = policy_net(state_batch).gather(1, action_batch)

next_state_values = torch.zeros(batch_size)

next_state_values[non_final_mask] = target_net(non_final_next_states).max(1)[0].detach()

expected_state_action_values = reward_batch + (gamma * next_state_values)

loss = nn.functional.mse_loss(state_action_values.squeeze(), expected_state_action_values)

optimizer.zero_grad()

loss.backward()

optimizer.step()

# Основной цикл обучения

for episode in range(num_episodes):

state = env.reset()

total_reward = 0

done = False

while not done:

action = select_action(state, epsilon)

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

total_reward += reward

if done:

next_state = None

store_transition(state, action, next_state, reward)

state = next_state

optimize_model()

if epsilon > epsilon_min:

epsilon *= epsilon_decay

if episode % target_update == 0:

target_net.load_state_dict(policy_net.state_dict())

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

# Тестирование агента после обучения

state = env.reset()

done = False

total_reward = 0

while not done:

action = select_action(state, epsilon=0.0) # Без ?-жадной стратегии

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

total_reward += reward

env.render()

print(f"Total reward after training: {total_reward}")

env.close()

```

Объяснение кода

1. Определение архитектуры нейронной сети:

– Сеть состоит из трех полносвязных слоев. Входной слой принимает состояние среды, а выходной слой предсказывает Q-значения для каждого возможного действия.

2. Параметры обучения:

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

3. Память для опыта:

– Используется `deque` для хранения недавних переходов, что позволяет повторно использовать их в процессе обучения.

4. Инициализация сети и оптимизатора:

– Инициализируются две сети: `policy_net` для предсказания Q-значений и `target_net` для стабильного обучения.

– `target_net` копирует веса из `policy_net` каждые несколько эпизодов.

5. Функция для выбора действия:

– Выбирается действие на основе ?-жадной стратегии.

6. Функция для обновления памяти:

– Сохраняются переходы (состояние, действие, следующее состояние, вознаграждение) в памяти.

7. Функция для обучения сети:

– Проводится выборка случайного мини-пакета переходов из памяти.

– Вычисляются текущие Q-значения и целевые Q-значения.

– Обновляются параметры сети путем минимизации ошибки MSE.

8. Основной цикл обучения:

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

– Периодически обновляются веса целевой сети.

– Постепенно уменьшается вероятность случайного действия.

9. Тестирование агента:

– После завершения обучения агент тестируется в среде, используя политику, основанную на максимальных Q-значениях.

– Выводится общее вознаграждение, полученное агентом.

Глава 4. Основные алгоритмы обучения

Обучение моделей машинного обучения часто сводится к оптимизации функции потерь, чтобы улучшить предсказательные способности модели. В этой главе мы рассмотрим три ключевых алгоритма, которые широко используются для этой цели: градиентный спуск, обратное распространение ошибки и стохастический градиентный спуск.

Градиентный спуск

Градиентный спуск – это метод оптимизации, который используется для минимизации функции потерь. Цель метода – найти значения параметров модели, которые минимизируют ошибку между предсказаниями модели и реальными значениями.

Все книги на сайте предоставены для ознакомления и защищены авторским правом