日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

强化学习(五)—— AlphaGo与Alpha Zero

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 强化学习(五)—— AlphaGo与Alpha Zero 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

強化學習(五)—— AlphaGo與Alpha Zero

  • 1. AlphaGo
    • 1.1 論文鏈接
    • 1.2 輸入編碼(State)
    • 1.3 訓練及評估流程
    • 1.4 模仿學習(Behavior Cloning)
    • 1.5 策略網絡依據策略梯度進行學習
    • 1.6 價值網絡訓練
    • 1.7 Monte Carlo Tree Search
      • 1.7.1 Selection
      • 1.7.2 Expansion
      • 1.7.3 Evaluation
      • 1.7.4 Backup
    • 1.8 使用MCTS進行決策
  • 2. AlphaGo Zero
    • 2.1 論文鏈接
    • 2.2 基于AlphaGo的改進內容
    • 2.2 策略網絡的訓練
  • 3. 代碼實現
    • 3.1 策略網絡和狀態價值網絡實現
      • 3.1.1 代碼
      • 3.1.2 結果
    • 3.2 蒙特卡洛樹搜索算法

1. AlphaGo

1.1 論文鏈接

查看原文

1.2 輸入編碼(State)

  • 棋盤大小:[19,19]的矩陣, 落子則為1,反之為0。
  • Input Shape:[19,19,17]。
  • 白棋當前狀態及其過去7步的狀態:[19,19,1]與[19,19,7]。
  • 黑棋當前狀態及其過去7步的狀態:[19,19,1]與[19,19,7]。
  • 當前到誰落子:[19,19,1] (黑棋全為1,白棋全為0)

