清北微軟深挖GPT,把上下文學習整明白了!和微調基本一致,只是參數沒變而已
大型預訓練語言模型其中一個重要的特點是上下文學習(In-Context Learning,ICL)能力,即透過一些示範性的輸入-標籤對,就可以在不更新參數的情況下對新輸入的標籤進行預測。
性能雖然上去了,但大模型的ICL能力到底從何而來仍然是一個開放的問題。
為了更好地理解ICL的工作原理,清華大學、北京大學和微軟的研究人員共同發表了一篇論文,將語言模型解釋為元優化器(meta- optimizer),並將ICL理解為一種隱性的(implicit)微調。
論文連結:https://arxiv.org/abs/2212.10559
#從理論上講,這篇文章弄清楚了Transformer注意力中存在一個基於梯度下降優化的對偶形式(dual form),並在此基礎上,對ICL的理解如下。 GPT首先根據示範實例產生元梯度,然後將這些元梯度應用於原始的GPT,並建立ICL模型。
在實驗中,研究人員綜合比較了ICL和基於真實任務的明確微調的行為,以提供支持該理解的經驗證據。
結果證明,ICL在預測層面、表徵層面和注意力行為層面的表現與明確微調類似。
此外,受到元優化理解的啟發,透過與基於動量的梯度下降演算法的類比,文中還設計了一個基於動量的注意力,比普通的注意力有更好的表現,從另一個方面再次支持了該理解的正確性,也展現了利用該理解對模型做進一步設計的潛力。
ICL的原理
研究人員首先對Transformer中的線性注意力機制進行了定性分析,以找出它與基於梯度下降的最佳化之間的對偶形式。然後將ICL與顯式微調進行比較,並在這兩種最佳化形式之間建立連結。
Transformer注意力就是元優化
#設X是整個query的輸入表徵,X'是範例的表徵,q是查詢向量,則在ICL設定下,模型中一個head的注意力結果如下:
可以看到,移除縮放因子根號d和softmax後,標準的注意力機制可以近似為:
#將Wzsl設為Zero-Shot Learning(ZSL)的初始參數後,Transformer注意力可以轉換為下面的對偶形式:
#可以看到,ICL可以解釋為一個元最佳化(meta -optimization)的過程:
1. 將基於Transformer的預訓練語言模型作為一個元優化器;
2. 透過正向計算,根據示範樣例計算元梯度;
3. 透過注意力機制,將元梯度應用於原始語言模型上,建立一個ICL模型。
ICL和微調對比
為了比較ICL的元優化和顯式優化,研究人員設計了一個具體的微調設定作為比較的基線:考慮到ICL只直接作用在註意力的key和value,所以微調也只更新key和value投影的參數。
同樣在非嚴謹形式下的線性注意力中,微調後的head注意力結果可以被表述為:
為了與ICL進行更公平的比較,實驗中進一步將微調設定限制如下:
#1. 將訓練範例指定為ICL的示範範例;
2. 只對每個例子進行一步訓練,其順序與ICL的示範順序相同;
3. 用ICL所用的模板對每個訓練樣例進行格式化,並使用因果語言建模目標進行微調。
比較後可以發現,ICL與微調有許多共同的屬性,主要包括四個面向。
都是梯度下降
#可以發現ICL和微調都對Wzsl進行了更新,即梯度下降,唯一的區別是,ICL透過正向計算產生元梯度,而finetuning則透過反向傳播獲得真正的梯度。
相同的訓練資訊
ICL的元梯度是根據示範範例獲得的,微調的梯度也是從相同的訓練樣本中得到的,也就是說,ICL和微調共享相同的訓練資訊來源。
訓練範例的因果順序相同
#ICL和微調共享訓練範例的因果順序,ICL用的是decoder-only Transformers,因此示例中的後續token不會影響到前面的token;而對於微調,由於訓練示例的順序相同,並且只訓練一個epoch,所以也可以保證後面的樣本對前面的樣本沒有影響。
都作用於注意力
#與zero-shot學習相比,ICL和微調的直接影響都僅限於注意力中key和value的計算。對於ICL來說,模型參數是不變的,它將範例資訊編碼為額外的key和value以改變注意力行為;對於微調中引入的限制,訓練資訊也只能作用到注意力key和value的投影矩陣中。
基於ICL和微調之間的這些共同特性,研究人員認為將ICL理解為一種隱性微調是合理的。
實驗部分
任務與資料集
研究人員選擇了橫跨三個分類任務的六個資料集來對比ICL和微調,包括SST2、SST-5、MR和Subj四個用於情感分類的資料集;AGNews是一個主題分類資料集;CB用於自然語言推理。
實驗設定
模型部分使用了兩個類似GPT的預訓練語言模型,由fairseq發布,其參數量分別為1.3B和2.7B.
對於每個任務,使用相同的模板來對ZSL、ICL和微調的樣本進行格式化。
結果
#準確度
與ZSL相比,ICL和微調都取得了相當大的改進,這意味著它們的最佳化,對這些下游任務都有幫助。此外,ICL在少數情況下比微調更好。
Rec2FTP(Recall to Finetuning Predictions)
#GPT模型在六個資料集上的得分結果顯示,平均而言,ICL可以正確預測87.64%的例子,而微調可以修正ZSL。在預測層面,ICL可以涵蓋大部分正確的行為進行微調。
SimAOU(Similarity of Attention Output Updates)
從結果可以發現,ICL更新與微調更新的相似度遠高於隨機更新,也意味著在表示層面上,ICL傾向於以與微調變化相同的方向改變注意力結果。
SimAM(Similarity of Attention Map)
以上是清北微軟深挖GPT,把上下文學習整明白了!和微調基本一致,只是參數沒變而已的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DMA在C 中是指DirectMemoryAccess,直接內存訪問技術,允許硬件設備直接與內存進行數據傳輸,不需要CPU干預。 1)DMA操作高度依賴於硬件設備和驅動程序,實現方式因係統而異。 2)直接訪問內存可能帶來安全風險,需確保代碼的正確性和安全性。 3)DMA可提高性能,但使用不當可能導致系統性能下降。通過實踐和學習,可以掌握DMA的使用技巧,在高速數據傳輸和實時信號處理等場景中發揮其最大效能。

