這篇文章主要介紹“怎么用PyTorch對Leela Zero進(jìn)行神經(jīng)網(wǎng)絡(luò)訓(xùn)練”,在日常操作中,相信很多人在怎么用PyTorch對Leela Zero進(jìn)行神經(jīng)網(wǎng)絡(luò)訓(xùn)練問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用PyTorch對Leela Zero進(jìn)行神經(jīng)網(wǎng)絡(luò)訓(xùn)練”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!為您提供網(wǎng)站制作、網(wǎng)站建設(shè)、成都網(wǎng)頁設(shè)計、重慶小程序開發(fā)、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、APP應(yīng)用開發(fā)是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計公司,等你一起來見證!
最近,我一直在尋找方法來加快我的研究和管理我的實驗,特別是圍繞著寫訓(xùn)練管道和管理實驗配置文件這兩個方面,我發(fā)現(xiàn)這兩個新項目叫做PyTorch Lightning和Hydra。PyTorch Lightning可以幫助你快速編寫訓(xùn)練管道,而Hydra可以幫助你有效地管理配置文件。
PyTorch Lightning:https://github.com/PyTorchLightning/pytorch-lightning
Hydra:https://hydra.cc/
為了練習(xí)使用它們,我決定為Leela Zero(https://github.com/leela-zero/leela-zero) 編寫一個訓(xùn)練管道。我這樣做,是因為這是一個范圍很廣的項目,涉及到使用多個gpu在大數(shù)據(jù)集上訓(xùn)練大型網(wǎng)絡(luò),可以說是一個十分有趣的技術(shù)挑戰(zhàn)。此外,我以前曾經(jīng)實現(xiàn)過一個更小版本的AlphaGo國際象棋(https://medium.com/@peterkeunwoo/beating-my-brother-in-chess-cb17739ffe2) ,所以我認(rèn)為這將是一個有趣的業(yè)余項目。
在這個博客中,我將解釋這個項目的主要細(xì)節(jié),以便你能夠輕松理解我所做的工作。你可以在這里閱讀我的代碼:https://github.com/yukw777/leela-zero-pytorch
第一步是找出Leela Zero神經(jīng)網(wǎng)絡(luò)的內(nèi)部工作原理。我大量引用了Leela Zero的文檔和它的Tensorflow訓(xùn)練管道。
Leela Zero的神經(jīng)網(wǎng)絡(luò)由一個殘差塔(ResNet “tower” )組成,塔上有兩個“head”,即AlphaGo Zero論文(https://deepmind.com/blog/article/alphago-zero-starting-scratch) 中描述的負(fù)責(zé)策略的“頭”(policy head)和負(fù)責(zé)計算價值的“頭”(value head)。就像論文所述,策略“頭”和值“頭”開始的那幾個卷積濾波器都是1x1,其他所有的卷積濾波器都是3x3。游戲和棋盤特征被編碼為[批次大小,棋盤寬度,棋盤高度,特征數(shù)量]形狀的張量,首先通過殘差塔輸入。然后,塔提取出抽象的特征,并通過每個“頭”輸入這些特征,以計算下一步棋的策略概率分布和游戲的價值,從而預(yù)測游戲的獲勝者。
你可以在下面的代碼片段中找到網(wǎng)絡(luò)的實現(xiàn)細(xì)節(jié)。
Leela Zero使用一個簡單的文本文件來保存和加載網(wǎng)絡(luò)權(quán)重。文本文件中的每一行都有一系列數(shù)字,這些數(shù)字表示網(wǎng)絡(luò)的每一層的權(quán)重。首先是殘差塔,然后是策略頭,然后是值頭。
卷積層有2個權(quán)重行:
與[output, input, filter size, filter size]形狀的卷積權(quán)值
通道的偏差
Batchnorm層有2個權(quán)重行:
Batchnorm平均值
Batchnorm方差
內(nèi)積(完全連接)層有2個權(quán)重行:
帶有[output, input]形狀的層權(quán)重
輸出偏差
我編寫了單元測試來確保我的權(quán)重文件是正確的。我使用的另一個簡單的完整性檢查是計算層的數(shù)量,在加載我的權(quán)值文件后,將其與Leela Zero進(jìn)行比較。層數(shù)公式為:
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)
到目前為止,這看起來很簡單,但是你需要注意一個實現(xiàn)細(xì)節(jié)。Leela Zero實際上使用卷積層的偏差來表示下一個歸一化層(batch norm)的可學(xué)習(xí)參數(shù)(gamma
和beta
)。這樣做是為了使權(quán)值文件的格式(只有一行表示層權(quán)值,另一行表示偏差)在添加歸一化層時不必更改。
目前,Leela Zero只使用歸一化層的beta
項,將gamma
設(shè)置為1。那么,實際上我們該如何使用卷積偏差,來產(chǎn)生與在歸一化層中應(yīng)用可學(xué)習(xí)參數(shù)相同的結(jié)果呢?我們先來看看歸一化層的方程:
y = gamma * (x — mean)/sqrt(var — eps) + beta
由于Leela Zero將gamma
設(shè)為1,則方程為:
y = (x — mean)/sqrt(var — eps) + beta
現(xiàn)在,設(shè)定x_conv
是沒有偏差的卷積層的輸出。然后,我們想給x_conv
添加一些偏差,這樣當(dāng)你在沒有beta的歸一化層中運行它時,結(jié)果與在只有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)
因此,如果我們在權(quán)值文件中將卷積偏差設(shè)置為beta * sqrt(var - eps)
,我們就會得到期望的輸出,這就是LeelaZero所做的。
那么,我們?nèi)绾螌崿F(xiàn)它呢?在Tensorflow中,你可以通過調(diào)用tf.layers.batch_normalization(scale=False)
來告訴歸一化層要忽略gamma
項,然后使用它。
遺憾的是,在PyTorch中,你不能將歸一化層設(shè)置為只忽略gamma
,你只能通過將仿射參數(shù)設(shè)置為False: BatchNorm2d(out_channels, affine=False)
,來忽略gamma
和beta
。所以,我把歸一化層設(shè)為兩個都忽略,然后簡單地在后面加上一個張量,它表示beta
。然后,使用公式bias = beta * sqrt(var - eps)
來計算權(quán)值文件的卷積偏差。
在弄清了Leela Zeros的神經(jīng)網(wǎng)絡(luò)的細(xì)節(jié)之后,就到了處理訓(xùn)練管道的時候了。正如我提到的,我想練習(xí)使用兩個工具:PyTorch Lightning和Hydra,來加快編寫訓(xùn)練管道和有效管理實驗配置。讓我們來詳細(xì)了解一下我是如何使用它們的。
編寫訓(xùn)練管道是我研究中最不喜歡的部分:它涉及大量重復(fù)的樣板代碼,而且很難調(diào)試。正因為如此,PyTorch Lightning對我來說就像一股清流,它是一個輕量級的庫,PyTorch沒有很多輔助抽象,在編寫訓(xùn)練管道時,它負(fù)責(zé)處理大部分樣板代碼。它允許你關(guān)注你的訓(xùn)練管道中更有趣的部分,比如模型架構(gòu),并使你的研究代碼更加模塊化和可調(diào)試。此外,它還支持多gpu和TPU的開箱即用訓(xùn)練!
為了使用PyTorch Lightning作為我的訓(xùn)練管道,我需要做的最多的編碼就是編寫一個類,我稱之為NetworkLightningModule
,它繼承自LightningModule
來指定訓(xùn)練管道的細(xì)節(jié),并將其傳遞給訓(xùn)練器。有關(guān)如何編寫自己的LightningModule
的詳細(xì)信息,可以參考PyTorch Lightning
的官方文檔。
我一直在研究的另一部分是實驗管理。當(dāng)你進(jìn)行研究的時候,你不可避免地要運行大量不同的實驗來測試你的假設(shè),所以,以一種可擴(kuò)展的方式跟蹤它們是非常重要的。到目前為止,我一直依賴于配置文件來管理我的實驗版本,但是使用平面配置文件很快就變得難以管理。使用模板是這個問題的一個解決方案。然而,我發(fā)現(xiàn)模板最終也會變得混亂,因為當(dāng)你覆蓋多個層的值文件來呈現(xiàn)你的配置文件時,很難跟蹤哪個值來自哪個值文件。
另一方面,Hydra是一個基于組件的配置管理系統(tǒng)。與使用單獨的模板和值文件來呈現(xiàn)最終配置不同,你可以組合多個較小的配置文件來組成最終配置。它不如基于模板的配置管理系統(tǒng)靈活,但我發(fā)現(xiàn)基于組件的系統(tǒng)在靈活性和可維護(hù)性之間取得了很好的平衡。Hydra就是這樣一個專門為研究腳本量身定做的系統(tǒng)。它的調(diào)用有點笨拙,因為它要求你將它用作腳本的主要入口點,但實際上我認(rèn)為有了這種設(shè)計,它很容易與你的訓(xùn)練腳本集成。此外,它允許你通過命令行手動覆蓋配置,這在運行你的實驗的不同版本時非常有用。我常常使用Hydra管理不同規(guī)模的網(wǎng)絡(luò)架構(gòu)和訓(xùn)練管道配置。
為了評估我的訓(xùn)練網(wǎng)絡(luò),我使用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,能夠極大地加快編寫訓(xùn)練管道的速度,并有效地管理實驗配置文件。我希望這個項目和博客文章也能對你的研究有所幫助。你可以在這里查看代碼:https://github.com/yukw777/leela-zero-pytorch
原文鏈接:https://towardsdatascience.com/training-neural-networks-for-leela-zero-using-pytorch-and-pytorch-lightning-bbf588683065
到此,關(guān)于“怎么用PyTorch對Leela Zero進(jìn)行神經(jīng)網(wǎng)絡(luò)訓(xùn)練”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
本文名稱:怎么用PyTorch對LeelaZero進(jìn)行神經(jīng)網(wǎng)絡(luò)訓(xùn)練
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/pceiis.html