哪些網(wǎng)站是用python做的seo如何快速排名百度首頁
?????????在很多場景下下,可能微調(diào)模型并不能帶來一個較好的效果。因為特定領域場景下,通用話模型過于通用,出現(xiàn)多而不精。樣樣通樣樣松;本章主要介紹如何在特定的數(shù)據(jù)上對模型進行預訓練;
????????訓練自己的語言模型(從頭開始訓練)與微調(diào)(fine-tuning)預訓練模型之間的選擇取決于多個因素,包括但不限于數(shù)據(jù)特性、任務需求、計算資源和時間成本。以下是一些原因,解釋為什么有時候你可能想要訓練自己的語言模型,而不是僅僅微調(diào)現(xiàn)有的預訓練模型:
????????訓練自己的語言模型(從頭開始訓練)與微調(diào)(fine-tuning)預訓練模型之間的選擇取決于多個因素,包括但不限于數(shù)據(jù)特性、任務需求、計算資源和時間成本。以下是一些原因,解釋為什么有時候你可能想要訓練自己的語言模型,而不是僅僅微調(diào)現(xiàn)有的預訓練模型:
1. **領域特異性**:如果你的工作涉及非常專業(yè)的領域,如醫(yī)療健康、法律或金融,那么現(xiàn)有的預訓練模型可能沒有包含足夠的領域相關數(shù)據(jù)。在這種情況下,從頭開始訓練一個模型,使用專門領域的大量文本數(shù)據(jù),可以讓模型更好地理解和生成專業(yè)領域的文本。
2. **數(shù)據(jù)量大且獨特**:如果你擁有大量的專有數(shù)據(jù),這些數(shù)據(jù)具有獨特的特點,那么訓練一個模型以充分利用這些數(shù)據(jù)的獨特性可能更有意義。預訓練模型通常是在廣泛的數(shù)據(jù)集上訓練的,可能無法捕捉到特定數(shù)據(jù)集中存在的細微差別。
3. **控制模型架構**:訓練自己的模型允許你完全控制模型架構的選擇,包括層數(shù)、隱藏單元的數(shù)量以及其他超參數(shù)。這對于研究或開發(fā)新方法特別有用。
4. **避免偏見和數(shù)據(jù)污染**:預訓練模型可能包含了來自其訓練數(shù)據(jù)的某些偏見。如果你希望避免這些偏見,或者你的任務要求極高精度而不能容忍任何潛在的偏見,那么訓練一個干凈的新模型可能是更好的選擇。
5. **數(shù)據(jù)隱私和安全**:對于處理敏感數(shù)據(jù)的情況,從頭開始訓練模型可以確保所有數(shù)據(jù)都保留在內(nèi)部系統(tǒng)中,而不必擔心將數(shù)據(jù)發(fā)送到外部服務器進行微調(diào)。
6. **探索新的模型架構**:對于學術研究來說,開發(fā)和訓練新型的模型架構是一個重要的方向。這通常需要從零開始訓練模型,以便全面地測試和驗證新設計的有效性。
7. **資源可用性**:如果你有充足的計算資源(如高性能GPU集群),那么從頭訓練模型可能并不是一個問題,并且可能帶來更好的長期投資回報。
盡管如此,訓練自己的語言模型是一項耗時且資源密集型的任務。如果你的數(shù)據(jù)集不大,或者任務領域與現(xiàn)有預訓練模型的數(shù)據(jù)集重疊較多,那么微調(diào)一個預訓練模型通常是更為高效和實用的選擇。微調(diào)可以讓你快速地適應特定任務,同時保持較高的準確性和較低的成本。
1 數(shù)據(jù)準備?
????????選擇一個中文為主的語料進行訓練。
https://huggingface.co/datasets/pleisto/wikipedia-cn-20230720-filtered
![]() |
2 模型
選擇使用BERT模型:
需要注意的是模型類別不同使用的方法也不一樣的:
1.?Encoder-Decoder Models(編碼器-解碼器模型):EncoderDecoderModel
典型代表:Transformer(如BERT)、Seq2Seq(如T5) 訓練方法:
- 掩碼語言建模(Masked Language Modeling, MLM):在訓練過程中隨機遮蓋輸入序列的一部分單詞,然后讓模型預測這些被遮蓋的單詞。
- 序列到序列任務(Sequence-to-Sequence Tasks):如機器翻譯、文本摘要等,輸入一個源序列,輸出一個目標序列。
2.?Decoder-Only Models(解碼器模型):AutoModelForCausalLM
典型代表:GPT系列(如GPT-2、GPT-3)、BLOOM 訓練方法:
- 因果語言建模(Causal Language Modeling, CLM):在訓練過程中,模型預測序列中的下一個詞,僅依賴于序列中的先前詞。這是一種自回歸式的訓練方法,即每次預測下一個詞時,只看前面的詞。
- 文本生成:這類模型非常適合生成連貫的文本序列,因為它們可以逐詞生成文本,并且保證生成的文本是連貫的。
3.?Encoder-Only Models(編碼器模型):AutoModelForMaskedLM
典型代表:RoBERTa 訓練方法:
- 掩碼語言建模(MLM):類似于BERT,但在訓練過程中可能采用不同的掩碼策略。
- 句子對預測(Next Sentence Prediction, NSP):雖然RoBERTa不再使用NSP,但在早期的一些模型中,這種方法用于預測兩個句子是否相鄰。
https://hf-mirror.com/google-bert/bert-base-chinese
????????下面是一個去掉部分詞的標簽:
from datasets import load_dataset, Dataset
from transformers import AutoTokenizer, AutoModelForMaskedLM, DataCollatorForLanguageModeling, TrainingArguments, Trainerds = Dataset.load_from_disk("../data/wiki_chines_filter/")
ds#ds[1]#定義一個過濾函數(shù)
def filter_function(example):# 確保返回布爾值if 'completion' in example and isinstance(example['completion'], str) and example['completion']:return Truereturn Falseds = ds.filter(lambda example: filter_function(example))
dstokenizer = AutoTokenizer.from_pretrained("../bert-base-chinese/")def process_func(examples):#print(examples)contents = [e + tokenizer.sep_token for e in examples["completion"]]return tokenizer(contents, max_length=384, truncation=True)
# try:
# contents = [e + tokenizer.eos_token for e in examples["completion"]]
# return tokenizer(contents, max_length=384, truncation=True)
# except:#print(examples['completion'])#exit()
tokenized_ds = ds.map(process_func, batched=True, remove_columns=ds.column_names)
tokenized_dsfrom torch.utils.data import DataLoader
dl = DataLoader(tokenized_ds, batch_size=2, collate_fn=DataCollatorForLanguageModeling(tokenizer, mlm=False))model = AutoModelForMaskedLM.from_pretrained("../bert-base-chinese/")args = TrainingArguments(output_dir="./causal_lm",per_device_train_batch_size=2,gradient_accumulation_steps=16,logging_steps=10,num_train_epochs=1,#fp16=True
)
trainer = Trainer(args=args,model=model,tokenizer=tokenizer,train_dataset=tokenized_ds,data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=True, mlm_probability=0.15)
)
trainer.train()