為什麼計算機學科的論文不給出具體的參數、代碼、數據集來方便實驗重現呢?
物理、化學的實驗都非常精確,計算機領域的實驗為什麼不這麼規範呢?
做了多年機器學習,說一下自己的看法。
我覺得,是否公開代碼,這取決於圈子內長久以來形成的環境。
機器學習、計算機視覺領域都算是比較好的,如果演算法實現不是太容易,作者基本都會在主頁上公布代碼,即使沒公布,你發個郵件要,作者肯定會給的(反正我沒見過不給我代碼的)。要是演算法就20行MATLAB,真心沒必要掛出去,你也沒必要找人家要。
數據挖掘、信息檢索這些領域的環境似乎沒那麼好(我不是地圖炮,別噴我)。這些領域代碼通常都很長很不好實現,而且通常不公開代碼。尤其是某些研究院,以公司保密要求等為理由拒絕提供代碼。更噁心的是,他們的實驗是在自己公司的數據上做的;在這些公司想要公開數據,確實要經過層層審批,很麻煩的,這倒是不忽悠。現在問題來了,不公開數據、不公開代碼,讀者重複不了實驗,究竟是誰的責任?我一個朋友告訴我,他認識一個人,WWW的ddl前一周開始寫,實驗不做,直接畫個表往裡編數據。最後中沒中我不知道,但這事足以說明,圈子內不公開數據和代碼的生態環境給了一些人大膽造假的勇氣。
至於是否公開參數和調參數方法,這個很大程度上取決於作者的人品。很多人都會在論文里寫清楚怎麼調的,代碼里也有demo,用起來不難。但是我也親眼見過不厚道的人。幾年前我一個朋友在做視覺的一個問題(不是深度學習,應該沒那麼難調),在重複一篇paper的實驗,調了1個月,結果還是差幾個百分點。發郵件問作者要參數,作者說找不到參數了。我們都覺得這paper是謊報結果,建議這哥們放棄,但他不信邪,又調了很久,結果還是那樣。
我的結論是:1. 如果代碼實現起來容易,也不難調參數,真的沒必要公開代碼。
2. 如果代碼複雜,上人家主頁找,找不到就果斷髮郵件要,作者通常會給代碼。不給肯定有貓膩,你可以在paper里說「沒有和XX對比,原因是作者拒絕提供源代碼」。
3. 如果是某些公司的研究院做的,數據和代碼都不公開,就別去follow了。他們造假毫無代價,你重複不出來他們的結果的。
4. 參數調不好,重複不出結果,要果斷髮郵件問作者,不要悶聲自己調。看了作者的回復,基本就知道是你的問題還是作者的問題。
EECS的人寫的maching learning論文很多看上去很美的結果難以重複,他們一般倒不是留了什麼絕活,而是只選擇對自己方法有利的結果發表,而真相是很多時候他們的方法並不那麼好。所以願意share code的人沒那麼多。Everybody wants to show others some shining face, not ass.
誰告訴你物理化學方面的實驗非常精確啊!很多論文里都留了一手的,按照論文里的實驗步驟無法重現論文的結論,只能聯繫作者詢問詳情。這是學術界的普遍現象,不是只是計算機才這樣的。
計算機學科的論文不開放或者共享源代碼還是有很多原因的。不過,每一個子領域源代碼不開放的原因也有其自己的因素。我是做公鑰密碼學的,只能從密碼學這個子領域來回答一下這個問題。
(1) 篇幅問題:給我這麼幾頁真不夠寫
這個主要出現在會議論文中。眾所周知,計算機學科和其他學科一個不同點就是,計算機學科知識更新速度極快,大家更關注會議論文而非是期刊論文。但是會議論文集一般都會有比較嚴格的頁數限制,比如密碼學中最知名的2個會議(Asiacrypt,Eurocrypt)最新一期的投稿要求如下(還有一個頂級會議叫做Crypto,但是2015年投稿要求還沒有出…):
- Asiacrypt 2014
- Eurocrypt 2015
媽蛋,密碼學家那幫抽筋手們,20頁-30頁夠寫個毛啊!而且近期論文為了保證Self-Contained,背景知識+定義就得寫個7-8頁。加上方案論述,證明什麼的,頁碼真心不夠。
實際上,在會議論文發表的時候,一般其內容會遠遠小於投稿的內容。一方面大量的證明、實現什麼的都會在投稿版的附錄中出現,而這些在Camera Ready中會刪掉或者略去。另一方面,我們注意到投稿要求中一般會有這麼個蛋疼的話:in at least 11-point fonts and have reasonable margins,但是Final Version是這麼要求的:in the llncs class format。所以為了在20-30頁內能容下儘可能多的內容,作者一般會人為加大頁面的頁邊距,縮小行距,所以如果一個20頁的論文,用llncs class format編譯的話,一般會達到32頁左右。因此,為了讓正文保有更多的核心內容,作者一般都會在Final Version中把實驗什麼的都刪除掉。因為他們認為:我TM都把方案寫出來了,你們難道不能實現嗎~ 其實是:還真不能…
(2)飯碗問題:理論與工程論文
上面的回答偷了個懶,沒有指出Asiacrypt,Eurocrypt這種論文一般都是理論性很強的論文,注重理論的創新性,並不太關注實現。或者說實現給出一個正確的複雜度分析就可以了。但在很多ACM,IEEE的會議或者期刊中,可實現性都會是一個比較嚴重的問題。那麼,下面的問題就來了:我要是實現了,把源代碼公開了大家用,那我後面的飯碗還不就沒了?如果實現需要依託硬體平台,或者一些一般研究所所無法取得的數據集,源代碼公開與否也還好說。如果沒有這些限制,那麼公開源代碼基本就認為是砸自己的飯碗了… 但是,在投稿版中,作者一般會給出一個GitHub鏈接什麼的,允許審稿人下載代碼並且試運行,這是為了增加中稿率的小技巧了。在Final Version中,作者可以自由地刪除GitHub內容。
(3)開發能力問題:源代碼實在寫的不太好
在密碼學中,已經有很多公開的源代碼了,比如Pairing-Based Cryptography Library(PBC庫),Functional Encryption Library等等。PBC庫是一個寫的非常棒的源代碼,很體現作者Lynn的水平。當然了,PBC庫的實現本身也是Lynn的畢業設計,他也依靠這種開發能力去了Microsoft。但是,像其他一些庫,源代碼寫的確實比較糟糕。而密碼學研究者,尤其是理論研究者,一般都不太擅長代碼實現,這樣的代碼公開了豈不是會被別人噴死… 所以大家也就學乖了,不公開,反正我實現了,我能把時間結果跑出來,我也不想被噴。說實話其實我也是這麼乾的,因為當時要寫一個有關Attribute-Based Encryption(ABE)的工程論文,需要Java的ABE實現(因為也要在Android上面跑)。但是現有的ABE具體實現都是在C上面的,因此我就自己寫了個Access Policy的實現,加上自己的方案,依託java PBC庫實現了自己的ABE。但是那個代碼寫的實在是不太美觀,並且可以進一步做很多很多的優化(重新組織類關係啊,設計介面啊,做成通用庫啊什麼的),因此最後我也沒也不敢公開自己的源代碼,只是在文中提到可以實現,給出實驗結果。
(4)不算作弊的作弊問題:代碼實現中可能會有一些小技巧
我個人不太同意前面一些回答者的說法。在頂級會議和期刊論文中,人們一般不會篩選比較好的數據作為論文的結果,否則會被大家鄙視的… 但是,計算機領域中確實有一些實現過程中的細節問題,看似作弊,實際上仔細想想沒有太大的問題,只能說人家嚴謹。而這些東西,在源代碼中可能會有所體現。舉個例子:在ABE中有一個東西叫做Linear Secret Sharing Scheme(LSSS),這東西基本上是ABE的基礎。這個LSSS的輸入是一個Access Policy,輸出是一個矩陣M,還有一個映射
ho。現在的ABE,如果大家仔細看看的話,都會說自己的複雜度是線性的,或者說計算效率很高。但是,如果不自己實現一下的話,不會發現LSSS的計算是以多項式複雜度增加的!比如Access Policy有一個Threshold有100個and屬性,那麼這個LSSS的輸出時間至少是99階多項式複雜度。這樣的話,實現結果就是一個多項式曲線,而非是一個線性結果。而LSSS實際上現在還沒有一個完整的實現,大家一般都用Access Tree作為替代。那麼,怎麼讓實現結果好看呢?作者稱我們的加密演算法以M和
ho作為輸入,而不是以Access Policy作為輸入。這樣的話LSSS的計算過程就不用算在加密過程裡面了,也就減少了演算法運行時間。這種東西,不自己實現的話確實也發現不了… 而這種東西,如果真的公開代碼跑一跑的話,可能得到的時間結果並不一樣。
當然了,可能別的領域還有一些其他的原因,比如數據比較珍貴不能公開(如SAR原始數據,GPS定位原始數據等等)。不過總體上說,不太喜歡公開源代碼都會有自己的原因的。沒準當我畢業的時候,有心情修改一下我的代碼讓它變得好看的話,可能我也會上傳的~
以上
其實很多人都樂意分享代碼和數據的, 國際上的頂級會議也在提倡實驗的可複製性。至少那些好文章的代碼很多都可以拿到的。分享代碼是件非常有益的事情,不但提高自己的聲譽,而且自己的文章也可以得到更多的引用。 做研究的本質就是把成果分享給別人,優秀學者都樂意這麼做的。
有一個role model, Richard Socher, 可以多學習學習。
辛辛苦苦整理附錄的計算機科學家哭死在廁所。
說一個自己的經歷
從事cs某熱門領域,復現某個知名組的某篇paper,各種嘗試後仍未能復現paper中的結果,遂放棄。
後來偶然得知這篇paper的技術細節被該組拿去給某業內知名公司申專利了,而實現細節在paper中一言帶過。
別說公開參數代碼什麼的了…我還見過頂會best paper連實驗用了幾台機器來做出這個結果都沒寫明的呢
你應該先問是不是。。。
要是沒有代碼,我們這些學渣怎麼灌水?!
你們見過Siggraph用ps修圖的么... 匿了
一般來說, 一篇好的paper都會提供 參數,代碼 和數據集的。
不過不提供以上信息的原因包括但不限於 數據集的版權原因(比如做 車牌識別的資料庫),這個方法申請專利了或者是商業公司做的(比如 google, msra), 有可能提供可執行文件而不是源代碼,
有些參數本身是比較特別的,需要根據處理的數據來調整的, 這個時候需要一些trick, 但不一定會在文章中提出。
一般來說,一篇寫得不錯的文章,都可以通過讀論文來根據其中的步驟實現這個方法。過程中遇到問題的標準做法可以是發email聯繫作者,然後尋求幫助來自己實現,詢問一些可能的參數。
當然網上也有很多人 收集了 提供了 這些信息的論文的 合集:
Reproducible Research in Computational Science(Xin Li of WVU)
根本原因在於,對學術界來說,一個方法的具體實現並不是最重要的,論文所提出的思路,理論和方法本身 才是重點。所以 參數、代碼、數據集 並不是一個論文的必須, 不過我們都希望可以提供,一個是增加可驗證性,二是減少重複勞動。
把代碼給了你,你把別人的路走了,別人就真的無路可走了
要是自己的論文是水的,不給數據別人重現不出來,你就可以說別人數據的錯的,反正也沒多少人有興趣重現。
我只想說,大部分有代碼的論文的方法都火了。
比如SVM,前幾年的DPM,現在的Deep Learning。一方面是論文本身的水平夠高。另一方面是有代碼才好灌水。
可恥地匿了。
其實大部分文章都復現不到它report的結果。很多隨機的東西不可控,可能造成結果的不可複製性,講真,老師會讓我們把實驗使勁跑,使勁調參數,跑到結果老師滿意為止,可是這樣的工作真的有用嗎,也許只能適用於這一個資料庫而已啊?都是灌水,人艱不拆啊。。。一年頂會頂刊這麼多文章,真正能好用的有幾個啊
其實很想,哪怕只有一個,也想做出一個真正能有用的工作,也不想貌似效率很高的樣子一年水多少多少篇論文。想當年我指導老師的論文就是framework加source code加測試環境加測試方法都給了。是關於suffix array sorting的。
後來有民間人員將那份source code性能提升了。老闆看完後,又有想法又提升那個人的版本的性能,又發了一篇。
哈哈哈哈,算是良性循環。
不過後來我研讀後,發現裡面又些小bug。
感覺其實是看圈子風氣和看作者水平,水平夠硬的,發你代碼又如何。最大的問題到不是提供代碼和參數, 事實上有些雜紙建議代碼開放, 並且有 sweave 這陽的軟體。
最大的問題是, 作者有選擇性的發表適用的數據結果, 直接過濾調沒有提高的結果。
應該對每個領域都有一個標準並且全面的要求測試數據集合, 作者必須完成, 他們可以再選擇另外的數據結果添加上。即便這樣, 作者還是會over fit 方法, 不過這個是無法避免的, 但是在實際工程中這是一個重要因素。核心代碼一般是有的,就算是沒有也可以闡述的很明白。但是數據集則大部分根本不能公開。
NIPS每年有一小部分的paper根本沒有實驗部分,證明出來就完了,也不能算不規範吧。
數據集一般都是公開的,實驗部分一般會告訴你用的什麼數據集和參數。代碼的話,許多人會公開,有些就不一定了。
推薦閱讀:
※如何評價「谷歌用神經機器系統把漢語翻譯成英語,錯誤率最高下降85%」?
※如何向文科同學科普自然語言處理(NLP)?
※想進 Google,Facebook 等公司,校招前一段時間是用來實習還是刷演算法題?
※目前常用的自然語言處理開源項目/開發包有哪些?
※各種機器學習的應用場景分別是什麼?例如,k近鄰,貝葉斯,決策樹,svm,邏輯斯蒂回歸和最大熵模型。