欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PyTorch策略梯度算法詳情

 更新時(shí)間:2022年07月17日 08:44:43   作者:??盼小輝丶???  
這篇文章主要介紹了PyTorch策略梯度算法詳情,文章我們主要使用策略梯度算法解決CartPole問(wèn)題,詳細(xì)的相關(guān)介紹,需要的朋友可以參考一下

0. 前言

本節(jié)中,我們使用策略梯度算法解決 CartPole 問(wèn)題。雖然在這個(gè)簡(jiǎn)單問(wèn)題中,使用隨機(jī)搜索策略爬山算法就足夠了。但是,我們可以使用這個(gè)簡(jiǎn)單問(wèn)題來(lái)更專注的學(xué)習(xí)策略梯度算法,并在之后的學(xué)習(xí)中使用此算法解決更加復(fù)雜的問(wèn)題。

1. 策略梯度算法

策略梯度算法通過(guò)記錄回合中的所有時(shí)間步并基于回合結(jié)束時(shí)與這些時(shí)間步相關(guān)聯(lián)的獎(jiǎng)勵(lì)來(lái)更新權(quán)重訓(xùn)練智能體。使智能體遍歷整個(gè)回合然后基于獲得的獎(jiǎng)勵(lì)更新策略的技術(shù)稱為蒙特卡洛策略梯度。

在策略梯度算法中,模型權(quán)重在每個(gè)回合結(jié)束時(shí)沿梯度方向移動(dòng)。關(guān)于梯度的計(jì)算,我們將在下一節(jié)中詳細(xì)解釋。此外,在每一時(shí)間步中,基于當(dāng)前狀態(tài)和權(quán)重計(jì)算的概率得到策略,并從中采樣一個(gè)動(dòng)作。與隨機(jī)搜索和爬山算法(通過(guò)采取確定性動(dòng)作以獲得更高的得分)相反,它不再確定地采取動(dòng)作。因此,策略從確定性轉(zhuǎn)變?yōu)殡S機(jī)性。例如,如果向左的動(dòng)作和向右的動(dòng)作的概率為 [0.8,0.2],則表示有 80% 的概率選擇向左的動(dòng)作,但這并不意味著一定會(huì)選擇向左的動(dòng)作。

2. 使用策略梯度算法解決CartPole問(wèn)題

在本節(jié)中,我們將學(xué)習(xí)使用 PyTorch 實(shí)現(xiàn)策略梯度算法了。 導(dǎo)入所需的庫(kù),創(chuàng)建 CartPole 環(huán)境實(shí)例,并計(jì)算狀態(tài)空間和動(dòng)作空間的尺寸:

import gym
import torch
import matplotlib.pyplot as plt
env = gym.make('CartPole-v0')

n_state = env.observation_space.shape[0]
print(n_state)

n_action = env.action_space.n
print(n_action)

定義 run_episode 函數(shù),在此函數(shù)中,根據(jù)給定輸入權(quán)重的情況下模擬一回合 CartPole 游戲,并返回獎(jiǎng)勵(lì)和計(jì)算出的梯度。在每個(gè)時(shí)間步中執(zhí)行以下操作:

  • 根據(jù)當(dāng)前狀態(tài)和輸入權(quán)重計(jì)算兩個(gè)動(dòng)作的概率 probs
  • 根據(jù)結(jié)果概率采樣一個(gè)動(dòng)作 action
  • 以概率作為輸入計(jì)算 softmax 函數(shù)的導(dǎo)數(shù) d_softmax,由于只需要計(jì)算與選定動(dòng)作相關(guān)的導(dǎo)數(shù),因此:

\frac {\partial p_i} {\partial z_j} = p_i(1-p_j), i=j∂zj?∂pi??=pi?(1−pj?),i=j

  • 將所得的導(dǎo)數(shù) d_softmax 除以概率 probs,以得與策略相關(guān)的對(duì)數(shù)導(dǎo)數(shù) d_log
  • 根據(jù)鏈?zhǔn)椒▌t計(jì)算權(quán)重的梯度 grad

\frac {dy}{dx}=\frac{dy}{du}\cdot\frac{du}{dx}dxdy?=dudy?⋅dxdu?

  • 記錄得到的梯度 grad
  • 執(zhí)行動(dòng)作,累積獎(jiǎng)勵(lì)并更新狀態(tài)
