自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢

發(fā)布于 2024-10-24 14:37
瀏覽
0收藏

以chatgpt為起始節(jié)點的大模型技術經(jīng)過了兩年左右的發(fā)展,大致沉淀了一些較為確定的研究領域。首先是基座大模型的研究,主要是國內(nèi)外大廠集中大量財力、人力、算力進行大模型軍備競賽,企圖將大模型的基礎能力(包括推理能力)上限逐步提升到更高的層次。當然也有一些研究機構致力于改進transformer的架構或者提出其他更先進的基礎模型結構,在性能或者效率上做文章,例如MOE,Mamba等;多模態(tài)模型,讓大模型同時能夠理解并生成圖像、音頻、視頻、文字等多種模態(tài)的信息,例如大火的Sora。其次是大模型的微調(diào)對齊研究,主要是基座大模型通過指令微調(diào)、強化學習等技術將其變成一個應用友好、用戶友好的能力模型,也可以將模型長文本、長上下文能力的提升也包含在該方向內(nèi);另外,還有大模型的高效部署和推理計算,在降低大模型服務成本的同時,提升大模型服務的實時性,提升用戶體驗;最后,則是大模型在各種細分場景領域的應用落地,能夠將大模型封裝成一個成熟的應用產(chǎn)品,真正的將大模型用起來,當然也可以將agent相關的技術研究歸納在這個方向上,因為agent的目標就是將大模型的能力充分利用起來,幫助人類更好地使用大模型。詳見下圖所示:

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

本人目前主要精力集中在大模型的應用落地,對大模型在傳統(tǒng)NLP應用任務上的效果非常感興趣。正好前段時間,有潛在客戶希望我們研究是否能夠通過大模型提升新聞事件分類的效果。借著這個機會,我對大模型在文本分類任務上的應用方式和對應效果進行了研究,有了一些初步的結論。本文希望通過描述上述研究過程與結果,總結出大模型在文本分類任務上的最佳實踐,并推廣到更多類似的應用上,為業(yè)界做大模型應用時提供一些落地的參考。

應用場景分類

在談具體的研究內(nèi)容前,需要先明確一下研究的問題類型。目前對于可能會應用到大模型的傳統(tǒng)NLP應用,我自己將其分為兩種不同的情況:

(1)開荒式業(yè)務場景。這種場景主要出現(xiàn)在那些剛剛完成數(shù)字化還未進行智能化的機構、或者業(yè)務場景本身比較復雜、傳統(tǒng)技術無法在該場景中匹配最低的用戶使用體驗要求的情況。特點:數(shù)據(jù)積累不成熟(也就是沒有足夠的訓練語料用于場景專用模型的訓練)、硬件資源不足(沒有足夠的GPU用于訓練模型)等。

(2)優(yōu)化提升式業(yè)務場景。這種場景主要出現(xiàn)在那些已經(jīng)有一定智能化基礎的機構、或者業(yè)務場景中已經(jīng)使用了一些傳統(tǒng)NLP技術解決了部分問題的情況。特點:需要提升已有方法的應用效果和用戶體驗(如準確率、召回率等),當前方法繼續(xù)優(yōu)化的難度較大。

本文主要討論的是第二種場景,這也是很多有一定數(shù)字化、智能化基礎的公司比較關注的類型。他們在大模型提出之前,已經(jīng)通過一些規(guī)則、統(tǒng)計機器學習、深度神經(jīng)網(wǎng)絡等算法模型技術構建了一些分類服務,有些行業(yè)頭部團隊在此基礎上通過一些技巧(數(shù)據(jù)增強,對抗訓練等)進行了優(yōu)化,將算法指標提升到了某個瓶頸線。然而,業(yè)務用戶對于算法的精度提升要求是持續(xù)性的,因此在大模型出現(xiàn)之前的一段時間,算法人員疲于應付業(yè)務用戶對于場景效果的高要求。

只用prompt工程足夠嗎?

