作者|Peter Yu
編譯|Flin
來源|towardsdatascience

最近,我一直在尋找方法來加快我的研究和管理我的實驗,特別是圍繞著寫訓練管道和管理實驗組態檔這兩個方面,我發現這兩個新專案叫做PyTorch Lightning和Hydra,PyTorch Lightning可以幫助你快速撰寫訓練管道,而Hydra可以幫助你有效地管理組態檔,
- PyTorch Lightning:https://github.com/PyTorchLightning/pytorch-lightning
- Hydra:https://hydra.cc/
為了練習使用它們,我決定為Leela Zero(https://github.com/leela-zero/leela-zero) 撰寫一個訓練管道,我這樣做,是因為這是一個范圍很廣的專案,涉及到使用多個gpu在大資料集上訓練大型網路,可以說是一個十分有趣的技術挑戰,此外,我以前曾經實作過一個更小版本的AlphaGo國際象棋(https://medium.com/@peterkeunwoo/beating-my-brother-in-chess-cb17739ffe2) ,所以我認為這將是一個有趣的業余專案,
在這個博客中,我將解釋這個專案的主要細節,以便你能夠輕松理解我所做的作業,你可以在這里閱讀我的代碼:https://github.com/yukw777/leela-zero-pytorch
Leela Zero
第一步是找出Leela Zero神經網路的內部作業原理,我大量參考了Leela Zero的檔案和它的Tensorflow訓練管道,
神經網路結構
Leela Zero的神經網路由一個殘差塔(ResNet “tower” )組成,塔上有兩個“head”,即AlphaGo Zero論文(https://deepmind.com/blog/article/alphago-zero-starting-scratch) 中描述的負責策略的“頭”(policy head)和負責計算價值的“頭”(value head),就像論文所述,策略“頭”和值“頭”開始的那幾個卷積濾波器都是1x1,其他所有的卷積濾波器都是3x3,游戲和棋盤特征被編碼為[批次大小,棋盤寬度,棋盤高度,特征數量]形狀的張量,首先通過殘差塔輸入,然后,塔提取出抽象的特征,并通過每個“頭”輸入這些特征,以計算下一步棋的策略概率分布和游戲的價值,從而預測游戲的獲勝者,
你可以在下面的代碼片段中找到網路的實作細節,

權重格式
Leela Zero使用一個簡單的文本檔案來保存和加載網路權重,文本檔案中的每一行都有一系列數字,這些數字表示網路的每一層的權重,首先是殘差塔,然后是策略頭,然后是值頭,
卷積層有2個權重行:
-
與[output, input, filter size, filter size]形狀的卷積權值
-
通道的偏差
Batchnorm層有2個權重行:
-
Batchnorm平均值
-
Batchnorm方差
內積(完全連接)層有2個權重行:
-
帶有[output, input]形狀的層權重
-
輸出偏差
我撰寫了單元測驗來確保我的權重檔案是正確的,我使用的另一個簡單的完整性檢查是計算層的數量,在加載我的權值檔案后,將其與Leela Zero進行比較,層數公式為:
n_layers = 1 (version number) +
2 (input convolution) +
2 (input batch norm) +
n_res (number of residual blocks) *
8 (first conv + first batch norm +
second conv + second batch norm) +
2 (policy head convolution) +
2 (policy head batch norm) +
2 (policy head linear) +
2 (value head convolution) +
2 (value head batch norm) +
2 (value head first linear) +
2 (value head second linear)
到目前為止,這看起來很簡單,但是你需要注意一個實作細節,Leela Zero實際上使用卷積層的偏差來表示下一個歸一化層(batch norm)的可學習引數(gamma和beta),這樣做是為了使權值檔案的格式(只有一行表示層權值,另一行表示偏差)在添加歸一化層時不必更改,
目前,Leela Zero只使用歸一化層的beta項,將gamma設定為1,那么,實際上我們該如何使用卷積偏差,來產生與在歸一化層中應用可學習引數相同的結果呢?我們先來看看歸一化層的方程:
y = gamma * (x — mean)/sqrt(var — eps) + beta
由于Leela Zero將gamma設為1,則方程為:
y = (x — mean)/sqrt(var — eps) + beta
現在,設定x_conv是沒有偏差的卷積層的輸出,然后,我們想給x_conv添加一些偏差,這樣當你在沒有beta的歸一化層中運行它時,結果與在只有beta的歸一化層方程中運行x_conv是一樣的:
(x_conv + bias — mean)/sqrt(var — eps) =
(x_conv — mean)/sqrt(var — eps) + beta
x_conv + bias — mean =
x_conv — mean + beta * sqrt(var — eps)
bias = beta * sqrt(var — eps)
因此,如果我們在權值檔案中將卷積偏差設定為beta * sqrt(var - eps),我們就會得到期望的輸出,這就是LeelaZero所做的,
那么,我們如何實作它呢?在Tensorflow中,你可以通過呼叫tf.layers.batch_normalization(scale=False)來告訴歸一化層要忽略gamma項,然后使用它,
遺憾的是,在PyTorch中,你不能將歸一化層設定為只忽略gamma,你只能通過將仿射引數設定為False: BatchNorm2d(out_channels, affine=False),來忽略gamma和beta,所以,我把歸一化層設為兩個都忽略,然后簡單地在后面加上一個張量,它表示beta,然后,使用公式bias = beta * sqrt(var - eps)來計算權值檔案的卷積偏差,
訓練管道
在弄清了Leela Zeros的神經網路的細節之后,就到了處理訓練管道的時候了,正如我提到的,我想練習使用兩個工具:PyTorch Lightning和Hydra,來加快撰寫訓練管道和有效管理實驗配置,讓我們來詳細了解一下我是如何使用它們的,
PyTorch Lightning
撰寫訓練管道是我研究中最不喜歡的部分:它涉及大量重復的樣板代碼,而且很難除錯,正因為如此,PyTorch Lightning對我來說就像一股清流,它是一個輕量級的庫,PyTorch沒有很多輔助抽象,在撰寫訓練管道時,它負責處理大部分樣板代碼,它允許你關注你的訓練管道中更有趣的部分,比如模型架構,并使你的研究代碼更加模塊化和可除錯,此外,它還支持多gpu和TPU的開箱即用訓練!
為了使用PyTorch Lightning作為我的訓練管道,我需要做的最多的編碼就是撰寫一個類,我稱之為NetworkLightningModule,它繼承自LightningModule來指定訓練管道的細節,并將其傳遞給訓練器,有關如何撰寫自己的LightningModule的詳細資訊,可以參考PyTorch Lightning的官方檔案,
Hydra
我一直在研究的另一部分是實驗管理,當你進行研究的時候,你不可避免地要運行大量不同的實驗來測驗你的假設,所以,以一種可擴展的方式跟蹤它們是非常重要的,到目前為止,我一直依賴于組態檔來管理我的實驗版本,但是使用平面組態檔很快就變得難以管理,使用模板是這個問題的一個解決方案,然而,我發現模板最終也會變得混亂,因為當你覆寫多個層的值檔案來呈現你的組態檔時,很難跟蹤哪個值來自哪個值檔案,
另一方面,Hydra是一個基于組件的配置管理系統,與使用單獨的模板和值檔案來呈現最終配置不同,你可以組合多個較小的組態檔來組成最終配置,它不如基于模板的配置管理系統靈活,但我發現基于組件的系統在靈活性和可維護性之間取得了很好的平衡,Hydra就是這樣一個專門為研究腳本量身定做的系統,它的呼叫有點笨拙,因為它要求你將它用作腳本的主要入口點,但實際上我認為有了這種設計,它很容易與你的訓練腳本集成,此外,它允許你通過命令列手動覆寫配置,這在運行你的實驗的不同版本時非常有用,我常常使用Hydra管理不同規模的網路架構和訓練管道配置,
評估
為了評估我的訓練網路,我使用GoMill(https://github.com/mattheww/gomill) 來舉行圍棋比賽,它是一個運行在Go Text Protocol (GTP)引擎上的比賽的庫,Leela Zero就是其中之一,你可以在這里(https://github.com/yukw777/leela-zero-pytorch/blob/master/eval/bg-vs-sm.ctl) 找到我使用的比賽配置,
結論
通過使用PyTorch-Lightning和Hydra,能夠極大地加快撰寫訓練管道的速度,并有效地管理實驗組態檔,我希望這個專案和博客文章也能對你的研究有所幫助,你可以在這里查看代碼:https://github.com/yukw777/leela-zero-pytorch
原文鏈接:https://towardsdatascience.com/training-neural-networks-for-leela-zero-using-pytorch-and-pytorch-lightning-bbf588683065
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/194796.html
標籤:其他
上一篇:機器為什么能夠學習?
