科技

【你必須知道的六個深度煉丹好習慣】

問:為什麼訓練不出一個好的模型?

答:從一開始就沒有遵循科學的煉丹方法,可能哪個地方出了錯你還沒意識到。

寫在前面:培養良好的工程習慣至關重要,前期可能需要一些學習成本,但到後期你會發現養成了好習慣反而能省很多時間,尤其是當任務量比較大或者是需要開展持續的工作的時候,你會發現之前的付出真的很有意義。

舉個簡單的例子,你如果研究目標檢測,這是當前很熱的領域哇,很多人都在做。要想突破可能需要更多的實驗去嘗試,在實驗過程會用到COCO和Pascal VOC資料集,評價標準也相對複雜;同時目標檢測的程式碼量又相對較大,為了提高執行效率部分程式碼甚至會用C++實現。拿到這麼冗雜的一套系統,無論是用來做研究還是做工程,都需要一套科學嚴謹的準則,否則到最後發現會亂成一鍋粥,不知道對錯。

本文就是作者總結的一些在深度學習領域一些好的規則和習慣,都是自己的踩坑心路歷程。記住,播種一個行為,收穫一種習慣,日積月累,必有迴響。

在實際開發過程中,往往是通過遠端操作伺服器,掌握基本的linux指令非常關鍵,前期如果沒有這些基礎後期再做一些複雜的研究或者工程會十分惱火。因為你要去改程式碼,研究資料,做很多對比試驗。如果不能掌握基本的操作指令你會發現最後無從下手。不要期待使用圖形介面化操作。首先我們通常用遠端ssh連線伺服器跑程式,接觸到的只有黑黢黢的終端;再者圖形介面化其實不方便處理複雜的批操作,還不如指令來的方便;再者就是去Github拉程式碼你會發現很多DL的repo中都會讓你執行一些指令,不會肯定是不行的。有人可能會說,pycharm可以遠端操作呀,還自帶Sftp,這裡提一下,如果是在實驗室資源充足的條件下可以使用pycharm遠端除錯,但是在資源受限制的情況下不太穩定。(預告:如果下週有空我出一個pycharm詳細教程,它是非常NB的生產力工具)。總之,學會指令可以提高開發效率。前期不要著急去跑程式碼,花點時間研究一下基本的指令和工具是很有幫助的。下面列舉一些常用的指令:

檔案操作

mv, cp, ln, rm, ls, mkdir, make, mount, nohup, >, tailf, cat, find,ifconfig, chmod, cat

遠端控制

ssh, scp(遠端檔案傳輸)

系統資源檢視

ps, top, free, nvidia-smi, df, fdisk

簡單的正則

grep

實用工具

screen或tmux(多終端後臺執行), vim(可當做IDE), wget(支援斷點下載), conda, pip, apt-get, git

要尤其重視conda的使用,用來管理多個環境;使用Git管理你的程式碼版本

第一層境界:放心大膽的使用百度或Google吧,看看有沒有前人做過類似的工作;其次去知乎,CSDN,簡書上搜搜看,可能會有文章帶給我們啟發;如果是找一些學習資料或視訊直接B站或者YouTube搜尋;還有就是關注一些DL技術公眾號,PaperWeekly,CVer,量子位,機器之心等等..(我不是打廣告,這些公眾號大家可能都已經關注過)

第二層境界:等有一些基本的概念和了解之後就要去查閱相關領域的論文,去Google學術、百度學術或arxiv檢索相關的文獻,看論文是非常有必要和有用的,因為Paper也算是可信度高內容豐富的技術文件。

進階:去github搜尋相關論文的程式碼,論文和程式碼搭配使用效果更佳;大佬們的隱藏著很多幹貨;Kaggle或天池上面很多優秀的Kernel或許能夠提供新的思路;一些大佬自己的網站上面也會有很多幹貨,說不定就能淘到我們想要的東西

首先當然是百度和google,github的issue,StackOverflow都是查詢解決方案的好地方;如果身邊有大牛的話也要虛心請教;一些技術交流QQ或微信群也是我們獲取答案的好地方。比如我加了Pytorch交流群,裡面很活躍,大佬們也不吝賜教,群裡可能有人發一些最新資料,這對新手來講是很好學習途徑。多水一水群既可以開闊視野,同時又可以摸魚閒聊。

在訓練之前要合理規劃資料夾的命名以及層級結構,使用簡潔的英文單詞命名檔案(這裡可以推薦一下我的另一篇文章——CV領域常用單詞)。不要以為這是一個小事情,前期沒有一個好的架構,等程式碼多了再想起重構是一件非常麻煩的事情。推薦大家可以看一下Mask-RCNN倉庫連結的資料夾組織,我也是看到大佬們的工作才想起自身的不足,多看牛人的程式碼真的是一種洗禮。

你的工程中應該包含如下模組:

訓練Loss日誌:建議使用Tensorboard,因為現在tf和pytorch都支援這個工具,用起來也很簡單,因此強烈推薦使用,我看到之前一些人的程式碼中可能寫了log的方法,但現在官方提供了更強大的工具建議就不要用自己造的輪子了。注意,日誌資料夾命名最好要有區別,建議使用時間戳命名,否則所有的日誌混雜在一起將會亂成一鍋粥。

模型儲存:用一個資料夾來專門存放訓練的模型,每個模型的命名建議花點心思,最好要包含有用的資訊,方便查詢使用