截止2024年,我瀏覽過很多應用大模型研究傳統(tǒng)NLP任務的工作,大多集中在如何利用prompt技術、few-shot技術等直接將大模型應用在這些傳統(tǒng)任務中。例如這一篇:Can ChatGPT Understand Too? A Comparative Study on ChatGPT and Fine-tuned BERT,通過prompt工程對比ChatGPT與Fine-tuned Roberta在GLUE數(shù)據(jù)集上的效果,最終的結論是Fine-tuned Roberta在文本理解任務上仍然無法被超越。然而我也看到有一些觀點認為這些傳統(tǒng)任務直接用大模型一把梭就能搞定,只要prompt寫的足夠好,就能得到一個足夠好的語言理解分析服務。本人并不反對這種觀點,而且還支持對過去的一些應用模式進行革新,從而讓大模型能夠充分發(fā)揮其特性。不過在目前的階段,很多企業(yè)或者業(yè)務場景基于安全、成本、時延等因素,無法使用綜合能力強的模型(GPT4,國內(nèi)模型的付費版公有云服務、超過14B的開源模型等),而通過純prompt工程使用類似7B的模型還無法完全替代已經(jīng)在足量數(shù)據(jù)上訓練過的BERT類模型。由于上述提到的研究是使用ChatGPT以及英文的數(shù)據(jù)集,為了驗證國內(nèi)開源的大模型是否在中文數(shù)據(jù)集上是否也有類似的結論,下面我將根據(jù)相關的目標應用場景以一個具體的數(shù)據(jù)集的實驗來說明。

應用場景與數(shù)據(jù)集

目標應用場景:新聞事件分類任務。任務特點:

(1)多標簽分類任務,即一個新聞可能會對應多個事件類別;

(2)事件標簽體系龐大,且有比較嚴重的類別不均衡問題。出現(xiàn)頻次高的類別容易累積訓練數(shù)據(jù),而低頻長尾類別屬于典型的小樣本問題。

由于一些原因,不能拿到相關真實場景數(shù)據(jù),因此搜尋了網(wǎng)上的公開數(shù)據(jù)集,最終找到了一個比較貼近上述任務特點的數(shù)據(jù)集:ccks 2022 任務八數(shù)據(jù)集。

數(shù)據(jù)鏈接見:https://tianchi.aliyun.com/dataset/136800

數(shù)據(jù)集簡介:數(shù)據(jù)主要來自金融領域的公開新聞、報道,數(shù)量在5萬+左右。原始數(shù)據(jù)集的任務是“給定100+事件類型及其事件主體公司,訓練數(shù)據(jù)中對其中16個事件類型只保留10條左右的訓練樣本,測試集中包含這16個類型的大量待抽取樣本。

本次的驗證為了簡化問題,不會采用上述的任務形式,而是采用最基本的全類別分類數(shù)據(jù)集的處理方式,從而驗證模型在這種類型的數(shù)據(jù)集上的整體效果,以及在一些小樣本類別上的效果。

由于目前只有訓練集有標注標簽,因此只能針對標注數(shù)據(jù)集進行分析。具體做法是根據(jù)標注數(shù)據(jù)分布劃分了訓練集,測試集(5000+),其中測試集只用于評測模型的最終結果。

備注:該數(shù)據(jù)集存在一定的標注質量問題,前期通過一些人力檢測與校正,提升了部分的標注質量。

數(shù)據(jù)示例如下:

{"textId": "2333e4ef53762e498cc79c7613d6ac6f", "text": "科銳國際:2018年年度權益分派實施公告", "eventTags": [{"eventType": "公司權益分派", "eventCompany": "科銳國際"}]}
{
    "textId": "35a726ecec33a755abea4ff6fd5464ec",
    "text": "訥河軟式透水管有限責任—訥河公司;湘潭招聘/萬達集團招聘信息;多次延期后,ST康美終于披露回覆函",
    "eventTags": [
        {
            "eventType": "延期信息披露",
            "eventCompany": "ST康美"
        },
        {
            "eventType": "當?shù)卣心紗T工",
            "eventCompany": "萬達集團"
        }
    ]
}

事件標簽數(shù)量為174個,均為金融相關的事件標簽。以下為部分事件標簽樣例。

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

