精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
一文理解“上下文學習”----大語言模型突現能力

前言

該能力簡單來說就是,對于一個預訓練好的大語言模型,遷移到新任務上的時候,只需要給模型輸入幾個示例(示例輸入和示例輸出對),模型就能為新輸入生成正確輸出而不需要對模型做 fine-tuning。

這也引發了研究人員對該能力產生原因的思考和探索。本文會首先給讀者介紹什么是上下文學習,接著解讀一篇最近由微軟研究院發布的探索 LLM 上下文學習能力來源的文章[7]

什么是上下文學習(In-Context Learning)?

GPT-n 系列的模型都屬于自回歸類的語言模型,所謂自回歸模型就是根據當前輸入預測下一個詞,然后將預測結果和輸入拼接再當做模型的輸入再預測下一個詞,這樣循環往復。

而自回歸模型的訓練目標也很簡單,就是從超大規模語料庫中采樣訓練樣本,模型根據輸入輸出一個概率向量(概率向量包含所有詞的預測概率,對于GPT-3 模型來說,維度約1千多萬),而因為文本數據自帶標注所以我們是知道真實的下一個詞,所以損失函數就采用得交叉熵。

然后研究人員發現,預訓練好的 GPT-3 模型擁有一項神奇的能力,后來被稱為:上下文學習(In-Context Learning)。

這項能力簡單來說就是,預訓練好的 GPT-3 模型在遷移到新任務上的時候并不需要重新訓練,而只需要提供任務描述(這個任務描述是可選項)接著提供幾個示例(任務查詢和對應答案,以一對對的形式組織),最后加上要模型回答的查詢。將以上內容打包一起作為模型的輸入,則模型就能正確輸出最后一個查詢對應的答案。

舉個例子:

比如現在想用 GPT-3 來做個翻譯任務,翻譯英文為法文。輸入的格式如下:

https://ai.stanford.edu/blog/in-context-learning/

首先第一行是對任務描述,告訴模型要做翻譯,接下來三行就是示例,英文單詞和對應的法文單詞對,最后一行就是待翻譯的英文單詞。將以上內容整體作為 GPT-3 的輸入,讓模型去補全輸出就能得到 cheese 對應的法文單詞。

上下文學習非常的靈活,除了上面展示的翻譯任務,還可以做語法修飾甚至寫代碼。而神奇的地方就在于,在 GPT-3 的訓練過程中是并沒有顯式的提供,類似測試階段任務描述加示例這樣的訓練數據。

當然 GPT-3 的訓練數據量非常巨大(比如包含了 wiki, 書本期刊,reddit 上的討論等等),或許里面就已經就包含了各種任務類似結構的數據,GPT-3 模型容量足夠大能夠將所有訓練數據都記了下來。

對于上下文學習能力的成因,目前還是一個開放性的問題。為什么只有大規模的語言模型才會具備該能力?或許只有模型參數量大還不夠,還必須要訓練數據量也足夠大,模型才能顯現出該能力?

深入探究上下文學習

簡單的拷貝輸出

首先來看一個很簡單的任務,就是讓模型直接復制輸入的內容。

首先示例個數設置為 5 個,每個示例輸入包含 5 個不同的小寫單詞(從字母表前 8 個小寫字母中隨機選5個得到),這些單詞用逗號分隔,輸出直接拷貝的輸入,比如:

Input: g, c, b, h, d
Output: g, c, b, h, d
Input: b, g, d, h, a
Output: b, g, d, h, a
Input: f, c, d, e, h
Output: f, c, d, e, h
Input: c, f, g, h, d
Output: c, f, g, h, d
Input: e, f, b, g, d
Output: e, f, b, g, d
Input: a, b, c, d, e
Output:

期待模型的輸出是:

 a, b, c, d, e

接著對于5個字母順序的所有可能情況 (8!/3!=6720,從8個樣本中選5個總的組合數)也就是最后 input 的位置將 6720 個情況都測試了,GPT-3 模型的準確率是 100%

接著用 GPT-3 系列最小的模型 text-ada-001 來做這個任務,獲得了 6705/6720 = 99.78% 的準確率,一定程度上證明了模型規模的重要性。

格式化日期

接著來看 GPT-3 在更復雜一些的任務上的表現。

這個任務是對日期做格式化,將 年-月-日 格式的輸入格式轉化成 !月!日!年!,其中年份四位數,月份和日子是兩位數,比如:

https://ai.stanford.edu/blog/in-context-learning/

上面這個例子中,示例個數是3,最后是待測試的日期 2005-07-23

為什么選擇日期格式化這個任務呢?

首先足夠簡單,日期包含三個隨機變量(年月日),它們長度都是固定的,而且設定的輸出格式也不是正常的格式,所以訓練數據中不太可能包含類似的樣本,也排除了模型可能只是將訓練數據都記憶了下來。

