加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 什么是強(qiáng)化學(xué)習(xí)?
    • 強(qiáng)化學(xué)習(xí)與監(jiān)督學(xué)習(xí)、無監(jiān)督學(xué)習(xí)的比較
    • 強(qiáng)化學(xué)習(xí)的應(yīng)用領(lǐng)域
    • 強(qiáng)化學(xué)習(xí)算法示例
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

白話機(jī)器學(xué)習(xí)-第五章-強(qiáng)化學(xué)習(xí)

09/05 08:23
1959
閱讀需 37 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

什么是強(qiáng)化學(xué)習(xí)?

機(jī)器學(xué)習(xí)的大家庭里,強(qiáng)化學(xué)習(xí)(RL)是那個(gè)總是在玩“打怪升級(jí)”游戲的孩子。這個(gè)孩子不斷嘗試各種策略,尋找最優(yōu)的游戲路線,在失敗中學(xué)習(xí),在成功中積累經(jīng)驗(yàn),最終成為一名“游戲高手”。在現(xiàn)實(shí)世界中,強(qiáng)化學(xué)習(xí)算法通過與環(huán)境的交互,逐漸優(yōu)化策略,以最大化其長(zhǎng)期收益。這種學(xué)習(xí)方式有點(diǎn)像訓(xùn)練一只小狗,經(jīng)過不斷的嘗試和獎(jiǎng)勵(lì),小狗學(xué)會(huì)了坐下、握手、甚至是跳圈。

強(qiáng)化學(xué)習(xí)的核心思想是通過“試錯(cuò)”來學(xué)習(xí)。模型(即智能體)在每一步行動(dòng)后,都會(huì)從環(huán)境中得到一個(gè)反饋(獎(jiǎng)勵(lì)或懲罰),這個(gè)反饋幫助模型調(diào)整其策略,以便在未來獲得更大的獎(jiǎng)勵(lì)。最終目標(biāo)是找到一個(gè)策略,使得在長(zhǎng)期內(nèi)累積的獎(jiǎng)勵(lì)最大化。

強(qiáng)化學(xué)習(xí)與監(jiān)督學(xué)習(xí)、無監(jiān)督學(xué)習(xí)的比較

要理解強(qiáng)化學(xué)習(xí),我們先來對(duì)比一下它與監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)的不同之處。

監(jiān)督學(xué)習(xí)

監(jiān)督學(xué)習(xí)就像一個(gè)勤奮的學(xué)生,他總是有現(xiàn)成的答案可以參考(有標(biāo)簽的數(shù)據(jù))。他通過不斷地學(xué)習(xí)這些答案,來預(yù)測(cè)新問題的答案。監(jiān)督學(xué)習(xí)的目標(biāo)是找到輸入與輸出之間的映射關(guān)系,比如根據(jù)一個(gè)人的身高和體重來預(yù)測(cè)他是否適合當(dāng)模特。這里,學(xué)生每次答題后都會(huì)知道自己對(duì)錯(cuò),而強(qiáng)化學(xué)習(xí)則是在“玩游戲”的過程中不斷積累經(jīng)驗(yàn),沒有現(xiàn)成的答案。

無監(jiān)督學(xué)習(xí)

無監(jiān)督學(xué)習(xí)更像是一個(gè)在迷宮里探索的小孩,他沒有現(xiàn)成的路徑圖(沒有標(biāo)簽的數(shù)據(jù)),只能通過觀察和摸索來理解這個(gè)迷宮的結(jié)構(gòu)。無監(jiān)督學(xué)習(xí)的目標(biāo)是發(fā)現(xiàn)數(shù)據(jù)的內(nèi)在模式,比如將相似的物品分成同一類。強(qiáng)化學(xué)習(xí)與無監(jiān)督學(xué)習(xí)不同的是,它不僅僅是發(fā)現(xiàn)數(shù)據(jù)中的模式,還要根據(jù)這些模式采取行動(dòng),并根據(jù)行動(dòng)的結(jié)果進(jìn)行調(diào)整。

強(qiáng)化學(xué)習(xí)