對數(shù)據(jù)集進行分析后,發(fā)現(xiàn)其具備典型的長尾分布特征,與實際的業(yè)務數(shù)據(jù)分布比較類似。由于類別比較多,以每個類別為粒度進行畫圖不夠直觀,因此將所有標簽類別按照從大到小順序排序后,以10為一組進行分組,按照組的粒度畫出的柱狀圖如下(圖由GPT-4生成):

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

以下是出于長尾位置的部分事件標簽樣例:

  • 產(chǎn)品虛假宣傳: 9
  • 產(chǎn)品虧損: 3
  • 行業(yè)排名下降: 41
  • 責令轉讓所持證券公司股權: 21
  • 新增分支機構: 38
  • 分支機構被警方調(diào)查: 11
  • 非法集資: 8
  • 發(fā)放貸款出現(xiàn)壞賬: 27
  • 擠兌: 41
  • 訴訟仲裁-敗訴: 29
  • 澄清辟謠: 9
  • 停產(chǎn)停業(yè): 10
  • 上市前融資: 33
  • 銷量下降: 48
  • 行政處分: 33
  • 薪酬福利下降: 16
  • 被盜: 44
  • 實際控制人違規(guī): 10
  • 發(fā)布新產(chǎn)品延期: 24
  • 其他經(jīng)營不善: 39
  • 貸款用途變更: 17
  • 第一大股東變化: 8
  • 客戶管理不善: 29
  • 市場份額減少: 28
  • 產(chǎn)品質量問題: 10
  • 股東借款: 4
  • 財務報表更正: 8
  • 經(jīng)營資質瑕疵: 8
  • 引入新股東: 9
  • 停止批準增設分支機構: 24
  • 授信額度上升: 10
  • 資金緊張: 7
  • 在當?shù)爻焚Y: 22
  • 股權融資失敗: 19

基于BERT的baseline

為了驗證大模型的相關方案與傳統(tǒng)的NLP方案相比是否有提升,因此選定了BERT簇的分類方案作為baseline來進行對比。

BERT也是一個以Transformer為模型架構的預訓練語言模型。

  • 參數(shù)量相比LLM大模型更小,基本在億級參數(shù)以下
  • 訓練方式與LLM大模型不同,更注重語義理解類任務,而不是文本生成式任務
  • 一般需要適量的下游任務訓練數(shù)據(jù)進行微調(diào),并在基座模型的基礎上設計針對下游任務的額外組件,從而得到一個任務專用的模型。微調(diào)難度較小。
  • LLM大模型出世之前,業(yè)界主流的方法

BERT與GPT在語言模型訓練任務上的區(qū)別如下圖所示:

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

具體來說,本次實驗的BERT模型選擇了哈工大的macbert-base和macbert-large兩種體量的模型。

模型鏈接如下:https://github.com/ymcui/MacBERT

具體訓練方式:

輸入:新聞文本

輸出:事件標簽列表

loss函數(shù):BCEWithLogitsLoss

將所有訓練數(shù)據(jù)(5萬+)灌入模型進行訓練

最終,base和large模型的指標如下:

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

基于Prompt工程的LLM方法

將LLM大模型直接應用于文本多標簽分類任務,實際上就是編寫提示詞指令,讓大模型去生成最終的事件標簽結果。整體還是一個文本生成的過程。

提示詞模版樣例如下:

f"作為一個多標簽新聞分類專家,你的任務是識別出新聞中的所有相關事件標簽。
事件標簽列表:{event_tags}。新聞內(nèi)容:{text}。該新聞對應的所有事件標簽是什么?"

其中,event_tags需要把體系中的事件標簽填入。這里涉及到兩個問題:

  • 如果事件標簽體系很龐大,把所有事件標簽裝進去不太現(xiàn)實,超過了大模型能夠處理的文本長度上限。
  • 把所有標簽裝進去會增加大模型分析處理文本的難度

基于當前最新的技術發(fā)展,有的開源大模型已經(jīng)能夠處理超過128K的上下文,對于170+的標簽文本是能夠覆蓋的。當然,能處理和處理好是兩種概念,對于大模型來說,肯定是標簽范圍越小越容易解決問題,因此也可以通過先將事件標簽進行分級分組,然后逐級進行大模型的分析,兩種方式均可。

