<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在隨機搜尋策略中,每個回合都是獨立的。因此,隨機搜尋中的所有回合都可以並行執行,最終選擇能夠得到最佳效能的權重。我們還通過繪製總獎勵隨回合增加的變化情況進行驗證,可以看到獎勵並沒有上升的趨勢。在本節中,我們將實現爬山演演算法 (hill-climbing algorithm
),以將在一個回合中學習到的知識轉移到下一個回合中。
在爬山演演算法中,我們同樣從隨機選擇的權重開始。但是,對於每個回合,我們都會為權重新增一些噪聲資料。如果總獎勵有所改善,我們將使用新的權重來更新原權重;否則,將保持原權重。通過這種方法,隨著回合的增加,權重也會逐步修改,而不是在每個回合中隨機改變。
接下來,我們使用 PyTorch
實現爬山演演算法。首先,匯入所需的包,建立一個 CartPole
環境範例,並計算狀態空間和動作空間的尺寸。重用 run_episode
函數,其會根據給定權重,模擬一個回合後返回總獎勵:
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
函數進行模擬。
隨機選擇初始權重之後,在每個回合中執行以下操作:
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
為了評估使用爬山演演算法的訓練效果,多次重複訓練過程,使用迴圈語句多次執行爬山演演算法,可以觀察到平均總獎勵的波動變化較大:
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次後得到的結果:
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
產生如此差異的原因是什麼呢?如果初始權重較差,則新增的少量噪聲只會小範圍改變權重,且對改善效能幾乎沒有影響,導致演演算法收斂效能不佳。另一方面,如果初始權重較為合適,則新增大量噪聲可能會大幅度改變權重,使得權重偏離最佳權重並破壞演演算法效能。為了使爬山演演算法的訓練更穩定,我們可以使用自適應噪聲縮放因子,類似於梯度下降中的自適應學習率,隨著模型效能的提升改變噪聲縮放因子的大小。
為了使噪聲具有自適應性,執行以下操作:
0.0001
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
接下來,為了更加直觀的觀察,我們繪製每個回合的總獎勵的變化情況,如下所示,可以看到總獎勵有明顯的上升趨勢,然後穩定在最大值處:
plt.plot(total_rewards, label='search') plt.xlabel('episode') plt.ylabel('total_reward') plt.legend() plt.show()
多次執行訓練過程過程,可以發現與採用恆定噪聲縮放因子進行學習相比,自適應噪聲縮放因子可以得到穩定的訓練結果。
接下來,我們測試所得到的模型策略在 1000 個新回合中的效能表現:
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
環境中可以獲得的最高獎勵。通過多次執行評估,可以獲得非常一致的結果。
到此這篇關於利用PyTorch實現爬山演演算法的文章就介紹到這了,更多相關PyTorch爬山演演算法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45