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

利用PyTorch實現(xiàn)爬山算法

 更新時間:2022年07月17日 08:46:04   作者:??盼小輝丶?  
這篇文章主要介紹了利用PyTorch實現(xiàn)爬山算法,爬山算法是一種局部擇優(yōu)的方法,采用啟發(fā)式方法,是對深度優(yōu)先搜索的一種改進,它利用反饋信息幫助生成解的決策,屬于人工智能算法的一種

0. 前言

隨機搜索策略中,每個回合都是獨立的。因此,隨機搜索中的所有回合都可以并行運行,最終選擇能夠得到最佳性能的權重。我們還通過繪制總獎勵隨回合增加的變化情況進行驗證,可以看到獎勵并沒有上升的趨勢。在本節(jié)中,我們將實現(xiàn)爬山算法 (hill-climbing algorithm),以將在一個回合中學習到的知識轉(zhuǎn)移到下一個回合中。

1. 使用 PyTorch 實現(xiàn)爬山算法

1.1 爬山算法簡介

在爬山算法中,我們同樣從隨機選擇的權重開始。但是,對于每個回合,我們都會為權重添加一些噪聲數(shù)據(jù)。如果總獎勵有所改善,我們將使用新的權重來更新原權重;否則,將保持原權重。通過這種方法,隨著回合的增加,權重也會逐步修改,而不是在每個回合中隨機改變。

1.2 使用爬山算法進行 CartPole 游戲

接下來,我們使用 PyTorch 實現(xiàn)爬山算法。首先,導入所需的包,創(chuàng)建一個 CartPole 環(huán)境實例,并計算狀態(tài)空間和動作空間的尺寸。重用 run_episode 函數(shù),其會根據(jù)給定權重,模擬一個回合后返回總獎勵:

import gym
import torch
from matplotlib import 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)

def run_episode(env, weight):
    state = env.reset()
    total_reward = 0
    is_done = False
    while not is_done:
        state = torch.from_numpy(state).float()
        action = torch.argmax(torch.matmul(state, weight))
        state, reward, is_done, _ = env.step(action.item())
        total_reward += reward
    return total_reward

模擬 1000 個回合,并初始化變量用于跟蹤最佳的總獎勵以及相應的權重。同時,初始化一個空列表用于記錄每個回合的總獎勵:

n_episode = 1000
best_total_reward = 0
best_weight = torch.randn(n_state, n_action)

total_rewards = []

正如以上所述,我們在每個回合中為權重添加一些噪音,為了使噪聲不會覆蓋原權重,我們還將對噪聲進行縮放,使用 0.01 作為噪聲縮放因子:

noise_scale = 0.01

然后,就可以運行 run_episode 函數(shù)進行模擬。

隨機選擇初始權重之后,在每個回合中執(zhí)行以下操作:

  • 為權重增加隨機噪音
  • 智能體根據(jù)線性映射采取動作
  • 回合終止并返回總獎勵
  • 如果當前獎勵大于到目前為止獲得的最佳獎勵,更新最佳獎勵和權重;否則,最佳獎勵和權重將保持不變
  • 記錄每回合的總獎勵
for e in range(n_episode):
    weight = best_weight + noise_scale * torch.rand(n_state, n_action)
    total_reward = run_episode(env, weight)
    if total_reward >= best_total_reward:
        best_total_reward = total_reward
        best_weight = weight
    total_rewards.append(total_reward)
print('Episode {}: {}'.format(e + 1, total_reward))

計算使用爬山算法所獲得的平均總獎勵:

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

2. 改進爬山算法

為了評估使用爬山算法的訓練效果,多次重復訓練過程,使用循環(huán)語句多次執(zhí)行爬山算法,可以觀察到平均總獎勵的波動變化較大:

for i in range(10):
    best_total_reward = 0
    best_weight = torch.randn(n_state, n_action)
    total_rewards = []
    for e in range(n_episode):
        weight = best_weight + noise_scale * torch.rand(n_state, n_action)
        total_reward = run_episode(env, weight)
        if total_reward >= best_total_reward:
            best_total_reward = total_reward
            best_weight = weight
        total_rewards.append(total_reward)
        # print('Episode {}: {}'.format(e + 1, total_reward))

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

以下是我們運行10次后得到的結(jié)果:

Average total reward over 1000 episode: 200.0
Average total reward over 1000 episode: 9.846
Average total reward over 1000 episode: 82.1
Average total reward over 1000 episode: 9.198
Average total reward over 1000 episode: 9.491
Average total reward over 1000 episode: 9.073
Average total reward over 1000 episode: 149.421
Average total reward over 1000 episode: 49.584
Average total reward over 1000 episode: 8.827
Average total reward over 1000 episode: 9.369

產(chǎn)生如此差異的原因是什么呢?如果初始權重較差,則添加的少量噪聲只會小范圍改變權重,且對改善性能幾乎沒有影響,導致算法收斂性能不佳。另一方面,如果初始權重較為合適,則添加大量噪聲可能會大幅度改變權重,使得權重偏離最佳權重并破壞算法性能。為了使爬山算法的訓練更穩(wěn)定,我們可以使用自適應噪聲縮放因子,類似于梯度下降中的自適應學習率,隨著模型性能的提升改變噪聲縮放因子的大小。

為了使噪聲具有自適應性,執(zhí)行以下操作:

  • 指定初始噪聲縮放因子
  • 如果回合中的模型性能有所改善,則減小噪聲縮放因子,本節(jié)中,每次將噪聲縮放因子減小為原來的一半,同時設置縮放因子最小值為 0.0001
  • 而如果回合中中的模型性能下降,則增大噪聲縮放因子,本節(jié)中,每次將噪聲縮放因子增大為原來的 2 倍,同時設置縮放因子最大值為 2
