japanese-gpt-neox-3.6b-instruction-ppo
Overview
This repository provides a Japanese GPT-NeoX model of 3.6 billion parameters. The model is based on rinna/japanese-gpt-neox-3.6b-instruction-sft-v2
and has been aligned to serve as an instruction-following conversational agent.
Model architecture
A 36-layer, 2816-hidden-size transformer-based language model.
RLHF
Following the OpenAI InstructGPT paper, Reinforcement Learning from Human Feedback (RLHF) has been applied to aligning the model's behaviour with input instructions. Particularly, the model has been trained in two stages, i.e. Supervised Fine-Tuning (SFT) and PPO-based Reinforcement Learning (RL).
- The first SFT stage produces
rinna/japanese-gpt-neox-3.6b-instruction-sft-v2
. - The second RL stage produces this model.
- The first SFT stage produces
PPO vs. SFT evaluation
We conducted human evaluation and ChatGPT-based automated evaluation on 100 prompts to assess the performance gain from reinforcement learning.
Reinforcement learning
We used CarperAI/trlx and its implementation of the PPO algorithm for the RL stage.
The RL data is the subset of the following dataset and has been translated into Japanese.
Model Series
Contributors
Limitations
- We found this verison of PPO model tends to generate repeated text more often than its SFT counterpart, and thus we set
repetition_penalty=1.1
for better generation performance. (The same generation hyper-parameters are applied to the SFT model in aforementioned evaluation experiments.) You can also explore other hyperparameter combinations that yield higher generation randomness/diversity for better generation quality, e.g.temperature=0.9, repetition_penalty=1.0
.
I/O Format
A special format has been adopted to construct inputs.
- An input prompt is formatted as a conversation between
ใฆใผใถใผ
andใทในใใ
. - Each input utterance consists of (1) its speaker (
"ใฆใผใถใผ"
or"ใทในใใ "
), (2) a colon (":"
), (3) a whitespace (" "
), and (4) utterance text (e.g."ไธ็ใงไธ็ช้ซใๅฑฑใฏ๏ผ"
). - The input prompt should be ended with
"ใทในใใ : "
to acknowledge the model to generate a response. - Since the model's tokenizer does not recognize
"\n"
, a special newline symbol"<NL>"
is used instead. - All the newlines in input and output utterances should be replaced with
"<NL>"
. - All the utterances in the input prompt should be separated by
"<NL>"
.
Following is an example to construct an input from a conversation.
prompt = [
{
"speaker": "ใฆใผใถใผ",
"text": "ใณใณใฟใฏใใฌใณใบใๆ
ฃใใใซใฏใฉใใใใฐใใใงใใ๏ผ"
},
{
"speaker": "ใทในใใ ",
"text": "ใใใซใคใใฆๅ
ทไฝ็ใซ่ชฌๆใใฆใใใ ใใพใใ๏ผไฝใ้ฃใใใฎใงใใใใ๏ผ"
},
{
"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)
# "ใฆใผใถใผ: ใณใณใฟใฏใใฌใณใบใๆ
ฃใใใซใฏใฉใใใใฐใใใงใใ๏ผ<NL>ใทในใใ : ใใใซใคใใฆๅ
ทไฝ็ใซ่ชฌๆใใฆใใใ ใใพใใ๏ผไฝใ้ฃใใใฎใงใใใใ๏ผ<NL>ใฆใผใถใผ: ็ฎใ็ใใฎใงใใ<NL>ใทในใใ : ๅใใใพใใใใณใณใฟใฏใใฌใณใบใใคใใใจ็ฎใใใใใชใใจใใใใจใงใใญใๆใฃใไปฅไธใซใฌใณใบใๅคใๅฟ
่ฆใใใใงใใใใ๏ผ<NL>ใฆใผใถใผ: ใใใใฌใณใบใฏๅคใใพใใใใ็ฎใ่ตคใใชใใใงใใ<NL>ใทในใใ : "
How to use the model
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-ppo", use_fast=False)
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-ppo")
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,
repetition_penalty=1.1,
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)
"""ใใใฏใใณใณใฟใฏใใฌใณใบใ็ฎใซๅใใชใใใใซ่ตทใใใใจใใใใพใใใฌใณใบใ็ฎใฎ่กจ้ขใซ้ทๆ้่งฆใ็ถใใใใจใๅๅ ใจใชใใใจใใใใพใใใพใใใณใณใฟใฏใใฌใณใบใๆฑใใฆใใๅฏ่ฝๆงใใใใพใใใณใณใฟใฏใใฌใณใบใฑใผในใๅฎๆ็ใซๆดๆตใใใใใณใณใฟใฏใใฌใณใบใๆญฃใใใใฃใใใใใใใใซใใใใใใใจใๅฝน็ซใกใพใใ</s>"""
Tokenization
The model uses a sentencepiece-based tokenizer.
- The tokenizer has a vocabulary size of 32,000.
- It uses sentencepiece's byte fallback feature to decompose unknown text pieces into UTF-8 byte pieces and to avoid producing
<UNK>
tokens. - sentencepiece's
--add_dummy_prefix
option was turned off so that a leading whitespace will not be prepended automatically.print(tokenizer.tokenize("ๅพ่ผฉใฏ็ซใงใใ")) # ['ๅพ', '่ผฉ', 'ใฏ', '็ซ', 'ใงใใ'] # instead of ['โ', 'ๅพ', '่ผฉ', 'ใฏ', '็ซ', 'ใงใใ'] as in rinna/japanese-gpt-1b
- sentencepiece's
--remove_extra_whitespaces
option was turned off so that leading, trailing, and duplicate whitespaces are reserved.print(tokenizer.tokenize(" ๅพ่ผฉใฏ ็ซใงใใ ")) # ['โ', 'โ', 'ๅพ', '่ผฉ', 'ใฏ', 'โ', 'โ', '็ซ', 'ใงใใ', 'โ', 'โ', 'โ'] # instead of ['โ', 'ๅพ', '่ผฉ', 'ใฏ', 'โ็ซ', 'ใงใใ'] as in rinna/japanese-gpt-1b
- Don't forget to set
use_fast=False
to make the above features function correctly.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>'
How to cite
@misc{rinna-japanese-gpt-neox-3.6b-instruction-ppo,
title = {rinna/japanese-gpt-neox-3.6b-instruction-ppo},
author = {Zhao, Tianyu and Sawada, Kei},
url = {https://huggingface.co/rinna/japanese-gpt-neox-3.6b-instruction-ppo}
}
@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}}
}
Licenese
- Downloads last month
- 2,652