程式碼已上傳到github: https://github.com/taishan1994/chinese_llm_pretrained
前面我們已經講過怎麼構建中文領域的tokenization:
https://zhuanlan.zhihu.com/p/639144223
接下來我們將介紹繼續預訓練。
我們新增加了一些中文詞彙到詞表中,這些詞彙是沒有得到訓練的,因此在進行指令微調之前我們要進行預訓練。預訓練的方式一般都是相同的,簡單來說,就是根據上一個字預測下一個字是什麼。為了方便起見,我們這裡直接使用IDEA-CCNL/Wenzhong2.0-GPT2-110M-BertTokenizer-chinese模型,並且tokenizer也是其自帶的。
同樣的,我們使用的資料還是鬥破蒼穹小說資料。首先我們看看是怎麼處理資料的, 資料位於data下,分別為corpus.txt和test_corpus.txt,每一行為一句或多句話。再看看資料預處理的部分,在test_dataset.py裡面:
import os
import logging
import datasets
import transformers
from pprint import pprint
from itertools import chain
from datasets import load_dataset, concatenate_datasets
from transformers.testing_utils import CaptureLogger
from transformers import AutoTokenizer, LlamaTokenizer
tok_logger = transformers.utils.logging.get_logger("transformers.tokenization_utils_base")
logger = logging.getLogger(__name__)
lm_datasets = []
files = ["data/test_corpus.txt"]
data_cache_dir = "./cache_data"
preprocessing_num_workers = 1
# tokenizer = AutoTokenizer.from_pretrained("hfl/chinese-bert-wwm-ext")
tokenizer = LlamaTokenizer.from_pretrained("ziqingyang/chinese-llama-lora-7b")
tokenizer = AutoTokenizer.from_pretrained("IDEA-CCNL/Wenzhong2.0-GPT2-110M-BertTokenizer-chinese")
def print_dict(adict):
for k,v in adict.items():
print(k, v)
def tokenize_function(examples):
with CaptureLogger(tok_logger) as cl:
output = tokenizer(examples["text"])
# clm input could be much much longer than block_size
if "Token indices sequence length is longer than the" in cl.out:
tok_logger.warning(
"^^^^^^^^^^^^^^^^ Please ignore the warning above - this long input will be chunked into smaller bits"
" before being passed to the model."
)
return output
block_size = 128
# 將所有文字進行拼接
def group_texts(examples):
# Concatenate all texts.
concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()}
total_length = len(concatenated_examples[list(examples.keys())[0]])
# We drop the small remainder, we could add padding if the model supported it instead of this drop, you can
# customize this part to your needs.
if total_length >= block_size:
total_length = (total_length // block_size) * block_size
# Split by chunks of max_len.
result = {
k: [t[i : i + block_size] for i in range(0, total_length, block_size)]
for k, t in concatenated_examples.items()
}
result["labels"] = result["input_ids"].copy()
return result
for idx, file in enumerate(files):
data_file = file
filename = ''.join(file.split(".")[:-1])
cache_path = os.path.join(data_cache_dir, filename)
os.makedirs(cache_path, exist_ok=True)
try:
processed_dataset = datasets.load_from_disk(cache_path, keep_in_memory=False)
print(f'training datasets-{filename} has been loaded from disk')
except Exception:
cache_dir = os.path.join(data_cache_dir, filename + "_text")
os.makedirs(cache_dir, exist_ok=True)
raw_dataset = load_dataset("text", data_files=data_file, cache_dir=cache_dir, keep_in_memory=False)
print_dict(raw_dataset["train"][0])
# 直接進行tokenize,需要注意的是隻需要在句子開頭加上bos_token
tokenized_dataset = raw_dataset.map(
tokenize_function,
batched=True,
num_proc=preprocessing_num_workers,
remove_columns="text",
load_from_cache_file=True,
keep_in_memory=False,
cache_file_names={k: os.path.join(cache_dir, f'tokenized.arrow') for k in raw_dataset},
desc="Running tokenizer on dataset",
)
print_dict(tokenized_dataset["train"][0])
grouped_datasets = tokenized_dataset.map(
group_texts,
batched=True,
num_proc=preprocessing_num_workers,
load_from_cache_file=True,
keep_in_memory=False,
cache_file_names={k: os.path.join(cache_dir, f'grouped.arrow') for k in tokenized_dataset},
desc=f"Grouping texts in chunks of {block_size}",
)
processed_dataset = grouped_datasets
print_dict(processed_dataset["train"][0])
processed_dataset.save_to_disk(cache_path)
if idx == 0:
lm_datasets = processed_dataset['train']
else:
assert lm_datasets.features.type == processed_dataset["train"].features.type
lm_datasets = concatenate_datasets([lm_datasets, processed_dataset["train"]])
lm_datasets = lm_datasets.train_test_split(test_size=0.1)
print_dict(lm_datasets["train"][0])
結果:
text 又一次上架了,這次比上次還激動,甚至激動到了上傳了章節卻不知道發出來的地步。
input_ids [21134, 1348, 671, 3613, 677, 3373, 749, 8024, 6821, 3613, 3683, 677, 3613, 6820, 4080, 1220, 8024, 4493, 5635, 4080, 1220, 1168, 749, 677, 837, 749, 4995, 5688, 1316, 679, 4761, 6887, 1355, 1139, 3341, 4638, 1765, 3635, 511, 21133]
token_type_ids [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
attention_mask [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
input_ids [21134, 1348, 671, 3613, 677, 3373, 749, 8024, 6821, 3613, 3683, 677, 3613, 6820, 4080, 1220, 8024, 4493, 5635, 4080, 1220, 1168, 749, 677, 837, 749, 4995, 5688, 1316, 679, 4761, 6887, 1355, 1139, 3341, 4638, 1765, 3635, 511, 21133, 21134, 2219, 2217, 8024, 1068, 754, 3173, 741, 8024, 677, 3373, 1184, 2768, 5327, 1962, 2533, 3300, 763, 1139, 725, 1759, 6486, 4638, 2692, 3160, 8024, 2190, 754, 6821, 819, 1331, 4798, 4638, 2768, 5327, 8024, 1759, 6486, 2552, 7027, 6820, 4696, 3300, 1126, 1146, 2684, 2607, 680, 2558, 2559, 8024, 6006, 6432, 3295, 5307, 3300, 782, 6432, 1759, 6486, 3221, 1170, 1139, 3341, 4638, 3144, 2945, 8024, 2190, 754, 6821, 763, 4522, 6241, 8024, 2769, 738, 2400, 3313, 1922, 6814, 1762, 2692, 8024, 1166, 4638, 2769, 679]
token_type_ids [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
attention_mask [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
labels [21134, 1348, 671, 3613, 677, 3373, 749, 8024, 6821, 3613, 3683, 677, 3613, 6820, 4080, 1220, 8024, 4493, 5635, 4080, 1220, 1168, 749, 677, 837, 749, 4995, 5688, 1316, 679, 4761, 6887, 1355, 1139, 3341, 4638, 1765, 3635, 511, 21133, 21134, 2219, 2217, 8024, 1068, 754, 3173, 741, 8024, 677, 3373, 1184, 2768, 5327, 1962, 2533, 3300, 763, 1139, 725, 1759, 6486, 4638, 2692, 3160, 8024, 2190, 754, 6821, 819, 1331, 4798, 4638, 2768, 5327, 8024, 1759, 6486, 2552, 7027, 6820, 4696, 3300, 1126, 1146, 2684, 2607, 680, 2558, 2559, 8024, 6006, 6432, 3295, 5307, 3300, 782, 6432, 1759, 6486, 3221, 1170, 1139, 3341, 4638, 3144, 2945, 8024, 2190, 754, 6821, 763, 4522, 6241, 8024, 2769, 738, 2400, 3313, 1922, 6814, 1762, 2692, 8024, 1166, 4638, 2769, 679]
input_ids [21134, 1348, 671, 3613, 677, 3373, 749, 8024, 6821, 3613, 3683, 677, 3613, 6820, 4080, 1220, 8024, 4493, 5635, 4080, 1220, 1168, 749, 677, 837, 749, 4995, 5688, 1316, 679, 4761, 6887, 1355, 1139, 3341, 4638, 1765, 3635, 511, 21133, 21134, 2219, 2217, 8024, 1068, 754, 3173, 741, 8024, 677, 3373, 1184, 2768, 5327, 1962, 2533, 3300, 763, 1139, 725, 1759, 6486, 4638, 2692, 3160, 8024, 2190, 754, 6821, 819, 1331, 4798, 4638, 2768, 5327, 8024, 1759, 6486, 2552, 7027, 6820, 4696, 3300, 1126, 1146, 2684, 2607, 680, 2558, 2559, 8024, 6006, 6432, 3295, 5307, 3300, 782, 6432, 1759, 6486, 3221, 1170, 1139, 3341, 4638, 3144, 2945, 8024, 2190, 754, 6821, 763, 4522, 6241, 8024, 2769, 738, 2400, 3313, 1922, 6814, 1762, 2692, 8024, 1166, 4638, 2769, 679]
token_type_ids [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
attention_mask [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
labels [21134, 1348, 671, 3613, 677, 3373, 749, 8024, 6821, 3613, 3683, 677, 3613, 6820, 4080, 1220, 8024, 4493, 5635, 4080, 1220, 1168, 749, 677, 837, 749, 4995, 5688, 1316, 679, 4761, 6887, 1355, 1139, 3341, 4638, 1765, 3635, 511, 21133, 21134, 2219, 2217, 8024, 1068, 754, 3173, 741, 8024, 677, 3373, 1184, 2768, 5327, 1962, 2533, 3300, 763, 1139, 725, 1759, 6486, 4638, 2692, 3160, 8024, 2190, 754, 6821, 819, 1331, 4798, 4638, 2768, 5327, 8024, 1759, 6486, 2552, 7027, 6820, 4696, 3300, 1126, 1146, 2684, 2607, 680, 2558, 2559, 8024, 6006, 6432, 3295, 5307, 3300, 782, 6432, 1759, 6486, 3221, 1170, 1139, 3341, 4638, 3144, 2945, 8024, 2190, 754, 6821, 763, 4522, 6241, 8024, 2769, 738, 2400, 3313, 1922, 6814, 1762, 2692, 8024, 1166, 4638, 2769, 679]
具體是:
在test_model.py裡面我們可以初步使用預訓練的模型看看效果:
from transformers import BertTokenizer,GPT2LMHeadModel, AutoModelForCausalLM
hf_model_path = 'IDEA-CCNL/Wenzhong2.0-GPT2-110M-BertTokenizer-chinese'
tokenizer = BertTokenizer.from_pretrained(hf_model_path)
# model = GPT2LMHeadModel.from_pretrained(hf_model_path)
model = AutoModelForCausalLM.from_pretrained(hf_model_path)
def generate_word_level(input_text,n_return=5,max_length=128,top_p=0.9):
inputs = tokenizer(input_text,return_tensors='pt',add_special_tokens=False).to(model.device)
gen = model.generate(
inputs=inputs['input_ids'],
max_length=max_length,
do_sample=True,
top_p=top_p,
eos_token_id=21133,
pad_token_id=0,
num_return_sequences=n_return)
sentences = tokenizer.batch_decode(gen)
for idx,sentence in enumerate(sentences):
print(f'sentence {idx}: {sentence}')
print('*'*20)
return gen
# 西湖的景色
outputs = generate_word_level('西湖的景色',n_return=5,max_length=128)
print(outputs)
結果:
sentence 0: 西 湖 的 景 色 很 美 麗, 古 代 有 個 名 叫 : 西 湖 的 湖 南 和 江 南 的 一 段 。 湖 面 上 有 一 座 小 小 的 湖 泊, 有 一 片 湖 泊 和 一 座 小 島, 有 一 處 小 的 小 鎮 。 在 西 湖 裡, 每 個 人 都 是 在 湖 邊, 你 可 以 在 小 小 湖 裡 暢 遊 。 西 湖 上 是 古 代 建 築, 但 湖 水 不 多 。 西 湖 上 是 一 座 水 庫, 古 代 有 個 名 叫 : 西 湖 的 湖 南 和 江 南 的 一 段 。 湖
********************
sentence 1: 西 湖 的 景 色 美 不 勝 數 。 近 日, 位 於 湖 北 省 湖 北 省 石 家 莊 市 的 石 家 莊 旅 遊 風 景 區 被 命 名 為 " 湖 北 省 國 家 級 森 林 公 園 " 。 園 內 有 一 座 石 屋, 位 於 石 屋 與 石 屋 的 對 面, 總 面 積 3. 2 平 方 公 裡, 其 中 一 座 石 屋, 由 石 屋 和 石 屋 組 成, 一 棟 大 型 石 屋 由 石 屋 組 成, 三 棟 石 屋 由 石 屋 組 成 。 石 屋 主 要 是 一 座 石 屋
********************
sentence 2: 西 湖 的 景 色 在 古 城 、 小 鎮 和 城 郊 中, 有 大 片 的 湖 泊, 是 古 典 中 的 佳 餚, 湖 水 清 澈, 湖 中 有 一 大 塊 魚, 在 湖 水 裡 散 發 著 濃 鬱 的 清 香 。 湖 水 中, 有 各 種 顏 色 的 魚 、 蟹 、 貝 殼 類 的 水 產 品 。 湖 邊 有 的 池 塘 也 有 的 水 果 攤 位, 可 供 上 千 家 店 。 在 湖 中 央 的 湖 中 央 有 三 個 小 水 塘, 水 塘 長 約 三 丈, 兩 端 長, 塘 底
********************
sentence 3: 西 湖 的 景 色 也 很 漂 亮, 可 以 說 是 城 市 的 象 徵, 而 且 還 有 小 小 的 山 洞, 看 到 了, 我 們 在 西 湖 的 中 心 也 很 近, 所 以 也 沒 有 停 止, 西 湖 的 風 景 很 秀 美, 我 們 也 不 願 意 停 留 在 這 樣 的 地 方 。 西 湖 是 世 界 上 最 美 的 湖 泊, 也 是 最 令 人 羨 慕 的 旅 遊 區, 西 湖 的 美 麗 不 容 小 視, 是 我 們 心 中 最 美 的 風 景 。 西 湖 在 西 湖
********************
sentence 4: 西 湖 的 景 色 是 如 此 獨 特, 那 水 碧 草 如 黛, 池 水 清 新, 一 池 青 湖, 遊 人 可 以 品 一 小 池 花 。 " " 好 景 如 畫, 山 清 水 秀, 碧 草 如 茵, 池 清 潭 秀 。 " 黃 湖 " 是 西 湖 的 " 綠 色 湖 " 。 西 湖 的 景 色 是 如 此 獨 特, 那 水 碧 草 如 黛, 池 水 清 新, 一 池 青 湖, 遊 人 可 以 品 一 小 池 花 。 " " 好 景 如 畫, 山 清 水 秀, 碧 草 如 茵
********************
接下來是使用該模型針對我們自己的資料進行繼續預訓練了。需要注意的幾個地方:
model_vocab_size = model.get_output_embeddings().weight.size(0)
model.resize_token_embeddings(len(tokenizer))
訓練指令:
torchrun --nnodes 1 --nproc_per_node 1 run_clm_pt_with_peft.py --deepspeed ds_zero2_no_offload.json --model_name_or_path IDEA-CCNL/Wenzhong2.0-GPT2-110M-BertTokenizer-chinese --tokenizer_name_or_path IDEA-CCNL/Wenzhong2.0-GPT2-110M-BertTokenizer-chinese --dataset_dir data --data_cache_dir temp_data_cache_dir --validation_split_percentage 0.001 --per_device_train_batch_size 32 --per_device_eval_batch_size 16 --do_train --seed $RANDOM --fp16 --max_steps 2500 --lr_scheduler_type cosine --learning_rate 2e-4 --warmup_ratio 0.05 --weight_decay 0.01 --logging_strategy steps --logging_steps 10 --save_strategy steps --save_total_limit 3 --save_steps 50 --gradient_accumulation_steps 1 --preprocessing_num_workers 8 --block_size 512 --output_dir output_dir --overwrite_output_dir --ddp_timeout 30000 --logging_first_step True --lora_rank 8 --lora_alpha 32 --trainable c_attn --modules_to_save transformer.wte,lm_head --lora_dropout 0.05 --torch_dtype float16 --gradient_checkpointing --ddp_find_unused_parameters False
即:
torchrun --nnodes 1 --nproc_per_node 1 run_clm_pt_with_peft.py \
--deepspeed ds_zero2_no_offload.json \
--model_name_or_path IDEA-CCNL/Wenzhong2.0-GPT2-110M-BertTokenizer-chinese \
--tokenizer_name_or_path IDEA-CCNL/Wenzhong2.0-GPT2-110M-BertTokenizer-chinese \
--dataset_dir data \
--data_cache_dir temp_data_cache_dir \
--validation_split_percentage 0.001 \
--per_device_train_batch_size 32 \
--per_device_eval_batch_size 16 \
--do_train --seed $RANDOM \
--fp16 \
--max_steps 2500 \
--lr_scheduler_type cosine \
--learning_rate 2e-4 \
--warmup_ratio 0.05 \
--weight_decay 0.01 \
--logging_strategy steps \
--logging_steps 10 \
--save_strategy steps \
--save_total_limit 3 \
--save_steps 50 \
--gradient_accumulation_steps 1 \
--preprocessing_num_workers 8 \
--block_size 512 \
--output_dir output_dir \
--overwrite_output_dir \
--ddp_timeout 30000 \
--logging_first_step True \
--lora_rank 8 \
--lora_alpha 32 \
--trainable c_attn \
--modules_to_save transformer.wte,lm_head \
--lora_dropout 0.05 \
--torch_dtype float16 \
--gradient_checkpointing \
--ddp_find_unused_parameters False
由於使用了seepspeed中ZeRo,佔用的視訊記憶體會更小。
最後我們可以這麼使用模型,在test_pretrained_model.py中:
import os
import torch
from transformers import BertTokenizer,GPT2LMHeadModel, AutoModelForCausalLM
from peft import PeftModel
hf_model_path = 'IDEA-CCNL/Wenzhong2.0-GPT2-110M-BertTokenizer-chinese'
tokenizer = BertTokenizer.from_pretrained(hf_model_path)
# model = GPT2LMHeadModel.from_pretrained(hf_model_path)
model = AutoModelForCausalLM.from_pretrained(hf_model_path)
model_vocab_size = model.get_output_embeddings().weight.size(0)
model.resize_token_embeddings(len(tokenizer))
model = PeftModel.from_pretrained(model, os.path.join("output_dir", "adapter_model"), torch_dtype=torch.float32)
model.cuda()
model.eval()
def generate_word_level(input_text,n_return=5,max_length=128,top_p=0.9):
inputs = tokenizer(input_text,return_tensors='pt',add_special_tokens=False).to(model.device)
gen = model.generate(
inputs=inputs['input_ids'],
max_length=max_length,
do_sample=True,
top_p=top_p,
eos_token_id=21133,
pad_token_id=0,
num_return_sequences=n_return)
sentences = tokenizer.batch_decode(gen)
for idx,sentence in enumerate(sentences):
print(f'sentence {idx}: {sentence}')
print('*'*20)
return gen
outputs = generate_word_level('眼角斜瞥著柳翎那略微有些陰沉的臉龐。蕭炎',n_return=5,max_length=128)
print(outputs)
結果:
sentence 0: 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 淡 淡 的 道 。 <|endoftext|> [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD]
********************
sentence 1: 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 一 怔 。 手 掌 猛 然 一 僵 。 手 指 一 扯 。 旋 即 在 房 門 內 停 留 。 旋 即 一 口 鮮 血 噴 湧 而 出 。 <|endoftext|>
********************
sentence 2: 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 頓 時 愣 了 愣 。 他 這 是 何 人 ? 怎 能 知 道 這 位 灰 袍 老 者 出 手 啊 ? <|endoftext|> [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD]
********************
sentence 3: 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 心 中 有 著 什 麼 感 觸 ? <|endoftext|> [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD]
********************
sentence 4: 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 微 皺 著 眉 頭 。 轉 過 身 。 輕 聲 道 : 「 柳 翎 。 是 你 的 人 ? 」 <|endoftext|> [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD]
********************
對於沒有經過繼續預訓練的模型結果:
sentence 0: 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎, 男, 1964 年 生, 河 北 齊 齊 哈 爾 市 人 。 1979 年 畢 業 於 武 漢 工 學 院 中 文 系, 1988 年 畢 業 於 中 國 人 民 大 學 中 文 系, 歷 任 中 國 人 民 大 學 高 級 教 師 、 教 育 部 大 學 文 學 系 主 任, 中 國 語 言 文 學 會 理 事, 中 國 人 民 大 學 歷 史 學 會 副 會 長, 中 國 作 家 協 會 員, 中 國 作 家 協 會 會
********************
sentence 1: 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 的 臉 龐 在 不 同 時 期 會 發 出 來 , 這 樣 的 眉 目 和 眉 目 能 夠 很 容 易 的 在 一 起 , 能 夠 讓 人 看 得 見 的 就 是 這 樣 的 眉 目 。 那 一 對 情 侶 還 是 非 常 喜 歡 的 , 不 過 他 們 的 交 往 方 式 也 是 各 種 多 樣 的 , 最 後 的 交 往 方 式 就 是 讓 所 有 的 人 都 看 到 了 自 己 的 內 心 。 他 們 倆 是 非 常 相
********************
sentence 2: 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 眼 睛 看 向 柳 翎, 眼 眸 裡 滿 是 傷 痕 。 「 天 邊 來 客 。 」 柳 翎 那 無 情 的 目 光 中 透 著 幾 分 冷 漠 的 微 笑 。 「 沒 有 你 的 名 字, 你 只 是 名 字 。 」 柳 翎 在 柳 翎 眼 前 一 怔, 無 意 中 卻 看 出 了 柳 翎 已 經 在 想 要 離 開 了 。 柳 翎 說 這 些 東 西 有 的 是 一 次 次 的 意 外, 她 還 是 有 意 的,
********************
sentence 3: 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 的 臉 上 只 有 幾 分 陰 沉, 但 卻 能 夠 帶 著 微 微 的 憐 惜 之 心 。 蕭 炎 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 眼 角
********************
sentence 4: 眼 角 斜 瞥 著 柳 翎 那 略 微 有 些 陰 沉 的 臉 龐 。 蕭 炎 已 經 是 年 輕 貌 美 的 人, 在 某 處 留 下 的 是 無 盡 的 光 影 。 她 的 微 笑 也 在 耳 畔 閃 爍 著 光 影 。 他 不 斷 地 伸 出 手 指, 他 在 他 的 微 笑 中 輕 鬆 地 走 著, 而 柳 翎 卻 始 終 沉 默 。 他 已 經 是 個 女 孩 子, 在 某 處 也 許 你 聽 不 見 。 他 輕 輕 地 接 過 他 的 手, 輕 輕 地 說 道 : " 沒 有 人 聽
********************
模型確實得到了有效的訓練。
到這裡,你已經瞭解了怎麼構建中文詞表並繼續預訓練了,接下來可能你還想了解指令微調,那我們下期再見。