日本在线看黄a美女久草|日本动漫亚洲在线一区|日韩人妻无码免费视频|A√有码中文字幕|日韩一级片视频热久久久|一区二区三区四区精品无码在线|亚洲AV成人无码一二三app|亚洲综合图片绯色|91极品人妻在线网站|国产成人精品一区二三区四区五区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預覽,將在時失效
人工智能學術 正文
發(fā)私信給蔣寶尚
發(fā)送

0

自以為是套路,結果反生技術債,開源代碼應該注意這五大誤區(qū)!

本文作者: 蔣寶尚 2020-04-17 16:31
導語:作者 | 蔣寶尚編輯 | 叢末人工智能的研究該不該開源代碼,一直是社區(qū)熱議的話題。畢竟,一項機器學習研究不僅包括理論,算法和應用也是機器學習研究的重要

自以為是套路,結果反生技術債,開源代碼應該注意這五大誤區(qū)!

作者 | 蔣寶尚

編輯 | 叢末

人工智能的研究該不該開源代碼,一直是社區(qū)熱議的話題。畢竟,一項機器學習研究不僅包括理論,算法和應用也是機器學習研究的重要內(nèi)容。

ICML、ICLR 和 NeurIPS 都在嘗試將實驗代碼和數(shù)據(jù)作為評審材料的一部分提交,鼓勵作者在評審或出版過程中提交代碼。事實證明,結果能夠復現(xiàn)的研究往往也更能引起討論,也更能促進學科領域的進步發(fā)展。

但是,卻一直存在著這樣問題:開源研究中的代碼應該如何寫?提交的時候應該注意什么樣的事項,才能幫助其他研究者更容易復現(xiàn)論文結果?

一位機器學習研究員,在reddit上發(fā)出了倡議,提出了機器學習研究中開源代碼時的五大反面教材(反模式),呼吁在開源代碼的時候,盡量避免一些錯誤。

以下為他的倡議原文:

大家好,鑒于這個話題,我必須先聲明一下:我也很佩服發(fā)表論文并有勇氣開放源代碼的研究員,他們非常了不起,我個人也從開源代碼庫中改編過一些代碼,即用于自己的項目,也用于生產(chǎn)代碼。我對此表示最深刻的敬意。

但是,這些代碼有時候也出現(xiàn)問題 **runs for cover**

下面是我個人的筆記,里面包括五個反面教材,如果你有補充,歡迎評論留言,如果你不同意,指出來哪一個,我們展開討論。

在敲機器學習相關研究代碼,或者其他的啥領域代碼的時候,請盡量避免:

1.做一個單一的配置對象,讓所有的函數(shù)不斷傳遞給你。配置文件非常棒,但是如果把他們加載到字典里面,然后到處mutating,那么這就會變成一場噩夢。

注意,在頂層這么操作通常不會有問題,也可以和你的CLI綁定在一起。

2.使用argparse當然可以,但是不要像上面note1那樣使用,另外讓我們廢除 "from args import get_args(); cfg = get_args()"的模式。用更加直接的方法解析命令行的參數(shù)。(例如,如果你使用 argh,自然會讓你圍繞著可重用的函數(shù)來架構你的代碼)

3.請不要讓你的CLI接口泄露到你的實現(xiàn)細節(jié)中去,首先創(chuàng)建庫,然后將其公開為CLI。這會讓所有東西都更具可重用性。

4.除非有充分的理由(提示,很少有),否則不要使用文件作為進程間通信。如果你調(diào)用一個函數(shù)保存了一個文件,然后在下一行代碼中加載這個文件,那就說明出了很大的問題。如果這個函數(shù)是來自不同的repo,可以考慮cloning它,修復后再PRing回來,使用修改后的形式。當然,還是有副作用的,往往會引起一個“無聲”的Bug。

5.在幾乎所有的情況下,除了最瑣碎的情況,做一個事物列表上操作的函數(shù)比在單個事物上操作的函數(shù)更麻煩。所以,如果真的需要一個接受列表的接口,可以直接做一個新的函數(shù),調(diào)用單個函數(shù)就可以了。

網(wǎng)友評論:還真是教科書級別的錯誤!

帖子放到reddit上面之后,立即引起了各路網(wǎng)友反響,大家似乎在一些學術論文中或多或少都遇到了這些問題。

自以為是套路,結果反生技術債,開源代碼應該注意這五大誤區(qū)!

(雷鋒網(wǎng))

哈哈,期初以為我只會在學術論文中遇到這些問題,隨后我進入業(yè)界的時候,發(fā)現(xiàn)機器學習中的技術欠債是真實存在的。

