提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 摘要
- Abstract
- 一、方法介紹
- 1.任務適應性持續預訓練(TACP)
- 2.領域自適應連續預訓練(DACP)
- 3.ETS-DACP和ETA-DACP
- 二、實驗
- 1.實驗概況
- 2.實驗代碼
- 3.實驗結果
- 總結
摘要
本博客介紹了論文《Efficient Continual Pre-training for Building Domain
Specific Large Language Models》通過持續預訓練構建特定領域大語言模型的策略。研究以金融領域為例,創建了包含160億單詞的大規模金融語料庫,訓練了基于Pythia的FinPythia模型。實驗表明,領域自適應持續預訓練能提升模型在金融任務上的表現,且不損害其開放領域能力。此外,提出了ETS - DACP和ETA - DACP兩種高效的持續預訓練方法,通過數據選擇策略,僅用10%的語料和成本就能取得優于普通持續預訓練的效果,為低成本構建特定領域大語言模型提供了新途徑。
Abstract
This blog introduces the paper “Efficient Continual Pre-training for Building Domain Specific Large Language Models” which discusses strategies for constructing domain-specific large language models through continual pre-training. Taking the financial sector as an example, a large-scale financial corpus containing 16 billion words was created, and the Pythia-based FinPythia model was trained. Experiments show that domain-adaptive continual pre-training can enhance the model’s performance on financial tasks without compromising its open-domain capabilities. Additionally, two efficient continual pre-training methods, ETS - DACP and ETA - DACP, are proposed, which achieve better results than ordinary continual pre-training using only 10% of the corpus and cost, providing a new approach for low-cost construction of domain-specific large language models.
一、方法介紹
1.任務適應性持續預訓練(TACP)
任務適應性持續預訓練(TACP)是指旨在提高目標任務績效的持續預訓練。TACP已經在較小的語言模型(如BERT)的背景下進行了研究,通過對來自任務的標記和未標記數據預訓練語言模型,顯示了對任務的改進。雖然任務數據通常非常有限,但TACP對BERT等較小的語言模型有相當大的影響。
2.領域自適應連續預訓練(DACP)
域自適應連續預訓練(DACP)是從頭開始建造的直接替代方案。域自適應持續的預訓練表明能夠適應語言模型以更好地擬合內域分布。 它們還使大型語言模型能夠獲取新知識,因為出現了新數據,而不是從頭開始訓練模型。
3.ETS-DACP和ETA-DACP
TACP的主要局限性在于它專注于構建特定于任務的LLM,而不是基礎LLM,這是因為它只使用未標記的任務數據進行訓練。雖然DACP使用的領域語料庫要大得多,但它的成本非常高。針對這些局限性,研究者提出了兩種方法:高效任務相似領域自適應連續預訓練(ETS-DACP)和高效任務不可知域自適應連續預訓練(ETA-DACP)。ETS-DACP旨在通過定制DACP來為一系列任務建立基礎LLM,以強調這些任務的重要性,而ETA-DACP則更加通用,從領域語料庫中選擇信息最豐富的樣本進行持續的預培訓。
ETS-DACP(任務感知的領域自適應持續預訓練)
目標:從領域語料庫中選擇與任務數據分布相似的樣本。
實現:
1.使用嵌入模型(如Spacey)計算任務數據和領域數據的文檔級嵌入。
2.采用余弦相似度來衡量領域文檔d與任務文檔t之間的相似度:
3.選擇相似度最高的樣本或按相似度分配權重進行訓練。
ETA-DACP(任務無關的領域自適應持續預訓練)
目標:在無任務數據的情況下,選擇領域語料庫中新穎性和多樣性較高的樣本。
實現:新穎性:通過困惑度Perplexity衡量樣本的新穎性。
使用小模型作為代理計算困惑度,選擇困惑度高的樣本(模型不熟悉的文本)。
多樣性:通過詞性標簽的熵衡量,選擇熵高的樣本:
理論支撐:
泛化誤差界限:
DHPΔHP是由界限的D和T之間的分布差異距離:
核心思想:通過最小化領域數據分布 D和T之間的分布差異距離DHPΔHP,提升模型在任務上的泛化性能。
實現方式:選擇與任務數據分布接近的領域數據(ETS-DACP)或高信息量的領域數據(ETA-DACP)。
二、實驗
1.實驗概況
以金融領域為研究場景,基于Pythia模型構建持續預訓練模型FinPythia,通過實驗對比不同方法在金融任務和開放領域標準任務上的表現。從金融新聞CommonCrawl和SEC filings兩個來源收集數據,構建包含160億單詞的大規模金融語料庫。采用領域自適應持續預訓練(DACP)、任務自適應持續預訓練(TACP),并提出高效任務相似領域自適應持續預訓練(ETS - DACP)和高效任務無關領域自適應持續預訓練(ETA - DACP)。
使用相似度、困惑度和詞元類型熵三個指標進行數據選擇,有硬采樣和軟采樣兩種方式。
在金融任務上采用FLARE框架評估模型,在開放領域標準任務上使用MMLU和TruthfulQA等進行評估。通過對比不同模型在各任務上的表現,分析不同預訓練方法和數據選擇策略的效果。
2.實驗代碼
完整代碼鏈接:https://github.com/EleutherAI/lm-evaluation-harness
以下展示實驗關鍵代碼及相應注釋說明:
import os
from itertools import isliceimport datasets
import pytestimport lm_eval.tasks as tasks
from lm_eval.api.task import ConfigurableTask
from lm_eval.evaluator_utils import get_task_listfrom .utils import new_tasks# 設置HuggingFace數據集信任遠程代碼(與論文中使用的第三方金融數據相關)
datasets.config.HF_DATASETS_TRUST_REMOTE_CODE = True
# 禁用tokenizers并行處理(防止多進程沖突)
os.environ["TOKENIZERS_PARALLELISM"] = "false"
# 默認測試任務列表(對應論文中Table 4的開放域評估任務)
TASKS = ["arc_easy"]def get_new_tasks_else_default():"""檢查是否有修改后的新任務,否則返回默認任務列表(對應論文中第3章實驗設置,支持自定義金融評估任務)"""global TASKStask_classes = new_tasks() # 獲取新增/修改的任務(如論文提出的FLARE金融評估框架)return task_classes if task_classes else TASKSdef task_class(task_names=None, task_manager=None) -> ConfigurableTask:"""將任務名稱轉換為可配置任務實例(支持論文中第4節的多任務評估設置)"""if task_manager is None:task_manager = tasks.TaskManager()res = tasks.get_task_dict(task_names, task_manager) # 加載任務配置res = [x.task for x in get_task_list(res)] # 實例化任務對象return res@pytest.fixture()
def limit() -> int:return 10 # 測試文檔數量限制(加速測試過程)# 基礎測試類(驗證任務配置的完整性)
class BaseTasks:"""測試語言模型評估任務的核心功能"""def test_download(self, task_class: ConfigurableTask):"""驗證數據集下載功能(對應論文附錄E的金融語料庫構建流程)"""task_class.download()assert task_class.dataset is not Nonedef test_has_training_docs(self, task_class: ConfigurableTask):"""檢查是否包含訓練文檔(用于持續預訓練的數據準備)"""assert task_class.has_training_docs() in [True, False]def test_doc_to_text(self, task_class, limit):"""驗證文檔到文本的轉換(對應論文3.1節的指令提示設計)"""task = task_classarr = list(islice(task.test_docs(), limit)) if task.has_test_docs() else list(islice(task.validation_docs(), limit))_array = [task.doc_to_text(doc) for doc in arr]# 檢查文本格式是否符合論文中的空間約定(防止目標分隔符沖突)def test_create_choices(self, task_class, limit):"""驗證多選任務選項生成(對應論文Table 1中的分類任務設置)"""task = task_classif "multiple_choice" in task._config.output_type:_array = [task.doc_to_choice(doc) for doc in arr]assert all(isinstance(x, list) for x in _array) # 確保選項格式正確def test_build_all_requests(self, task_class, limit):"""構建評估請求(對應論文4.1節的5-shot評估設置)"""task_class.build_all_requests(rank=1, limit=limit, world_size=1)assert task_class.instances is not None# 參數化測試:使用論文提出的新任務或默認任務
@pytest.mark.parametrize("task_class",task_class(get_new_tasks_else_default()),ids=lambda x: f"{x.config.task}", # 顯示任務名稱
)
class TestNewTasksElseDefault(BaseTasks):"""測試新增/修改的任務配置(驗證論文3.2節的實驗設置有效性)"""# 單元測試:專門測試Unitxt格式任務(對應論文中FLARE評估框架的實現)
@pytest.mark.parametrize("task_class",task_class(["arc_easy_unitxt"], tasks.TaskManager(include_path="./tests/testconfigs")),
)
class TestUnitxtTasks(BaseTasks):"""測試自定義任務格式(驗證論文附錄B中數據分布分析的實現)"""def test_doc_to_text(self, task_class, limit: int):"""驗證復雜文本生成(對應論文Table 2的定性評估案例)"""task = task_class_array = [task.doc_to_text(doc) for doc in arr]if not task.multiple_input:for x in _array:assert isinstance(x, str) # 確保生成文本格式正確
核心測試類:BaseTasks中的每個測試方法對應論文不同章節:
test_download驗證附錄E的金融語料庫構建
test_create_choices對應Table 1的多分類任務設置
test_build_all_requests實現4.1節的5-shot評估
3.實驗結果
為了監控預訓練過程,研究者隨機抽取了0.1%的金融語料作為金融測試數據集。該模型還在Pile測試數據集上進行了評估。FinPythia6.9B的損失軌跡如下圖所示:
研究者觀察到在持續預訓練的早期階段,財務測試(Fin測試)損失急劇減少,并且進展逐漸飽和。
為了評估金融領域的任務,研究者將Finpythia與Pythia和其他相似大小的開源模型進行了比較,將OPT-7B ,BLOOM-7B [和GPT-J-6B作為基準模型。
結果如下表所示:
FinPythia-6.9B和FinPythia-1B在任務FPB、標題和NER上表現出上級性能,而在FiQA SA任務上表現出相對較低的結果。DACP將1B模型的平均任務性能提高了2.8%,將6.9B模型的平均任務性能提高了8.3%。這些結果直接證實了領域適應性持續預訓練對提高領域內任務績效的影響。此外,Pythia-6.9B的平均性能優于OPT-7 B、BLOOM-7 B和GPT-J-6 B。
使用Efficient DACP方法,研究者選擇了10%的金融語料子集用于每種方法,還創建了另一個版本的ETS-DACP,稱為ETS-DACP-com,通過使用其他兩個具有相似性的指標,對所有三個指標進行平均排名/加權。為了減輕過擬合,TACP和Efficient DACP方法都運行單個epoch,采用與DACP相同的預訓練配置,以確保公平比較,實驗結果如下所示:
雖然與原始Pythia-1B相比,TACP在模型性能上有顯著改善,但ETS-DACP在平均任務性能方面突出,成為DACP,TACP和高效DACP方法中表現最好的方法。
在10%語料庫上訓練的ETS-DACP在100%數據的情況下優于DACP;TS-DACP在所有三個同行中具有最好的性能,并且與三個度量的組合- ETS-DACP-com相當;采用硬采樣的DACP方法優于采用軟采樣的DACP方法。
總結
研究者提出ETS - DACP和ETA - DACP兩種高效領域自適應持續預訓練方法,通過數據選擇策略提升預訓練效果。首次在大語言模型持續預訓練中進行數據選擇,提出基于相似度、困惑度和標記類型熵的選擇策略。首次在大語言模型持續預訓練中進行數據選擇,提出基于相似度、困惑度和標記類型熵的選擇策略。