最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyTorch策略梯度算法詳情

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

0. 前言

本節(jié)中,我們使用策略梯度算法解決 CartPole 問題。雖然在這個簡單問題中,使用隨機搜索策略爬山算法就足夠了。但是,我們可以使用這個簡單問題來更專注的學習策略梯度算法,并在之后的學習中使用此算法解決更加復雜的問題。

1. 策略梯度算法

策略梯度算法通過記錄回合中的所有時間步并基于回合結束時與這些時間步相關聯(lián)的獎勵來更新權重訓練智能體。使智能體遍歷整個回合然后基于獲得的獎勵更新策略的技術稱為蒙特卡洛策略梯度。

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

2. 使用策略梯度算法解決CartPole問題

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

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ù)給定輸入權重的情況下模擬一回合 CartPole 游戲,并返回獎勵和計算出的梯度。在每個時間步中執(zhí)行以下操作:

  • 根據(jù)當前狀態(tài)和輸入權重計算兩個動作的概率 probs
  • 根據(jù)結果概率采樣一個動作 action
  • 以概率作為輸入計算 softmax 函數(shù)的導數(shù) d_softmax,由于只需要計算與選定動作相關的導數(shù),因此:

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

  • 將所得的導數(shù) d_softmax 除以概率 probs,以得與策略相關的對數(shù)導數(shù) d_log
  • 根據(jù)鏈式法則計算權重的梯度 grad

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

  • 記錄得到的梯度 grad
  • 執(zhí)行動作,累積獎勵并更新狀態(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ù)當前狀態(tài)和輸入權重計算兩個動作的概率 probs
        z = torch.matmul(state, weight)
        probs = torch.nn.Softmax(dim=0)(z)
        # 根據(jù)結果概率采樣一個動作 action
        action = int(torch.bernoulli(probs[1]).item())
        # 以概率作為輸入計算 softmax 函數(shù)的導數(shù) d_softmax
        d_softmax = torch.diag(probs) - probs.view(-1, 1) * probs
        # 計算與策略相關的對數(shù)導數(shù)d_log
        d_log = d_softmax[action] / probs[action]
        # 計算權重的梯度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

回合完成后,返回在此回合中獲得的總獎勵以及在各個時間步中計算的梯度信息,用于之后更新權重。

接下來,定義要運行的回合數(shù),在每個回合中調用 run_episode 函數(shù),并初始化權重以及用于記錄每個回合總獎勵的變量:

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

在每個回合結束后,使用計算出的梯度來更新權重。對于回合中的每個時間步,權重都根據(jù)學習率、計算出的梯度和智能體在剩余時間步中的獲得的總獎勵進行更新。

我們知道在回合終止之前,每一時間步的獎勵都是 1。因此,我們用于計算每個時間步策略梯度的未來獎勵是剩余的時間步數(shù)。在每個回合之后,我們使用隨機梯度上升方法將梯度乘以未來獎勵來更新權重。這樣,一個回合中經(jīng)歷的時間步越長,權重的更新幅度就越大,這將增加獲得更大總獎勵的機會。我們設定學習率為 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)

然后,我們計算通過策略梯度算法獲得的平均總獎勵:

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

我們可以繪制每個回合的總獎勵變化情況,如下所示:

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

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

最后,我們查看學習到策略在 1000 個新回合中的性能表現(xiàn),并計算平均獎勵:

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

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

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

相關文章

  • Python開根號的幾種方式詳解

    Python開根號的幾種方式詳解

    使用Python中的自帶庫math、自帶函數(shù)pow和自帶庫cmath來對數(shù)字進行開根號運算,這篇文章主要介紹了Python開根號的幾種方式,需要的朋友可以參考下
    2023-01-01
  • Python編寫登陸接口的方法

    Python編寫登陸接口的方法

    這篇文章主要為大家詳細介紹了Python編寫登陸接口的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Python中http請求方法庫匯總

    Python中http請求方法庫匯總

    最近在使用python做接口測試,發(fā)現(xiàn)python中http請求方法有許多種,今天抽點時間把相關內容整理,對python http請求相關知識感興趣的朋友一起學習吧
    2016-01-01
  • Python實現(xiàn)問題回答小游戲

    Python實現(xiàn)問題回答小游戲

    這篇文章主要介紹了利用Python制作一個簡單的知識競賽小游戲,可以實現(xiàn)回答問題功能,文中的示例代碼介紹詳細,感興趣的同學快跟隨小編一起學習吧
    2021-12-12
  • python list轉置和前后反轉的例子

    python list轉置和前后反轉的例子

    今天小編就為大家分享一篇python list轉置和前后反轉的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python全局變量與局部變量的區(qū)別及使用

    python全局變量與局部變量的區(qū)別及使用

    在python中定義和使用函數(shù)方法的時候,會遇到局部變量和全局變量,本文就來介紹一下python全局變量與局部變量的區(qū)別及使用,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • 我用Python做個AI出牌器斗地主把把贏

    我用Python做個AI出牌器斗地主把把贏

    這篇文章主要介紹了我是如何用Python做的AI出牌器,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Python基于gevent實現(xiàn)高并發(fā)代碼實例

    Python基于gevent實現(xiàn)高并發(fā)代碼實例

    這篇文章主要介紹了Python基于gevent實現(xiàn)高并發(fā)代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • python學習與數(shù)據(jù)挖掘應知應會的十大終端命令

    python學習與數(shù)據(jù)挖掘應知應會的十大終端命令

    今天我們將介紹一些基本的數(shù)據(jù)收集、探索和聚合—所有這些都是通過shell完成的。如果你使用的是Linux或Mac,那么接下來就不會有任何問題,但是Windows用戶應該在繼續(xù)之前下載一個終端仿真器
    2021-11-11
  • Python Image模塊基本圖像處理操作小結

    Python Image模塊基本圖像處理操作小結

    這篇文章主要介紹了Python Image模塊基本圖像處理操作,結合實例形式總結分析了Python圖形處理模塊Image常用的圖形處理函數(shù)、功能及相關使用技巧,需要的朋友可以參考下
    2019-04-04

最新評論

安平县| 文山县| 兴安县| 萝北县| 滁州市| 青阳县| 阜新市| 汉沽区| 佛学| 裕民县| 个旧市| 潮安县| 龙山县| 福鼎市| 闸北区| 甘谷县| 高陵县| 开平市| 突泉县| 察隅县| 临武县| 侯马市| 惠来县| 临猗县| 普宁市| 阿合奇县| 都江堰市| 龙州县| 永济市| 恩施市| 乌什县| 奉化市| 渭南市| 巴里| 浏阳市| 宜川县| 四子王旗| 儋州市| 江川县| 凤城市| 广德县|