使用C 中的chrono庫可以讓你更加精確地控制時間和時間間隔,讓我們來探討一下這個庫的魅力所在吧。 C 的chrono庫是標準庫的一部分,它提供了一種現代化的方式來處理時間和時間間隔。對於那些曾經飽受time.h和ctime折磨的程序員來說,chrono無疑是一個福音。它不僅提高了代碼的可讀性和可維護性,還提供了更高的精度和靈活性。讓我們從基礎開始,chrono庫主要包括以下幾個關鍵組件:std::chrono::system_clock:表示系統時鐘,用於獲取當前時間。 std::chron

交易所內置量化工具包括:1. Binance(幣安):提供Binance Futures量化模塊,低手續費,支持AI輔助交易。 2. OKX(歐易):支持多賬戶管理和智能訂單路由,提供機構級風控。獨立量化策略平台有:3. 3Commas:拖拽式策略生成器,適用於多平台對沖套利。 4. Quadency:專業級算法策略庫,支持自定義風險閾值。 5. Pionex:內置16 預設策略,低交易手續費。垂直領域工具包括:6. Cryptohopper:雲端量化平台,支持150 技術指標。 7. Bitsgap:

在C 中處理高DPI顯示可以通過以下步驟實現:1)理解DPI和縮放,使用操作系統API獲取DPI信息並調整圖形輸出;2)處理跨平台兼容性,使用如SDL或Qt的跨平台圖形庫;3)進行性能優化,通過緩存、硬件加速和動態調整細節級別來提升性能;4)解決常見問題,如模糊文本和界面元素過小,通過正確應用DPI縮放來解決。

C 在實時操作系統(RTOS)編程中表現出色,提供了高效的執行效率和精確的時間管理。 1)C 通過直接操作硬件資源和高效的內存管理滿足RTOS的需求。 2)利用面向對象特性,C 可以設計靈活的任務調度系統。 3)C 支持高效的中斷處理,但需避免動態內存分配和異常處理以保證實時性。 4)模板編程和內聯函數有助於性能優化。 5)實際應用中,C 可用於實現高效的日誌系統。

在C 中測量線程性能可以使用標準庫中的計時工具、性能分析工具和自定義計時器。 1.使用庫測量執行時間。 2.使用gprof進行性能分析,步驟包括編譯時添加-pg選項、運行程序生成gmon.out文件、生成性能報告。 3.使用Valgrind的Callgrind模塊進行更詳細的分析,步驟包括運行程序生成callgrind.out文件、使用kcachegrind查看結果。 4.自定義計時器可靈活測量特定代碼段的執行時間。這些方法幫助全面了解線程性能,並優化代碼。

在MySQL中,添加字段使用ALTERTABLEtable_nameADDCOLUMNnew_columnVARCHAR(255)AFTERexisting_column,刪除字段使用ALTERTABLEtable_nameDROPCOLUMNcolumn_to_drop。添加字段時,需指定位置以優化查詢性能和數據結構;刪除字段前需確認操作不可逆;使用在線DDL、備份數據、測試環境和低負載時間段修改表結構是性能優化和最佳實踐。

C 中使用字符串流的主要步驟和注意事項如下:1.創建輸出字符串流並轉換數據,如將整數轉換為字符串。 2.應用於復雜數據結構的序列化,如將vector轉換為字符串。 3.注意性能問題,避免在處理大量數據時頻繁使用字符串流,可考慮使用std::string的append方法。 4.注意內存管理,避免頻繁創建和銷毀字符串流對象,可以重用或使用std::stringstream。