強(qiáng)化學(xué)習(xí)與上述兩種學(xué)習(xí)方法的不同之處在于,它不僅學(xué)習(xí)如何做出正確的決策,還要學(xué)習(xí)如何在一系列決策中最大化長(zhǎng)期收益。它沒有監(jiān)督學(xué)習(xí)中的“標(biāo)準(zhǔn)答案”,也不像無監(jiān)督學(xué)習(xí)那樣只是探索數(shù)據(jù)的結(jié)構(gòu)。強(qiáng)化學(xué)習(xí)是一個(gè)更加動(dòng)態(tài)的過程,智能體通過與環(huán)境的不斷交互,逐漸摸索出一套能夠獲得最大化回報(bào)的策略。就像訓(xùn)練一只小狗,你需要通過不斷地給它獎(jiǎng)勵(lì),讓它明白哪些行為是正確的。

常用的強(qiáng)化學(xué)習(xí)算法

強(qiáng)化學(xué)習(xí)的算法種類繁多,每種算法都有其獨(dú)特的適用場(chǎng)景和特點(diǎn)。我們來聊聊幾種常見的強(qiáng)化學(xué)習(xí)算法,用最簡(jiǎn)單的語(yǔ)言讓你明白它們的工作原理。

Q學(xué)習(xí)(Q-Learning)

Q學(xué)習(xí)是強(qiáng)化學(xué)習(xí)中的一個(gè)經(jīng)典算法,它的核心思想是建立一個(gè)“Q表”,記錄每個(gè)狀態(tài)-動(dòng)作對(duì)的價(jià)值。想象一下你在玩迷宮游戲,每到一個(gè)十字路口(狀態(tài)),你有幾個(gè)方向可以選擇(動(dòng)作),Q學(xué)習(xí)會(huì)記錄下你每次選擇的結(jié)果——你是到了死胡同,還是找到了出路。隨著游戲的進(jìn)行,Q表不斷更新,最終幫助你選擇最優(yōu)的路線。在具體實(shí)現(xiàn)中,Q學(xué)習(xí)通過不斷更新Q值來逼近最優(yōu)策略,這個(gè)過程不需要環(huán)境的模型,因此也被稱為無模型(model-free)算法。

深度Q學(xué)習(xí)(Deep Q-Learning, DQN)

Q學(xué)習(xí)雖然簡(jiǎn)單,但在復(fù)雜環(huán)境中,Q表的大小會(huì)急劇膨脹,無法處理高維狀態(tài)空間。為了解決這個(gè)問題,深度Q學(xué)習(xí)引入了神經(jīng)網(wǎng)絡(luò)來代替Q表,直接從圖像、視頻等高維數(shù)據(jù)中提取特征,計(jì)算每個(gè)動(dòng)作的Q值。DQN的出現(xiàn)使得強(qiáng)化學(xué)習(xí)能夠在復(fù)雜的游戲、機(jī)器人控制等任務(wù)中大顯身手,像“阿爾法狗”這樣的AI正是借助了類似的技術(shù)。

策略梯度(Policy Gradient)

策略梯度方法直接優(yōu)化策略,而不是像Q學(xué)習(xí)那樣間接優(yōu)化Q值。它的工作原理是通過計(jì)算梯度來逐步調(diào)整策略參數(shù),使得在給定環(huán)境下的期望回報(bào)最大化。想象一下你在爬山,每次你都會(huì)根據(jù)當(dāng)前的坡度調(diào)整前進(jìn)的方向,策略梯度方法就是通過這種方式找到最佳策略。在策略梯度中,智能體不再需要記錄每個(gè)狀態(tài)的具體價(jià)值,而是直接調(diào)整策略,往往在處理高維連續(xù)動(dòng)作空間時(shí)表現(xiàn)出色。

演員-評(píng)論家(Actor-Critic)

演員-評(píng)論家方法結(jié)合了策略梯度和Q學(xué)習(xí)的優(yōu)點(diǎn)。這個(gè)方法將智能體分為兩個(gè)部分:演員(Actor)和評(píng)論家(Critic)。演員負(fù)責(zé)生成動(dòng)作(類似于策略梯度),而評(píng)論家則根據(jù)當(dāng)前狀態(tài)和動(dòng)作給出評(píng)價(jià)(類似于Q學(xué)習(xí)中的Q值)。評(píng)論家的評(píng)價(jià)幫助演員調(diào)整策略,使得智能體能夠更快地找到最優(yōu)策略。這種方法通過將策略學(xué)習(xí)與價(jià)值評(píng)估分開處理,使得算法能夠更高效地學(xué)習(xí)復(fù)雜的策略。

蒙特卡洛樹搜索(Monte Carlo Tree Search, MCTS)

