强化学习(五)—— AlphaGo与Alpha Zero
生活随笔
收集整理的這篇文章主要介紹了
强化学习(五)—— 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 訓練及評估流程
1.4 模仿學習(Behavior Cloning)
通過Behavior Cloning從人的經驗中初始化策略網絡的參數,策略網絡的結構為:
隨機初始化網絡參數后,基于人類對弈的落子序列數據,進行模仿學習(分類任務),使用交叉熵作為損失函數進行參數更新:
模仿學習可認為是循規蹈矩。
1.5 策略網絡依據策略梯度進行學習
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)
- 訓練過程:
1.7 Monte Carlo Tree Search
每次蒙特卡洛樹(MCTS)的搜索過程:
1.7.1 Selection
1.7.2 Expansion
由于狀態轉移函數未知,則用策略函數作為狀態轉移函數
1.7.3 Evaluation
1.7.4 Backup
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訓練策略網絡
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 强化学习(四)—— Actor-Crit
- 下一篇: 强化学习—— 蒙特卡洛树(Monte C