我自己的原文哦~? ? ??https://blog.51cto.com/whaosoft/14010384
#UPSCALE
這里設計了一個通用算法UPSCALE,可以剪枝具有任意剪枝模式的模型。通過消除約束,UPSCALE將ImageNet精度提高2.1個點。
paper地址:https://arxiv.org/pdf/2307.08771.pdf
code:https://github.com/apple/ml-upscale
隨著神經網絡規模和復雜度的增長,推理速度在下降。為了應對這一點,通道剪枝這樣的壓縮技術通過刪除權重的通道來刪除參數。但是,對于模型的多分支段來說,刪除通道可能會引入推理時的內存復制操作。這反過來會增加推理延遲,以至于剪枝后的模型比未剪枝的模型慢。為了應對這一點,剪枝方法通常會約束某些通道一起剪枝。這可以完全消除內存復制,但如本文所示,它大大降低了精度。作為變通方法,本文的思路是在導出時重新排序通道,以減少內存復制并提高精度。基于這一思路,本文設計了一個通用算法UPSCALE,可以剪枝具有任意剪枝模式的模型。通過消除約束,本文將ImageNet精度提高2.1個點。進一步地,通過重新排序通道,與基準相比,UPSCALE將推理速度提高了2倍。本文的工作為更廣泛的剪枝算法打開了大門。
Introduction
深度神經網絡模型對越來越多的實際應用來說是必不可少的,但是與此同時神經網絡架構也在逐年增長規模和復雜度。這對具有推理時間約束的許多使用場景來說成為一個大問題,這使得模型壓縮技術變得必要。
通道剪枝是最有效的模型壓縮方法家族之一,它通過刪除卷積或全連接權重的整個通道來減少推理時延遲。盡管其效果顯著,但是通道刪除過程本身在多分支網絡段并不簡單,且常被忽視。這導致兩種不可取的通道剪枝選擇:1) 按照約定增加約束,結果是會降低精度;2) 消除約束,但會增加推理延遲。
首先,沒有約束時,導出網絡的多分支段尤其復雜。在這些段中,不同分支的層可能都使用相同的輸入特征圖,并同時剪枝不同的通道。這會導致不兼容的維度,更重要的是,在推理時網絡必須執行內存復制以確保張量在內存中是連續的。這些內存復制非常耗費延遲,以至于剪枝后的模型可能比未剪枝的模型更慢(圖2)。
其次,為了應對這一點,早期工作通過建立約定來增加約束,具體是約束段的所有分支剪枝相同的通道。這些約束簡化了導出,因此現代剪枝工作更關注剪枝哪些通道,而不是如何在導出時刪除它們。盡管在結構化剪枝方面取得了顯著進步,但這些約束降低了精度。直觀地,約束限制了可能的剪枝模式集合,限制了剪枝的有效性(圖3)。?
為了解決這個問題,本文有兩個思路:1) 重排序通道可以使張量的子集保持連續;2) 張量的連續切片“免費”使用,不需要內存復制。簡而言之,這允許本文放棄常規的剪枝約束以獲得更高的精度。此外,通過消除內存復制,這允許精度收益以較小的延遲代價獲得。
這些思路產生了一個通用的導出算法“UPSCALE”,它可以剪枝具有任意剪枝模式的模型。這支持更廣泛的剪枝算法類,因為它使未約束剪枝的模型延遲更加適中,在某些情況下幾乎完全消除冗余內存復制。本工作做出以下三點貢獻:
- 比較不同約束對精度的影響,涵蓋各種剪枝啟發式方法、架構和稀疏度水平。不受約束的剪枝提高了ImageNet的后訓練剪枝精度,平均提高2.1個點。
- 一個通用的導出工具UPSCALE,與基準相比將推理時間提高2倍以上。這個可插拔工具使未來研究人員可以抽象出導出問題。據本文所知,本文是第一個開發可以支持不受約束剪枝模式的導出工具的。
- 將內存復制最大化抽象為圖形,這可能為進一步的延遲優化打開新的方向。
Related Work
結構化與非結構化剪枝。現有的剪枝工作可以分為非結構化方法和結構化方法。非結構化方法通過閾值和零化單個權重值,而結構化方法在不同粒度層面施加稀疏模式來進行結構約束,從剪枝成塊到刪除整個通道。后者稱為通道剪枝,其優勢不依賴于定制稀疏矩陣原語。其優勢來自于在導出時刪除卷積權重通道,以減少推理時的資源消耗。
通道剪枝策略。除了其獨特的優勢外,通道剪枝還引入了一個獨特的挑戰:復雜拓撲的通道刪除尤其困難,特別是當網絡的多個分支使用或生成共享張量時。為了應對這一點,先前的工作增加約束,限制網絡復雜部分的可能剪枝模式。大多數結構化剪枝工作關注剪枝的其他方面,而不是導出,包括剪枝的啟發式方法、量化粒度、掩碼學習技術等。值得注意的是,這些工作忽視了兩個導出相關的挑戰:1)大多數工作在訓練時使用零一掩碼來模擬剪枝,而不會最終刪除通道;這意味著多分支段的導出挑戰從未出現。2)大多數工作用FLOPs作為延遲的代理;這意味著如果這些工作刪除約束,內存復制的延遲影響從未被發現。這兩種做法組合起來,隱藏了導出相關的挑戰。為了補救這一點,本文直接研究導出,以允許更廣泛的剪枝算法類,展示現有的剪枝啟發式方法可以通過簡單地消除這些約束來獲得更高的精度。
Method
先前的研究主要關注剪枝策略,這些策略在訓練期間通過“零化”通道來模擬剪枝模式。本文的工作與這一研究方向無關,而是專注于如何導出無限制的剪枝模式。
卷積核中的輸入通道和輸出通道都可以被剪枝;剪枝前者稱為“輸入剪枝”(即將剪枝掩碼放在卷積層之前),剪枝后者稱為“輸出剪枝”(即將剪枝掩碼放在卷積層之后)。為了方便起見,本文將重點放在無限制的輸入剪枝上,不失一般性地,可以參考附錄F中的明確描述來了解無限制的輸出剪枝。本文還經驗性地觀察到,輸入剪枝通常優于輸出剪枝(圖A.15,A.16),這激發了本文對輸入剪枝的關注。
請注意,在本方法部分中,本文明確指定“卷積”以便于理解。然而,本文的算法可推廣到任何輸入通道數量獨立于輸出通道數量的操作,例如全連接層。
Step 1 - Reduce to a Segment
本文的算法將網絡架構劃分為多個段(segments)(圖4中的步驟1),非正式地說,是一組可以獨立于網絡的其余部分進行剪枝的層。一個段包括(a)產生輸出的卷積層,稱為“producers”,以及(b)消耗這些張量的卷積層,稱為“consumers”。
為了確定segments,從任意一個producers開始。找到該producers的所有consumers,然后找到這些consumers的所有producers。重復迭代,直到兩個集合都收斂。詳見算法1的更準確的公式表述。
例如,在圖4(步驟1)中,從producersA開始。找到A的consumers:{B,D}。找到它們的producers:{A,C}。找到它們的consumers:{B,D}。注意到本文的consumers集合已經收斂,因此本文的段已經完成。現在,這個segments可以獨立于網絡的其余部分進行剪枝,將剪枝網絡的問題簡化為剪枝單個segments的問題。詳見圖A.14中的更多示例。
Why Memory Copies Occur
簡而言之,當consumers剪枝不同的通道時,會出現內存復制。為了解決這個問題,先前的方法只是將所有consumers約束為剪枝相同的通道,如圖2中的“Constrained”。由于兩個consumers都被約束為剪枝相同的通道,因此導出實現是微不足道的:只需刪除所有consumers剪枝的producers輸出通道即可。
然而,現在考慮圖2中的無約束情況:“Inefficient”。假設consumers II剪枝的通道consumers III沒有剪枝。在導出時,無法刪除II剪枝的通道,因為III仍然需要它。相反,在推理期間,本文會選擇producers的輸出 - 將II所需的每個未剪枝的通道復制到一個新的張量中 - 然后將其傳遞給II。這種方法是導出無約束剪枝模型的基準方法。不幸的是,基準方法中的內存復制會在推理時間產生顯著的延遲成本,以至于這個剪枝模型的延遲比原始未剪枝模型更高(圖7)。
本文的關鍵見解是連續的切片是“免費的”。換句話說,每個consumers取輸入張量的一個切片,而不是將通道復制到一個新的張量中。因此,本文設計了一個算法,可以重新排序producers的輸出通道和consumers的輸入通道(圖2,“Ours”,第3.6節)。現在本文將討論如何計算這個重新排序。
Formulate as a Graph
為了簡化說明,本文將在接下來的內容中研究consumers保留的通道,而不是它剪枝的通道。
為了規范化本文的目標,將本文的約束條件形式化為一個無向圖(圖4,第2步):本文圖中的每個節點代表一個consumers保留的通道集。如果兩個節點共享一個或多個保留的通道,則它們之間共享一個無向邊。每個節點的獎勵是保留的通道數,每個邊的獎勵是共享保留通道數的負數。本文很快就會解釋為什么要這樣做。有了這個圖,可以將內存復制最大化目標規范化。
目標是找到一條路徑?- 或者換句話說,一個節點序列:由于每個節點都是一個consumers,節點的序列表示一系列consumers。反過來,每個consumers序列都有一個零復制的通道順序。例如,假設本文有兩個consumers,節點序列為A、B。零復制通道順序可以通過:首先排序僅由A保留的通道,然后是A和B共享的通道,最后是僅由B保留的通道。這種順序可以確保零內存復制,因為A和B的輸入已經在內存中是連續的。本文可以無限期地為任意數量的consumers繼續這個過程,只要consumers按順序排列即可。總之,路徑可以轉化為零復制的通道順序。更多例子可以參見附錄B。
目標是找到一個無環路徑:假設路徑中的第一個和最后一個節點共享通道。現在,問題在于:將共享通道放在通道順序的開頭還是結尾?無論哪種方式,至少一個consumers的輸入都將在內存中非連續分布。更一般地,序列中的非相鄰consumers不能共享通道。換句話說,沒有兩個不相鄰的節點可以共享一條邊 - 或者更簡潔地說,路徑必須是無環的;否則,在推理期間將需要為共享通道引入額外的內存復制。
目標是找到最大獎勵的無環路徑:如前所述,路徑中的所有通道都需要零復制,因此為了最小化內存復制,本文需要最大化路徑中包含的通道數。之前本文定義了節點和邊的獎勵,使得路徑獎勵等于路徑中包含的通道數。因此,最終最大化包含通道數就是最大化路徑獎勵。
本文最終的正式目標是找到最大獎勵的無環路徑(maximum reward acyclic path)。關于如何通過這樣做來最小化內存復制的端到端示例,請參見附錄C或圖A.10。
How to Find Maximum Reward Acyclic Path
本文首先計算最大獎勵路徑的獎勵,簡稱為“mrp”。為了計算圖 G 的 MRP(G) 獎勵,本文遍歷所有節點 s ∈ G,并計算從節點 s 開始的最大獎勵路徑的獎勵 f(s)。
現在本文的目標是定義 f(s)。為此,考慮節點 s 的所有鄰居:n ∈ A[s],其中 A 是鄰接矩陣。直觀地說,mrp 的獎勵 f(s) 是所有鄰居節點 f(n) : n ∈ A[s] 的最大獎勵路徑的最大獎勵 (a),以及到其鄰居節點的獎勵 Re[s, n],其中 Re 是邊緣獎勵矩陣,表示共享通道的數量。這可以用以下遞歸關系總結:
其中 Rn 是節點獎勵矩陣,表示consumers保留的通道數量。這可以找到最大獎勵路徑,但它不能處理無環約束。請注意,mrp 路徑 p 是通過動態規劃優化目標(即方程式1)獲得的節點序列。
處理無環約束:將最大獎勵無環路徑縮寫為“mrap”。為了處理無環約束,定義一個節點集 I,其中包括所有無效節點。無效節點包括 (a) 已經遍歷的節點,包括當前路徑中的節點,以及 (b) 鄰近路徑的節點,即與路徑中的節點共享邊緣的節點。如果從不遍歷鄰近路徑的節點,則路徑保證是無環的。重新定義子問題為 f(s,I),即從源節點 s 開始且不包括節點 I 的 mrap 的獎勵。
然后可以修改原始目標為以下目標。初始無效集 I 是路徑中唯一的節點,即 {s}。
然后修改遞歸關系為以下關系。為方便起見,將僅從 s 到 n 而避免無效集 I 的旅行的定義因子g(s, n, I) 提取出來。?
簡而言之,方程式 4 在考慮要遍歷的鄰居節點時排除所有無效節點。在考慮每個鄰居節點時,通過添加鄰居節點本身 {n} 和源節點的鄰居 A[s] 來擴展無效集 I。
Step 3 - Compute Channel Order From Graph
注意,最大獎勵無環路徑 p 可以通過動態規劃解決優化問題(即方程式 3)得到,表示為 p ← MRAP(G)。此外,mrap 路徑 p 可能不包含所有節點,例如,如果所有節點都在一個環中。因此,繼續在剩余節點 MRAP(G-p) 上尋找路徑,直到沒有更多節點為止。
在前一步驟中找到路徑然后被轉換為最終的通道順序。如第 3.3 節和圖 4(情況 2)所示,假設有兩個consumers A、B。排序通道僅由 A 保留,然后通道由 A 和 B 共享,然后通道僅由 B 保留。例如,如果 A 保留 1、3,B 保留 2、3,則先排序A 的專有通道(1),然后是共享通道(3),最后是 B 的專有通道(2),生成最終順序:1、3、2。
更一般地,將 mrap 路徑中的排序節點表示為 p = [n1,n2,n3,...]。首先取所有僅由第一個節點保留的通道,將其表示為 n?1。第一個節點只應與第二個節點共享通道,因此這等價于計算集合減法:
更一般地,將“唯一”于節點 i 的通道表示為 n?i。第 i 個節點只應與前 ni-1 和后 ni+1 個節點共享通道,因此取差集以查找所有“唯一”于節點 ni 的通道。
然后,取第一個和第二個節點共享的所有通道,n1 ∩ n2。然后,取第二個節點的“唯一”通道 n?2。然后,取第二個和第三個節點共享的通道,n2 ∩ n3。對于路徑中的所有節點,繼續這樣做。總排序如下所示:?
當路徑耗盡時,繼續使用以下路徑中的節點排序。一旦所有路徑耗盡,排序就完成了。此通道排序在 Algorithm 1 中被總結為一個置換矩陣 Π。請參見圖 4(步驟 3)或圖 A.11 的示例。?
Step 4 - Reorder Weights
然后,使用上一步中的通道排序對producers和consumers中的通道進行重新排序。首先,通道順序直接決定了該段中所有producers的輸出通道順序。更正式地,對于模型權重 W 和producers索引 pi 的列表,本文將通道重新排序表示為 W[pi]Π。其次,對于每個consumers,相應地重新排序consumers的輸入通道(即W[ci]Π)。請參閱算法 1 中的完整算法、附錄 G 中的說明或圖 4 中的示例(步驟 4)。
Generalized Method
一些節點是其他節點的子集。例如,consumersA保留1,2,3;consumersB保留1、2;consumersC保留2、3。A是父節點,B、C 是子節點。盡管A、B、C形式本文圖中的一個循環,可以實現零內存復制適應所有三個consumers的解決方案。簡單地將通道排序為 1、2、3。這與本文的非循環路徑相矛盾要求。為了解決這個問題,引入兩個修改:(1)拒絕循環時忽略父子邊路徑,以及 (2) 如果路徑中的子節點包含所有父節點節點通道,然后將父節點的獎勵添加到路徑的獎勵。有關此子集的擴展描述案例及其解決方案,參見附錄 D。
多個producers。上面的算法假設有只有一個producer。為了處理多個producers,發現哪些渠道在各個producers之間是相互對應的。假設producers A 和 B 的輸出簡單相加。在這個在這種情況下,A 的通道 1 相當于 B 的通道 1。A 的通道 2 相當于 B 的通道 2,所以等等。知道了這一點,可以簡化為單個producers案例,作為 A 的過濾器自動排序提供 B 的過濾器的排序。
然后運行本文的方法,假設卷積 A 是唯一的producer。之后,當重新排序producers的權重時(即步驟 4),通過上述提到的同等通過映射 Πi,將原始排列 Π 映射為每個producers。然后按 W[pi 排序權重]ΠiΠ。為了更多詳細描述和示例參見附錄E。
實驗
本文進行了大量的實驗來表明,相比于有約束剪枝,無約束剪枝可以顯著提高準確率,特別是對于較大的和具有復雜拓撲的模型。對于這些無約束剪枝模型,本文證明UPSCALE 在推理時間上優于基線導出的延遲 - 事實上,在沒有 UPSCALE 的情況下,剪枝后的模型延遲實際上增加了,這使得 UPSCALE 成為必要導出方法。先前所有的方法都利用約束剪枝,在本文的實驗中,消除了這些限制,取而代之的是使用 UPSCALE 導出。
對于訓練后設置,無約束剪枝相比有約束剪枝將 ImageNet top-1 準確率提高高達 76.7%?。本文的目標是評估從有約束切換到無約束剪枝時的精度影響。為了簡單起見,本文使用以前用于有約束剪枝的剪枝算法,通過刪除零一掩碼,來實現無約束剪枝。評估效果受約束或無約束剪枝,本文進行實驗時沒有微調,使用訓練后剪枝:(1)采用模型在 ImageNet 上進行預訓練,(2) 應用各種剪枝啟發式方法使用不同的稀疏度級別進行訓練, (3) 查看 ImageNet top-1驗證準確性。本文以間隔稀疏參數2.5% 從 0% 到 100% 并測試 5 種剪枝策略15+ 架構。
雖然這些剪枝策略是為有約束剪枝而設計的,但本文發現在所有設置中,無約束剪枝實現的精度與有約束剪枝相當或更好,平均獲得了 2.1 個百分點的更優。對于一些情況,特別是對于復雜的拓撲結構和較大的模型(圖 3),無約束剪枝可以獲得顯著的精度提升,ImageNet 精度平均提高了 21.7 個百分點(DenseNet121,L1),在所有稀疏度水平上平均提高,或在特定稀疏度水平上提高了高達 76.7 個百分點(EfficientNetV2-Small,LAMP,12.5%)。這說明無約束剪枝在適當的情況下可以提供額外的好處。本文在圖 6 中總結了結果,并在圖 A.22 和圖 A.23 中報告了完整的結果。附錄 A 中的微調初步結果也顯示了相當大的(5 個百分點)精度差距。
相對于無約束剪枝模式的基準導出,使用 UPSCALE 導出剪枝模型的延遲可以提高高達 52.8%?。這個基準在第 3.2 節中有描述。為了獨立評估本文的重排序算法的有效性,本文采取以下步驟:(1)對在 ImageNet 上預訓練的模型進行訓練后剪枝;(2)導出帶有和不帶有 UPSCALE 的未受限制剪枝模型;(3)對導出的模型的延遲進行基準測試。UPSCALE 可以平均減少所有設置的導出模型的延遲達 8.6%,并在所有稀疏度水平上獲得顯著的延遲優勢,最高可達到 24.9%(SqueezeNet1-1,L1),平均值為所有稀疏度水平(ResNet18,FPGM)達到 52.8% 的延遲降低。需要注意的是,導出未受限制的剪枝模型而沒有使用 UPSCALE 實際上會增加延遲,相對于原始的未剪枝模型來說;在相同的設置中,UPSCALE 能夠實現更適當的延遲降低。?
本文在圖 7 和圖 3 中總結了結果,并在圖 A.24 中報告了完整的結果。需要注意的是,本文的算法中沒有可以控制性能的超參數,因此本文在所有模型上均勻地運行本文的算法以獲得這種性能。本文還繪制了理論上的零內存復制解決方案的延遲,說明任何未受限制的剪枝導出所能達到的最大延遲降低;本文觀察到 UPSCALE 常常表現得近乎最優,延遲幾乎與零內存復制延遲相匹配。
設置。本文使用一張 V100 GPU,配備 32 GB RAM。為了計時導出模型,本文在提供的模型上運行現有的剪枝策略,使用 UPSCALE 進行導出,然后使用 PyTorch 的 jit trace 生成一個不含 Python 的可執行文件。然后,使用 PyTorch 內置的分析工具對這個跟蹤模型進行基準測試,包括 CUDA “activities” 和跟蹤張量內存分配。需要注意的是,該工具會自動處理預熱,例如在啟動定時運行之前運行多個正向傳遞。本文所有的延遲測量是 100 次運行的總和,并報告平均值和標準差。所有的精度都是在 ImageNet ILSVRC 2015(Russakovsky 等人,2015)驗證數據集上報告的。
結論
本文引入了無限制通道剪枝導出(UPSCALE)來更通用地支持剪枝導出;UPSCALE 可以直接應對剪枝現代神經網絡的主要挑戰:即內存和延遲效率問題。此外,本文提出了一個框架和一個近似解決方案,以減少推理時的內存復制,從而減輕效率低下的問題。最終結果是一個通用的剪枝導出庫,擴大了現有和新的剪枝算法可操作的范圍,允許導出任何剪枝模式,并使得無限制剪枝成為傳統受限制剪枝的有力競爭對手。
#Cumulative Reasoning
姚期智領銜提出大模型「思維」框架!邏輯推理正確率達98%,思考方式更像人類了
一出手,瞄準的就是“讓大模型像人一樣思考”這個方向——
不僅要讓大模型一步步推理,還要讓它們學會“步步為營”,記住推理中間的所有正確過程。
具體來說,這篇新論文提出了一種叫做累積推理(Cumulative Reasoning)的新方法,顯著提高了大模型搞復雜推理的能力。
要知道,大模型基于思維鏈等,可以進行問題推理,但面對“要拐好幾個彎”的問題,還是容易出錯。
累積推理正是在此基礎上,加入了一個“驗證者”,及時判斷對錯。由此模型的思考框架也從鏈狀和樹狀,變成了更復雜的“有向無環圖”。
這樣一來,大模型不僅解題思路更清晰,還生出了一手“玩牌”的技巧:
在代數和幾何數論等數學難題上,大模型的相對準確率提升了42%;玩24點,成功率更是飆升到98%。
據清華大學交叉信息研究院介紹,共同一作張伊凡解釋了這篇論文的出發點:
卡尼曼認為人類的認知處理過程包括兩個系統:“系統1”是快速、本能和情感化的,“系統2”是緩慢、深思熟慮、合邏輯的。
目前,大語言模型的表現與“系統1”更為接近,這也或許是它不擅長應對復雜任務的原因。
從這個角度出發設計的累積推理,效果比思維鏈(CoT)和思維樹(ToT)更好。
那么,這種新方法究竟長啥樣?我們一起展開看看。
突破思維鏈&樹“瓶頸”
累積推理的核心,在于改進了大模型思維過程的“形狀”。
具體來說,這個方法用到了3個大語言模型:
- 提議者 (Proposer):不斷提出新命題,即基于當前思維上下文,建議下一步是什么。
- 驗證者 (Verifier):核查提議者的命題準確性,如果正確就將它添加到思維上下文中。
- 報告者 (Reporter):判斷是否已經能得到最終解決方案,來確定是否結束推理過程。
推理過程中,“提議者”先給出提案,“驗證者”負責評估,“報告者”決定是否要敲定答案、終止思考過程。
CR推理示例
有點像是團隊項目里的三類角色:小組成員先頭腦風暴出各種idea,指導老師“把關”看哪個idea可行,組長決策什么時候完成項目。
所以,這種方法究竟是怎么改變大模型思維“形狀”的?
要想理解這一點,還得先從大模型思維加強方法“鼻祖”思維鏈(Chain of Thought,CoT)說起。
這個方法在2022年1月由OpenAI科學家Jason Wei等人提出,核心在于給數據集中的輸入加一段“逐步推理”文字,激發出大模型的思考能力。
選自GSM8K數據集
基于思維鏈原理,谷歌也快速跟進了一個“思維鏈PLUS版”,即CoT-SC,主要是進行多次思維鏈過程,并對答案進行多數投票(majority vote)選出最佳答案,進一步提升推理準確率。
但無論思維鏈還是CoT-SC,都忽略了一個問題:題目不止有一種解法,人類做題更是如此。
因此,隨后又出現了一種名叫思維樹(Tree of Thought,ToT)的新研究。
這是一種樹狀檢索方案,允許模型嘗試多種不同的推理思路,并自我評估、選擇下一步行動方案,必要時也可以回溯選擇。
從方法中可以看出,思維樹比思維鏈更進一步,讓大模型思維“更活躍”了。
這也是為什么玩24點時,思維鏈加成的GPT-4成功率只有4%,但思維樹成功率卻飆升到74%。
BUT無論思維鏈、CoT-SC還是思維樹,都有一個共同的局限性:
它們都沒有設置思維過程中間結果的儲存位置。
畢竟不是所有的思維過程都能做成鏈或者樹,人類想東西的方式往往還要更復雜。
這次的累積推理新框架,在設計上就突破了這一點——
大模型的整體思維過程不一定是鏈或樹,還可以是一個有向無環圖(DAG)!(嗯,有神經突觸內味了)
圖中的邊都有方向,并且不存在任何循環路徑;每個有向邊是一個推導步驟
這也就意味著,它可以將所有歷史上正確的推理結果存儲于內存中,以便在當前搜索分支中探索。(相比之下,思維樹并不會存儲來自其它分支的信息)
但累積推理也能和思維鏈無縫切換——只要將“驗證者”去掉,就是一個標準的思維鏈模式。
基于這種方法設計的累積推理,在各種方法上都取得了不錯的效果。
做數學和搞邏輯推理都在行
研究人員選擇了FOLIO wiki和AutoTNLI、24點游戲、MATH數據集,來對累積推理進行“測試”。
提議者、驗證者、報告者在每次實驗中使用相同的大語言模型,用不同的prompt來設定角色。
這里用作實驗的有GPT-3.5-turbo、GPT-4、LLaMA-13B、LLaMA-65B這些基礎模型。
值得一提的是,理想情況下應該使用相關推導任務數據專門預訓練模型、“驗證者”也應加入正規的數學證明器、命題邏輯求解器模塊等。
1、邏輯推理能力
FOLIO是一階邏輯推理數據集,問題的標簽可以是“true”、“False”、“Unknown”;AutoTNLI是高階邏輯推理數據集。
在FOLIO wiki數據集上,與直接輸出結果(Direct)、思維鏈(CoT)、進階版思維鏈(CoT-SC)方法相比,累積推理(CR)表現總是最優。
在刪除數據集中有問題的實例(比如答案不正確)后,使用CR方法的GPT-4推理準確率達到了98.04%,并且有最小1.96%的錯誤率。
再來看AutoTNLI數據集上的表現:
與CoT方法相比,CR顯著提高了LLaMA-13B、LLaMA-65B的性能。
在LLaMA-65B模型上,CR相較于CoT的改進達到了9.3%。
2、玩24點游戲能力
ToT最初論文中用到的是24點游戲,所以這里研究人員就用此數據集來做CR和ToT的比較。
ToT使用固定寬度和深度的搜索樹,CR允許大模型自主確定搜索深度。
研究人員在實驗中發現,在24點的上下文中,CR算法和ToT算法非常相似。不同點在于,CR中算法每次迭代最多產生一個新的狀態,而ToT在每次迭代中會產生許多候選狀態,并過濾、保留一部分狀態。
通俗來講,ToT沒有上面提到的CR有的“驗證者”,不能判斷狀態(a、b、c)正誤,因此ToT比CR會探索更多無效狀態。
最終CR方法的正確率甚至能達到98%(ToT為74%),且平均訪問狀態數量要比ToT少很多。
也就是說CR不僅有更高的搜索正確率,也有更高的搜索效率。
3、數學能力
MATH數據集包含了大量數學推理題目,包含代數、幾何、數論等,題目難度分為五級。
用CR方法,模型可以將題目分步驟拆解成能較好完成的子問題,自問自答,直到產生答案。
實驗結果表明,CR在兩種不同的實驗設定下,正確率均超出當前已有方法,總體正確率可達58%,并在Level 5的難題中實現了42%的相對準確率提升,拿下了GPT-4模型下的新SOTA。
論文鏈接:https://arxiv.org/abs/2308.04371