1.3 訓練及評估流程

  • 使用behavior cloning 對策略網絡進行初步訓練;
  • 兩個策略網絡互相對弈,并使用策略梯度對策略網絡進行更新;
  • 使用策略網絡去訓練狀態價值網絡;
  • 基于策略網絡和價值網絡,使用蒙特卡洛樹(Monte Carlo Tree Search, MCTS)進行搜索。
  • 1.4 模仿學習(Behavior Cloning)

    通過Behavior Cloning從人的經驗中初始化策略網絡的參數,策略網絡的結構為:
    隨機初始化網絡參數后,基于人類對弈的落子序列數據,進行模仿學習(分類任務),使用交叉熵作為損失函數進行參數更新:

  • 觀測得到狀態:sts_tst?
  • 使用策略網絡進行預測pt=[π(1∣st;θ),π(2∣st;θ),...,π(361∣st;θ)]p_t=[\pi(1|s_t;\theta),\pi(2|s_t;\theta),...,\pi(361|s_t;\theta)]pt?=[π(1st?;θ),π(2st?;θ),...,π(361st?;θ)]
  • 高級人類玩家采取的動作為at?a_t^*at??
  • 策略網絡的預測進行one-hot編碼后,和人類玩家的動作進行交叉熵計算,并更新網絡參數。
    模仿學習可認為是循規蹈矩
  • 1.5 策略網絡依據策略梯度進行學習

  • 兩個策略網絡進行對弈直到游戲結束。Player V.S. Opponent,Player 使用策略網絡最新的參數,Opponent隨機選用過去迭代中的網絡參數。
  • 得到對弈的序列數據:s1,a1,s2,a2,s3,a3,...,sT,aTs_1,a_1,s_2,a_2,s_3,a_3,...,s_T,a_Ts1?,a1?,s2?,a2?,s3?,a3?,...,sT?,aT?
  • Player獲得的回報為:u1=u2=u3=uT(贏了為1,輸了為?1)u_1=u_2=u_3=u_T(贏了為1,輸了為-1)u1?=u2?=u3?=uT?(1?1)
  • 近似策略梯度(連加)gθ=∑t=1T?log(π(?∣st;θ))?θ?utg_\theta=\sum_{t=1}^T \frac{\partial log(\pi(\cdot|s_t;\theta))}{\partial\theta}\cdot u_tgθ?=t=1T??θ?log(π(?st?;θ))??ut?
  • 參數更新θ←θ+β?gθ\theta\gets\theta+\beta\cdot g_{\theta}θθ+β?gθ?
  • 1.6 價值網絡訓練

    • 狀態價值函數:Vπ(S)=E(Ut∣St=s)Ut=1(win)Ut=?1(fail)V_\pi(S)=E(U_t|S_t=s)\\U_t=1(win)\\U_t=-1(fail)Vπ?(S)=E(Ut?St?=s)Ut?=1(win)Ut?=?1(fail)
    • 神經網絡近似狀態價值函數:v(s;W)~Vπ(s)v(s;W)\sim V_\pi(s)v(s;W)Vπ?(s)
    • 訓練過程:
  • 兩個策略網絡進行對弈直到游戲結束u1=u2=u3=uT(贏了為1,輸了為?1)u_1=u_2=u_3=u_T(贏了為1,輸了為-1)u1?=u2?=u3?=uT?(1?1)
  • 損失函數:L=∑t=1T12[v(st;W)?ut]2L=\sum_{t=1}^T \frac{1}{2}[v(s_t;W)-u_t]^2L=t=1T?21?[v(st?;W)?ut?]2
  • 進行參數更新:W←W?α??L?WW\gets W-\alpha\cdot \frac{\partial L}{\partial W}WW?α??W?L?
  • 1.7 Monte Carlo Tree Search

    每次蒙特卡洛樹(MCTS)的搜索過程:

  • Selection:假想Player依據當前狀態執行一次動作stats_t\\a_tst?at?
  • Expansion: 假想對手做一次動作,并更新狀態:st+1s_{t+1}st+1?
  • Evaluation: 使用狀態價值網絡評估得到價值分數:ν=v(st+1;W)\nu=v(s_{t+1};W)ν=v(st+1?;W)假想對弈直到結束,得到獎勵:rrr給假想動作進行打分:score(at)=ν+r2score(a_t)=\frac{\nu+r}{2}score(at?)=2ν+r?
  • Backup:對動作的分數進行更新。
  • 1.7.1 Selection

  • 觀測到狀態sts_tst?
  • 對于所有可選動作,計算其選擇分數:score(a)=Q(a)+η?π(a∣st;θ)1+N(a){\rm score} (a)=Q(a) + \eta\cdot\frac{\pi(a|s_t;\theta)}{1+N(a)}score(a)=Q(a)+η?1+N(a)π(ast?;θ)?Q(a)為通過MRTS得到的動作價值,N(a)為在t時刻狀態下已搜索過動作a的次數。
  • 具有最高選擇分數的動作被選中。
  • 1.7.2 Expansion


    由于狀態轉移函數未知,則用策略函數作為狀態轉移函數

  • 依據策略函數和對手觀測到的狀態,隨機采樣得到對手的動作:at‘~π(?∣st′;θ)a_t^{‘}\sim \pi(\cdot|s_t^{'};\theta)at?π(?st?;θ)
  • 對手的動作將導致新的狀態生成:st+1s_{t+1}st+1?
  • 1.7.3 Evaluation

  • 重復對弈直至游戲結束,Player的動作:ak~π(?∣sk;θ)a_k\sim \pi(\cdot|s_k;\theta)ak?π(?sk?;θ)Opponents的動作:ak′~π(?∣sk′;θ)a_k^{'}\sim \pi(\cdot|s_k^{'};\theta)ak?π(?sk?;θ)
  • 記錄對局結束后的回報:win:rT=+1lose:rT=?1win:r_T=+1\\lose:r_T=-1win:rT?=+1lose:rT?=?1
  • 計算 t+1時刻的狀態價值:ν(st+1;W)\nu(s_{t+1};W)ν(st+1?;W)
  • t+1時刻狀態的價值分數:V(st+1)=12ν(st+1;W)+12rTV(s_{t+1})=\frac{1}{2}\nu(s_{t+1};W)+\frac{1}{2}r_TV(st+1?)=21?ν(st+1?;W)+21?rT?
  • 1.7.4 Backup

  • 對選取t時刻動作后的過程重復多次:ata_tat?
  • t時刻動作的每個子節點對應多條價值分數記錄,取平均值更新Q值(在Selection中用到):Q(at)=mean(therecordedVs′)Q(a_t)=mean(the\quad recorded \quad V^{'}_s)Q(at?)=mean(therecordedVs?)
  • 1.8 使用MCTS進行決策

    • 動作a被選中的次數為:N(a)N(a)N(a)
    • 在進行MCTS后,被選中次數最多的動作被Player用于最后決策:at=argmaxaN(a)a_t=\mathop{argmax}\limits_{a}N(a)at?=aargmax?N(a)
    • 執行完該次決策后,Q值和N值被重置為0:Q(a)=0N(a)=0Q(a)=0\\N(a)=0Q(a)=0N(a)=0

    2. AlphaGo Zero

    2.1 論文鏈接

    查看原文

    2.2 基于AlphaGo的改進內容

    • AlphaGo Zero未使用Behavior cloning(未使用人類經驗)
    • 策略網絡的訓練過程中使用MCTS。

    2.2 策略網絡的訓練

    AlphaGo Zero使用MCTS訓練策略網絡

  • 觀測到狀態:sts_tst?
  • 通過策略網絡進行預測:p=[π(a=1∣st,θ),...,π(a=361∣st,θ)]∈R361p=[\pi(a=1|s_t,\theta),...,\pi(a=361|s_t,\theta)]\in R^{361}p=[π(a=1st?,θ),...,π(a=361st?,θ)]R361
  • 通過MCTS進行預測:n=normalize[N(a=1),N(a=2),...,N(a=361)]∈R361n=normalize[N(a=1),N(a=2),...,N(a=361)]\in R^{361}n=normalize[N(a=1),N(a=2),...,N(a=361)]R361
  • 計算損失:L=CrossEntropy(n,p)L=CrossEntropy(n,p)L=CrossEntropy(n,p)
  • 對網絡參數進行更新:θ←?L?θ\theta \gets \frac{\partial L}{\partial \theta}θ?θ?L?
  • 3. 代碼實現

    3.1 策略網絡和狀態價值網絡實現

    3.1.1 代碼

    # -*- coding: utf-8 -*- # @Time : 2022/4/1 13:47 # @Author : CyrusMay WJ # @FileName: resnet.py # @Software: PyCharm # @Blog :https://blog.csdn.net/Cyrus_Mayimport tensorflow as tf import logging import sys import os os.environ["PATH"] += os.pathsep + 'D:\software_root\Anoconda3\envs\AI\Graphviz\\bin' # 用于網絡結構畫圖 class ResidualNet():def __init__(self,input_dim,output_dim,net_struct,l2_reg=0,logger=None):""":param input_dim::param output_dim::param net_struct: a list for residual network, net_struct[0] is the first CNN for inputs,the rest is single block for residual connect. e.g. net_struct = [{filters:64,kernel_size:(3,3), {filters:128,kernel_size:(3,3),{filters:128,kernel_size:(3,3)}]:param logger:"""self.logger=loggerself.input_dim = input_dimself.output_dim=output_dimself.l2_reg = l2_regself.__build_model(net_struct)def conv_layer(self,x,filters,kernel_size):x = tf.keras.layers.Conv2D(filters=filters,kernel_size=kernel_size,activation="linear",padding="same",data_format="channels_last",kernel_regularizer=tf.keras.regularizers.l2(self.l2_reg),bias_regularizer=tf.keras.regularizers.l2(self.l2_reg))(x)x = tf.keras.layers.BatchNormalization(axis=-1)(x)x = tf.keras.layers.LeakyReLU()(x)return xdef residual_block(self,inputs,filters,kernel_size):x = self.conv_layer(inputs,filters,kernel_size)x = tf.keras.layers.Conv2D(filters=filters,kernel_size=kernel_size,activation="linear",padding="same",data_format="channels_last",kernel_regularizer=tf.keras.regularizers.l2(self.l2_reg),bias_regularizer=tf.keras.regularizers.l2(self.l2_reg))(x)x = tf.keras.layers.BatchNormalization(axis=-1)(x)if inputs.shape[-1] == filters:x = tf.keras.layers.add([inputs,x])else:inputs = tf.keras.layers.Conv2D(filters=filters,kernel_size=(1,1),activation="linear",padding="same",data_format="channels_last",kernel_regularizer=tf.keras.regularizers.l2(self.l2_reg),bias_regularizer=tf.keras.regularizers.l2(self.l2_reg))(inputs)x = tf.keras.layers.add([inputs, x])x = tf.keras.layers.LeakyReLU()(x)return xdef policy_head(self,inputs):x = tf.keras.layers.Conv2D(filters=2,kernel_size=(1,1),activation="linear",padding="same",data_format="channels_last",kernel_regularizer=tf.keras.regularizers.l2(self.l2_reg),bias_regularizer=tf.keras.regularizers.l2(self.l2_reg))(inputs)x = tf.keras.layers.Flatten()(x)x = tf.keras.layers.Dense(units=self.output_dim,activation="linear",kernel_regularizer=tf.keras.regularizers.l2(self.l2_reg),bias_regularizer=tf.keras.regularizers.l2(self.l2_reg),name="policy_head")(x)return xdef state_value_head(self,inputs):x = tf.keras.layers.Conv2D(filters=2,kernel_size=(1, 1),activation="linear",padding="same",data_format="channels_last",kernel_regularizer=tf.keras.regularizers.l2(self.l2_reg),bias_regularizer=tf.keras.regularizers.l2(self.l2_reg))(inputs)x = tf.keras.layers.Flatten()(x)x = tf.keras.layers.Dense(units=1,activation="linear",kernel_regularizer=tf.keras.regularizers.l2(self.l2_reg),bias_regularizer=tf.keras.regularizers.l2(self.l2_reg),name="state_value_head")(x)return xdef __build_model(self,net_struct):input_layer = tf.keras.layers.Input(shape=self.input_dim,name="inputs")x = self.conv_layer(input_layer,net_struct[0]["filters"],net_struct[0]["kernel_size"])for i in range(1,len(net_struct)):x = self.residual_block(x,net_struct[i]["filters"],net_struct[i]["kernel_size"])v_output = self.state_value_head(x)p_output = self.policy_head(x)self.model = tf.keras.models.Model(inputs=input_layer,outputs=[p_output,v_output])tf.keras.utils.plot_model(self.model, to_file="./AlphZero.png")self.model.compile(optimizer=tf.optimizers.Adam(),loss = {"policy_head":tf.nn.softmax_cross_entropy_with_logits,"state_value_head":"mean_squared_error"},loss_weights={"policy_head":0.5,"state_value_head":0.5})if __name__ == '__main__':logger = logging.getLogger(name="ResidualNet")logger.setLevel(logging.INFO)screen_handler = logging.StreamHandler(sys.stdout)screen_handler.setLevel(logging.INFO)formatter = logging.Formatter('%(asctime)s - %(module)s.%(funcName)s:%(lineno)d - %(levelname)s - %(message)s')screen_handler.setFormatter(formatter)logger.addHandler(screen_handler)residual_net = ResidualNet(logger=logger,input_dim=[19,19,17],output_dim=19*19,net_struct=[{"filters":64,"kernel_size":(3,3)},{"filters": 128, "kernel_size": (3, 3)},{"filters": 128, "kernel_size": (3, 3)},{"filters": 64, "kernel_size": (3, 3)},{"filters": 64, "kernel_size": (3, 3)},])

    3.1.2 結果

    3.2 蒙特卡洛樹搜索算法

    參考我的另一篇博客。

    本文部分內容為參考B站學習視頻書寫的筆記!

    by CyrusMay 2022 04 04

    當時有多少的心愿
    就有多少的殘缺
    ————五月天(步步)————

    總結

    以上是生活随笔為你收集整理的强化学习(五)—— AlphaGo与Alpha Zero的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。