大模型PEFT技術原理(二):P-Tuning、P-Tuning v2

? ? ? ? 隨著預訓練模型的參數越來越大,尤其是175B參數大小的GPT3發布以來,讓很多中小公司和個人研究員對于大模型的全量微調望而卻步,近年來研究者們提出了各種各樣的參數高效遷移學習方法(Parameter-efficient Transfer Learning),即固定住Pretrain Language model(PLM)的大部分參數,僅調整模型的一小部分參數來達到與全部參數的微調接近的效果(調整的可以是模型自有的參數,也可以是額外加入的一些參數)。本文將介紹一些常見的參數高效微調技術,比如:BitFit、Prefix Tuning、Prompt Tuning、P-Tuning、P-Tuning v2、Adapter Tuning及其變體、LoRA、AdaLoRA、QLoRA、MAM Adapter、UniPELT等。

推薦閱讀列表:

大模型PEFT技術原理(一):BitFit、Prefix Tuning、Prompt Tuning

4、P-Tuning

論文地址:https://arxiv.org/pdf/2103.10385.pdf

代碼地址:https://github.com/THUDM/P-tuning

? ? ? ?P-Tuning和Prompt-Tuning幾乎是同時出現,思路也很接近。之前很多Prompt設計都是人工的,不僅構造難度大,而且性能也不太穩定,很可能創建出導致性能大幅下降的對抗性提示。比如GPT3采用人工構造的模版來做上下文學習(in context learning),但人工設計的模版的變化特別敏感,加一個詞或者少一個詞,或者變動位置都會造成比較大的變化,如下圖所示:

圖片

? ? ? ?鑒于這些問題,最近的工作重點是自動搜索離散提示,也取得了一定的效果。然而,由于神經網絡本質上是連續的,離散的提示可能是次優的。在這項工作中,作者提出了一種新方法——P-tuning,在連續空間中自動搜索提示。P-tuning 利用很少的連續自由參數來作為預訓練語言模型輸入的提示,并使用梯度下降作為離散提示搜索的替代方法來優化連續提示。

作者認為直接通過虛擬token引入prompt存在兩個問題:

  • 離散性:如果用預訓練詞表的embedding初始化,經過預訓練的詞在空間分布上較稀疏,微調的幅度有限,容易陷入局部最優。這里到底是局部最優還是有效信息prior其實很難分清
  • 整體性:多個token的連續prompt應該相互依賴作為一個整體

? ? ? 針對這兩個問題,作者使用雙向LSTM+2層MLP來對prompt進行表征, 這樣LSTM的結構提高prompt的整體性,Relu激活函數的MLP提高離散型。這樣更新prompt就是對應更新整個lstm+MLP部分的Prompt Encoder。下面是p-tuning和離散prompt的對比

圖片

? ? ? ?相比Prefix Tuning,P-Tuning加入的可微virtual token,但僅限于輸入層,沒有在每一層都加;另外,virtual token的位置也不一定是前綴,插入的位置是可選的。這里的出發點實際是把傳統人工設計模版中的真實token替換成可微的virtual token。

? ? ? 在知識探測任務中,默認是固定LM只微調prompt。效果上P-tuning對GPT這類單項語言模型的效果提升顯著,顯著優于人工構建模板和直接微調,使得GPT在不擅長的知識抽取任務中可以BERT的效果持平。

圖片

局限性

  • 可解釋性差:這是所有連續型prompt的統一問題;
  • 收斂更慢: 更少的參數想要挖掘更大模型的知識,需要更復雜的空間搜索;
  • 可能存在過擬合:只微調prompt,理論上是作為探針,但實際模型是否真的使用prompt部分作為探針,而不是直接去擬合任務導致過擬合是個待確認的問題;
  • 微調可能存在不穩定性:prompt-tuning和p-tuning的github里都有提到結果在SuperGLUE上無法復現的問題;

5、P-Tuning v2

論文地址:https://arxiv.org/pdf/2110.07602.pdf

代碼地址:https://github.com/THUDM/P-tuning-v2

? ? ? ? 之前提到的Prompt Tuning,是只凍結大語言模型的參數來優化連續Prompts,這樣可以大大減少每個任務的存儲和訓練時的內存使用,但是Prompt Tuning論文中表明當模型規模超過100億個參數時,提示優化可以與全量微調相媲美。但是對于那些較小的模型(從100M到1B),提示優化和全量微調的表現有很大差異,這大大限制了提示優化的適用性。雖然在GLUE和SuperGLUE 基準測試上表現出一定的優勢,然而在較難的硬序列標記任務(即序列標注)的有效性尚未得到驗證。

? ? ? ?基于此,作者提出了P-tuning v2,它利用深度提示優化(如:Prefix Tuning),對Prompt Tuning和P-Tuning進行改進,作為一個跨規模和NLU任務的通用解決方案。

