湖南網(wǎng)站建設(shè)小公司搜索引擎的工作原理有哪些
我們前面了解了DQN網(wǎng)絡(luò)的一些知識(shí),然而DQN還有一些改進(jìn)的方法,比如doubleDQN和duelingDQN,我們先來(lái)將一下doubleDQN和DQN.
先來(lái)對(duì)比一下
單一網(wǎng)絡(luò) vs. 雙重網(wǎng)絡(luò)
DQN:是一個(gè)深度神經(jīng)網(wǎng)絡(luò)來(lái)估計(jì)每個(gè)動(dòng)作的Q值
DDQN:使用兩個(gè)獨(dú)立的深度神經(jīng)網(wǎng)絡(luò):一個(gè)用于選擇動(dòng)作,一個(gè)用于評(píng)估動(dòng)作的價(jià)值。這種設(shè)計(jì)有助于減少Q(mào)值的過(guò)估計(jì)問(wèn)題。
過(guò)估計(jì)問(wèn)題
DQN:由于網(wǎng)絡(luò)同時(shí)負(fù)責(zé)選擇動(dòng)作和評(píng)估動(dòng)作的價(jià)值,可能會(huì)導(dǎo)致Q值的過(guò)估計(jì),即Q值被高估,這會(huì)影響學(xué)習(xí)穩(wěn)定性和性能。
DDQN:通過(guò)分離選擇和評(píng)估過(guò)程,降低了過(guò)低的可能性,因?yàn)槟繕?biāo)網(wǎng)絡(luò)不參與動(dòng)作選擇,從而提供一個(gè)更穩(wěn)定的學(xué)習(xí)目標(biāo)。
更新機(jī)制
DQN:在更新Q值時(shí),直接使用當(dāng)前網(wǎng)絡(luò)的輸出作為目標(biāo)Q值。
DDQN:在更新Q值時(shí),使用目標(biāo)網(wǎng)絡(luò)的輸出作為Q值,而行為網(wǎng)絡(luò)負(fù)責(zé)選擇動(dòng)作這種分離有助于提高學(xué)習(xí)過(guò)程的穩(wěn)定性。
訓(xùn)練穩(wěn)定性
DQN:由于過(guò)估計(jì)問(wèn)題,訓(xùn)練過(guò)程中可能會(huì)遇到穩(wěn)定性問(wèn)題,尤其是在高維狀態(tài)空間中。
DDQN:通過(guò)使用兩個(gè)網(wǎng)絡(luò),通常能夠提供更穩(wěn)定的訓(xùn)練過(guò)程,因?yàn)樗鼫p少了Q值的波動(dòng)。
應(yīng)用場(chǎng)景
DQN:適用于狀態(tài)空間不是特別高維或者問(wèn)題相對(duì)簡(jiǎn)單的情況。
DDQN:更適合于復(fù)雜環(huán)境,特別是在需要更精確估計(jì)Q值的情況下,如機(jī)器人控制、游戲AI等領(lǐng)域。
通俗來(lái)講DDQN就是使用了兩個(gè)神經(jīng)網(wǎng)絡(luò),一個(gè)選擇動(dòng)作,一個(gè)評(píng)估動(dòng)作的價(jià)值。
這是DDQN的公式,它首先用行為網(wǎng)絡(luò)選擇下一個(gè)動(dòng)作中最大Q值的那個(gè)動(dòng)作,然后在用評(píng)估動(dòng)作的網(wǎng)絡(luò)評(píng)估出目標(biāo)Q值,然后更新Q值表。
我們來(lái)看一下DDQN的代碼:我們就看下區(qū)別的那部分
多了兩個(gè)網(wǎng)絡(luò)。
behavior_net = QNetwork(state_dim, action_dim)
target_net = QNetwork(state_dim, action_dim)
利用行為網(wǎng)絡(luò)選擇動(dòng)作
def train(episodes):for episode in range(episodes):# 重置環(huán)境狀態(tài)state = env.reset()done = Falsewhile not done:# 選擇動(dòng)作if random.random() < epsilon:action = env.action_space.sample() # 隨機(jī)探索else:action = behavior_net(torch.tensor(state, dtype=torch.float32)).max(0)[1].item() # 利用行為網(wǎng)絡(luò)選擇動(dòng)作# 執(zhí)行動(dòng)作,觀察結(jié)果new_state, reward, done, _ = env.step(action)# 存儲(chǔ)經(jīng)驗(yàn)experience_replay_buffer.append((state, action, reward, new_state, done))# 移動(dòng)到下一個(gè)狀態(tài)
計(jì)算目標(biāo)Q值和當(dāng)前Q值。
# 計(jì)算目標(biāo) Q 值with torch.no_grad():target_q_values = target_net(new_state).max(1)[0] * gamma * (1 - done) + reward# 計(jì)算當(dāng)前 Q 值current_q_values = behavior_net(no_state).gather(1, action)
這些就是和DQN網(wǎng)絡(luò)的區(qū)別,其實(shí)改動(dòng)也不是很大。但是很好地解決了Q值過(guò)估計(jì)的問(wèn)題。
然后看下duelingDQN
網(wǎng)絡(luò)結(jié)構(gòu)
DQN:使用一個(gè)深度神經(jīng)網(wǎng)絡(luò)來(lái)近似Q函數(shù),網(wǎng)絡(luò)的輸出是每個(gè)可能動(dòng)作的Q值
duelingDQN:在DQN的基礎(chǔ)上引入了決斗機(jī)制,將狀態(tài)值函數(shù)(V函數(shù))和優(yōu)勢(shì)函數(shù)(A函數(shù))分開(kāi)估計(jì)。網(wǎng)絡(luò)的輸出包括狀態(tài)值和每個(gè)動(dòng)作的優(yōu)勢(shì)值。
目標(biāo)Q值的計(jì)算
DQN:可能導(dǎo)致Q值的過(guò)估計(jì)
duelingDQN:目標(biāo)Q值計(jì)算為?reward + gamma * (V(next_state) + A(next_state, action) - V(current_state))
,這里?V(next_state)
?是下一個(gè)狀態(tài)的狀態(tài)值,A(next_state, action)
?是在下一個(gè)狀態(tài)下采取某個(gè)動(dòng)作的優(yōu)勢(shì)值。這種分解可以更穩(wěn)定地估計(jì)Q值。
更新機(jī)制
DQN:Q值更新直接依賴(lài)于下一個(gè)狀態(tài)的最大Q值,這可能導(dǎo)致訓(xùn)練過(guò)程中的不穩(wěn)定性。
duelingDQN:Q值更新考慮了狀態(tài)值和優(yōu)勢(shì)值的差,這有助于減少Q(mào)值的過(guò)估計(jì),提高訓(xùn)練的穩(wěn)定性。
優(yōu)勢(shì)函數(shù)
DQN:不顯式地使用優(yōu)勢(shì)函數(shù)。
duelingDQN:明確地使用優(yōu)勢(shì)函數(shù)來(lái)表示在給定狀態(tài)下某個(gè)動(dòng)作相對(duì)于其他動(dòng)作的相對(duì)優(yōu)勢(shì)。
應(yīng)用場(chǎng)景
DQN:適用于狀態(tài)和動(dòng)作空間不是特別大的問(wèn)題。
duelingDQN:由于其更穩(wěn)定的Q值估計(jì),Dueling DQN在處理高維狀態(tài)空間和動(dòng)作空間的問(wèn)題時(shí)表現(xiàn)更好。
我們來(lái)看下duelingDQN區(qū)別的代碼
創(chuàng)建值函數(shù)網(wǎng)絡(luò),和優(yōu)勢(shì)函數(shù)網(wǎng)絡(luò)
self.V = nn.Linear(128, 1) # Value stream
self.A = nn.Linear(128, n_actions) # Advantage stream
前向傳播時(shí)將優(yōu)勢(shì)函數(shù)減去其均值,以穩(wěn)定訓(xùn)練。
def forward(self, x):# ...return V + (A - A.mean(dim=1, keepdim=True)) # Q = V + (A - mean(A))
總結(jié):Dueling DQN算法的關(guān)鍵創(chuàng)新在于將狀態(tài)值和優(yōu)勢(shì)分開(kāi)估計(jì),并通過(guò)減去優(yōu)勢(shì)函數(shù)的均值來(lái)計(jì)算Q值,這與傳統(tǒng)DQN算法中直接輸出每個(gè)動(dòng)作的Q值是不同的。這種結(jié)構(gòu)有助于提高學(xué)習(xí)效率和性能,尤其是在具有不同價(jià)值狀態(tài)的情況下。