- author: Minseok Kim
- created: 2023-09-14
학습 시 데이터셋의 형태
토크나이저
- 문자열을 숫자(토큰)으로 변경해줌
- 사전학습 모델은 토큰 정보를 파일을 제공해야함
데이터셋 분석
- KoAlpaca 에서 제공한 sample을 통해 Polyglot 모델 학습 시 데이터셋이 어떤 형태로 들어가는지 확인
# 로컬 데이터셋 로드
dataset = datasets.load_dataset('json', data_files='saved_0.8.json')
# 데이터셋 리포맷
data = dataset.map(lambda x: {'text': f"### 질문: {x['paragraphs']}\n\n### 답변: {x['answer']}<|endoftext|>"})
>> print(data)
DatasetDict({
train: Dataset({
features: ['answer', 'paragraphs', 'text'],
num_rows: 31444
})
})
>> dataset['train'][0]
{'answer': '위·변조 방지 기능을 갖추고 원본 효력을 지니게 됩니다.',
'paragraphs': '디지털화 인증서의 특별한 기능은 무엇인가요?',
'text': '### 질문: 디지털화 인증서의 특별한 기능은 무엇인가요?\n\n### 답변: 위·변조 방지 기능을 갖추고 원본 효력을 지니게 됩니다.<|endoftext|>'}
- 이 중 ‘text’ 키의 값이 학습에 사용됨
'### 질문: 디지털화 인증서의 특별한 기능은 무엇인가요?\n\n### 답변: 위·변조 방지 기능을 갖추고 원본 효력을 지니게 됩니다.<|endoftext|>
데이터셋 토큰화
# 토크나이저 로드
tokenizer = AutoTokenizer.from_pretrained(MODEL)
# 데이터셋 토근화
data = data.map(lambda samples: tokenizer(samples["text"]), batched=True)
# 토근화된 데이터 확인1
print(data['train'][0]['input_ids'])
# 토근화된 데이터 확인2
print(data['train'][10]['input_ids'])
>> [6, 6, 6, 2438, 29, 3449, 434, 27627, 285, 1700, 288, 2054, 296, 1937, 11260, 34, 202, 202, 6, 6, 6, 4253, 29, 484, 525, 1078, 510, 3783, 2054, 276, 3910, 283, 19661, 11379, 276, 8020, 379, 4468, 17, 2]
>> [6, 6, 6, 2438, 29, 224, 307, 1272, 363, 1924, 285, 27065, 437, 441, 3335, 285, 814, 4008, 296, 2331, 1787, 11260, 34, 202, 202, 6, 6, 6, 4253, 29, 1924, 276, 7475, 379, 15, 4705, 1848, 379, 15, 1636, 284, 453, 2030, 284, 272, 388, 276, 3937, 2136, 17, 2]
-
토근화되어 학습 인풋으로 들어가는 데이터를 보면, 앞서 데이터셋을 포맷할 때 정한질문 ,답변이 동일하게 들어가 있는 것을 확인
-
따라서 추론 시 모델의 인풋으로는 아래 형태의 데이터가 들어감
def ask(x):
ans = pipe(
f"### 질문: {x}\n\n### 답변:",
do_sample=True,
return_full_text=True,
early_stopping=True,
max_new_tokens=512,
eos_token_id=2,
)
print(ans[0]['generated_text'])
ask("데이터셋이 뭐야?")
- 이때, 모델의 Input으로 들어가는 데이터의 형태는 아래와 같다
"### 질문: 데이터셋이 뭐야?\n\n### 답변:"
결론
- 데이터셋을 구축할 때, 구축자가 정한 규칙대로
###질문, ###답변
과 같은 명령어와 답변을 구분하는 단어를 사용함
- 모델은 학습 시
###질문: {text}\n\n###답변:{text}
의 형태를 학습하기 때문에 이렇게 학습된 모델에 인풋으로###질문: {text}\n\n###답변:
을 넣으면 이 문장 뒤에 나올 토큰들을 예측하여 추론함
- 만약,
###데이터: {text}###답안:
과 같은 형태로, 학습에 사용한 포맷과 다른 포맷으로 입력에 사용하게 되면 원하는 결과가 잘 나오지 않을 것
- 따라서, 사전학습된 모델의 성능을 살리며 파인튜닝을 하고자 할 때는 사전학습 모델의 질답 규칙을 지켜 데이터셋을 구축하고 학습하는 것이 옳고,
우리 데이터셋의 새로운 규칙을 따르도록 튜닝하려면 full finetuning이나 반복 학습을 통해 모델을 우리 데이터셋에 맞게 피팅시켜야할 것으로 생각됨
- 또, 추론 시 프롬포트를 학습된 데이터셋에서 사용된 규칙을 이용해 정의하는 것이 최적의 결과를 낼 것