深度Q網(wǎng)絡DQN(Deep Q-Network)強化學習的原理與實戰(zhàn)
DQN(Deep Q-Network)是一種基于深度學習和強化學習的算法,由DeepMind提出,用于解決離散動作空間下的馬爾科夫決策過程(MDP)問題。它是首個成功將深度學習應用于解決強化學習任務的算法之一。DQN,即深度Q網(wǎng)絡(Deep Q-network),是指基于深度學習的Q-Learing算法。
一、強化學習基礎
強化學習(Reinforcement Learning)是機器學習的一個重要分支,其核心思想是通過與環(huán)境的交互學習最優(yōu)策略。與監(jiān)督學習不同,強化學習不需要預先準備好的輸入-輸出對,而是通過試錯機制獲得獎勵信號來指導學習。
1.1 核心概念
• 智能體(Agent):學習的執(zhí)行者 • 環(huán)境(Environment):智能體交互的對象 • 狀態(tài)(State):環(huán)境的當前情況 • 動作(Action):智能體的行為 • 獎勵(Reward):環(huán)境對動作的反饋 • 策略(Policy):狀態(tài)到動作的映射
1.2 馬爾可夫決策過程
強化學習問題通常建模為馬爾可夫決策過程(MDP),由五元組(S, A, P, R, γ)組成: • S:狀態(tài)集合 • A:動作集合 • P:狀態(tài)轉(zhuǎn)移概率 • R:獎勵函數(shù) • γ:折扣因子(0≤γ<1)
二、Q學習與深度Q網(wǎng)絡
2.1 Q學習算法
Q學習是一種經(jīng)典的強化學習算法,通過維護一個Q值表來估計在給定狀態(tài)下采取某個動作的長期回報:
import numpy as np
# 初始化Q表
q_table = np.zeros((state_space_size, action_space_size))
# Q學習更新公式
alpha = 0.1 # 學習率
gamma = 0.99 # 折扣因子
for episode in range(total_episodes):
state = env.reset()
done = False
while not done:
action = select_action(state) # ε-greedy策略
next_state, reward, done, _ = env.step(action)
# Q值更新
q_table[state, action] = q_table[state, action] + alpha * (
reward + gamma * np.max(q_table[next_state]) - q_table[state, action]
)
state = next_state2.2 深度Q網(wǎng)絡(DQN)
當狀態(tài)空間較大時,Q表變得不切實際。DQN使用神經(jīng)網(wǎng)絡近似Q函數(shù):
import torch
import torch.nn as nn
import torch.optim as optim
class DQN(nn.Module):
def __init__(self, input_dim, output_dim):
super(DQN, self).__init__()
self.fc1 = nn.Linear(input_dim, 128)
self.fc2 = nn.Linear(128, 128)
self.fc3 = nn.Linear(128, output_dim)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
return self.fc3(x)三、DQN的改進技術
3.1 經(jīng)驗回放(Experience Replay)
解決樣本相關性和非平穩(wěn)分布問題:
from collections import deque
import random
class ReplayBuffer:
def __init__(self, capacity):
self.buffer = deque(maxlen=capacity)
def push(self, state, action, reward, next_state, done):
self.buffer.append((state, action, reward, next_state, done))
def sample(self, batch_size):
return random.sample(self.buffer, batch_size)
def __len__(self):
return len(self.buffer)3.2 目標網(wǎng)絡(Target Network)
穩(wěn)定訓練過程:
target_net = DQN(input_dim, output_dim).to(device)
target_net.load_state_dict(policy_net.state_dict())
target_net.eval()
# 定期更新目標網(wǎng)絡
if steps_done % TARGET_UPDATE == 0:
target_net.load_state_dict(policy_net.state_dict())四、完整DQN實現(xiàn)(CartPole環(huán)境)
import gym
import numpy as np
import torch
import random
from collections import deque
import matplotlib.pyplot as plt
# 超參數(shù)
BATCH_SIZE = 128
GAMMA = 0.99
EPS_START = 0.9
EPS_END = 0.05
EPS_DECAY = 200
TARGET_UPDATE = 10
LR = 0.001
# 初始化環(huán)境
env = gym.make('CartPole-v1')
state_dim = env.observation_space.shape[0]
action_dim = env.action_space.n
# 神經(jīng)網(wǎng)絡定義
class DQN(nn.Module):
def __init__(self, input_dim, output_dim):
super(DQN, self).__init__()
self.fc1 = nn.Linear(input_dim, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, output_dim)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
return self.fc3(x)
# 初始化網(wǎng)絡
policy_net = DQN(state_dim, action_dim).to(device)
target_net = DQN(state_dim, action_dim).to(device)
target_net.load_state_dict(policy_net.state_dict())
optimizer = optim.Adam(policy_net.parameters(), lr=LR)
memory = ReplayBuffer(10000)
# 訓練過程
def train():
if len(memory) < BATCH_SIZE:
return
transitions = memory.sample(BATCH_SIZE)
batch = list(zip(*transitions))
state_batch = torch.FloatTensor(np.array(batch[0]))
action_batch = torch.LongTensor(np.array(batch[1]))
reward_batch = torch.FloatTensor(np.array(batch[2]))
next_state_batch = torch.FloatTensor(np.array(batch[3]))
done_batch = torch.FloatTensor(np.array(batch[4]))
current_q = policy_net(state_batch).gather(1, action_batch.unsqueeze(1))
next_q = target_net(next_state_batch).max(1)[0].detach()
expected_q = reward_batch + (1 - done_batch) * GAMMA * next_q
loss = nn.MSELoss()(current_q.squeeze(), expected_q)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 主訓練循環(huán)
episode_rewards = []
for episode in range(500):
state = env.reset()
total_reward = 0
done = False
while not done:
# ε-greedy動作選擇
eps_threshold = EPS_END + (EPS_START - EPS_END) * \
np.exp(-1. * episode / EPS_DECAY)
if random.random() > eps_threshold:
with torch.no_grad():
action = policy_net(torch.FloatTensor(state)).argmax().item()
else:
action = random.randint(0, action_dim-1)
next_state, reward, done, _ = env.step(action)
memory.push(state, action, reward, next_state, done)
state = next_state
total_reward += reward
train()
episode_rewards.append(total_reward)
if episode % 10 == 0:
print(f"Episode {episode}, Total Reward: {total_reward}")
# 繪制訓練曲線
plt.plot(episode_rewards)
plt.xlabel('Episode')
plt.ylabel('Total Reward')
plt.title('DQN Training Progress')
plt.show()五、DQN的局限性與發(fā)展
- 過估計問題:Double DQN通過解耦動作選擇和Q值評估來解決
- 優(yōu)先經(jīng)驗回放:給重要的轉(zhuǎn)移更高采樣概率
- 競爭網(wǎng)絡架構(gòu):Dueling DQN分離價值函數(shù)和優(yōu)勢函數(shù)
- 分布式強化學習:學習價值分布而不僅是期望值
六、總結(jié)
深度Q學習將深度神經(jīng)網(wǎng)絡與強化學習相結(jié)合,解決了傳統(tǒng)Q學習在高維狀態(tài)空間下的局限性。通過經(jīng)驗回放和目標網(wǎng)絡等技術,DQN能夠在復雜環(huán)境中學習有效的策略。本文通過CartPole環(huán)境的完整實現(xiàn),展示了DQN的核心思想和實現(xiàn)細節(jié)。未來,結(jié)合改進技術和更強大的網(wǎng)絡架構(gòu),深度強化學習將在機器人控制、游戲AI等領域發(fā)揮更大作用。
到此這篇關于深度Q網(wǎng)絡DQN(Deep Q-Network)強化學習的原理與實戰(zhàn)的文章就介紹到這了,更多相關深度Q網(wǎng)絡DQN強化學習內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python實現(xiàn)自動計算Excel數(shù)據(jù)指定范圍內(nèi)的區(qū)間最大值
這篇文章主要為大家詳細介紹了如何基于Python自動計算Excel數(shù)據(jù)指定范圍內(nèi)的區(qū)間最大值,文中的示例代碼簡潔易懂,感興趣的小伙伴可以了解下2023-07-07
神經(jīng)網(wǎng)絡理論基礎及Python實現(xiàn)詳解
這篇文章主要介紹了神經(jīng)網(wǎng)絡理論基礎及Python實現(xiàn)詳解,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12
解決python-docx打包之后找不到default.docx的問題
今天小編就為大家分享一篇解決python-docx打包之后找不到default.docx的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
基于python進行桶排序與基數(shù)排序的總結(jié)
今天小編就為大家分享一篇基于python進行桶排序與基數(shù)排序的總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
python基礎教程之基本內(nèi)置數(shù)據(jù)類型介紹
在Python程序中,每個數(shù)據(jù)都是對像,每個對像都有自己的一個類型。不同類型有不同的操作方法,使用內(nèi)置數(shù)據(jù)類型獨有的操作方法,可以更快的完成很多工作2014-02-02