蒙特卡洛樹搜索是一種用于決策過程中的算法,尤其在策略類游戲中表現(xiàn)突出。它通過構(gòu)建一個(gè)決策樹,模擬未來可能的決策路徑,并通過蒙特卡洛模擬(即隨機(jī)取樣)來評(píng)估這些路徑的價(jià)值。MCTS不需要完整的環(huán)境模型,通過多次模擬來逐步逼近最優(yōu)決策。比如在圍棋或國(guó)際象棋中,MCTS可以模擬數(shù)千次可能的棋局變化,從中選擇最佳的下一步棋。

強(qiáng)化學(xué)習(xí)的應(yīng)用領(lǐng)域

強(qiáng)化學(xué)習(xí)因?yàn)槠洫?dú)特的學(xué)習(xí)方式,在多個(gè)領(lǐng)域得到了廣泛應(yīng)用。讓我們來看看它在哪些領(lǐng)域“大顯身手”。

游戲AI

強(qiáng)化學(xué)習(xí)在游戲AI領(lǐng)域的表現(xiàn)可謂是“如魚得水”。從早期的“吃豆人”到后來風(fēng)靡全球的“阿爾法狗”,強(qiáng)化學(xué)習(xí)幫助這些AI在游戲中找到了最優(yōu)策略。它不僅可以擊敗人類頂尖棋手,還可以在復(fù)雜的策略類游戲中展示出驚人的決策能力。通過不斷模擬和試錯(cuò),強(qiáng)化學(xué)習(xí)使得游戲AI越來越聰明,甚至讓人類感到“不可戰(zhàn)勝”。

機(jī)器人控制

機(jī)器人控制是強(qiáng)化學(xué)習(xí)的另一個(gè)重要應(yīng)用領(lǐng)域。在這里,強(qiáng)化學(xué)習(xí)幫助機(jī)器人學(xué)習(xí)如何行走、抓取物體、平衡等復(fù)雜任務(wù)。與傳統(tǒng)的控制方法相比,強(qiáng)化學(xué)習(xí)可以通過與環(huán)境的交互,自主學(xué)習(xí)最優(yōu)的控制策略,而不需要依賴于精確的物理模型。這種自主學(xué)習(xí)能力使得強(qiáng)化學(xué)習(xí)在機(jī)器人領(lǐng)域展現(xiàn)出了巨大的潛力,從工業(yè)自動(dòng)化到家庭服務(wù)機(jī)器人,應(yīng)用場(chǎng)景廣泛。

自動(dòng)駕駛

自動(dòng)駕駛是一項(xiàng)高度復(fù)雜且具有挑戰(zhàn)性的任務(wù),涉及大量的感知、決策和控制。強(qiáng)化學(xué)習(xí)在這一領(lǐng)域的應(yīng)用主要體現(xiàn)在決策和控制上。通過與虛擬環(huán)境中的模擬駕駛互動(dòng),強(qiáng)化學(xué)習(xí)算法可以逐步學(xué)習(xí)如何在各種交通場(chǎng)景中做出安全、有效的決策。雖然目前自動(dòng)駕駛還處于發(fā)展階段,但強(qiáng)化學(xué)習(xí)的引入無疑為這一領(lǐng)域帶來了新的可能性。

智能推薦系統(tǒng)

推薦系統(tǒng)的核心任務(wù)是根據(jù)用戶的行為數(shù)據(jù),預(yù)測(cè)他們可能感興趣的內(nèi)容。在傳統(tǒng)推薦系統(tǒng)中,監(jiān)督學(xué)習(xí)方法通過已知的用戶評(píng)分來訓(xùn)練模型,而強(qiáng)化學(xué)習(xí)則通過不斷調(diào)整推薦策略,使得用戶的長(zhǎng)期滿意度最大化。例如,視頻網(wǎng)站可以利用強(qiáng)化學(xué)習(xí)不斷優(yōu)化推薦算法,使得用戶在瀏覽時(shí)更容易找到他們喜歡的視頻內(nèi)容,從而提高用戶粘性。

金融交易

在金融交易領(lǐng)域,市場(chǎng)環(huán)境變化多端且充滿不確定性。強(qiáng)化學(xué)習(xí)通過模擬不同的交易策略,找到在復(fù)雜市場(chǎng)條件下的最優(yōu)交易方案。例如,通過強(qiáng)化學(xué)習(xí)模型,交易系統(tǒng)可以自主學(xué)習(xí)如何在不同的市場(chǎng)條件下進(jìn)行買賣操作,以最大化長(zhǎng)期收益。盡管金融市場(chǎng)中充滿了隨機(jī)性和風(fēng)險(xiǎn),但強(qiáng)化學(xué)習(xí)為智能交易系統(tǒng)提供了一個(gè)強(qiáng)有力的工具,幫助其在高風(fēng)險(xiǎn)環(huán)境中找到平衡。

