日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

自學(xué)圍棋的AlphaGo Zero,你也可以造一個

01、遙想當(dāng)年,AlphaGo的Master版本,在完勝柯潔九段之后不久 , 就被后輩AlphaGo Zero (簡稱狗零) 擊潰了 。

自學(xué)圍棋的AlphaGo Zero,你也可以造一個


從一只完全不懂圍棋的AI , 到打敗Master,狗零只用了21天 。
而且,它不需要用人類知識來喂養(yǎng) , 成為頂尖棋手全靠自學(xué) 。
如果能培育這樣一只AI , 即便自己不會下棋,也可以很驕傲吧 。
于是,來自巴黎的少年Dylan Djian (簡稱小笛),就照著狗零的論文去實(shí)現(xiàn)了一下 。
他給自己的AI棋手起名SuperGo,也提供了代碼 (傳送門見文底)。
除此之外 , 還有教程——
一個身子兩個頭
智能體分成三個部分:
一是特征提取器 (Feature Extractor) , 二是策略網(wǎng)絡(luò) (Policy Network) ,三是價值網(wǎng)絡(luò)(Value Network)。
于是 , 狗零也被親切地稱為“雙頭怪” 。特征提取器是身子 , 其他兩個網(wǎng)絡(luò)是腦子 。
特征提取器
特征提取模型,是個殘差網(wǎng)絡(luò) (ResNet),就是給普通CNN加上了跳層連接 (Skip Connection) , 讓梯度的傳播更加通暢 。
跳躍的樣子 , 寫成代碼就是:
1class BasicBlock(nn.Module):
2 """
3 Basic residual block with 2 convolutions and a skip connection
4 before the last ReLU activation.
5 """
6、7 def __init__(self, inplanes, planes, stride=1, downsample=None):
8 super(BasicBlock, self).__init__()
9、10 self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=3,
11 stride=stride, padding=1, bias=False)
12 self.bn1 = nn.BatchNorm2d(planes)
13、14 self.conv2 = nn.Conv2d(planes, planes, kernel_size=3,
15 stride=stride, padding=1, bias=False)
16 self.bn2 = nn.BatchNorm2d(planes)
17、18
19 def forward(self, x):
20 residual = x
21、22 out = self.conv1(x)
23 out = F.relu(self.bn1(out))
24、25 out = self.conv2(out)
26 out = self.bn2(out)
27、28 out= residual
29 out = F.relu(out)
30、31 return out
然后,把它加到特征提取模型里面去:
1class Extractor(nn.Module):
2 def __init__(self, inplanes, outplanes):
3 super(Extractor, self).__init__()
4 self.conv1 = nn.Conv2d(inplanes, outplanes, stride=1,
5 kernel_size=3, padding=1, bias=False)
6 self.bn1 = nn.BatchNorm2d(outplanes)
7、8 for block in range(BLOCKS):
9 setattr(self, "res{}".format(block),
10 BasicBlock(outplanes, outplanes))
11、12
13 def forward(self, x):
14 x = F.relu(self.bn1(self.conv1(x)))
15 for block in range(BLOCKS - 1):
16 x = getattr(self, "res{}".format(block))(x)
17、18 feature_maps = getattr(self, "res{}".format(BLOCKS - 1))(x)
19 return feature_maps
策略網(wǎng)絡(luò)
策略網(wǎng)絡(luò)就是普通的CNN了 , 里面有個批量標(biāo)準(zhǔn)化 (Batch Normalization) , 還有一個全連接層,輸出概率分布 。
1class PolicyNet(nn.Module):
2 def __init__(self, inplanes, outplanes):
3 super(PolicyNet, self).__init__()
4 self.outplanes = outplanes
5 self.conv = nn.Conv2d(inplanes, 1, kernel_size=1)
6 self.bn = nn.BatchNorm2d(1)
7 self.logsoftmax = nn.LogSoftmax(dim=1)
8 self.fc = nn.Linear(outplanes - 1, outplanes)
9、10
11 def forward(self, x):
12 x = F.relu(self.bn(self.conv(x)))
13 x = x.view(-1, self.outplanes - 1)
14 x = self.fc(x)
15 probas = self.logsoftmax(x).exp()
16、17 return probas
價值網(wǎng)絡(luò)
這個網(wǎng)絡(luò)稍微復(fù)雜一點(diǎn) 。除了標(biāo)配之外,還要再多加一個全連接層 。最后,用雙曲正切 (Hyperbolic Tangent) 算出 (-1,1) 之間的數(shù)值,來表示當(dāng)前狀態(tài)下的贏面多大 。
代碼長這樣——
1class ValueNet(nn.Module):
2 def __init__(self, inplanes, outplanes):

推薦閱讀