Update README.md
Browse files
README.md
CHANGED
@@ -11,7 +11,7 @@ tags:
|
|
11 |
license: unknown
|
12 |
datasets:
|
13 |
- JosephusCheung/GuanacoDataset
|
14 |
-
-
|
15 |
widget:
|
16 |
- text: <s>\\n以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\\n[SEP]\\n指示:\\n日本で一番広い湖は?\\n[SEP]\\n応答:\\n
|
17 |
---
|
@@ -40,13 +40,14 @@ model = AutoModelForCausalLM.from_pretrained("inu-ai/alpaca-guanaco-japanese-gpt
|
|
40 |
## ChatGPT4によるサンプルコード
|
41 |
|
42 |
```python
|
43 |
-
|
|
|
44 |
INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n入力:\n{input}\n[SEP]\n応答:\n'
|
45 |
NO_INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n応答:\n'
|
46 |
|
47 |
def prepare_input(role_instruction, conversation_history, new_conversation):
|
48 |
instruction = "".join([f"{text}\\n" for text in role_instruction])
|
49 |
-
|
50 |
input_text = f"User:{new_conversation}"
|
51 |
|
52 |
return INPUT_PROMPT.format(instruction=instruction, input=input_text)
|
@@ -61,7 +62,7 @@ def generate_response(role_instruction, conversation_history, new_conversation):
|
|
61 |
input_text = prepare_input(role_instruction, conversation_history, new_conversation)
|
62 |
token_ids = tokenizer.encode(input_text, add_special_tokens=False, return_tensors="pt")
|
63 |
n = len(token_ids[0])
|
64 |
-
if n <=
|
65 |
break
|
66 |
else:
|
67 |
conversation_history.pop()
|
@@ -71,7 +72,7 @@ def generate_response(role_instruction, conversation_history, new_conversation):
|
|
71 |
output_ids = model.generate(
|
72 |
token_ids.to(model.device),
|
73 |
min_length=n,
|
74 |
-
max_length=min(
|
75 |
temperature=0.7,
|
76 |
do_sample=True,
|
77 |
pad_token_id=tokenizer.pad_token_id,
|
@@ -131,16 +132,17 @@ for question in questions:
|
|
131 |
## 出力
|
132 |
|
133 |
```
|
134 |
-
Assistant
|
135 |
-
Assistant
|
136 |
-
Assistant
|
137 |
-
Assistant
|
138 |
-
Assistant
|
139 |
-
Assistant
|
140 |
```
|
141 |
|
142 |
# 評価
|
143 |
-
100
|
|
|
144 |
なお、サンプルコードのように「入力」が長くなると正答率が50%ぐらいに下がりました。
|
145 |
|
146 |
| 入力 | 応答 | 正答率[%] |
|
@@ -148,8 +150,30 @@ Assistant:今、私は何問目でしょうか?
|
|
148 |
| 日本で一番広い湖は? | 琵琶湖 | 96 |
|
149 |
| 世界で一番高い山は? | エベレスト | 86 |
|
150 |
|
|
|
151 |
|
152 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
153 |
|
154 |
学習時には以下のハイパーパラメータを使用:
|
155 |
```
|
@@ -172,7 +196,7 @@ python.exe transformers/examples/pytorch/language-modeling/run_clm.py ^
|
|
172 |
--logging_dir logs
|
173 |
```
|
174 |
|
175 |
-
#
|
176 |
|
177 |
- Transformers 4.28.0.dev0
|
178 |
- Pytorch 2.0.0+cu117
|
|
|
11 |
license: unknown
|
12 |
datasets:
|
13 |
- JosephusCheung/GuanacoDataset
|
14 |
+
- yahma/alpaca-cleaned
|
15 |
widget:
|
16 |
- text: <s>\\n以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\\n[SEP]\\n指示:\\n日本で一番広い湖は?\\n[SEP]\\n応答:\\n
|
17 |
---
|
|
|
40 |
## ChatGPT4によるサンプルコード
|
41 |
|
42 |
```python
|
43 |
+
MAX_ASSISTANT_LENGTH = 100
|
44 |
+
MAX_INPUT_LENGTH = 1024
|
45 |
INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n入力:\n{input}\n[SEP]\n応答:\n'
|
46 |
NO_INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n応答:\n'
|
47 |
|
48 |
def prepare_input(role_instruction, conversation_history, new_conversation):
|
49 |
instruction = "".join([f"{text}\\n" for text in role_instruction])
|
50 |
+
instruction += "\\n".join(conversation_history)
|
51 |
input_text = f"User:{new_conversation}"
|
52 |
|
53 |
return INPUT_PROMPT.format(instruction=instruction, input=input_text)
|
|
|
62 |
input_text = prepare_input(role_instruction, conversation_history, new_conversation)
|
63 |
token_ids = tokenizer.encode(input_text, add_special_tokens=False, return_tensors="pt")
|
64 |
n = len(token_ids[0])
|
65 |
+
if n + MAX_ASSISTANT_LENGTH <= MAX_INPUT_LENGTH:
|
66 |
break
|
67 |
else:
|
68 |
conversation_history.pop()
|
|
|
72 |
output_ids = model.generate(
|
73 |
token_ids.to(model.device),
|
74 |
min_length=n,
|
75 |
+
max_length=min(MAX_INPUT_LENGTH, n + MAX_ASSISTANT_LENGTH),
|
76 |
temperature=0.7,
|
77 |
do_sample=True,
|
78 |
pad_token_id=tokenizer.pad_token_id,
|
|
|
132 |
## 出力
|
133 |
|
134 |
```
|
135 |
+
Assistant:はい、日本で一番高い山は日本の富士山です。
|
136 |
+
Assistant:日本で最も広い湖は琵琶湖です。
|
137 |
+
Assistant:世界で一番高い山といえば、ギザの大ピラミッドの頂上に立つギザギザのピラミッドです。
|
138 |
+
Assistant:世界で一番広い湖は、ギザの大ピラミッドの頂上に立つギザギザのピラミッドです。
|
139 |
+
Assistant:最初の質問は、ずんだアローに変身するかどうかの質問である。
|
140 |
+
Assistant:今、あなたの質問は10問目です。
|
141 |
```
|
142 |
|
143 |
# 評価
|
144 |
+
100回の「入力」のような質問を行い、それらに対する「応答」に正解の文字列が含まれるかで評価しています。
|
145 |
+
一番正答率が高いエポックのモデルを選択しました。
|
146 |
なお、サンプルコードのように「入力」が長くなると正答率が50%ぐらいに下がりました。
|
147 |
|
148 |
| 入力 | 応答 | 正答率[%] |
|
|
|
150 |
| 日本で一番広い湖は? | 琵琶湖 | 96 |
|
151 |
| 世界で一番高い山は? | エベレスト | 86 |
|
152 |
|
153 |
+
# 学習データのフォーマット
|
154 |
|
155 |
+
[alpaca](https://github.com/tatsu-lab/stanford_alpaca)と同じように、以下のようなフォーマットにしています。
|
156 |
+
|
157 |
+
```
|
158 |
+
<s>
|
159 |
+
以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。
|
160 |
+
[SEP]
|
161 |
+
指示:
|
162 |
+
User:あなたは「ずんだもん」なのだ。東��ずん子の武器である「ずんだアロー」に変身する妖精またはマスコットなのだ。一人称は「ボク」で語尾に「なのだ」を付けてしゃべるのだ。
|
163 |
+
Assistant:了解したのだ!
|
164 |
+
[SEP]
|
165 |
+
入力:
|
166 |
+
User:日本で一番高い山は?
|
167 |
+
[SEP]
|
168 |
+
応答:
|
169 |
+
日本で一番高い山は富士山で、標高3776メートルです。
|
170 |
+
</s>
|
171 |
+
```
|
172 |
+
|
173 |
+
なぜか改行コードがスペースに置き換わってしまうため、実際は`\\n`に置き換えています。
|
174 |
+
データは[guanaco_alpaca_ja.txt](alpaca-guanaco-japanese-gpt-1b/train_data/guanaco_alpaca_ja.txt)です。
|
175 |
+
|
176 |
+
# 学習のハイパーパラメータ
|
177 |
|
178 |
学習時には以下のハイパーパラメータを使用:
|
179 |
```
|
|
|
196 |
--logging_dir logs
|
197 |
```
|
198 |
|
199 |
+
# ライブラリのバージョン
|
200 |
|
201 |
- Transformers 4.28.0.dev0
|
202 |
- Pytorch 2.0.0+cu117
|