醫(yī)療健康

強(qiáng)化學(xué)習(xí)在醫(yī)療健康領(lǐng)域的應(yīng)用也在逐步擴(kuò)大,尤其是在個(gè)性化治療和藥物開發(fā)方面。例如,在個(gè)性化治療中,強(qiáng)化學(xué)習(xí)可以根據(jù)病人的歷史數(shù)據(jù),優(yōu)化治療方案,使其在特定的病情下獲得最優(yōu)治療效果。此外,強(qiáng)化學(xué)習(xí)還可以用于藥物開發(fā)中的虛擬篩選過程,通過模擬不同的藥物組合,找到效果最佳的藥物配方,縮短研發(fā)時(shí)間。

強(qiáng)化學(xué)習(xí)作為機(jī)器學(xué)習(xí)中的一個(gè)重要分支,通過與環(huán)境的互動(dòng),不斷優(yōu)化策略,最大化長(zhǎng)期收益。在與監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)的比較中,強(qiáng)化學(xué)習(xí)展現(xiàn)出了其獨(dú)特的動(dòng)態(tài)決策能力。無論是在游戲AI、機(jī)器人控制、自動(dòng)駕駛,還是在推薦系統(tǒng)、金融交易和醫(yī)療健康等領(lǐng)域,強(qiáng)化學(xué)習(xí)都展現(xiàn)出了廣泛的應(yīng)用前景。

盡管強(qiáng)化學(xué)習(xí)目前仍然面臨著一些挑戰(zhàn),如學(xué)習(xí)效率、穩(wěn)定性和安全性問題,但隨著算法的不斷改進(jìn)和硬件性能的提升,強(qiáng)化學(xué)習(xí)的應(yīng)用將會(huì)越來越廣泛。無論你是機(jī)器學(xué)習(xí)領(lǐng)域的新手還是老手,強(qiáng)化學(xué)習(xí)都是一個(gè)值得深入探索的方向。

強(qiáng)化學(xué)習(xí)算法示例

我們用代碼來展示幾個(gè)常見的強(qiáng)化學(xué)習(xí)算法:

Q學(xué)習(xí)(Q-Learning)

比如現(xiàn)在有一條結(jié)了冰的河流,一個(gè)人想從冰面走過到對(duì)岸,冰面上有些地方很結(jié)實(shí),有些地方一踩上去就會(huì)掉進(jìn)冰窟窿。這個(gè)人現(xiàn)在的任務(wù)是通過冰面走到對(duì)岸,從起點(diǎn)走到終點(diǎn),并且不能掉進(jìn)冰窟窿。此人如何走到對(duì)面岸邊呢?我們可以用強(qiáng)化學(xué)習(xí)中的Q學(xué)習(xí)算法來教“自己”走到終點(diǎn)。

此處示例代碼我們使用的是OpenAI Gym中的FrozenLake環(huán)境。在這個(gè)環(huán)境中,冰面被分成了一個(gè)4x4的網(wǎng)格,每個(gè)格子可以是:

起點(diǎn)(S)

終點(diǎn)(G)

正常的冰面(F)

會(huì)掉下去的冰窟窿(H)

我們的目標(biāo)就是讓人(智能體/agent)學(xué)會(huì)從起點(diǎn)(S)走到終點(diǎn)(G),而避免掉進(jìn)冰窟窿(H)。

Q學(xué)習(xí)是一種強(qiáng)化學(xué)習(xí)算法,它的核心思想是讓智能體通過試錯(cuò)(trial and error)來學(xué)習(xí)每一個(gè)狀態(tài)(比如說智能體站在哪個(gè)格子)下采取什么行動(dòng)(上下左右移動(dòng))最優(yōu)。為了做出這個(gè)決定,Q學(xué)習(xí)使用了一個(gè)叫做“Q表”的東西。這個(gè)Q表記錄了在每個(gè)狀態(tài)下,采取每個(gè)行動(dòng)的“價(jià)值”有多大。