接下來看看測試結果,我們測試了 GPT-3 全系列的模型 [8],包括text-ada-001,text-babbage-001,text-curie-001text-davinci-003,模型參數量依次從小到大排列。

并通過設置不同的上下文示例個數(對于每個示例個數的設置,都有2000個測試樣本),記錄各個模型的預測準確率,測試結果如下:

https://ai.stanford.edu/blog/in-context-learning/

從圖表展示的結果來看,固定橫坐標示例個數,則模型越大準確率也越高,模型越大準確率曲線也就更加的陡峭。而對于每個模型來說,增加上下文的示例個數也能有效提升準確率。

不過仔細觀察圖表可以發現,即使增大示例個數和模型,模型的精確度也只是無限接近 100% 但還是達不到。

接下來我們分析一下,GPT-3 預測錯誤的樣本都包含哪些類型。

https://ai.stanford.edu/blog/in-context-learning/

這里我們選取了前10個最常見的錯誤類型,其中圖標中的 DD 表示兩位數的日子,MM 表示兩位數字的月份,mm 一位數的月份,YYYY 則是四位數的年份,YY 是兩位數的年份,** 則是其他的兩位數。

從實驗結果上看,隨著上下文示例個數的增加,預測錯誤的樣本個數也在下降。

而模型預測錯誤最多的格式是,將日期放在月份前面,這也能理解,因為訓練數據中常見的日期格式都是先日期,再月份,最后年份。

繼續分析模型預測錯誤的樣本,發現一個有趣的結果:

https://ai.stanford.edu/blog/in-context-learning/

就是對于 2019 年份的輸入,模型是最容易預測錯誤的,這也能理解因為訓練數據中 2019 年份的數據不多。

標簽重映射

這個測試任務就是將實體做一個不正常的重新分類,比如:

volleyball: animal
onions: sport
broccoli: sport
hockey: animal
kale: sport
beet: sport
golf: animal
horse: plant/vegetable
corn: sport
football: animal
luge: animal
bowling: animal
beans: sport
archery: animal
sheep: plant/vegetable
zucchini: sport
goldfish: plant/vegetable
duck: plant/vegetable
leopard: plant/vegetable
lacrosse: animal
badminton: animal
lion: plant/vegetable
celery: sport
porcupine: plant/vegetable
wolf: plant/vegetable
lettuce: sport
camel: plant/vegetable
billiards: animal
zebra: plant/vegetable
radish: sport

輸入示例中包含了 [animal(動物), plant/vegetable(植物/蔬菜), sport(運動)] 三種類型標簽。現在將它們原來的標簽映射打亂,將動物映射為植物(duck: plant/vegetable),將運動映射為動物(golf: animal),將植物映射為運動(beans: sport)。

接著測試 GPT-3 能否根據僅有的示例學會預測新的映射,下面是測試結果:

llama: plant/vegetable ?
cat: plant/vegetable ?
elephant: plant/vegetable ?
monkey: plant/vegetable ?
panda: plant/vegetable ?
cucumber: sport ?
peas: sport ?
tomato: sport ?
spinach: sport ?
carrots: sport ?
rugby: animal ?
cycling: animal ?
baseball: animal ?
tennis: animal ?
judo: animal ?