自以為是套路,結果反生技術債,開源代碼應該注意這五大誤區(qū)!

(雷鋒網(wǎng))

在編寫個人研究代碼的時候,我并未總是提前對最終結果有個清晰的想法,接口需要不斷更改,以前有意義的庫可能在一些改變之后不再有意義。我使用反模式,通常是為了趕DDL時候,加快實現(xiàn)速度。

自以為是套路,結果反生技術債,開源代碼應該注意這五大誤區(qū)!

(雷鋒網(wǎng))

一個項目中往往有兩種代碼,一種是作為基礎設施的代碼,另一種是作為研究工作流的代碼。前者應該是相當靜態(tài)的,明確的,有很好的軟件工程。后者應該是靈活的,且有可能是混亂的,能夠優(yōu)化為快速迭代。

自以為是套路,結果反生技術債,開源代碼應該注意這五大誤區(qū)!

這個話題非常重要,但是,你必須說明為什么這些事情是壞的,還必須提出替代方案。

機器學習中的反模式與技術債務

上面提到的五點寫代碼的反模式與機器學習技術債務息息相關,一般來說,反模式一開始用起來很爽,但是維護起來卻有非常大成本開銷。 

自以為是套路,結果反生技術債,開源代碼應該注意這五大誤區(qū)!

機器學習不同于其他,2015年谷歌曾經(jīng)貢獻過一篇年度頂級論文《機器學習系統(tǒng),隱藏多少技術債?》,里面詳細介紹了機器學習系統(tǒng)一些常見的的反面模式。其中過包括:

粘合代碼 :機器學習研究者傾向于開發(fā)普遍適用的解決方案作為自給自足的包(packages)。采用通用軟件包經(jīng)常會導致粘合代碼的系統(tǒng)設計模式,在這種系統(tǒng)設計模式中,包含了大量支持數(shù)據(jù)寫入通用軟件包或者數(shù)據(jù)從通用軟件包中輸出的代碼。

粘合代碼的代價從長遠來看是很高的,因為這會讓機器學習系統(tǒng)非常局限,如果需要測試其他方法,成本就會變得不可避免的昂貴。

對抗粘合代碼的重要策略之一就是,將黑盒包裝進普通的應用程序接口,以便更多地重復利用,降低更換包的成本。

管道叢林:這是粘合代碼的一種特殊情況,經(jīng)常出現(xiàn)在數(shù)據(jù)預備階段。稍不注意,在機器學習系統(tǒng)良好的格式下,預備數(shù)據(jù)的結果系統(tǒng)可能會成為一個充滿碎片的叢林,經(jīng)常也會有中間輸出文件在其中。

只有從整體上考慮數(shù)據(jù)收集和特征提取的過程,才能夠避免“管道叢林”現(xiàn)象的發(fā)生。從頭再來的方式雖然初始投資巨大,但卻能夠大幅度減少持續(xù)增加的成本。

失效的實驗代碼路徑:在主要的生成代碼中,通過執(zhí)行實驗代碼路徑作為條件分支來演示具有選擇性方法的實驗過程,短期內(nèi)很有誘惑力,但是隨著時間的推移,后臺兼容性的維護會非常困難。

結果辦法是周期性地重復檢查每個實驗分支,果斷舍棄廢物分支非常有益

抽象化債務:當時谷歌認為,明顯缺少強抽象來支持機器學習系統(tǒng)。基于的觀察是:機器學習領域的文獻中,沒有哪一篇將相關數(shù)據(jù)庫(relational database)作為基本抽象(basic abstraction)的論文得到的結果能達到接近成功的地步。

常見異味(smell):即在一個系統(tǒng)中或者系統(tǒng)中的一個部件中存在的潛在問題。主要包括:1、POD類(Plain-Old-Data)異味,即機器學習系統(tǒng)采用浮點數(shù)、整數(shù)等普通的數(shù)據(jù)類型進行編碼。2、多語言異味,用多種語言編寫系統(tǒng)經(jīng)常會增加測試成本,并且會增加將所有權讓渡給其他人的難度;3、原型異味,定期地依賴原型環(huán)境意味著機器學習系統(tǒng)的脆弱性,時間壓力會促使一個原型系統(tǒng)變成了產(chǎn)品解決方案,所以長遠看需要付出更多的成本。

雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

自以為是套路,結果反生技術債,開源代碼應該注意這五大誤區(qū)!

分享:
相關文章
當月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設置密碼以方便用郵箱登錄
立即設置 以后再說