每次智能體采取行動(dòng)并收到反饋(例如掉進(jìn)冰窟窿,成功到達(dá)終點(diǎn)等),Q表會(huì)更新,這樣智能體就逐漸學(xué)會(huì)了如何更好地行動(dòng)。

下面我們使用代碼演示此算法:

import gymimport numpy as npimport matplotlib.pyplot as pltfrom matplotlib.colors import ListedColormap, BoundaryNorm
# 創(chuàng)建FrozenLake環(huán)境env = gym.make("FrozenLake-v1", is_slippery=True, render_mode='rgb_array')  # 使用FrozenLake-v1
# 初始化Q表state_space_size = env.observation_space.naction_space_size = env.action_space.nQ = np.zeros((state_space_size, action_space_size))
# 超參數(shù)alpha = 0.1  # 學(xué)習(xí)率gamma = 0.99  # 折扣因子epsilon = 1.0  # 初始探索率epsilon_decay = 0.995  # 探索率衰減epsilon_min = 0.01  # 最小探索率num_episodes = 2000  # 總回合數(shù)
# 用于記錄每輪的總獎(jiǎng)勵(lì)rewards = []

def get_action(state, epsilon):    if np.random.random() < epsilon:        return env.action_space.sample()    else:        return np.argmax(Q[state])

# Q學(xué)習(xí)算法for episode in range(num_episodes):    state, _ = env.reset()    total_reward = 0    done = False
    while not done:        action = get_action(state, epsilon)        next_state, reward, done, truncated, _ = env.step(action)
        # Check if the episode is done either through completion or termination        done = done or truncated
        # 更新Q值        best_next_action = np.argmax(Q[next_state])        td_target = reward + gamma * Q[next_state, best_next_action]        td_error = td_target - Q[state, action]        Q[state, action] += alpha * td_error
        total_reward += reward        state = next_state
    # 更新探索率    epsilon = max(epsilon_min, epsilon * epsilon_decay)    rewards.append(total_reward)
    if episode % 100 == 0:        print(f"Episode {episode}: Total Reward: {total_reward}, Epsilon: {epsilon}")
# 打印最終Q表print("Final Q-Table Values")print(Q)
# 繪制獎(jiǎng)勵(lì)隨時(shí)間變化圖plt.plot(rewards)plt.xlabel('Episode')plt.ylabel('Total Reward')plt.title('Reward Over Time')plt.show()

# 使用matplotlib繪制方格圖并畫出最終路線def plot_frozen_lake(Q):    grid_size = env.unwrapped.nrow    grid = np.zeros((grid_size, grid_size))
    fig, ax = plt.subplots()    cmap = ListedColormap(['white', 'black', 'blue', 'green'])    norm = BoundaryNorm(boundaries=[-0.5, 0.5, 1.5, 2.5, 3.5], ncolors=4)
    for i in range(grid_size):        for j in range(grid_size):            state = i * grid_size + j            if env.unwrapped.desc[i, j] == b'S':                grid[i, j] = 2                ax.text(j, i, 'S', ha='center', va='center', color='black')            elif env.unwrapped.desc[i, j] == b'G':                grid[i, j] = 3                ax.text(j, i, 'G', ha='center', va='center', color='black')            elif env.unwrapped.desc[i, j] == b'H':                grid[i, j] = 1                ax.text(j, i, 'H', ha='center', va='center', color='black')            elif env.unwrapped.desc[i, j] == b'F':                grid[i, j] = 0                ax.text(j, i, 'F', ha='center', va='center', color='black')
    ax.imshow(grid, cmap=cmap, norm=norm)
    state, _ = env.reset()    path = [state]    directions = ['↑', '→', '↓', '←']    while True:        action = np.argmax(Q[state])        next_state, reward, done, truncated, _ = env.step(action)        path.append(next_state)        i, j = state // grid_size, state % grid_size        if state != next_state:  # 不在同一個(gè)狀態(tài)上畫箭頭            ax.text(j, i, directions[action], ha='center', va='center', color='red')        state = next_state        if done or truncated:            break
    plt.show()