可以看到 GPT-3 能正確輸出映射關系。而即使將標簽改成無意義的符號比如 [^*, #@#, !!~],模型同樣可以輸出正確的預測。

上下文學習能力的成因

經過上面對上下文學習的介紹,相信讀者也能體會到其神奇之處。

為什么 LLM 能夠具備該能力?上下文學習的原理究竟是怎樣的呢?

接下來解讀一篇最近微軟研究院發布的文章[7],對于上下文學習能力來源的探究。

文章中提出,關鍵在于 LLM 中的注意力層(attention layers),在推理過程實現了一個隱式的參數優化過程,這和 fine-tuning 的時候通過梯度下降法顯式優化參數的過程是類似的。

基于梯度下降法的優化過程和注意力層的聯系

文章[7]中提出,一個線性的注意力層其實和基于梯度下降法優化的全連接層是互為對偶的形式,具體怎么理解呢?

首先文章中定義,全連接層的初始參數矩陣為 W0,參數的梯度矩陣為△W,維度為 dout × din。還有當前輸入向量 x ,維度為 din。則經過一次梯度下降法優化的全連接層可以表示為:

其中 △W 由上一次的輸入 x' 和上一次全連接層的輸出梯度 e 計算得到:

怎么理解這個梯度的計算公式呢,我們畫個圖:

接下來看基于梯度下降法優化的全連接和線性注意力層是怎么聯系起來的,

我們關注紅框部分,參數梯度矩陣 △W 是上一次輸入和上一次輸出梯度的外積求和,這部分可以等價變換為,首先讓上一次輸入xi'T 和當前輸入 x 做內積,接著再和 ei 做內積最后再求和。

接著如果我們將

  • 上一次輸出梯度 ei 看做是一個 value 向量,Evalue 矩陣
  • 上一次輸入 xi'T 看做是一個 key 向量,X'key 矩陣
  • 當前輸入 x 看做是一個 query 向量

其實就等價于是一個線性的注意力層。

上一次輸入xi'Tx 先做內積,就是相當于 key 矩陣和當前 query 向量做乘法,得到每個 value 向量的權值,然后每個 ei 和權值相乘再相加,就是所有 value 向量加權求和。

上下文學習怎么實現隱式 finetuning

文章中定義,將上下文學習輸入的最后一個詞表示定義為 query token ,維度是 d

則輸入到注意力層之后的 query 向量計算公式如下:

則對于最后一個 token 來說,經過一個注意力頭操作的輸出公式如下:

其中 WvWKWQ 都是變換矩陣,維度是 d' × dX' 是輸入中示例部分的 token 向量表示,而 X 則表示輸入中示例部分之后又在最后一個詞之前的所有的 token 的向量表示。[X';X] 表示矩陣拼接。

然后論文中簡化了下公式,將注意力計算中的 softmax 操作去掉了,就得到了上面新的公式。

我們關注上公式的第二到第三行的變換,上圖解釋變換過程:

接著文章中將,輸入中示例部分之后又在最后一個詞之前的所有的 token 的 valuekey 相乘部分定義為 Wzsl(zsl 表示 Zero-shot Learning,0樣本學習)當做是初始的權值:

Wzsl * q 就相當于是一個0樣本學習的 attention 結果,因為沒有加上前面示例部分的 attention 結果。接著就是根據前面全連接層和 attention 互轉的公式可得:

我們看右邊紅框部分的變換,我們將示例部分的 token attention 操作中的

  • Wv*X' 看做是對應前面全連接上一次計算的輸出梯度
  • Wk*X' 看作是對應前面全連接上一次計算的輸入
  • q 看作是當前的輸入

然后就可以把推理得示例部分的 token attention 操作部分看做是對應 Wzsl 初始權值的更新梯度 △Wicl(icl 表示 In-Context Learning)。

這就是為什么說 LLM 中的注意力層在推理過程中實現了隱式的參數優化過程。所以這也是上下文學習能 work 的原因。

但是有個疑問就是 attention 機制不管模型規模大小都是一樣的操作,為什么模型規模得增加到一定程度上下文學習才能顯現呢?

我感覺還是回到模型規模和訓練數據上,首先 LLM 中的key, query, value變換矩陣的維度 d ' x d 足夠大,其次預訓練的數據量也大,所以初始權值 Wzsl 足夠好只需要少量的示例梯度 △Wicl 更新參數之后就能 work 了,其實感覺就和 Few-Shot Learning 沒什么區別。

參考資料

  • [1] https://yaofu.notion.site/GPT-3-5-360081d91ec245f29029d37b54573756
  • [2] http://ai.stanford.edu/blog/understanding-incontext/
  • [3] https://ai.stanford.edu/blog/in-context-learning/
  • [4] https://www.reddit.com/r/MachineLearning/comments/10ly7rw/r_why_can_gpt_learn_incontext_language_models/
  • [5] https://mp.weixin.qq.com/s/dPpO18g3V4xqHUsEBKrXJQ
  • [6] https://arxiv.org/abs/2005.14165
  • [7] https://arxiv.org/abs/2212.10559
  • [8] https://platform.openai.com/docs/models/gpt-3
  • [9] https://github.com/microsoft/LMOps
本站僅提供存儲服務,所有內容均由用戶發布,如發現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
清北微軟深挖GPT,把上下文學習整明白了!和微調基本一致,只是參數沒變而已
談談如何構建一個大型語言模型LLM應用程序【有示例】
論文解讀:Bert原理深入淺出
AI大模型領域的熱門技術——Embedding入門介紹以及為什么Embedding在大語言模型中很重要
老碼農眼中的大模型(LLM)
【每周NLP論文推薦】從預訓練模型掌握NLP的基本發展脈絡
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服

主站蜘蛛池模板: 三门县| 通化县| 宁蒗| 广昌县| 奉新县| 北安市| 容城县| 新津县| 洞头县| 靖远县| 独山县| 海门市| 德格县| 彰化市| 建平县| 汝南县| 林周县| 兴城市| 法库县| 明光市| 修武县| 武隆县| 濮阳县| 扎兰屯市| 灯塔市| 信阳市| 邯郸县| 南汇区| 衢州市| 高雄市| 仁化县| 南靖县| 潞城市| 拉萨市| 砀山县| 南木林县| 城市| 衡阳市| 昭苏县| 云浮市| 和林格尔县|