引入Few-shot sample

為了能夠充分利用已有的標注數(shù)據(jù)集和大模型的能力,在上述prompt中,還可以引入示例樣本(一般論文里面都叫demonstrations),從而激發(fā)大模型的In-context learning能力。為此,對整體訓練數(shù)據(jù)集設計了如下的工作流程:

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

該工作流程的主要核心思想是將示例樣本的選擇問題轉化成RAG(Retrieve-Augmented-Generation),將訓練樣本集合向量化存儲后,對于每個測試樣本的分析,通過召回+排序的方式做知識庫的檢索,根據(jù)預設的示例樣本數(shù)量(實驗中設置為10),選擇語義最相似的標注樣本填充到prompt中。

示例樣本填充順序重要嗎?

在選擇示例樣本后,還有個容易被忽略的問題:示例樣本填充入prompt的順序需要關注嗎?

之前,有一些文章提到過,RAG得到的召回樣本在prompt中,如果較為相似的召回內(nèi)容離用戶問題越近,大模型的回答質量會更高。我也嘗試了這樣的處理方式,將相似度高的樣本放置在了與待預測的新聞文本接近的位置。提示詞模版樣例如下:

你是一個先進的大語言模型,專門用于理解和分類金融新聞資訊,現(xiàn)在需要你根據(jù)提供的新聞內(nèi)容,
將其分類到預定義的事件標簽中。任務要求:
1、仔細閱讀新聞內(nèi)容,理解新聞主題和核心內(nèi)容。
2、只使用給定的事件標簽列表進行分類,若新聞屬于多個事件標簽,則使用豎線|來分隔不同的事件標簽,
若沒有合適的事件標簽,則分類為others。
3、只需要輸出事件標簽名字,其他內(nèi)容不需要輸出。
事件標簽列表如下,使用英文逗號分隔:\n{event_tags}
下面是給你提供的人工標注過的參考樣例:
{demonstrations}待分類的新聞內(nèi)容如下:{text}
該新聞事件標簽為:

其中demonstrations存放的順序為按照示例與待預測樣本相似度的正序排列,即相似度越高的排得越后,離待預測樣本text越近。

通過上述處理方式,確實能夠在這個任務上有比較微小的提升,雖然提升幅度不大,但操作成本上也幾乎可以忽略,因此推薦使用。

結果

基于純Prompt工程的方式采用了開源的qwen-7b-chat,Yi-34b-chat-int4,閉源的qwen-72b-chat接口(百煉平臺)三種大模型來驗證。(實驗的時候,qwen1.5還未出,但根據(jù)其他任務的分析,可以推測不會相差太多)

具體指標如下:

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

根據(jù)指標結果,可以看到純Prompt工程的方式,即使是使用百億級別參數(shù)量的模型,還是離傳統(tǒng)BERT方式的效果差不少。因為LLM大模型的訓練方式與BERT不同,以文本生成為目標,是單向構建上下文(從左到右);而BERT訓練是以完形填空式任務為目標。相比于LLM,能夠在雙向(向左向右)構建上下文理解,本身就適配自然語言理解任務(文本分類,信息抽取等均為理解任務)。

通過分析大模型的錯誤case,可以發(fā)現(xiàn)很多樣本都是因為指令遵循能力不夠(比如格式未按要求,生成了無關的分析解釋內(nèi)容等),導致格式處理后的結果是錯的。因此,推測如果對大模型進行訓練樣本的sft,應該還能夠在指標上有不少的提升。

Prompt工程+指令微調(diào)

方法描述

既然要指令微調(diào)了,那么基于硬件成本限制,就只能選擇一些性價比高的開源模型來做驗證了。因此,最終選擇了qwen-7b-chat和qwen-14b-chat來做實驗。針對當前的數(shù)據(jù)集,結合Prompt工程和指令微調(diào)技術,設計了如下的大模型文本分類流程:

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