# 經(jīng)過訓(xùn)練后,利用最終Q表繪制方格圖并演示智能體的最終路線plot_frozen_lake(Q)
#?輸出Episode 0: Total Reward: 0.0, Epsilon: 0.995Episode 100: Total Reward: 0.0, Epsilon: 0.6027415843082742Episode 200: Total Reward: 0.0, Epsilon: 0.36512303261753626Episode 300: Total Reward: 0.0, Epsilon: 0.2211807388415433Episode 400: Total Reward: 0.0, Epsilon: 0.13398475271138335Episode 500: Total Reward: 0.0, Epsilon: 0.0811640021330769Episode 600: Total Reward: 0.0, Epsilon: 0.04916675299948831Episode 700: Total Reward: 0.0, Epsilon: 0.029783765425331846Episode 800: Total Reward: 1.0, Epsilon: 0.018042124582040707Episode 900: Total Reward: 0.0, Epsilon: 0.010929385683282892Episode 1000: Total Reward: 1.0, Epsilon: 0.01Episode 1100: Total Reward: 1.0, Epsilon: 0.01Episode 1200: Total Reward: 1.0, Epsilon: 0.01Episode 1300: Total Reward: 1.0, Epsilon: 0.01Episode 1400: Total Reward: 0.0, Epsilon: 0.01Episode 1500: Total Reward: 1.0, Epsilon: 0.01Episode 1600: Total Reward: 0.0, Epsilon: 0.01Episode 1700: Total Reward: 1.0, Epsilon: 0.01Episode 1800: Total Reward: 1.0, Epsilon: 0.01Episode 1900: Total Reward: 1.0, Epsilon: 0.01Final Q-Table Values[[5.44268685e-01 4.69096295e-01 4.82892049e-01 4.79534135e-01] [1.37398190e-01 1.62239900e-01 1.41869750e-01 4.86489428e-01] [3.85222751e-01 1.07776060e-01 1.20971350e-01 1.31364319e-01] [1.61018062e-03 5.15108692e-02 7.38985361e-04 9.63652587e-04] [5.58640044e-01 4.45894208e-01 4.24832915e-01 4.05942688e-01] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [2.46020726e-01 4.95482787e-02 9.58877618e-02 6.20800888e-02] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [3.33051441e-01 2.94682152e-01 3.28286414e-01 5.93740756e-01] [3.66880719e-01 6.75596165e-01 1.83187573e-01 4.01768922e-01] [6.29869042e-01 2.03088211e-01 1.96117532e-01 2.41455667e-01] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [1.96948367e-01 3.14519066e-01 7.95832287e-01 3.81453214e-01] [4.77829487e-01 8.97068795e-01 6.42640553e-01 6.42877028e-01] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]

蒙特卡洛樹搜索(MCTS)

蒙特卡洛樹搜索 (MCTS) 是一種用于決策過程的算法,特別適用于游戲領(lǐng)域(如圍棋、國(guó)際象棋等)。MCTS 通過在可能的決策樹中隨機(jī)采樣來逐漸改進(jìn)決策,它在不需要完全遍歷樹的情況下找到好的決策。MCTS 的主要步驟如下:

選擇 (Selection): 從根節(jié)點(diǎn)開始,根據(jù)樹中現(xiàn)有的信息選擇一個(gè)需要擴(kuò)展的節(jié)點(diǎn)。常用的選擇策略是 UCT (Upper Confidence bounds for Trees),它平衡了探索和利用。

擴(kuò)展 (Expansion): 如果選擇的節(jié)點(diǎn)是非終止節(jié)點(diǎn),且還沒有完全展開它的子節(jié)點(diǎn),則從該節(jié)點(diǎn)擴(kuò)展出一個(gè)或多個(gè)子節(jié)點(diǎn)。

模擬 (Simulation): 從新擴(kuò)展的節(jié)點(diǎn)開始,進(jìn)行隨機(jī)模擬,直到達(dá)到終止?fàn)顟B(tài)。這一步的目的是估計(jì)該節(jié)點(diǎn)的價(jià)值。

反向傳播 (Backpropagation): 將模擬結(jié)果反向傳播到經(jīng)過的所有節(jié)點(diǎn),以更新它們的統(tǒng)計(jì)信息。

MCTS 往往在多次迭代后逐步收斂到最優(yōu)解。

為了更好地理解MCTS算法,我們可以設(shè)計(jì)一個(gè)簡(jiǎn)單的游戲,例如“猜數(shù)字”游戲。這個(gè)游戲規(guī)則如下:

游戲在一個(gè)有限的范圍內(nèi)隨機(jī)選擇一個(gè)目標(biāo)數(shù)字。

玩家需要通過猜測(cè)來找到這個(gè)目標(biāo)數(shù)字。

