【霏艺所思】AlphaGoZero开源实现代码讲解<5>:杂项
【霏艺所思】AlphaGoZero开源实现代码讲解<1>:前向过程
【霏艺所思】AlphaGoZero开源实现代码讲解<2>:反向过程
【霏艺所思】AlphaGoZero开源实现代码讲解<3>:输入特征
【霏艺所思】AlphaGoZero开源实现代码讲解<4>:MCTS算法
【霏艺所思】AlphaGoZero开源实现代码讲解<5>:杂项
杂七杂八的东西都放这里讲解了
1. 接上篇的addVirtualLoss
2. python 和 c++ 之间内存怎么交互的呢?
涉及代码 pybind 相关的,自己i搜索pybind
还有
src_cpp\elf\base\extractor.h
src_cpp\elf\base\sharedmem.h
3. 作为分布式的架构,各个节点是如何通信的呢?
通过zmq通信 dealer-router
涉及代码
src_cpp\elfgames\go\train\distri_server.h
src_cpp\elfgames\go\train\distri_client.h
client 是 dealer
server 是 router
具体的以后再说~
论文部分,网上的讲解已经很多很多了。。。
不要再让我写一遍了!我喜欢写原创内容【没人写过的,才能证明我是原创。。。】
第一篇,讲解前向过程,大概涉及到ResNet,以及外层是如何调用这个函数的
第二篇,讲解反向过程,就是训练,讲解经典函数
MSELoss(v,z) + CrossEntroy(pi, target)
以及 数据是在传递的
第三篇,讲解输入特征
前向的话,输入特征看函数extractStateAGZ 提取了特征
反向的话,输入特征看函数extractStateExtAGZ 提取了特征
讲解,这个过程是多么的复杂~
第四篇,讲解MCTS,重点说下UCT,还有如何select expand update
第五批,讲解杂七杂八的东西,都是些小细节
【霏艺所思】AlphaGoZero开源实现代码讲解<2>:反向过程
【霏艺所思】AlphaGoZero开源实现代码讲解<3>:输入特征
【霏艺所思】AlphaGoZero开源实现代码讲解<4>:MCTS算法
【霏艺所思】AlphaGoZero开源实现代码讲解<5>:杂项
杂七杂八的东西都放这里讲解了
1. 接上篇的addVirtualLoss
2. python 和 c++ 之间内存怎么交互的呢?
涉及代码 pybind 相关的,自己i搜索pybind
还有
src_cpp\elf\base\extractor.h
src_cpp\elf\base\sharedmem.h
3. 作为分布式的架构,各个节点是如何通信的呢?
通过zmq通信 dealer-router
涉及代码
src_cpp\elfgames\go\train\distri_server.h
src_cpp\elfgames\go\train\distri_client.h
client 是 dealer
server 是 router
具体的以后再说~
论文部分,网上的讲解已经很多很多了。。。
不要再让我写一遍了!我喜欢写原创内容【没人写过的,才能证明我是原创。。。】
第一篇,讲解前向过程,大概涉及到ResNet,以及外层是如何调用这个函数的
第二篇,讲解反向过程,就是训练,讲解经典函数
MSELoss(v,z) + CrossEntroy(pi, target)
以及 数据是在传递的
第三篇,讲解输入特征
前向的话,输入特征看函数extractStateAGZ 提取了特征
反向的话,输入特征看函数extractStateExtAGZ 提取了特征
讲解,这个过程是多么的复杂~
第四篇,讲解MCTS,重点说下UCT,还有如何select expand update
第五批,讲解杂七杂八的东西,都是些小细节
1 个评论
https://youtu.be/iRK4AAIOtVg
聽歌和代碼更配~
先講講
src_cpp\elf\base\sharedmem.h
第一個函數state2mem ,功能 : 把c++内存結構轉爲python認識的内存
state 表示 C++ 定義的内存結構
mem 表示 c++ 和 python互相訪問的公共内存
Message& msg 表示 server收到client的請求【c++請求調用python】
這樣就會調用pytorch進行神經網絡操作
比如 C++ 給 Python發送了 train ,那麽 python就調用 update
比如 C++ 給 Python發送了 actor,那麽 python就調用 forward
SharedMem& mem 表示c++和 python的共享内存
datum->state_to_mem_funcs.transfer(idx, mem); 表示調用 之前注冊的函數
之前注冊的函數,什麽時候注冊的???
src_cpp\elfgames\go\common\game_feature.h
的registerExtractor 函數 addFunction 表示 注冊
所以,所謂的遍歷調用之前的函數,就是調用 registerExtractor的addFunction函數
講完了第一個函數~
mem2state 這個是第二個函數 道理很簡單,反過來而已
e.addClass<GoReply>() 後面的 addFunction 這些函數就是了
總結: addField後面的 addFunction 就是 state2mem
addClass 後面的 addFunction 就是 mem2state
最後講講SharedMem
waitBatchFillMem Python側調用,表示Python等待C++發送指令
收到以後,調用state2mem ,對共享内存賦值,然後調用python綁定的回調函數
有人會問,python回調函數是什麽,,,
在scripts目錄下 搜索 GC.reg_callback 這行代碼
前面是key,表示cmd,後面表示對應的回調函數
完整過程
C++ 這邊 代碼
src_cpp\elfgames\go\train\game_train.cc
調用了 client_->sendBatchWait({"train"}, funcPtrsToSend);
Python 這邊代碼
scripts\elfgames\go\train.py
因爲 GC.reg_callback("train", train) 注冊了 字符串【cmd】為“train”的回調函數 train
後面 你懂的,因爲state2mem,所以 ,python的參數就是這麽來的。。。
python調用c++的函數,是pybind
python訪問c++的内存,就是我剛才説的
--------------------------------------------------------------------
前向過程 C++ 調用python的代碼是 src_cpp\elf\ai\ai.h 文件的
client_->sendWait(targets_, &funcs_s);
或者
client_->sendBatchWait(targets_, ptr_funcs_s);
【targets_ 就是 actor_black 或者 actor_white】
自己看python代碼 GC.reg_callback(actor_name, 都綁定了什麽函數就可以了~
反向過程 也就是訓練, 代碼是
src_cpp\elfgames\go\train\game_train.cc
調用了 client_->sendBatchWait({"train"}, funcPtrsToSend);
聽歌和代碼更配~
先講講
src_cpp\elf\base\sharedmem.h
第一個函數state2mem ,功能 : 把c++内存結構轉爲python認識的内存
state 表示 C++ 定義的内存結構
mem 表示 c++ 和 python互相訪問的公共内存
Message& msg 表示 server收到client的請求【c++請求調用python】
這樣就會調用pytorch進行神經網絡操作
比如 C++ 給 Python發送了 train ,那麽 python就調用 update
比如 C++ 給 Python發送了 actor,那麽 python就調用 forward
SharedMem& mem 表示c++和 python的共享内存
datum->state_to_mem_funcs.transfer(idx, mem); 表示調用 之前注冊的函數
之前注冊的函數,什麽時候注冊的???
src_cpp\elfgames\go\common\game_feature.h
的registerExtractor 函數 addFunction 表示 注冊
所以,所謂的遍歷調用之前的函數,就是調用 registerExtractor的addFunction函數
講完了第一個函數~
mem2state 這個是第二個函數 道理很簡單,反過來而已
e.addClass<GoReply>() 後面的 addFunction 這些函數就是了
總結: addField後面的 addFunction 就是 state2mem
addClass 後面的 addFunction 就是 mem2state
最後講講SharedMem
waitBatchFillMem Python側調用,表示Python等待C++發送指令
收到以後,調用state2mem ,對共享内存賦值,然後調用python綁定的回調函數
有人會問,python回調函數是什麽,,,
在scripts目錄下 搜索 GC.reg_callback 這行代碼
前面是key,表示cmd,後面表示對應的回調函數
完整過程
C++ 這邊 代碼
src_cpp\elfgames\go\train\game_train.cc
調用了 client_->sendBatchWait({"train"}, funcPtrsToSend);
Python 這邊代碼
scripts\elfgames\go\train.py
因爲 GC.reg_callback("train", train) 注冊了 字符串【cmd】為“train”的回調函數 train
後面 你懂的,因爲state2mem,所以 ,python的參數就是這麽來的。。。
python調用c++的函數,是pybind
python訪問c++的内存,就是我剛才説的
--------------------------------------------------------------------
前向過程 C++ 調用python的代碼是 src_cpp\elf\ai\ai.h 文件的
client_->sendWait(targets_, &funcs_s);
或者
client_->sendBatchWait(targets_, ptr_funcs_s);
【targets_ 就是 actor_black 或者 actor_white】
自己看python代碼 GC.reg_callback(actor_name, 都綁定了什麽函數就可以了~
反向過程 也就是訓練, 代碼是
src_cpp\elfgames\go\train\game_train.cc
調用了 client_->sendBatchWait({"train"}, funcPtrsToSend);