def run_episode(env, weight):
    state = env.reset()
    grads = []
    total_reward = 0
    is_done = False
    while not is_done:
        state = torch.from_numpy(state).float()
        # 根據(jù)當(dāng)前狀態(tài)和輸入權(quán)重計(jì)算兩個(gè)動(dòng)作的概率 probs
        z = torch.matmul(state, weight)
        probs = torch.nn.Softmax(dim=0)(z)
        # 根據(jù)結(jié)果概率采樣一個(gè)動(dòng)作 action
        action = int(torch.bernoulli(probs[1]).item())
        # 以概率作為輸入計(jì)算 softmax 函數(shù)的導(dǎo)數(shù) d_softmax
        d_softmax = torch.diag(probs) - probs.view(-1, 1) * probs
        # 計(jì)算與策略相關(guān)的對(duì)數(shù)導(dǎo)數(shù)d_log
        d_log = d_softmax[action] / probs[action]
        # 計(jì)算權(quán)重的梯度grad
        grad = state.view(-1, 1) * d_log
        grads.append(grad)
        state, reward, is_done, _ = env.step(action)
        total_reward += reward
        if is_done:
            break
    return total_reward, grads

回合完成后,返回在此回合中獲得的總獎(jiǎng)勵(lì)以及在各個(gè)時(shí)間步中計(jì)算的梯度信息,用于之后更新權(quán)重。

接下來(lái),定義要運(yùn)行的回合數(shù),在每個(gè)回合中調(diào)用 run_episode 函數(shù),并初始化權(quán)重以及用于記錄每個(gè)回合總獎(jiǎng)勵(lì)的變量:

n_episode = 1000
weight = torch.rand(n_state, n_action)
total_rewards = []

在每個(gè)回合結(jié)束后,使用計(jì)算出的梯度來(lái)更新權(quán)重。對(duì)于回合中的每個(gè)時(shí)間步,權(quán)重都根據(jù)學(xué)習(xí)率、計(jì)算出的梯度和智能體在剩余時(shí)間步中的獲得的總獎(jiǎng)勵(lì)進(jìn)行更新。

我們知道在回合終止之前,每一時(shí)間步的獎(jiǎng)勵(lì)都是 1。因此,我們用于計(jì)算每個(gè)時(shí)間步策略梯度的未來(lái)獎(jiǎng)勵(lì)是剩余的時(shí)間步數(shù)。在每個(gè)回合之后,我們使用隨機(jī)梯度上升方法將梯度乘以未來(lái)獎(jiǎng)勵(lì)來(lái)更新權(quán)重。這樣,一個(gè)回合中經(jīng)歷的時(shí)間步越長(zhǎng),權(quán)重的更新幅度就越大,這將增加獲得更大總獎(jiǎng)勵(lì)的機(jī)會(huì)。我們?cè)O(shè)定學(xué)習(xí)率為 0.001

learning_rate = 0.001

for e in range(n_episode):
    total_reward, gradients = run_episode(env, weight)
    print('Episode {}: {}'.format(e + 1, total_reward))
    for i, gradient in enumerate(gradients):
        weight += learning_rate * gradient * (total_reward - i)
    total_rewards.append(total_reward)

然后,我們計(jì)算通過(guò)策略梯度算法獲得的平均總獎(jiǎng)勵(lì):

print('Average total reward over {} episode: {}'.format(n_episode, sum(total_rewards)/n_episode))

我們可以繪制每個(gè)回合的總獎(jiǎng)勵(lì)變化情況,如下所示:

plt.plot(total_rewards)
plt.xlabel('Episode')
plt.ylabel('Reward')
plt.show()

在上圖中,我們可以看到獎(jiǎng)勵(lì)會(huì)隨著訓(xùn)練回合的增加呈現(xiàn)出上升趨勢(shì),然后能夠在最大值處穩(wěn)定。我們還可以看到,即使在收斂之后,獎(jiǎng)勵(lì)也會(huì)振蕩,這是由于策略梯度算法是一種隨機(jī)策略算法。

最后,我們查看學(xué)習(xí)到策略在 1000 個(gè)新回合中的性能表現(xiàn),并計(jì)算平均獎(jiǎng)勵(lì):

n_episode_eval = 1000
total_rewards_eval = []
for e in range(n_episode_eval):
    total_reward, _ = run_episode(env, weight)
    print('Episode {}: {}'.format(e+1, total_reward))
    total_rewards_eval.append(total_reward)

print('Average total reward over {} episode: {}'.format(n_episode_eval, sum(total_rewards_eval)/n_episode_eval))
# Average total reward over 1000 episode: 200

進(jìn)行測(cè)試后,可以看到回合的平均獎(jiǎng)勵(lì)接近最大值 200??梢远啻螠y(cè)試訓(xùn)練后的模型,得到的平均獎(jiǎng)勵(lì)較為穩(wěn)定。正如我們一開始所說(shuō)的那樣,對(duì)于諸如 CartPole 之類的簡(jiǎn)單環(huán)境,策略梯度算法可能大材小用,但它為我們解決更加復(fù)雜的問(wèn)題奠定了基礎(chǔ)。

到此這篇關(guān)于PyTorch策略梯度算法詳情的文章就介紹到這了,更多相關(guān)PyTorch梯度算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論