• 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이나 반복 학습을 통해 모델을 우리 데이터셋에 맞게 피팅시켜야할 것으로 생각됨
  • 또, 추론 시 프롬포트를 학습된 데이터셋에서 사용된 규칙을 이용해 정의하는 것이 최적의 결과를 낼 것

참고