? ? ? 與P-tuning相比,該方法在每一層都加入了Prompts tokens作為輸入,而不是僅僅加在輸入層,這帶來兩個方面的好處:

  • 更多可學習的參數(從P-tuning和Prompt Tuning的0.01%增加到0.1%-3%),同時也足夠參數高效。
  • 加入到更深層結構中的Prompt能給模型預測帶來更直接的影響。

圖片

? ? ? 具體做法基本同Prefix Tuning,可以看作是將文本生成的Prefix Tuning技術適配到NLU任務中,然后做了一些改進:

  • 移除重參數化的編碼器:以前的方法利用重參數化功能來提高訓練速度和魯棒性(如:Prefix Tuning中的MLP、P-Tuning中的LSTM))。在 P-tuning v2 中,作者發現重參數化的改進很小,尤其是對于較小的模型,同時還會影響模型的表現。
  • 針對不同任務采用不同的提示長度:提示長度在提示優化方法的超參數搜索中起著核心作用。在實驗中,作者發現不同的理解任務通常用不同的提示長度來實現其最佳性能,這與Prefix-Tuning中的發現一致,不同的文本生成任務可能有不同的最佳提示長度。
  • 引入多任務學習:先在多任務的Prompt上進行預訓練,然后再適配下游任務。多任務學習對我們的方法來說是可選的,但可能是相當有幫助的。一方面,連續提示的隨機慣性給優化帶來了困難,這可以通過更多的訓練數據或與任務相關的無監督預訓練來緩解;另一方面,連續提示是跨任務和數據集的特定任務知識的完美載體。實驗表明,在一些困難的序列任務中,多任務學習可以作為P-tuning v2的有益補充。
  • 回歸傳統的分類標簽范式,而不是映射器:標簽詞映射器(Label Word Verbalizer)一直是提示優化的核心組成部分,它將one-hot類標簽變成有意義的詞,以利用預訓練語言模型頭。盡管它在few-shot設置中具有潛在的必要性,但在全數據監督設置中,Verbalizer并不是必須的,它阻礙了Prompt調優在需要無實際意義的標簽和句子嵌入的場景中的應用。因此,P-Tuning v2回歸傳統的CLS標簽分類范式,采用隨機初始化的分類頭(Classification Head)應用于tokens之上,以增強通用性,可以適配到序列標注任務,如下圖所示:

圖片

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38509.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38509.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38509.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css鼠標樣式 cursor: pointer

cursor: none; cursor:not-allowed; 禁止選擇 user-select: none; pointer-events:none;禁止觸發事件, 該樣式會阻止默認事件的發生,但鼠標樣式會變成箭頭

Hlang社區-前端社區宣傳首頁實現

文章目錄 前言頁面結構固定釘頭部輪播JS特效完整代碼總結前言 這里的話,博主其實也是今年參與考研的大軍之一,所以的話,是抽空去完成這個項目的,當然這個項目的肯定是可以在較短的時間內完成的。 那么廢話不多說,昨天也是干到1點多,把這個首頁寫出來了。先看看看效果吧:…

Linux中 socket編程中多進程/多線程TCP并發服務器模型