與Prompt工程的方案相比,本方案加入了指令微調(diào)的步驟。具體來說就是對訓練集進行數(shù)據(jù)篩選和處理后,篩選出高質量的訓練數(shù)據(jù)集,然后通過lora的方式進行低成本的指令微調(diào)模型,最后在微調(diào)后的模型上使用Prompt工程來完成樣本的分類。整個流程中,有幾個重要節(jié)點的詳細說明如下:

  • 構建指令形式的訓練數(shù)據(jù)集時,需要生成指令提示詞模版,并將每個樣本填充到提示詞模版中。一般的做法是一種任務都用同一個提示詞模版。不過,這樣處理可能會讓微調(diào)后的大模型對指令的理解能力不夠魯棒。因此,我通過ChatGPT,讓其為我生成了適合該分類任務色50+個提示詞模版,并為每個樣本隨機分配一個。通過這種方式,能夠讓大模型對指令的遵循能力更好。
  • 關于高質量數(shù)據(jù)篩選的問題,其實我做了兩個不同的方法實驗。一個是全量數(shù)據(jù)的微調(diào)(5w+),另一個是采用一些數(shù)據(jù)選擇的方法,得到適量的樣本子集用于訓練。

這些方法除去一些不太方便實現(xiàn)的(例如要訓練一個reward模型,標注成本太高),基本都實現(xiàn)了一下,在當前的數(shù)據(jù)集上效果都不是很理想,猜想應該是上面的方法對于目標是復雜生成的任務會更有效。

實際上,探究數(shù)據(jù)集精選的本質,不外乎以下兩點:(1)樣本多樣性高;(2)對于任務的重要性或者增益程度盡量高。其實,之前做文本摘要的時候,對摘要句子的選取也是遵循這兩個原則,因此自然而然就想到可以借用文本摘要的思想來選擇:

(1)先將所有樣本根據(jù)標簽類別分成不同的簇(當然,也可以對樣本進行聚類分析,得到的簇可能更偏文本本身的語義相似性聚合)

(2)對每個簇中的樣本,采用MMR算法進行樣本的排序。MMR綜合考慮了樣本的多樣性和相關性,因此我們可以根據(jù)分數(shù)從高到低選擇一定數(shù)量的樣本放到訓練集中。

MMR算法:https://zhuanlan.zhihu.com/p/83596443

(3)對于包含多個標簽的樣本,以及樣本數(shù)量本身就很少的標簽均采用白名單模式,即全部加入樣本集合中。這也是為了讓大模型對多標簽、小樣本的情況能夠盡可能多的學習。

通過上述方式,選擇了4000+的樣本用于訓練。(每個標簽數(shù)據(jù)都會覆蓋到)

結果

我們將上述篩選后的訓練樣本集與全量訓練樣本集進行了大模型微調(diào)的對比實驗,可以發(fā)現(xiàn)一些有趣但并不意外的結果。

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

  • 結論1:大模型的參數(shù)量越大,整體的指標效果越好。但限于使用成本,通常沒辦法無限制提升模型的參數(shù)量級。
  • 結論2:當標注數(shù)據(jù)比較少的時候,大模型微調(diào)后的效果還是會優(yōu)于BERT簇模型,在小樣本類別的效果上,也要更好。
  • 結論3:全量數(shù)據(jù)集微調(diào)在整體指標上比子集微調(diào)要更好,但是在小樣本標簽類別上的效果不一定,會根據(jù)使用的模型而定。

根據(jù)上述的對比實驗,可以看到當標注數(shù)據(jù)量比較充裕的時候,LLM即使經(jīng)過微調(diào)、提示詞精心設計等步驟后,整體的效果還是不如BERT模型的微調(diào)效果。除了上一小節(jié)提到的“LLM大模型的訓練方式與BERT不同”的原因外,可能還有以下這個因素:

BERT在數(shù)據(jù)量充足的條件下,能夠充分“過擬合”下游任務信息,從而在任務上達到不錯的效果。但是微調(diào)后的模型完全無法去做其他任務;而LLM大模型的目標本就是通用人工智能,不會為了某個具體任務而喪失通用性,因此經(jīng)過一定的指令微調(diào)后,并不會充分“過擬合”某個任務。