每次猜測(cè)后,玩家會(huì)得到提示:猜測(cè)的數(shù)字是“太高”還是“太低”。

游戲結(jié)束時(shí),玩家找到目標(biāo)數(shù)字。

我們可以使用MCTS算法來模擬玩家的猜測(cè)過程。假設(shè)我們本次給出的數(shù)字是88,以下是具體的實(shí)現(xiàn)步驟和代碼:

import numpy as npimport randomimport matplotlib.pyplot as plt
class GuessNumberGame:    def __init__(self, lower_bound=1, upper_bound=100):        self.lower_bound = lower_bound        self.upper_bound = upper_bound        self.target = 88         self.current_guess = None
    def make_guess(self, guess):        self.current_guess = guess        if guess < self.target:            return -1  # Too low        elif guess > self.target:            return 1  # Too high        else:            return 0  # Correct
    def get_possible_guesses(self):        return list(range(self.lower_bound, self.upper_bound + 1))
    def is_correct_guess(self):        return self.current_guess == self.target
class Node:    def __init__(self, state, parent=None):        self.state = state        self.parent = parent        self.children = []        self.visits = 0        self.total_reward = 0
    def add_child(self, child_state):        child = Node(child_state, self)        self.children.append(child)        return child
    def update(self, reward):        self.visits += 1        self.total_reward += reward
    def ucb1(self, c=1.41):        if self.visits == 0:            return float('inf')        return self.total_reward / self.visits + c * np.sqrt(np.log(self.parent.visits) / self.visits)
def selection(node):    while node.children:        node = max(node.children, key=lambda n: n.ucb1())    return node
def expansion(node):    possible_guesses = node.state.get_possible_guesses()    for guess in possible_guesses:        new_state = GuessNumberGame(node.state.lower_bound, node.state.upper_bound)        new_state.target = node.state.target        new_state.make_guess(guess)        node.add_child(new_state)
def simulation(state):    game = GuessNumberGame(state.lower_bound, state.upper_bound)    game.target = state.target    while not game.is_correct_guess():        possible_guesses = game.get_possible_guesses()        guess = random.choice(possible_guesses)        game.make_guess(guess)        if game.is_correct_guess():            return 1  # Correct guess    return 0
def backpropagation(node, reward):    while node:        node.update(reward)        node = node.parent
def mcts(root, iterations):    for _ in range(iterations):        node = selection(root)        if not node.children:            expansion(node)        reward = simulation(node.state)        backpropagation(node, reward)
# 可視化函數(shù)def visualize_guesses(game, guesses):    plt.figure(figsize=(10, 6))    plt.plot(guesses, 'bo-', label='Guesses')    plt.axhline(y=game.target, color='r', linestyle='-', label='Target')    plt.xlabel('Iteration')    plt.ylabel('Guess Value')    plt.title('MCTS Guessing Process')    plt.legend()    plt.show()
# 測(cè)試game = GuessNumberGame()root = Node(game)mcts(root, 1000)
# 選擇最佳猜測(cè)best_guess_node = max(root.children, key=lambda n: n.visits)best_guess = best_guess_node.state.current_guessprint("Target number:", game.target)print("Best guess:", best_guess)
# 可視化猜測(cè)過程guesses = [child.state.current_guess for child in root.children]visualize_guesses(game,?guesses)
# 輸出Target number: 88Best guess: 1

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
ATXMEGA128A1U-AUR 1 Atmel Corporation RISC Microcontroller, 16-Bit, FLASH, AVR RISC CPU, 32MHz, CMOS, PQFP100, TQFP-100
$73.57 查看
MK60DN512VMC10 1 Freescale Semiconductor Kinetis K 32-bit MCU, ARM Cortex-M4 core, 512KB Flash, 100MHz, Ethernet, MAPBGA 121
$10.69 查看
STM32F429VIT6 1 STMicroelectronics High-performance advanced line, Arm Cortex-M4 core with DSP and FPU, 2 Mbytes of Flash memory, 180 MHz CPU, ART Accelerator, Chrom-ART Accelerator, FSMC, TFT

ECAD模型

下載ECAD模型
$34.08 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

致力于分享最前沿、最實(shí)用的人工智能(AI)技術(shù),包括深度學(xué)習(xí)(DL)、自然語(yǔ)言處理(NLP)、機(jī)器學(xué)習(xí)(ML)、計(jì)算機(jī)視覺(CV)等領(lǐng)域的最新發(fā)展及應(yīng)用。