您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么用PyTorch對Leela Zero進行神經網絡訓練”,在日常操作中,相信很多人在怎么用PyTorch對Leela Zero進行神經網絡訓練問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用PyTorch對Leela Zero進行神經網絡訓練”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
最近,我一直在尋找方法來加快我的研究和管理我的實驗,特別是圍繞著寫訓練管道和管理實驗配置文件這兩個方面,我發現這兩個新項目叫做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的文檔和它的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沒有很多輔助抽象,在編寫訓練管道時,它負責處理大部分樣板代碼。它允許你關注你的訓練管道中更有趣的部分,比如模型架構,并使你的研究代碼更加模塊化和可調試。此外,它還支持多gpu和TPU的開箱即用訓練!
為了使用PyTorch Lightning作為我的訓練管道,我需要做的最多的編碼就是編寫一個類,我稱之為NetworkLightningModule
,它繼承自LightningModule
來指定訓練管道的細節,并將其傳遞給訓練器。有關如何編寫自己的LightningModule
的詳細信息,可以參考PyTorch Lightning
的官方文檔。
我一直在研究的另一部分是實驗管理。當你進行研究的時候,你不可避免地要運行大量不同的實驗來測試你的假設,所以,以一種可擴展的方式跟蹤它們是非常重要的。到目前為止,我一直依賴于配置文件來管理我的實驗版本,但是使用平面配置文件很快就變得難以管理。使用模板是這個問題的一個解決方案。然而,我發現模板最終也會變得混亂,因為當你覆蓋多個層的值文件來呈現你的配置文件時,很難跟蹤哪個值來自哪個值文件。
另一方面,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
到此,關于“怎么用PyTorch對Leela Zero進行神經網絡訓練”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。