當然,在標注數(shù)據(jù)量不是非常充分的情況下,使用大模型做指令微調(diào)配合Prompt工程,確實能在小樣本場景下有不錯的效果。實際的應用場景中,有些小樣本的事件標簽雖然出現(xiàn)次數(shù)不多,但業(yè)務屬性卻非常重要,提升這些數(shù)據(jù)的效果,可能對整體的評測效果沒有明顯的影響,但對業(yè)務使用來說是能夠提升體驗的。

大模型+BERT式微調(diào)

大模型+指令微調(diào)的組合終究與追求精度提升的文本理解類任務不太契合。在足量的標注數(shù)據(jù)場景下,精度上難以匹敵傳統(tǒng)的BERT式微調(diào)方法。但是大模型畢竟在參數(shù)量和學習的知識信息量級上要遠超過往的BERT簇模型,所以從理論上來看,只要能夠充分利用大模型龐大的知識量,其在文本理解能力上必然是超越BERT簇模型的。指令微調(diào)+Prompt工程的大模型生成式方法在文本理解類任務上并沒有充分利用到大模型的豐富知識,那么能否參考BERT式的微調(diào)方法,將大模型的參數(shù)權重作為基座,去針對性適配下游任務呢?答案是可行的,因為大模型本質也是一個transformer模型網(wǎng)絡,只不過預訓練的方式不同而已,只需要在網(wǎng)絡的最后一層添加對應的任務層即可。不過在實際落地時,這種方式可能面臨這樣的問題:

目前主流的大模型參數(shù)通常在7B以上的量級,使用這種參數(shù)量的模型即使是使用lora微調(diào),訓練和在線推理預測的成本也是不小的,為了某個單個任務的精度提升而去過擬合一個大模型看上去得不償失。

不過,上述問題在通義千問發(fā)布了0.5B、1.8B的模型后得到了極大的緩解。相對于7B的參數(shù)量,1.8B左右的模型在訓練成本與推理的時延等方面都能得到足夠的控制。因此,本次實驗就以qwen1.5-1.8B為基準模型,來探索它結合了BERT式微調(diào)方法后的效果。

方法描述

大模型使用BERT式的微調(diào)方法其實很簡單,甚至transformers的庫都已經(jīng)幫我們寫好了,直接使用"Qwen2ForSequenceClassification"即可,其他的流程就跟傳統(tǒng)的文本分類流程一樣就行了。另外需要手動指定tokenizer的pad_token_id,否則在構建Dataset數(shù)據(jù)進行tokenize的時候會報錯。

整個訓練流程其實與傳統(tǒng)文本任務相似,但是有一些訓練中的細節(jié)內(nèi)容,我想在下面著重分享一下。

  • base模型通常比chat模型的微調(diào)效果更好。我在不同參數(shù)量的模型上均做了一些訓練嘗試,發(fā)現(xiàn)base模型的效果通過會比chat模型要好。這是因為chat模型通常會對base模型進行一些對齊訓練,使其在安全性、幻覺程度、用戶友好程度等方面得到提升,但是會因為一些“對齊稅”,導致模型喪失部分基礎能力或者知識。
  • NEFT方法,在微調(diào)中的增益效果是穩(wěn)定的。NEFT簡單來說就是在embedding層引入一些噪聲,從而增強模型的魯棒性。我感覺這個方法與之前競賽中常用的對抗訓練技巧(FGM)有類似的思想。簡單來說就是在前向計算的時候給embedding層增加噪聲擾動,在梯度計算結束和參數(shù)更新之間要將embedding還原回去,通過這種方式增強模型的魯棒性。

NEFT方法: https://arxiv.org/pdf/2310.05914.pdf
FGM方法: https://zhuanlan.zhihu.com/p/91269728
  • 建議使用lora微調(diào)。通過實驗對比發(fā)現(xiàn),lora微調(diào)和全參數(shù)微調(diào)的效果幾乎沒有明顯差距。那么訓練參數(shù)更少的lora方式顯然更值得推薦,使用lora后微調(diào)的參數(shù)(340M)恰好與bert-large參數(shù)量相當;在設置lora參數(shù)時,建議將embedding參數(shù)也加入訓練。我使用的參數(shù)配置見下:

lora_config = LoraConfig(
        r=32,  # low rank
        lora_alpha=64,  # alpha scaling, scale lora weights/outputs
        target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], #if you know
        lora_dropout=0.1,
        bias="none",
        modules_to_save=["score","embed_tokens"],
        task_type=TaskType.SEQ_CLS # 文本分類使用該類型
    )
  • 如果使用chatglm3進行BERT式微調(diào)時,如果使用bf16精度,可能會遇到一個bug。它的modeling_chatglm.py腳本中,沒有指定對任務dense層的參數(shù)進行正確的參數(shù)初始化,在訓練的時候任務dense層的參數(shù)都會精度溢出,從而導致loss一直是nan。修改的方式也很簡單,增加指定的參數(shù)初始化方法就行。代碼行15-18的部分就是新增的代碼。

class ChatGLMPreTrainedModel(PreTrainedModel):
    """
    An abstract class to handle weights initialization and
    a simple interface for downloading and loading pretrained models.
    """

    is_parallelizable = False
    supports_gradient_checkpointing = True
    config_class = ChatGLMConfig
    base_model_prefix = "transformer"
    _no_split_modules = ["GLMBlock"]

    def _init_weights(self, module: nn.Module):
        """Initialize the weights."""
        if isinstance(module, nn.Linear):
            module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
            if module.bias is not None:
                module.bias.data.zero_()
        return

結果

下面列出使用qwen1.5-1.8B模型進行BERT式微調(diào)與前述的方法效果對比。

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

可以看到,qwen1.5-1.8B+BERT式微調(diào)+lora的組合在整體F1精度和小樣本標簽類別的F1精度都是最好的。當整體數(shù)據(jù)集的量級比較少的時候,qwen1.5-1.8B+BERT式微調(diào)+lora對于小樣本標簽類別的表現(xiàn)也是不錯的,證明其在小樣本學習能力上也是有提升的。

結論是否適用其他分類任務?

當然,僅在一個任務上的實驗結果肯定是不足以支持上述的結論的,為了驗證這種方式是否能夠在文本分類通用任務上有不錯的效果,我又在兩個開源的數(shù)據(jù)集上進行了驗證,分別是THUCnews數(shù)據(jù)集以及Iflytek文本分類數(shù)據(jù)集。下面列出BERT-baseline以及qwen1.5-1.8B+BERT式微調(diào)+lora的組合的分類F1指標對比。

THUCnews數(shù)據(jù)集: http://thuctc.thunlp.org/#%E4%B8%AD%E6%96%87%E6%96%87%E6%9C%AC%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE%E9%9B%86THUCNews
Iflytek數(shù)據(jù)集: https://aistudio.baidu.com/datasetdetail/243969

注意?。?!以下所列指標為本人自己訓練后的結果,比公開出來的數(shù)據(jù)指標會低一點,因為我不太喜歡干調(diào)參的活,就隨機選了超參數(shù),不過bert與qwen兩者訓練的通用參數(shù)是保持一致,目標是驗證qwen是否能夠對bert有效果的提升,所以不建議與公開榜單指標做對比。

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

可以看到,qwen1.5-1.8B+BERT式微調(diào)+lora在其他分類任務上的精度相較于bert-large來說還是能有不錯的提升。

結論適用于其他參數(shù)量的模型嗎?

答案是肯定的。實際上,我還嘗試了qwen1.5-4B,qwen1.5-7B,chatglm3-6B,minicpm等模型結果,下面列出部分數(shù)據(jù)集的效果。

探討 | 大模型在傳統(tǒng)NLP任務的使用姿勢-AI.x社區(qū)

隨著大模型參數(shù)量的增加,BERT式微調(diào)的效果似乎并沒有隨著參數(shù)顯著得提升,可以看到的是即使是BERT式微調(diào)方法,也無法利用大模型更多的參數(shù)知識了。結合應用實際成本的考量,選擇qwen1.5-1.8B似乎是當前性價比最高的。