引數配置檔案config:將訓練網路的超引數和配置檔案引數都放在專門的檔案中統一管理,不要在訓練主程式中東一坨西一坨,改來改去到最後很容易出現疏忽

資料集資料夾:此處建議所有的資料使用軟連線的方式連線到工程資料夾,對原始資料加一些許可權防止誤刪或更改;工程中的資料路徑建議使用相對路徑而非絕對路徑!!絕對路徑會導致你的工程資料夾換個地方就報錯

函式工具包:把自己自定義的類和方法統一放到一個地方,增加模組的複用性。

訓練和推斷的程式:現在流行的做法就是把網路封裝成一個訓練器,在指定檔案中配置好引數,直接執行程式就開始訓練了,模型設計好了就專心訓練和調參。

網路模型結構:當網路比較複雜的話,專門建一個包來存放網路結構

訓練快照:也就是你當前訓練出來模型對應的引數配置,個人覺得這點挺實用,防止最後訓練了半天不知道用的啥引數啥資料集。

總之:清爽的工程使人愉悅,雜亂的工程使人爆炸

我們開展一個任務,上手的第一個環節可能是clone別人的程式碼然後準備復現,Wait.第一步不要猴急猴急地去run人家的程式碼,我建議走下面的流程:

1.理清任務和評價標準,對演算法精度有一個巨集觀的理解,也就是知道人家差不多能做到啥程度

2.先去看一下訓練的資料,如果是圖片的話先用肉眼隨機抽樣看一看,人類是一種非常高階和敏感的動物,說不定就會有意想不到的發現;看完了之後如果有程式碼基礎就做一下資料統計分佈,資料探索分析。

3.看一下原作者寫的Readme檔案,裡面會概述本工程的一些組織結構和使用方法,這是很重要的一個環節。根據作者的提示可以去Run程式,訓練推斷都玩一玩,這樣很容易讓自己有成就感。

4.程式碼跑起來了不代表這個工程就是對的,一定要仔細地檢查原作者的程式碼細節和實現思路,防止程式碼有坑,這點很關鍵,不要認為人家是大佬發過論文open的程式碼就沒毛病了!我個人習慣註釋原始碼,如果徹底搞清楚了可以先給別人講一講,講懂了說明自己也會了。徹底弄清楚之後才能把這份Solution作為自己的Baseline,不要等到效果遲遲不見提升回過頭來才發現,哦,原來這個程式碼有問題啊,當時怎麼沒注意呢?為時已晚(不要問我是怎麼知道的>_<)

前期可以在baseline上做一些改動,然後看一下效果如何,分析問題出在哪裡。譬如來一個連環問,是哪些類分不好?為什麼分不好?是因為這個類特徵難學嗎?加一些什麼模組或者機制能夠更好的學特徵?

然後多去看一些論文,汲取其中的精華,然後回來接著做實驗,這是一種問題驅動型的思路。總之要養成多看論文的習慣,不過你是檢測、分割還是跟蹤重識別,一些經典的DL論文是一定要看的,多看論文才能拓寬思路有所啟發。

確定好了思路開始跑實驗驗證,記住首先要小樣本(少量的資料)測試自己的演算法是否work,看一下有沒有初步的效果。切忌一股腦成千上萬開始訓練,訓了半天發現那個地方有疏忽又從頭開始訓練。

調參也是很重要的過程。深度學習說白了是一個優化過程,不要忽視了引數對最終效果的影響,至於如何調參網上文章很多,我建議還是要親自動手試一試感受才深刻。結合數學理論去巨集觀的分析原因,這樣對自己的整體能力提升很有幫助。

看大佬的程式碼你會發現人家不光是學術搞得好,程式碼敲得也賊666啊。多去看看名家的程式碼對自己是很有裨益的,甚至沒事的時候可以跟著敲一敲練手。那麼總結一下大佬的程式碼都會發現人家的程式碼風格基本上遵循Google程式碼規範,而且有命名優雅、註釋詳細、函式之間耦合性低、邏輯清晰等優點。這些東西需要沒法一時半會學會,但是隻要平時注意培養程式碼風格習慣,日積月累肯定會有提高的。

說到版本控制,我本人在這一塊做的比較差,越到後期會發現不注意版本控制是風險係數很高的一個行為。常用的版本控制有Git,我本人用了視覺化介面的SourceTree,有Mac和Win版本,推薦給大家使用。

不要在同一個坑裡面摔倒三次!!遇到問題及時解決和並記錄,不做重複性工作。這是我多次失敗的一個教訓,我之前沒有做筆記的習慣,但發現人腦很容易遺忘,做筆記是一件很有必要的事情。

推薦一個適合程式設計師做筆記的工具Leanote,如果使用官方提供的伺服器需要每月交五塊錢。如果不想花錢可以將Leanote開源的的程式碼部署到本地伺服器上

使用Wiki系統進行知識庫管理。每天做完工作都要有一定的收穫。我使用的是confluence,每天堅持寫一寫,對自己既是督促也是提升。

深度學習本來就是一個玄學,暫時還沒人揭開底層的奧祕。因此我們常稱之為“煉丹”。既然是煉丹就要做好持久戰的準備,多一些耐心多去嘗試,失敗再所難免。每次失敗之後做好記錄並分析,相信總有一天會有好的演算法誕生。^_^

Reference:科技日報

看更多!請加入我們的粉絲團

轉載請附文章網址

不可錯過的話題