「研究問題」寫不明白,讀者一臉懵!MIT博士手把手教你寫「問題設(shè)定」:論文得能變代碼才行
最近,MIT博士Tom Silver發(fā)表了一篇博客,他認(rèn)為有很多AI論文都缺少了「問題設(shè)定」(Problem Setting)部分,或者是字?jǐn)?shù)不夠?qū)е露x不夠清晰,讓讀者在閱讀論文后很難用代碼復(fù)現(xiàn)出具體方法。
博客中介紹了自己關(guān)于如何寫好問題設(shè)定部分的心得,并給出了一些他認(rèn)為寫的比較好的論文樣例以供參考學(xué)習(xí)。
Tom Silver是麻省理工學(xué)院計算機科學(xué)專業(yè)五年級博士生,本科畢業(yè)于哈佛大學(xué)計算機科學(xué)與數(shù)學(xué)專業(yè),主要研究方向是智能機器人,如自動規(guī)劃、程序合成等。
問題設(shè)定里應(yīng)該有什么?
除純理論研究、實驗現(xiàn)象的實證、提出新基準(zhǔn)數(shù)據(jù)等類型的研究外,大部分AI領(lǐng)域的論文中基本都包括三要素:提出了一種新的方法(new method),在某類問題(a certain class of problems)上性能表現(xiàn)良好(perform well);
也就是說,在設(shè)置論文問題時,應(yīng)該能回答三個問題:
1. 這篇論文考慮的是哪一類問題?
這個問題對于潛在讀者來說很重要,他們更想了解手里的問題是否與論文中的問題類別契合。
2. 方法的形式是什么?
這個問題對于尋求替代方法的潛在開發(fā)者來說很重要,他們需要知道應(yīng)該做出怎樣的設(shè)計選擇。
3. 如何測試方法的性能?
這個問題不僅對審稿人來說有價值,對于想要采納論文中研究方案的普通讀者來說也有用。
需要注意的是,研究背景與問題設(shè)定不同,可以為其他領(lǐng)域的讀者提供通用背景知識,但不一定能回答這三個問題。
問題設(shè)定應(yīng)該寫在方法章節(jié)前,并且應(yīng)該給予讀者足夠的信息,在讀完這部分后就可以自己思考如何設(shè)計方法來解決該問題。
把文字寫成代碼
通過一個簡單的測試,就可以檢查出自己論文中的問題設(shè)置部分是否清晰,且足夠完整。
在讀者閱讀完問題設(shè)定部分后,你就需要問問自己,目標(biāo)受眾是否能夠?qū)崿F(xiàn)Problem抽象類、Method抽象類以及run函數(shù)(輸入為Problem和Method,輸出為性能指標(biāo))。
抽象 Problem 類表示論文中定義的問題類別,即使對于相對簡單和熟悉的問題,如圖像分類,也需要描述地非常精確。
圖像是灰度、RGB、RGB-D還是任意N維矩陣?尺寸可以不同嗎?可能的類別是否固定和已知?數(shù)據(jù)集中是否存在訓(xùn)練/驗證/測試集分割?
如果在問題設(shè)定部分中已經(jīng)明確回答了這些問題,讀者應(yīng)該能將文本轉(zhuǎn)換成如下代碼:
import abcimport timefrom dataclasses import dataclassfrom typing import List, Set, Tupleimport numpy as npfrom numpy.typing import NDArrayGrayImage = NDArray[np.uint8] # two-dimensionalLabel = str # e.g., "cat"class Problem(abc.ABC): """An image classification dataset.""" @abc.abstractmethod def get_training_data(self) -> List[Tuple[GrayImage, Label]]: """Labeled data for training.""" @abc.abstractmethod def get_evaluation_data(self) -> List[Tuple[GrayImage, Label]]: """Held-out labeled data for evaluation.""" @abc.abstractmethod def get_image_dims(self) -> Tuple[int, int]: """Images assumed the same size, e.g., (32, 32).""" @abc.abstractmethod def get_all_labels(self) -> Set[Label]: """Output classes assumed fixed, e.g., {"cat", "no-cat"}."""
Method 抽象類描述了論文中提出方法的基本形式。
Method類可從Problem中獲得哪些信息?Method需要對這些信息做什么?
同樣,即使對于熟悉的問題設(shè)定,也需要在寫作時保持足夠精確,以便在實現(xiàn)時不會有歧義:
class Method(abc.ABC): """A method for image classification.""" @abc.abstractmethod def init(self, image_dims: Tuple[int, int], labels: Set[Label]) -> None: """Initialize the method before training starts.""" @abc.abstractmethod def train(self, training_data: List[Tuple[GrayImage, Label]]) -> None: """Train the method given training data.""" @abc.abstractmethod def predict(self, image: GrayImage) -> Label: """Predict the class label for an image."""
run 函數(shù)描述了問題和方法之間的接口,并確定最終報告的性能指標(biāo)。
對于圖像分類任務(wù)來說,實現(xiàn)是直接的,但仍需要選擇與問題相關(guān)的評估指標(biāo),選擇的過程也需要在文中清晰地描述出來。
@dataclassclass Metrics: """Metrics of interest for image classification.""" training_time: float evaluation_accuracy: floatdef run(problem: Problem, method: Method) -> Metrics: """Train and evaluate a method on a problem.""" # Initialization. image_dims = problem.get_image_dims() labels = problem.get_all_labels() method.init(image_dims, labels) # Training. training_data = problem.get_training_data() start_time = time.perf_counter() method.train(training_data) training_time = time.perf_counter() - start_time # Evaluation. evaluation_data = problem.get_evaluation_data() num_correct = 0 num_total = 0 for img, ground_truth_label in evaluation_data: num_total += 1 predicted_label = method.predict(img) if ground_truth_label == predicted_label: num_correct += 1 accuracy = num_correct / num_total return Metrics(training_time, accuracy)
在實驗中,文中需要考慮不同的子類 Method (新提出的方法、基線和消融實驗)和不同的子類 Problem (具有訓(xùn)練/測試分割的不同數(shù)據(jù)集,不同的強化學(xué)習(xí)環(huán)境等)。
如果問題設(shè)定一致,應(yīng)該可以直接運行,然后在Result章節(jié)中報告性能。
metrics = {}for problem in problems: for method in methods: metrics[(problem, method)] = run(problem, method)
這部分的重點并不是讓讀者實際實現(xiàn)任何可運行的代碼,但如果讀者能夠?qū)崿F(xiàn)這兩個抽象類和run函數(shù),并給出足夠的motivation說明,那么問題設(shè)定部分就算寫的比較成功了。
代碼之外的語義
雖然上面提出的測試可以被視為問題設(shè)定部分的必要條件,但卻不是充分條件,即并不是問題設(shè)定的所有特性都可以在代碼中被捕獲。
一些額外的語義信息應(yīng)該表達(dá)出超出測試中檢查的句法(syntactic)信息,包括:
1. 上面運行示例中的灰度圖像可能并不是隨機陣列,而是真實存在或生成的圖像,以結(jié)構(gòu)化或非結(jié)構(gòu)化的方式存儲;也可能是來自互聯(lián)網(wǎng)的隨機圖像子集,或者是精選的卡通長頸鹿集合。
2. 分類標(biāo)簽可能有部分錯誤的情況:標(biāo)簽可以由人類(專家或非專家)進(jìn)行標(biāo)注,也可以是用腳本進(jìn)行自動化標(biāo)注。
3. 訓(xùn)練可能意味著在大型計算機集群上運行一次,持續(xù)很長一段時間,或者在嵌入式設(shè)備上運行數(shù)千次,每次持續(xù)很短的時間;預(yù)測也有類似的自由度。
語義信息在問題設(shè)定部分中很難檢查,但它的重要性并不亞于問題本身,為了確保意圖是清晰明確的,用一個或多個具體的例子來說明你的環(huán)境中的問題和方法是很有用的;將文中的問題設(shè)定與之前相關(guān)工作中的問題進(jìn)行比較和對比也很有用。
優(yōu)秀樣例
有一些論文在問題設(shè)定部分寫的非常好。
圖片
論文鏈接:https://arxiv.org/pdf/2011.10024.pdf
這篇論文在闡述問題類別時寫的特別好,將其基本設(shè)定描述為MDP的分布。
但作者并沒有就此止步,還直觀地、形式化地描述了文中提出方法可以運行的一個分布,還清晰地建立了問題設(shè)定和其他常見問題之間的關(guān)系。
圖片
論文鏈接:https://openreview.net/pdf?id=bERaNdoegnO
這篇論文的問題設(shè)定部分對問題目標(biāo)有一個出色的、簡潔的描述,作者選擇了一個相對狹窄的框架來解決問題。
圖片
論文鏈接:https://arxiv.org/pdf/2301.06054.pdf
這篇論文中有一個非常簡潔的問題定義,包含了所有的基本信息,對在線訓(xùn)練和評估期間發(fā)生的所有事情都進(jìn)行了描述,方法的形式也是非常清晰的。
圖片
論文鏈接:https://arxiv.org/pdf/2303.04912.pdf
這篇論文在描述非常復(fù)雜的問題設(shè)定方面做得非常好,使用了圖表輔助。
圖片
論文鏈接:https://arxiv.org/pdf/2306.06236.pdf
這篇文章的作者找到了一個明確的方法,從一個抽象描述開始,然后用符號讓問題變得清晰;問題設(shè)定中有很多符號,但在這種情況下,符號是非常有必要的,對閱讀來說也很有幫助。
參考資料:
https://lis.csail.mit.edu/whats-your-problem-an-oft-missing-section-in-ai-papers/