noise_scale = 0.01
best_total_reward = 0
best_weight = torch.randn(n_state, n_action)
total_rewards = []
for e in range(n_episode):
    weight = best_weight + noise_scale * torch.rand(n_state, n_action)
    total_reward = run_episode(env, weight)
    if total_reward >= best_total_reward:
        best_total_reward = total_reward
        best_weight = weight
        noise_scale = max(noise_scale/2, 1e-4)
    else:
        noise_scale = min(noise_scale*2, 2)
    total_rewards.append(total_reward)
    print('Episode {}: {}'.format(e + 1, total_reward))

可以看到,獎勵隨著回合的增加而增加。訓練過程中,當一個回合中可以運行 200 個步驟時,模型的性能可以得到保持,平均總獎勵也得到了極大的提升:

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

接下來,為了更加直觀的觀察,我們繪制每個回合的總獎勵的變化情況,如下所示,可以看到總獎勵有明顯的上升趨勢,然后穩(wěn)定在最大值處:

plt.plot(total_rewards, label='search')
plt.xlabel('episode')
plt.ylabel('total_reward')
plt.legend()
plt.show()

多次運行訓練過程過程,可以發(fā)現(xiàn)與采用恒定噪聲縮放因子進行學習相比,自適應噪聲縮放因子可以得到穩(wěn)定的訓練結(jié)果。

接下來,我們測試所得到的模型策略在 1000 個新回合中的性能表現(xiàn):

n_episode_eval = 1000
total_rewards_eval = []
for episode in range(n_episode_eval):
    total_reward = run_episode(env, best_weight)
    print('Episode {}: {}'.format(episode+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: 199.98

可以看到在測試階段的平均總獎勵接近 200,即 CartPole 環(huán)境中可以獲得的最高獎勵。通過多次運行評估,可以獲得非常一致的結(jié)果。

到此這篇關于利用PyTorch實現(xiàn)爬山算法的文章就介紹到這了,更多相關PyTorch爬山算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Ubuntu 16.04 LTS中源碼安裝Python 3.6.0的方法教程

    Ubuntu 16.04 LTS中源碼安裝Python 3.6.0的方法教程

    最近Python 3發(fā)布了新版本Python 3.6.0,好像又加入了不少黑魔法!由于暫時不能使用 apt-get 的方式安裝 Python 3.6,所以還是直接編譯源碼安裝吧。下面這篇文章就介紹了在Ubuntu 16.04 LTS中源碼安裝Python 3.6.0的方法教程,需要的朋友可以參考下。
    2016-12-12
  • OpenCV凸包檢測和凸缺陷學習示例

    OpenCV凸包檢測和凸缺陷學習示例

    這篇文章主要為大家介紹了OpenCV凸包檢測和凸缺陷學習示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Pyspark 線性回歸梯度下降交叉驗證知識點詳解

    Pyspark 線性回歸梯度下降交叉驗證知識點詳解

    在本篇內(nèi)容里小編給大家整理的是一篇關于Pyspark 線性回歸梯度下降交叉驗證的相關知識點及實例,需要的朋友們可以參考下。
    2021-12-12
  • NCCL深度學習之初始化及ncclUniqueId的產(chǎn)生源碼解析

    NCCL深度學習之初始化及ncclUniqueId的產(chǎn)生源碼解析

    這篇文章主要為大家介紹了NCCL源碼解析之初始化及ncclUniqueId的產(chǎn)生詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 淺析PEP572: 海象運算符

    淺析PEP572: 海象運算符

    PEP572的標題是「Assignment Expressions」,也就是「賦值表達式」,也叫做「命名表達式」,不過它現(xiàn)在被廣泛的別名是「海象運算符」(The Walrus Operator)
    2019-10-10
  • 全面了解Python的getattr(),setattr(),delattr(),hasattr()

    全面了解Python的getattr(),setattr(),delattr(),hasattr()

    下面小編就為大家?guī)硪黄媪私釶ython的getattr(),setattr(),delattr(),hasattr()。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • windows下python安裝paramiko模塊和pycrypto模塊(簡單三步)

    windows下python安裝paramiko模塊和pycrypto模塊(簡單三步)

    這篇文章主要給大家介紹了通過簡單的三個步驟在windows下python中安裝paramiko模塊和pycrypto模塊的相關資料,文中安裝的步驟,簡單而且又易于大家理解,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-07-07
  • Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線程

    Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線程

    這篇文章主要介紹了Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 探究Python中isalnum()方法的使用

    探究Python中isalnum()方法的使用

    這篇文章主要介紹了探究Python中isalnum()方法的使用,是Python入門學習中的基礎知識,需要的朋友可以參考下
    2015-05-05
  • python代碼能做成軟件嗎

    python代碼能做成軟件嗎

    在本篇內(nèi)容里小編給大家分享的是一篇關于把python代碼做成軟件的方法,有興趣的朋友們可以閱讀下。
    2020-07-07

最新評論

荥经县| 南安市| 肥西县| 屯门区| 怀柔区| 满洲里市| 沂水县| 晋宁县| 金沙县| 雅安市| 九江市| 乌兰浩特市| 常宁市| 惠州市| 长兴县| 正蓝旗| 江达县| 南雄市| 大洼县| 宝坻区| 蒙自县| 佛山市| 昔阳县| 柳江县| 怀仁县| 荔浦县| 南和县| 咸丰县| 阿合奇县| 布尔津县| 卢氏县| 平安县| 阿拉善左旗| 道孚县| 昌平区| 如东县| 崇阳县| 金沙县| 江华| 孟津县| 桐梓县|