chatGPT模型參數 可直訓ChatGPT類模型!華師大、NUS開源HugNLP框架:一鍵刷榜
【新智元導讀】一站式NLP工具箱,你想要的全都有!
近日,華師大團隊研發了框架,這是一個面向研究者和開發者的全面統一的NLP訓練框架,可支持包括文本分類、文本匹配、問答、信息抽取、文本生成、小樣本學習等多種NLP任務模型搭建和訓練。
開源地址:
論文:
值得注意的是,還集成了大量最新的技術,例如-、In- 、-,未來還將引入-of-
團隊還研發了一系列的應用,例如CLUE&GLUE刷榜工具,可支持類模型訓練和部署產品,以及統一信息抽取產品等。
是一個分層式框架,遵循“高內聚低耦合”的開發模式,其核心包括模型層()、處理器層()、評估器層()和應用層()四部分。
框架圖如下所示:
完全基于開發,具有易擴展、易部署能力,同時集成了訓練追蹤器,方便使用者及時追蹤實驗進度,并進行實驗分析。
框架之所以稱為全面,是因為其集成了大量的NLP任務模型,目前已經實現的包括:
快速部署框架,只需要執行代碼三行命令即可:
git clone https://github.com/HugAILab/HugNLP.git
cd HugNLP
python3 setup.py install
下面介紹的幾個核心能力:
一、一鍵刷榜
最先開發了面向一些常用榜單的刷榜工具,例如GLUE、CLUE等。用戶只需要配置相應的數據集名稱,即可實現一鍵刷榜。
為了驗證框架的有效性,在22年9月提交了CLUE榜單的刷榜結果,選擇一系列中文小模型(、、P-BERT等)并結合了集成方法,至今依然維持在第15名位置,曾一度超越了部分企業。
例如如果訓練CLUE榜單的數據集,可編輯文件
applications/benchmark/clue/clue_finetune_dev.sh
修改參數:
--user_defined="data_name=afqmc"
執行下列命令即可:
bash applications/benchmark/clue/clue_finetune_dev.sh
同樣的方法還可以訓練一些常用的NLP任務,例如閱讀理解、實體識別、以及GLUE英文數據集等。
還集成了一系列模型用于刷榜,例如BERT、、、、等。
二、預訓練與知識注入
傳統的一些預訓練模型(例如BERT、GPT2等)是在通用語料上訓練的,而對領域事實知識可能不敏感,因此需要顯式的在預訓練階段注入事實知識。
在中,主要實現了幾個知識增強預訓練,包括和KP-PLM。是一種可分解的知識注入方法;KP-PLM則是將結構化知識轉化為自然語言描述的形式進行注入。這些知識注入的方法是可插拔式的,因此無需修改模型結構,很容易用于下游任務的微調。
執行下面命令即可進行 和 的預訓練:
bash applications/pretraining/run_pretrain_mlm.sh
bash applications/pretraining/run_pretrain_casual_lm.sh
三、 Fine- & -
基于預訓練語言模型的NLPchatGPT模型參數,通常遵循Pre-和Fine-范式。也包含Fine-技術。
3.1 參數有效性學習
集成了包括-、、、LoRA等參數有效性訓練方法,可以加速模型的訓練,降低顯存占用量。
在訓練腳本中,只需要添加一行參數,即可開啟參數有效性訓練:
--use_freezing
對于參數有效性方法,實現了若干類別的分類模型,如下所示:
CLASSIFICATION_MODEL_CLASSES = {
"head_prefix_cls": {
"bert": BertPrefixForSequenceClassification,
"roberta": RobertaPrefixForSequenceClassification,
},
"head_ptuning_cls": {
"bert": BertPtuningForSequenceClassification,
"roberta": RobertaPtuningForSequenceClassification,
},
"head_adapter_cls": {
"bert": BertAdapterForSequenceClassification,
"roberta": RobertaAdapterForSequenceClassification,
},
"masked_prompt_cls": {
"bert": PromptBertForSequenceClassification,
"roberta": PromptRobertaForSequenceClassification,
},
"masked_prompt_prefix_cls": {
"bert": PromptBertPrefixForSequenceClassification,
"roberta": PromptRobertaPrefixForSequenceClassification,
},
"masked_prompt_ptuning_cls": {
"bert": PromptBertPtuningForSequenceClassification,
"roberta": PromptRobertaPtuningForSequenceClassification,
},
"masked_prompt_adapter_cls": {
"bert": PromptBertAdapterForSequenceClassification,
"roberta": PromptRobertaAdapterForSequenceClassification,
},
}
只需要指定下面參數即可,例如選擇進行分類:
--task_type=head_adapter_cls
3.2 對抗訓練:引入對的擾動,提高模型的魯棒性
框架集成了若干種對抗訓練的方法,其中最簡單的對抗方法為FGM算法:
在訓練時,只需要添加一行參數,即可默認調用FGM算法:
--do_adv
3.3 -:通過模板來復用預訓練目標
傳統的Fine-在低資源場景下容易出現過擬合問題,因此復用預訓練的目標可以拉近Pre-和Fine-之間的語義差異。
集成了PET、P-、-等-算法,并無縫嵌入在NLP分類任務的模型里。
在訓練時,只需要指定下面兩個參數,即可以開啟-模式,例如選擇p-算法:
--task_type=masked_prompt_ptuning_cls
--use_prompt_for_cls
四、-
在大模型時代,如何將不同類型的NLP任務進行范式統一,是構造通用人工智能的核心要素。為此定義了三種統一范式的思想:
基于三種不同的范式統一,推出兩個核心產品,分別是:
4.1 :基于 的生成式對話模型
最近火爆全球,為了讓研究者可以訓練自己的,框架集成了基于生成式的訓練產品——,其支持各種類型的單向生成式模型的訓練,例如GPT-2、GPT-Neo、OPT、GLM、等。
在8張V100 32G的條件下chatGPT模型參數,可訓練OPT-13B大模型。團隊開源了約200萬條英文、300萬條中文對話數據,用于訓練模型。例如訓練GPT-2(XL),可直接執行腳本:
bash ./application/instruction_prompting/HugChat/supervised_finetuning/run_causal_instruction_gpt2_xl.sh
基于,訓練的GPT-2(1.3B)模型,即可實現很簡單的對話任務。只需要執行如下命令即可玩轉:
python3 applications/instruction_prompting/HugChat/hugchat.py
例如可以寫套磁信郵件:
再例如搜索谷歌地球的相關信息:
也可以實現編寫簡單的代碼(1.3B的模型具備此能力已經很驚嘆了!):
目前正在開發其他類型的-only大模型,相關信息和開源內容如下表所示:
后期將推出垂直領域的大模型解決方案,同時將與 API進行融合,推出大模型服務框架。
4.2 :基于 的統一信息抽取框架
信息抽取( )旨在從非結構化的文本中抽取出結構化信息,是構建知識庫的重要步驟之一。通常信息抽取包括兩個核心步驟,分別是命名實體識別( )和關系抽取( )。
我們基于研發一款產品,旨在實現統一信息處理。其主要核心包括如下幾個部分:
目前已經開源了模型: 可以基于框架使用抽取模型,如下圖所示:
五、In-
In- (ICL)首次由GPT-3提出,其旨在挑選少量的標注樣本作為提示(),從而在形式上促使大模型生成目標答案。ICL的優勢在于無需對參數進行更新,即可實現驚艷的效果。
框架集成了ICL,主要涉及到樣本的挑選和預測結果的校準兩個部分:
目前ICL已經集成在里,只需要指定下面參數即可:
--user_defined="data_name=xxx num_incontext_example=4 l=1 use_calibrate=True"
--use_prompt_for_cls
六、半監督Self-
半監督旨在同時結合標注數據和無標簽數據來訓練NLP任務。Self-是一種簡單但有效的迭代式訓練方法,其通過模型先獲取偽標簽,對偽標簽進行去噪后,再訓練模型。傳統的Self-會引入大量噪聲,從而降低訓練的效果。
為了提高性能,引入成熟的- Self-技術。框架圖如下所示:
其采用了來自貝葉斯推斷中的MC 技術,即對模型執行次推理chatGPT模型參數,每次推理開啟開關,從而得到若干與模型滿足獨立同分布的模型預測。
基于這些預測結果,可以通過信息熵的變化量得到模型對無標簽數據的不確定性量化指標(即BALD算法),核心公式如下:
進行多次DC 的代碼實現如下(詳見.py):
y_T = list()
for i in tqdm(range(T)):
y_pred = []
for step, inputs in enumerate(unlabeled_dataloader):
logits, __ = self.prediction_step(model, inputs, prediction_loss_only, ignore_keys=ignore_keys)
y_pred.extend(logits.detach().cpu().numpy().tolist())
predict_proba = torch.softmax(torch.Tensor(y_pred).to(logits.device), -1)
y_T.append(predict_proba.detach().cpu().numpy().tolist())
y_T = np.array(y_T)
#compute mean
y_mean = np.mean(y_T, axis=0)
BALD算法實現如下:
def get_BALD_acquisition(y_T):
expected_entropy = - np.mean(np.sum(y_T * np.log(y_T + 1e-10), axis=-1), axis=0)
expected_p = np.mean(y_T, axis=0)
entropy_expected_p = - np.sum(expected_p * np.log(expected_p + 1e-10), axis=-1)
return (entropy_expected_p - expected_entropy)
使用半監督模式,只需要做兩件事:
(1)執行腳本時添加參數:
--use_semi
(2)在指定的數據集目錄下,存放 data文件。
七、其他更豐富的應用
目前還開發了很多應用如下所示:還有更多豐富的應用正在開發中。也歡迎有志之士加入參與開源開發工作。
團隊介紹
參考資料:
免責聲明:本文系轉載,版權歸原作者所有;旨在傳遞信息,不代表本站的觀點和立場和對其真實性負責。如需轉載,請聯系原作者。如果來源標注有誤或侵犯了您的合法權益或者其他問題不想在本站發布,來信即刪。
聲明:本站所有文章資源內容,如無特殊說明或標注,均為采集網絡資源。如若本站內容侵犯了原著者的合法權益,可聯系本站刪除。