純研究O1的論文都發出來了,讓我想起來研究紅樓夢的紅學
有點意思的論文 2410.13639
A COMPARATIVE STUDY ON REASONING PATTERNS OF OPENAI’S O1 MODEL
簡而言之就是曼徹斯特大學,浙大和中科大還有一些開源的項目組一些一起研究OpenAI O1的人,來發O1為什么牛B的論文。
正常,研究紅樓夢畢竟也有紅學(我是一集紅樓夢也沒看過,書和電視都沒看過)。。。
文章主要講分析猜測和評估OpenAI的推理模式在不同任務上的效果。
同時也利用不同的模型比如GPT4o,Gemma,LLama, Qwen等嘗試利用分析出來的O1的推理方式。
也嘗試過在鏈式推理的過程中使用不同的PRM(process reward model),包括LLama,GPT4o,甚至人類...
評估的標準主要是在:
1- 常識推理:其中選擇HotpotQA和Collie來評估LLM的常識推理能力。HotpotQA主要關注需要LLM使用多個支持文檔來回答的常識推理問題。Collie需要LLM根據不同層次的生成標準生成符合特定豐富組合約束的文本。
2-數學:直接使用AIME基準來評估模型的數學能力,AIME 22、AIME 23和AIME 24中的90個問題。
3-編碼:使用USACO 競賽的銅牌級別來測試LLM的編碼技能。USACO專注于算法和問題解決能力。
因為現有的模型能力無法支持O1級別的鏈式推理,所以用GPT4o,Llama這些模型來實現的話,需要利用prompts來incontext-tunning,或者進行function calling來實現對每個step去找PRM分析best answer。
計算方法,選擇了四種方法可能得鏈式推理方式:
- Best-of-N (BoN)。它使LLM為給定輸入生成多個 N 輸出,然后選擇最合適的響應作為輸出。
- Step-wise BoN。它使LLM分析一個問題并將其分解為幾個子問題。對于每個步驟,模型根據之前的子問題和答案生成 N 個響應,然后使用獎勵模型選擇最佳響應。這個過程反復進行,直到獲得原始問題的最終答案。
- Self-Refine。通過迭代反饋和改進,提高LLM的初始輸出。
- Agent Workflow。LLM智能體通過結構化工作流將復雜任務分解為較小的子任務,規劃其執行并利用各種工具來實現其目標。(其實就是Agentic rag)。
圖表解釋
這張圖表顯示了不同模型和方法在四個基準(HotpotQA、Collie、USACO、AIME)上的性能結果。這些基準分別用于測試常識推理、編碼和數學能力。
表格說明
- Setting(設置):分為Direct(直接生成)和Test-Time(測試時計算)。直接生成的意思就是模型直出,比如O1-preview和O1-mini,或者GPT4o直出,Test-Time的意思就是用外力(prompt,Agent)來模仿類似O1的可能性推理步驟。
- Baselines(基線):列出了O1-preview、O1-mini、GPT-4o等模型。
- N:表示生成的輸出數量。
- Overall(整體):各模型和方法總體表現。
- Commonsense Reasoning(常識推理):包括HotpotQA和Collie兩個子任務的表現。
- Code(編碼):包括USACO任務的表現。
- Math(數學):包括AIME任務的表現。
通過解讀,可以看出O1-mini在大多數子任務中表現優異(比O1-preview牛B,只是在code上誰也干不過O1-preview,看過O1的正式版評測,提升特別明顯,這個后面有機會再寫),尤其是在AIME數學任務中。相反,Self-Refine方法在各個任務中的表現相對較差。Agent Workflow方法在多個領域(特別是編碼任務USACO)表現出色。
表里面的這個通過Test-Time的design來實現O1類似的推理方式的方法咋實現的呢?
其實也挺好理解的,我舉幾個例子:
Best-of-N
就是在一堆答案里給選一個最好的,在強化學習領域O1的架構已經不是單一模型來support了,推理的結果一般都是呈現出多個,比如上圖的多條鏈式推理,然后Verifier,也就是RM,reward model,會給出這些答案的一個最終的分數,選一個最好的。
這個其實挺好實現的,首先你prompt里面讓GPT4o以COT形式回復。
但是這不是就一個答案嗎?現在咱們讓它給我生成2個以上的選擇。
這不就Vans了嗎!
然后RM也就是Verifier來給結果打個分,這就是樸素的視線鏈式推理,并且BoN的方法,選出一個分數最高的,發給用戶。
但是問題來了,面上來看,最終答案最好,也就是全局最好的答案,是局部最優的嗎?
這還真不一定。理論上來講只是這些答案中的最好。(子博弈。這塊比較繞,我在強化學習的課程里,會陸續講解,大家看不懂也沒事,大概看個樂子就行)。
第二種是啥呢?
Step-wise BoN
就是給你推理鏈里面的每一步得分,都由RM來打分,所以也就叫做PRM (process RM),作為這次推理里面哪一個是最好的, 然后被選擇進入成為這個Tree的一個節點,然后就這么一步一步的推下去,每步推幾個答案,選最后的,知道最終答案。
這個其實看著好像是比BoN牛B,但是一樣犯悖論
什么悖論呢?就是局部最優(中間某一步最優)然后以它為節點繼續推,推出的答案一定是最優的嗎?
很顯然,不是。
怎么實現呢?
其實隨便瞎寫寫就能實現。
def step_wise_bon(model, reward_model, input_text, N_intermediate, N_responses_per_step):
"""
Step-wise BoN with Reward Model.
Args:
- model: The language model used to generate responses.
- reward_model: The reward model used to score responses.
- input_text: The initial input text.
- N_intermediate: Number of intermediate steps.
- N_responses_per_step: Number of responses to generate per step.
Returns:
- final_response: The final response after all intermediate steps.
"""
# Initialize the intermediate responses with the input text
intermediate_responses = [input_text]
for i in range(N_intermediate):
step_responses = []
# Generate N_responses_per_step responses for each intermediate response
for intermediate in intermediate_responses:
responses = [model.generate(intermediate) for _ in range(N_responses_per_step)]
step_responses.extend(responses)
# Use the reward model to score and select the best response
best_step_response = max(step_responses, key=lambda response: reward_model.score(response))
# Update intermediate responses for the next step
intermediate_responses.append(best_step_response)
# The final response is the last response in the intermediate responses
final_response = intermediate_responses[-1]
return final_response
# Example usage
input_text = "What are the benefits of a healthy diet?"
N_intermediate = 3
N_responses_per_step = 5
# Assume `model` and `reward_model` are pre-defined and properly initialized
final_response = step_wise_bon(model, reward_model, input_text, N_intermediate, N_responses_per_step)
print("Final Response:", final_response)
就是分解完任務后,每一步作為循環的一個分支,每個分支完成前調一下RM,然后繼續推
其實還有Beam-search,我自己做的類似O1的架構用的就是beam-search
看圖的話,比較好理解
每一步都從N個答案中選出best-of-N,這也是大模型標準推理選擇的decoding算法,也就是續寫類任務。
然后N個備選中的,比如綠色答案。就有資格再生成N個或者h個(看設計),然后這么一直推,直到樹到了leaf節點,沒東西可推了,比如無條件符合,或者有了最終答案。
這個和step-wise BoN的差不多,區別是樹的搜索域更廣,因為每一步都是Top K個,如果k=1其實就和step-wise BoN沒啥區別了。
下面是我的BYo1的截圖,我這個的算法就是Beam-search,我實測它效果最balance一點,意思就是推理算力和時間和準確性的balance。
其實還有一種就是Lookahaed Search。
就是MCTS,蒙特卡洛書的帶Verifier的版本,不像MCTS要隨機的去一直推,因為有Verifier給打分,所以相對好一點,它每次都要推k步,然后推到底,再回頭用總推理鏈的得分去評估,比如上圖的4個鏈,哪個鏈的K步更好,然后選擇以后繼續在往下推K步,如果K=1,變成1步,也可以把Beamsearch當成lookahead search,某種意義上來講,它盡力兼顧了全局和局部最優(Beamsearch只能k=1步,很難兼顧全局),我個人認為O1采用Lookahaed的算法可能性比較大,但是這玩意費算力,費顯存,我自己也沒弄,這個論文里也沒弄。
Self-Refine:
這個其實就是SCore,大家可以自己看看論文,看不懂我后面找機會講,說白了,如果你用過早期O1,不是會發現它會自己審核自己發出來的中間步驟是否不和邏輯嗎,這就是Self-Refine。
def self_refine(model, input_text, iterations):
response = model.generate(input_text)
for _ in range(iterations):
response = refine_response(response)
return response
def refine_response(response):
# 定義如何改進響應的具體邏輯
return response + " (refined)"
大概這樣就能實現,當然Train的時候就得加帶reasoning的數據,硬去做這個self-refine,拿普通模型,還是有點別扭。
Agent Workflow:
這個就純調Agent了Agentic RAG類似的架構,也沒啥可說的,調rag,調tool
前置條件都講解完了,現在說測試結論:
Self-Refine方法的性能改進并不顯著。在大多數任務中,Self-Refine相比GPT-4僅顯示出了輕微的改進,并且在Collie任務中性能下降。作者認為,這是因為在反復精煉過程中,LLM可能生成稍微偏離所需格式的響應。(它模型就沒經過Self-Refine測試訓練過)。
BoN在HotpotQA上表現相對較好。它展示了在推理階段通過擴展時間搜索更多可能響應的必要性。然而,BoN在Collie上的性能相比原始GPT-4o有所下降。此外,當N增加時,性能略有下降。作者認為這是由于Collie嚴格的格式要求,限制了LLM生成的多樣性輸出。(可見簡單的BoN拓展了動作空間就能有很好的效果,但是在玩指令遵從性比較嚴格的場景,動作空間越大,越難處理)
Step-wise BoN在復雜任務中的表現受限。對于Step-wise BoN,它在HotpotQA上取得了優秀成績,但在其它限制輸出文本的復雜基準上表現顯著下降。作者認為這是因為逐步方法生成了許多中間步驟,但無法跟隨原始問題。(和BoN一樣)
Agent Workflow在所有基準上表現出顯著的性能改進。Agent Workflow采用類似于Step-wise BoN的方法,將復雜任務分解為小的子任務,但設計了一系列領域特定的系統提示,從而減少了不必要的推理步驟并輕松完成長上下文推理。與Step-wise BoN相比,利用工具組合的Agent Workflow可以顯著提升性能。(從O1的實際架構角度推測,確實是多模型服務,從這個角度上解讀成Agent workflow,硬解釋也可以)
文章也自己猜測和定義了幾種O1的推理范式(注意,范式不是算法)
- 系統分析Systematic Analysis (SA):從問題的總體結構出發,O1首先分析輸入和輸出以及約束條件,然后決定選擇的算法和數據結構的使用。
- 方法重用Method Reuse(MR):對于一些可以轉化為經典問題(如最短路徑或背包問題)的問題,O1可以快速重用現有方法來解決它們。
- 分而治之Divide and Conquer (DC):它將復雜的問題分解為子問題,并通過解決子問題來構建整體解決方案。
- 自我改進Self-Refinement(SR):在推理期間評估其推理過程,以確定是否存在任何問題并糾正任何錯誤。
- 上下文識別Context Identification (CI):對于一些需要額外信息輸入的數據集(如HotpotQA),O1首先總結與查詢相關的上下文的不同方面,然后給出相應查詢的響應。
- 強化約束Emphasizing Constraints (EC):對于一些在生成的文本上有約束的數據集(如Collie),O1通常在推理過程中強調相應的約束。
隨機選擇了每個基準中的20到30個樣本來統計不同推理模式的數量。如圖所示,不同任務需要不同的推理模式。特別是在常識推理任務中,O1傾向于使用特定任務的全局分析方法(如上下文識別和強化約束)和分而治之方法。在數學和編碼任務中,O1主要依賴分而治之和方法重用。對于Collie和AIME,O1遵循相對較短的推理過程,我們發現這也與其推理模式有關。具體而言,O1通常采用方法重用的方法,直接應用知名經典解決方案來解決數學問題,而無需多步推理。對于Collie,O1傾向于使用強化約束推理模式。這使模型能夠在Collie嚴格的格式要求下,防止生成過長的推理過程,導致輸出不符合格式要求。
再總結一下:
- 在常識推理任務HotpotQA上,分而治之(DC)使用頻率最高。
- 在Collie這種強指令遵從任務中,強化約束(EC)使用頻率最高。
- 在AIME這種數學任務中,方法重用(MR)和分而治之(DC)使用頻率相等且較高。
- 在USACO 的coding任務中,分而治之(DC)使用頻率最高。
另外作者發現了幾個有邏輯的問題,值得解釋一下。
長上下文推理限制了Step-Wise BoN
除了生成多個響應外,Step-wise策略在擴展推理時間方面也很重要。具體來說,Step-wise方法通常會生成許多中間步驟,過長的上下文信息可能會阻礙模型從原始輸入生成正確響應。如表所示,不同任務中Step-wise BoN推理的中間步驟中的平均token數量。幾乎所有任務的推理tokens平均數量都超過200,這也證實了Step-wise BoN需要模型具備強大的長上下文跟蹤能力。Step-wise BoN在Collie和AIME等輸出文本格式和推理過程高度復雜的任務中表現較差(例如,Step-wise BoN在Collie上的準確率不到12%,在AIME上的性能僅為其他方法的一半)。然而,對于不需要嚴格的輸出格式或復雜推理的任務(例如HotpotQA),BoN和Step-wise BoN顯著提高了模型的結果(當N=4時,Step-wise BoN 比 GPT-4o 高出2.55%,BoN在HotpotQA上比GPT-4o高出0.36%)。
也就是說你的動作空間(當然指本次可選,而不是全部動作空間)越大,BoN在一般任務的表現就越好。
后面也發現了,這個邏輯是8及8以下的,如果可選動作空間太大,那呈邊界遞減甚至衰減的態勢,我個人認為最大的原因是局部最優影響了全局最優。
不同任務中推理tokens的數量
為了探究推理tokens的數量是否與O1的能力有關,作者制定了一條規則來提取O1推理tokens,并計算其在不同任務中的數量。此外,作者計算了正確和錯誤樣本的平均token數量。為了探索輸入提示長度與推理tokens長度之間的關系,作者還計算了平均輸入長度。如圖所示,對于同一任務,正確和錯誤樣本的tokens數量相似,并且輸入提示長度與推理tokens長度之間沒有明確的相關性。相反,不同任務中的推理tokens數量存在顯著差異。具體地,對于常識推理任務(如HotpotQA和Collie),O1的推理tokens長度相對較短。然而,對于更復雜的任務(如代碼任務USACO和數學任務AIME),模型通常需要更長的推理過程以獲得正確答案。
獎勵模型限制了搜索方法的能力
這塊就不講了,不用想,肯定reward model越牛B,你推理越準確,這也沒啥好講的。
搜索空間(可選動作空間)也決定了LLM的上界
除了Agent Workflow,BoN在不同數據集上也表現相對良好,但其表現受到N值的限制。為了充分探究BoN能力的上界,在HotpotQA中增加了N值,以全面評估基于不同能力水平的LLM的BoN能力。具體來說,如圖所示,比較了使用不同基線模型在不同搜索空間(即,N = 1, 4, 8, 16)下BoN 的結果。
評估了Qwen2.5-72B 和 Llama3-70B 這兩個模型。結果表明,隨著N值的增加,BoN的性能趨于穩定。需要注意的是,Qwen2.5和Llama3在HotpotQA數據集上都表現出色。然而,當BoN使用這三個模型作為基線模型時,隨著N值的增加,性能并沒有持續提高。當N > 8時,模型性能要么趨于穩定,要么下降,作者認為其原因在于搜索方法的性能與獎勵模型和搜索空間共同相關。
本文轉載自微信公眾號「??熵減AI???」,可以通過以下二維碼關注。轉載本文請聯系??熵減AI???公眾號。??微博:Transformer-周
