<commit_before>---
layout: post
title: AlphaPig-五子棋版AlphaZero的实现
category: 论文
tags: 计算机
keywords: 
description: 
---

<img src="http://p28sk9doh.bkt.clouddn.com/alphaZero.jpg" height="200px"/>



AlphaGo出来之后，对它的解读一直不断，而AlphaGo Zero和AlphaZero文章发表后，复现的文章也是层出不穷。写这篇博文的时候，真是感觉诚惶诚恐—不太可能将AlphaZero讲的比知乎上的[这篇文章](https://zhuanlan.zhihu.com/p/25345778)更清晰明了了。作者写的MCTS的讲解纠正了我对[UCT算法](http://mcts.ai/index.html)的好多误解。



![蒙特卡洛树](http://p28sk9doh.bkt.clouddn.com/UCT.png)

## MCTS（蒙特卡洛树搜索）

和人类下棋的思路类似，AlphaGo也需要模拟好多次下棋的步骤，探索哪一步是**更好**的招数。对于下图：

<img src="http://p28sk9doh.bkt.clouddn.com/mcts2.jpg" width="500px">   
黑棋有黑1， 黑2两个走法；对应黑棋的黑1位置，白棋有白1,白2,白3三个走法（别管图中具体位置了，这是个例子而已）；对应黑2位置，白棋有白4，白5两个走法。那么这时候，黑棋应该走哪个呢？假设白棋也走了这五个位置中的某个，我们可以得到黑棋的胜率分别为83%， 49%， 92%和 51%， 52%（胜率如何计算，由价值挽留过决定，暂且不表）。

那么你会如何下呢？ 可能你胆子比较大，于是决定下黑1，因为黑1的平均胜率是:(83%+49%+92%)/3=74.67%; 而黑2的平均胜率只有(51%+52%)/2 = 51.5%。 但是，MCTS则走b2,白4的最低胜率51%也高于白2的49%。而如果白棋很聪明，一定会走白2的。所以，

### SESB(选择，扩展，模拟，回溯)

在AlphaGo中，mcts对每一个节点进行1600次类似上图的模拟，以此来决定走子策略。不同与传统纯MCTS的是，AlphaGo并不需要一直把这盘棋下完才能知道输赢，它可以（能？）像上图一样仅搜索两层就知道了哪种走子赢率更大。

![MCTS tree search](http://p28sk9doh.bkt.clouddn.com/UCT2.jpeg)



## 策略网络

围棋(五子棋15x15)棋盘为19x19，这样MCTS每一步要需要搜索很广的情况，显然不划算。人类面对这种情况，是凭借直觉（还是计算呢？）确定几个**概率大**（比如五子棋，直接就不考虑边和角了）的点，然后在这几个点上再深度模拟（多走几步）。AlphaGo中的策略网络，就是充当这种**直觉**的：它通过输入19x19的图像，直接输出361个点的概率，然后搜索概率较大的点就可以了。

在[AlphaPig](https://github.com/anxingle/AlphaPig)中，我们将最近下的9个位置(黑，白…当前是否黑)作为特征输入卷积网络，然后得到225个行棋概率。

<img src="http://p28sk9doh.bkt.clouddn.com/policy.jpg" width="500px" />

## 价值网络

在AlphaZero中，价值网络开始和策略网络使用同一个卷积网络（不清楚AlphaGo中为什么一开始是两个），为40层的残差网络。而价值网络输出的，确是一个介于0~1（1是当前player赢了，0是输了）之间的小数。这里我们使用10层的残差，当然，你也可以试一试其他的网络结构（实际上，5层的效果已经很好了）。
<commit_msg>ignore<commit_after>---
layout: post
title: AlphaPig-五子棋版AlphaZero的实现
category: 论文
tags: 计算机
keywords: 
description: 
---

<img src="http://p28sk9doh.bkt.clouddn.com/alphaZero.jpg" height="200px"/>



AlphaGo出来之后，对它的解读一直不断，而AlphaGo Zero和AlphaZero文章发表后，复现的文章也是层出不穷。写这篇博文的时候，真是感觉诚惶诚恐—不太可能将AlphaZero讲的比知乎上的[这篇文章](https://zhuanlan.zhihu.com/p/25345778)更清晰明了了。作者写的MCTS的讲解纠正了我对[UCT算法](http://mcts.ai/index.html)的好多误解。



![蒙特卡洛树](http://p28sk9doh.bkt.clouddn.com/UCT.png)

## MCTS（蒙特卡洛树搜索）

和人类下棋的思路类似，AlphaGo也需要模拟好多次下棋的步骤，探索哪一步是**更好**的招数。对于下图：

<img src="http://p28sk9doh.bkt.clouddn.com/mcts2.jpg" width="500px">   
黑棋有黑1， 黑2两个走法；对应黑棋的黑1位置，白棋有白1,白2,白3三个走法（别管图中具体位置了，这是个例子而已）；对应黑2位置，白棋有白4，白5两个走法。那么这时候，黑棋应该走哪个呢？假设白棋也走了这五个位置中的某个，我们可以得到黑棋的胜率分别为83%， 49%， 92%和 51%， 52%（胜率如何计算，由价值挽留过决定，暂且不表）。

那么你会如何下呢？ 可能你胆子比较大，于是决定下黑1，因为黑1的平均胜率是:(83%+49%+92%)/3=74.67%; 而黑2的平均胜率只有(51%+52%)/2 = 51.5%。 但是，MCTS则走b2,白4的最低胜率51%也高于白2的49%。而如果白棋很聪明，一定会走白2的。所以，MCTS会选择走黑2。MCTS尽量会在轮到对方走的时候，选择对自己最不利的着法来走。

### SESB(选择，扩展，模拟，回溯)

在AlphaGo中，mcts对每一个节点进行1600次类似上图的模拟，以此来决定走子策略。不同与传统纯MCTS的是，AlphaGo并不需要一直把这盘棋下完才能知道输赢，它可以（能？）像上图一样仅搜索两层就知道了哪种走子赢率更大。

![MCTS tree search](http://p28sk9doh.bkt.clouddn.com/UCT2.jpeg)



## 策略网络

围棋(五子棋15x15)棋盘为19x19，这样MCTS每一步要需要搜索很广的情况，显然不划算。人类面对这种情况，是凭借直觉（还是计算呢？）确定几个**概率大**（比如五子棋，直接就不考虑边和角了）的点，然后在这几个点上再深度模拟（多走几步）。AlphaGo中的策略网络，就是充当这种**直觉**的：它通过输入19x19的图像，直接输出361个点的概率，然后搜索概率较大的点就可以了。

在[AlphaPig](https://github.com/anxingle/AlphaPig)中，我们将最近下的9个位置(黑，白…当前是否黑)作为特征输入卷积网络，然后得到225个行棋概率。

<img src="http://p28sk9doh.bkt.clouddn.com/policy.jpg" width="500px" />

## 价值网络

在AlphaZero中，价值网络开始和策略网络使用同一个卷积网络（不清楚AlphaGo中为什么一开始是两个），为40层的残差网络。而价值网络输出的，确是一个介于0~1（1是当前player赢了，0是输了）之间的小数。这里我们使用10层的残差，当然，你也可以试一试其他的网络结构（实际上，5层的效果已经很好了）。

{'fraction_non_alphanumeric': 0.16485454011166617, 'fraction_numerical': 0.06788128122245078, 'mean_word_length': 10.778546712802768, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6267969', 'n_tokens_mistral': 2729, 'n_tokens_neox': 3066, 'n_words': 92}