🚀 日语GPT-NeoX 36亿参数指令微调模型
本项目提供了一个拥有36亿参数的日语GPT - NeoX模型。该模型基于rinna/japanese - gpt - neox - 3.6b
构建,并经过微调,可作为遵循指令的对话代理。
🚀 快速开始
输入输出格式
采用了一种特殊格式来构建输入:
- 输入提示被格式化为
用户
和系统
之间的对话。
- 每个输入语句由以下部分组成:(1) 说话者(
"用户"
或"系统"
);(2) 冒号 (":"
);(3) 空格 (" "
);(4) 语句文本(例如"世界上最高的山是哪座?"
)。
- 输入提示应以
"系统: "
结尾,以告知模型生成响应。
- 由于模型的分词器无法识别
"\n"
,因此使用特殊的换行符号"<NL>"
代替。
- 输入和输出语句中的所有换行符都应替换为
"<NL>"
。
- 输入提示中的所有语句都应用
"<NL>"
分隔。
以下是一个从对话构建输入的示例:
prompt = [
{
"speaker": "用户",
"text": "请推荐一些日本的旅游景点。"
},
{
"speaker": "系统",
"text": "您想了解哪个地区的旅游景点呢?"
},
{
"speaker": "用户",
"text": "请告诉我涩谷的旅游景点。"
}
]
prompt = [
f"{uttr['speaker']}: {uttr['text']}"
for uttr in prompt
]
prompt = "<NL>".join(prompt)
prompt = (
prompt
+ "<NL>"
+ "系统: "
)
print(prompt)
模型使用方法
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft", use_fast=False)
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft")
if torch.cuda.is_available():
model = model.to("cuda")
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
with torch.no_grad():
output_ids = model.generate(
token_ids.to(model.device),
do_sample=True,
max_new_tokens=128,
temperature=0.7,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id
)
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1):])
output = output.replace("<NL>", "\n")
print(output)
"""明白了。为您推荐以下景点:
1. 忠犬八公像。忠犬八公像是日本热门的旅游景点之一。
2. 涩谷十字路口。这是一个人来人往的大型十字路口,是游客喜爱的景点。
3. 109大厦。109大厦是一个购物和娱乐场所。
4. 道玄坂。道玄坂是日本的一个商业街区坡道。</s>"""
✨ 主要特性
模型架构
这是一个基于Transformer的语言模型,有36层,隐藏层大小为2816。
微调数据
微调数据是以下数据集的子集,并已翻译成日语:
这些数据不会公开。
模型系列
变体 |
链接 |
36亿参数PPO |
https://huggingface.co/rinna/japanese-gpt-neox-3.6b-instruction-ppo |
36亿参数SFT - v2 |
https://huggingface.co/rinna/japanese-gpt-neox-3.6b-instruction-sft-v2 |
36亿参数SFT |
https://huggingface.co/rinna/japanese-gpt-neox-3.6b-instruction-sft |
36亿参数预训练 |
https://huggingface.co/rinna/japanese-gpt-neox-3.6b |
贡献者
发布日期
2023年3月17日
🔧 技术细节
分词
模型使用基于sentencepiece的分词器:
- 分词器的词汇量为32000。
- 使用sentencepiece的字节回退功能,将未知文本片段分解为UTF - 8字节片段,避免产生
<UNK>
标记。
- 关闭了sentencepiece的
--add_dummy_prefix
选项,因此不会自动添加前导空格。
print(tokenizer.tokenize("吾辈は猫である"))
# ['吾', '輩', 'は', '猫', 'である']
# 而不是像rinna/japanese-gpt-1b那样为 ['▁', '吾', '輩', 'は', '猫', 'である']
- 关闭了sentencepiece的
--remove_extra_whitespaces
选项,因此会保留前导、尾随及重复的空格。
print(tokenizer.tokenize(" 吾輩は 猫である "))
# ['▁', '▁', '吾', '輩', 'は', '▁', '▁', '猫', 'である', '▁', '▁', '▁']
# 而不是像rinna/japanese-gpt-1b那样为 ['▁', '吾', '輩', 'は', '▁猫', 'である']
- 请务必设置
use_fast=False
,以使上述功能正常工作。
good_tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b", use_fast=False)
bad_tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b")
print(good_tokenizer.decode(good_tokenizer.encode("გამარჯობა 吾輩は 猫である ")))
# 'გამარჯობა 吾輩は 猫である </s>'
print(bad_tokenizer.decode(bad_tokenizer.encode("გამარჯობა 吾輩は 猫である ")))
# 'გამარ[UNK]ობა 吾輩は 猫である </s>'
📚 详细文档
引用方式
@misc{rinna-japanese-gpt-neox-3.6b-instruction-sft,
title = {rinna/japanese-gpt-neox-3.6b-instruction-sft},
author = {Zhao, Tianyu and Sawada, Kei},
url = {https://huggingface.co/rinna/japanese-gpt-neox-3.6b-instruction-sft}
}
@inproceedings{sawada2024release,
title = {Release of Pre-Trained Models for the {J}apanese Language},
author = {Sawada, Kei and Zhao, Tianyu and Shing, Makoto and Mitsui, Kentaro and Kaga, Akio and Hono, Yukiya and Wakatsuki, Toshiaki and Mitsuda, Koh},
booktitle = {Proceedings of the 2024 Joint International Conference on Computational Linguistics, Language Resources and Evaluation (LREC-COLING 2024)},
month = {5},
year = {2024},
pages = {13898--13905},
url = {https://aclanthology.org/2024.lrec-main.1213},
note = {\url{https://arxiv.org/abs/2404.01657}}
}
📄 许可证
MIT许可证