當然,我對上述結果也不是完全沒有疑問的。最大的變數(shù)在于這些國內(nèi)大模型是否在預訓練的時候將這些開源的數(shù)據(jù)集包含進去了。如果在訓練的時候就見過這些數(shù)據(jù),那么對上述結果的真實性就需要進一步驗證了。

應用落地的“新姿勢” 采用BERT式的微調(diào)方式,由于是讓模型盡量過擬合某個下游任務,微調(diào)后它就無法適配其他類型的任務了,因此在實際應用時,對于不同的任務會微調(diào)部署多個獨立的模型。對于大模型來說,如果每個任務都單獨部署一個模型從應用成本上來看顯然是不可控的。但通過上述的lora微調(diào),可以有效得降低應用部署的顯存成本。

1、訓練階段,針對不同的任務,使用不同lora單獨進行訓練,得到獨立的lora權重。

其實我嘗試過MTDNN的多任務同時訓練的方式,即增加lora的參數(shù)規(guī)模,然后同時訓練不同的分類任務,目的是用一個模型cover多個任務。具體做法是在數(shù)據(jù)預處理batch的時候,根據(jù)不同任務的數(shù)據(jù)量比例通過采樣的方式采樣某個任務的1batch數(shù)據(jù)參與當前step的訓練。然后通過在模型定義時,指定對應任務與任務dense層的映射關系來保證每個任務都能使用正確的。

MTDNN方法: https://github.com/microsoft/MT-DNN

class MTDNNForSequenceClassification(Qwen2PreTrainedModel):
    def __init__(self, config,task_configs):
        super().__init__(config)
        # self.num_labels = config.num_labels
        self.model = Qwen2Model(config)
        # self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False)
        self.task_heads = nn.ModuleDict({
            f"task_{task_name}": nn.Linear(config.hidden_size, config_task["num_labels"])
            for task_name, config_task in task_configs.items()
        })
        self.task_configs = task_configs
        self.dropout = nn.Dropout(config.classifier_dropout)
        # Initialize weights and apply final processing
        self.post_init()

然而我嘗試了各種不同的參數(shù)組合,對上述提到的所有數(shù)據(jù)集進行了實驗,發(fā)現(xiàn)都無法保證所有的數(shù)據(jù)集都能得到理想的效果,推測還是因為數(shù)據(jù)集之間會存在“拖后腿”的情況,這種方法要成功最好是找一些特征類似的數(shù)據(jù),才能得到互相增強的效果。最后,還是決定每個任務使用獨立的lora單獨訓練。

2、在部署推理的時候,我們只需要先將一個qwen1.5-1.8B的基礎模型加載到顯存中,然后根據(jù)任務類型,來動態(tài)決定使用哪個lora權重合并到基礎模型中,具體可參考這篇博文:

https://zhuanlan.zhihu.com/p/691710751

簡單來說就是對multi-lora進行切換的操作。不過,這種方式可能會增加單次預測的推理時延(額外增加了lora卸載和裝載的操作時間),可以綜合當前硬件情況以及應用服務的使用頻次,對高頻次、時延要求比較高的任務單獨部署獨立的模型服務,對于低頻次、時延要求低的任務采用上述multi-lora切換的模式。

小結

本文主要目的是探討大模型應用在傳統(tǒng)NLP任務上的有效性和增益,通過一個細分的文本理解任務——文本分類,研究了大模型應用的不同“姿勢”。最終發(fā)現(xiàn),將大模型結合BERT式微調(diào)的方法在標注語料比較充分的時候,相對于已有的BERT類方法還能有進一步的精度提升,同時在部署推理成本上的投入也是可控的;另外,對于小樣本標簽類別的學習能力也能夠幫助提升對于邊界case的處理。當整體的標注數(shù)據(jù)語料比較匱乏的時候,也不妨可以應用大模型+sft+prompt工程的模式,輔助技術團隊進行冷啟動,在積累一定的標注語料后,可以切換成上述BERT式的微調(diào)方式,以提升任務的精度。

本文轉載自 ??NLP工作站??,作者: 邱震宇

收藏
回復
舉報
回復
相關推薦