🚀 Phi2-Chinese-0.2B:Phi2の中国語小規模モデルをゼロからトレーニング
このプロジェクトは実験的なもので、オープンソースのコードとモデルの重みを提供しています。ただし、事前学習データは少ないです。もしより良い性能の中国語小規模モデルが必要な場合は、プロジェクトChatLM - mini - Chineseを参考にしてください。
GithubリポジトリのURL:Phi2 - mini - Chinese
🚀 クイックスタート
1. ⚗️ データクリーニング
コード:dataset.ipynb。
例えば、文の末尾に句点を追加したり、繁体字を簡体字に変換したり、全角文字を半角文字に変換したり、重複する句読点を削除したり(例えば、一部の会話コーパスには"。。。。。"
のようなものが多い)します。
具体的なデータクリーニングのプロセスについては、プロジェクトChatLM - mini - Chineseを参照してください。
2. 🗨️ tokenizerのトレーニング
コード:tokeinzer.ipynb
このプロジェクトでは、byte level
のBPE
トークナイザーを使用しています。char level
とbyte level
の2種類のトークナイザーのトレーニングコードを提供しています。
トレーニング後のtokenizerについては、語彙表に\t
、\n
などの一般的な特殊記号が含まれているかを確認してください。特殊文字を含む文章をencode
、decode
して、元に戻るかどうかを試すことができます。これらの特殊文字が含まれていない場合は、add_tokens
関数を使用して追加します。語彙表のサイズはlen(tokenizer)
で取得でき、tokenizer.vocab_size
はadd_tokens
関数で追加した文字をカウントしません。
tokenizerのトレーニングはメモリを大量に消費します。
byte level
で1億文字をトレーニングするには、少なくとも32G
のメモリが必要です(実際には32G
では不十分で、頻繁にswapが発生します)。13600k
でのトレーニング時間は約1時間です。
char level
で6.5億文字(中国語のウィキペディアのデータ量とほぼ同じ)をトレーニングするには、少なくとも32Gのメモリが必要です。swapが何度も発生するため、実際の使用量は32Gをはるかに超えます。13600K
でのトレーニング時間は約30分です。
したがって、大規模なデータセット(GBレベル)の場合は、tokenizerをトレーニングする際にデータセットからサンプリングすることをおすすめします。
3. ⛏️ CLM因果モデルの事前学習
コード:pretrain.ipynb
大量のテキストを使用して教師なし事前学習を行います。主にbell open source
のデータセットBELLEを使用します。
データセットの形式:1つのサンプルは1文で、長すぎる場合は複数のサンプルに分割することができます。
CLM事前学習の過程で、モデルの入力と出力は同じです。交差エントロピー損失を計算する際には、1つずらす必要があります(shift
)。
事前学習時には、EOS
、BOS
などの特殊記号を追加しなくても構いません。
4. ⚒️ SFT指令微調整
コード:sft.ipynb
主にbell open source
のデータセットを使用します。BELLEの開発者の方々に感謝します。
SFTトレーニングのデータ形式は以下の通りです。
text = f"##提问:\n{example['instruction']}\n##回答:\n{example['output'][EOS]"
モデルが損失を計算する際には、"##回答:"
より前の部分("##回答:"
も含む)は無視され、"##回答:"
の後から計算が始まります。
EOS
(文章の終了)特殊記号を追加することを忘れないでください。そうしないと、モデルがdecode
する際にいつ停止すれば良いかわからなくなります。BOS
(文章の開始)記号は任意です。
5. 📝 RLHF最適化
このプロジェクトではdpo最適化方法を使用しています。
コード:dpo.ipynb
個人の好みに応じてSFTモデルを微調整します。データセットにはprompt
、chosen
、rejected
の3列を構築する必要があります。rejected
列の一部のデータは、SFT段階の初期モデル(例えば、SFTトレーニングを4エポック行い、0.5エポックのチェックポイントのモデル)から生成します。生成されたrejected
とchosen
の類似度が0.9以上の場合は、そのデータを使用しません。
DPOの過程では2つのモデルが必要です。1つはトレーニング対象のモデル、もう1つは参照モデルです。ロードする際には同じモデルですが、参照モデルはパラメータの更新には関与しません。
💻 使用例
基本的な使用法
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
import torch
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
tokenizer = AutoTokenizer.from_pretrained('charent/Phi2-Chinese-0.2B')
model = AutoModelForCausalLM.from_pretrained('charent/Phi2-Chinese-0.2B').to(device)
txt = '感冒了要怎么办?'
prompt = f"##提问:\n{txt}\n##回答:\n"
gen_conf = GenerationConfig(
num_beams=1,
do_sample=False,
max_length=320,
max_new_tokens=256,
no_repeat_ngram_size=4,
eos_token_id=tokenizer.eos_token_id,
pad_token_id=tokenizer.pad_token_id,
)
tokend = tokenizer.encode_plus(text=prompt)
input_ids, attention_mask = torch.LongTensor([tokend.input_ids]).to(device), \
torch.LongTensor([tokend.attention_mask]).to(device)
outputs = model.generate(
inputs=input_ids,
attention_mask=attention_mask,
generation_config=gen_conf,
)
outs = tokenizer.decode(outputs[0].cpu().numpy(), clean_up_tokenization_spaces=True, skip_special_tokens=True,)
print(outs)
##提问:
感冒了要怎么办?
##回答:
感冒是由病毒引起的,感冒一般由病毒引起,以下是一些常见感冒的方法:
- 洗手,特别是在接触其他人或物品后。
- 咳嗽或打喷嚏时用纸巾或手肘遮住口鼻。
- 用手触摸口鼻,特别是喉咙和鼻子。
- 如果咳嗽或打喷嚏,可以用纸巾或手绢来遮住口鼻,但要远离其他人。
- 如果你感冒了,最好不要触摸自己的眼睛、鼻子和嘴巴。
- 在感冒期间,最好保持充足的水分和休息,以缓解身体的疲劳。
- 如果您已经感冒了,可以喝一些温水或盐水来补充体液。
- 另外,如果感冒了,建议及时就医。
📚 ドキュメント
本プロジェクトのモデルの使用方法
モデルの重みのhuggingface
リポジトリ:Phi2 - Chinese - 0.2B
📄 ライセンス
このプロジェクトはApache - 2.0ライセンスの下で公開されています。
🎓 引用
このプロジェクトがあなたに役立った場合は、ぜひ引用してください。
@misc{Charent2023,
author={Charent Chen},
title={A small Chinese causal language model with 0.2B parameters base on Phi2},
year={2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/charent/Phi2-mini-Chinese}},
}
🤔 その他の事項
このプロジェクトは、オープンソースのモデルとコードによって引き起こされるデータセキュリティ、オピニオンリスク、またはモデルが誤用、悪用、拡散、不適切に利用されることによって生じるリスクと責任を負いません。
プロパティ |
詳細 |
ライブラリ名 |
transformers |
タグ |
text - generation - inference |
パイプラインタグ |
text - generation |
データセット |
BelleGroup/train_1M_CN |