一、循環服務器(while)【不常用】 一次只能處理一個客戶端的請求,等這個客戶端退出后,才能處理下一個客戶端。缺點:循環服務器所處理的客戶端不能有耗時操作。 模型 sfd socket(); bind(); listen(); while(1) {newfd accept();while(1){r…

分別在linux和windows上設置socket為阻塞模式

在 Linux 和 Windows 系統中,都可以將 socket 設置為非阻塞模式。 Linux平臺 在 Linux 系統中,可以使用 fcntl 函數來設置 socket 為非阻塞模式。例如: int flags fcntl(socket_fd, F_GETFL, 0); fcntl(socket_fd, F_SETFL, flags | O_NO…

【問心篇】渴望、熱情和選擇

加班太嚴重完全沒有時間學習,怎么辦? 我真的不算聰明的人,但是,我對學習真的是有渴望的。說得好聽一點,我希望自己在不停地成長,不辜負生活在這個信息化大變革的時代。說得不好的一點,就是我從…

斷點續傳的未來發展趨勢與前景展望

斷點續傳是一種在網絡傳輸中斷后,能夠從中斷的位置繼續傳輸的技術。它可以有效地避免因為網絡不穩定、服務器故障、用戶操作等原因導致的傳輸失敗,節省了用戶的時間和流量,提高了傳輸的效率和可靠性。斷點續傳在很多場景中都有廣泛的應用&…

AI 繪畫Stable Diffusion 研究(八)sd采樣方法詳解

大家好,我是風雨無阻。 本文適合人群: 希望了解stable Diffusion WebUI中提供的Sampler究竟有什么不同,想知道如何選用合適采樣器以進一步提高出圖質量的朋友。 想要進一步了解AI繪圖基本原理的朋友。 對stable diffusion AI繪圖感興趣的朋…

【洛谷 P5736】【深基7.例2】質數篩 題解(埃氏篩法)

【深基7.例2】質數篩 題目描述 輸入 n n n 個不大于 1 0 5 10^5 105 的正整數。要求全部儲存在數組中,去除掉不是質數的數字,依次輸出剩余的質數。 輸入格式 第一行輸入一個正整數 n n n,表示整數個數。 第二行輸入 n n n 個正整數 …

jquery如何修改選中狀態

jquery修改選中狀態的方法:1、使用addClass和removeClass方法,可以向選中的元素添加一個多個類名,從而改變其樣式或狀態;2、使用toggleClass方法,可以在選中元素上添加或移除一個類名,如果該類名已經存在&a…

208. 實現 Trie (前綴樹)

Trie(發音類似 "try")或者說 前綴樹 是一種樹形數據結構,用于高效地存儲和檢索字符串數據集中的鍵。這一數據結構有相當多的應用情景,例如自動補完和拼寫檢查。 請你實現 Trie 類: Trie() 初始化前綴樹對象…

手撕LFU緩存

手撕LRU緩存_右大臣的博客-CSDN博客 是LRU的升級,多了一個訪問次數的維度 實現 LFUCache 類: LFUCache(int capacity) - 用數據結構的容量 capacity 初始化對象int get(int key) - 如果鍵 key 存在于緩存中,則獲取鍵的值,否則返…

C# Lamda到底是什么?!

lamda作為匿名函數,現在已經能夠出現子啊C#程序的任何可能位置,它可能作為參數為委托或其他函數復制,或者單獨作為表達式,或者承擔一些類似C中內聯函數的一些作用承擔一些簡單計算。熟練的使用Lamda表達式能夠讓減少代碼的冗余&am…

Django圖書商城系統實戰開發-總結經驗之后端開發

Django圖書商城系統實戰開發-總結經驗之后端開發 簡介 在這篇博客中,我將總結經驗分享后端開發Django圖書商城系統的過程。在開發過程中,我遇到了各種挑戰和問題,并且通過實踐獲得了寶貴的經驗和教訓。通過本文,我希望能幫助讀者…

vue3+vite配置vantUI主題

?在項目中統一配置UI主題色,各個組件配色統一修改 vantUI按需安裝 參考vantUI文檔 創建vantVar.less文件夾進行樣式編寫 vantVar.less :root:root{//導航--van-nav-bar-height: 44px;//按鈕--van-button-primary-color: #ffffff;--van-button-primary-backgr…

linux——mysql的高可用MHA

目錄 一、概述 一、概念 二、組成 三、特點 四、工作原理 二、案例 三、構建MHA 一、基礎環境 二、ssh免密登錄 三、主從復制 master slave1 四、MHA安裝 一、環境 二、安裝node 三、安裝manager 一、概述 一、概念 MHA(MasterHigh Availability&a…

力扣 198. 打家劫舍

題目來源:https://leetcode.cn/problems/house-robber/description/ C題解:因為是間接偷竊,所以偷nums[i]家前,一定偷過第i-2或者i-3家,因為i-1不能偷。 例如12345共5家,先偷第1家,那么2不能偷…

(三)Unity開發Vision Pro——入門

3.入門 1.入門 本節涵蓋了幾個重要主題,可幫助您加快visionOS 平臺開發速度。在這里,您將找到構建第一個 Unity PolySpatial XR 應用程序的分步指南的鏈接,以及 PolySpatial XR 開發時的一些開發最佳實踐。 2.開發與迭代 有關先決條件、開…

顯卡nvidia-smi后 提示Faild 解決過程,包含卸載重裝NVIDIA驅動步驟

顯卡異常: 顯卡nvidia-smi后 提示Faild 解決過程,卸載重裝nvidia驅動步驟 文章目錄 顯卡異常: 顯卡nvidia-smi后 提示Faild 解決過程,卸載重裝nvidia驅動步驟 [toc]1 緣由2 解決過程3 過程所需命令4 解決4.1 把該顯卡重新拔插一下卸載NVIDIA驅動的方法&a…

單元測試優化:為什么要對程序進行測試?測試有什么好處?

單元測試(Unit Testing)又稱為模塊測試, 是針對程序模塊(軟件設計的最小單位)來進行正確性檢驗的測試工作。 程序單元是應用的最小可測試部件。簡單來說,就是測試數據的穩定性是否達到程序的預期。 我們日常開發時可能…

19、SQL注入之SQLMAP繞過WAF

目錄 邏輯層1、邏輯問題2、性能問題 白名單方式一:IP白名單方式二:靜態資源方式三:url白名單方式四: 爬蟲白名單 sqlmap在測試漏洞的時候,選擇了no,它就不會去測試其它的了,我們一般選擇yes,為了…