書名: 深度強化學習實踐(原書第2版)作者名: (俄)馬克西姆·拉潘本章字數: 2013字更新時間: 2021-08-18 17:39:21
3.6 使用TensorBoard進行監控
如果你曾經嘗試過自己訓練NN,那你肯定知道這有多么痛苦和不確定。我不是要談論根據現有的教程和示例來實現,這種情況已經調整好了所有的超參,現在要討論的是剛獲取一些數據并需要從頭開始創建一些東西。即便使用已經包含了一些最佳實踐(包括權重的合理初始化,優化器的beta、gamma和其他選項均已經設置為默認值,以及隱藏的大量其他東西)的DL高級工具包,仍然需要做很多決定,因此很多事情可能出錯。因此,這會導致網絡首次運行幾乎無法成功,你應該習慣這種情況。
當然,通過實踐和經驗,你可以對產生問題的可能原因有很強的直覺,但是產生這種直覺需要對有關網絡內部發生的情況有更多的了解。因此,需要能夠以某種方式觀察訓練過程以及其變化。即使是小型網絡(例如微MNIST教程網絡)也可能有成千上萬個具有非線性動態的參數。
DL從業人員已制定出在訓練期間應觀察的事項清單,通常包括以下內容:
- 損失值,通常由基本損失和正則化損失等幾部分組成。應該同時觀察總損失和各個組成部分。
- 訓練和測試數據集的驗證結果。
- 梯度和權重的統計信息。
- 網絡計算出來的值。例如,如果你正在解決分類問題,肯定要測量所預測的類概率計算出的熵。在回歸問題中,原始預測值可以提供有關訓練的大量數據。
- 學習率和其他超參(如果它們也是隨時間調整的話)。
該清單可能更長,并且包含特定領域的度量標準,例如詞嵌入投影、音頻樣本和GAN生成的圖像。你可能還希望監控與訓練速度相關的值(例如一個epoch需要多長時間)以查看優化效果或硬件問題。
長話短說,我們需要一個通用的解決方案來追蹤一段時間內的大量值,并將它們表示出來進行分析,最好是專門為DL開發的(想象一下在Excel電子表格中查看此類統計信息)。幸運的是,已經存在這樣的工具,接下來我們將對其進行探索。
3.6.1 TensorBoard 101
在撰寫本書第1版時,用于NN監控的工具還不多。隨著時間的流逝,越來越多的新人和公司參與了對機器學習(ML)和DL的研究,出現了很多新工具。在本書中,我們仍然將重點放在TensorFlow中的TensorBoard上,你也可以嘗試使用其他實用程序。
TensorFlow從第一個公開版本開始,就包含一個名為TensorBoard的特殊工具,該工具旨在解決上面討論的問題:如何在訓練中觀察和分析NN的各種特性。TensorBoard是一個功能強大的通用解決方案,具有龐大的社區,它看起來非常好用(見圖3.4)。

圖3.4 TensorBoard Web界面
從架構的角度來看,TensorBoard是一個Python Web服務,它可以在計算機上啟動,啟動時可以給它傳入一個目錄用于保存訓練過程中要分析的數據。然后,將瀏覽器指向TensorBoard的端口(通常為6006),它會顯示一個交互式Web界面,其中的值會實時更新。它既方便又好用,尤其是在遠程計算機上進行訓練時。
TensorBoard最初是作為TensorFlow的一部分進行部署的,但是最近,它變成了一個單獨的項目(仍由Google維護),并且有自己的名稱。但是,TensorBoard仍使用TensorFlow數據格式,因此要在PyTorch優化中展示訓練的統計信息,需要同時安裝tensorboard
和tensorflow
軟件包。
從理論上講,這就是監控網絡所需的全部,因為tensorflow
軟件包提供了一些類來編寫TensorBoard能夠讀取的數據。但是,這不是很實用,因為這些類很底層。為了克服這個問題,有幾個第三方開源庫提供了方便的高級接口。本書使用的就是我的最愛之一,tensorboardX
(https://github.com/lanpa/tensorboardX)。它可以通過pip install tensorboardX
安裝。
兼容性說明
在PyTorch 1.1中,支持了實驗級別的TensorBoard格式功能,因此無須安裝tensorboardX(有關詳細信息,請查看https://pytorch.org/docs/stable/tensorboard.html)。但是由于PyTorch Ignite依賴它,我們仍然會使用該第三方軟件包。
3.6.2 繪圖
為了讓你了解tensorboardX有多簡單,我們來考慮一個與NN無關的小例子,它只是將內容寫入TensorBoard(完整的示例代碼在Chapter03/02_tensorboard.py
中)。

首先導入所需的包,創建數據編寫器,并定義需要可視化的函數。默認情況下,SummaryWriter
每次啟動都會在runs
目錄下創建一個唯一目錄,以便能夠比較不同的訓練。新目錄的名稱包括當前日期和時間以及主機名。可以通過將log_dir
參數傳遞給SummaryWriter
來覆蓋它。還可以傳入注釋選項,在目錄名稱中添加后綴,一般是為了捕獲不同實驗的語義,如dropout=0.3
或strong_regularisation
。

此代碼遍歷以度為單位的角度范圍,將其轉換為弧度,然后計算函數的值。使用add_scalar
函數將每個值添加到編寫器,add_scalar
函數有三個參數:參數名稱、值和當前迭代(必須為整數)。
循環之后,需要做的最后一件事是關閉編寫器。請注意,編寫器會定期進行刷新(默認情況下,每兩分鐘刷新一次),因此即使在優化過程很漫長的情況下,仍可看到值。
運行此命令的結果不會在控制臺輸出,但是會在runs
目錄中創建一個只有一個文件的新目錄。要查看結果,需要啟動TensorBoard:

如果在遠程服務器上運行TensorBoard,則需要添加--bind_all
命令行選項以使其可以從外部訪問。現在,在瀏覽器中打開http://localhost:6006
,就可以查看內容了,如圖3.5所示。

圖3.5 示例生成的圖
該圖是交互式的,可以將鼠標懸停在圖形上查看實際值并選擇區域放大來查看詳細信息。在圖形內部雙擊可以縮小圖片。如果多次運行了程序,那么在左側的Runs列表中會有多項,可以任意啟用和禁用這些項目,從而比較不同優化的動態數據。TensorBoard不僅可以分析標量值,還可以分析圖像、音頻、文本數據和嵌入數據,甚至可以顯示網絡的結構。有關所有這些功能,請參考tensorboardX
和tensorboard
的文檔。
現在,是時候結合在本章所學的內容用PyTorch實現真實的NN優化問題了。