부트캠프에서 진행하는 3번째 경진대회 NLP가 시작됐다! 가장 기대하고 가장 관심이 많았던 주제였어서 뽜이팅이 넘친다. 일상 대회문을 요약하는 모델을 만드는 것이고, 이번에는 점수 평가 방법이 다른 대회들과 조금 다른 것 같다.
이번 대회에서 얻어가야 할 것
- 텍스트 데이터로 다양한 딥러닝 모델을 구축하는 경험
- 데이터 전처리, 모델 구축, 평가 파이프라인 전반의 사이클을 도는 경험
인공지능 모델의 lifecycle
- 학습 Training
대화문(문제)-요약문(정답)을 주고 모델이 학습하는 과정 - 추론 Inference
학습된 모델을 사용하는 단계. 문제(입력)만 주고 정답을 예측/생성하게 하는 단계
EDA
학습 데이터를 분석해보면, 대화문과 요약문은 약 5배 차이 정도 난다고. 나중에 인코더와 디코더의 최대 길이를 설정할 때 고려해야할 수도 있다.
그리고 주로 포멀한 대화와 비즈니스 관련 대화들이 있다. 은어나 약어는 나오지 않는다.
주요 대화 주제는 일상, 쇼핑, 통화, 인터뷰 등등이고,
개인정보가 들어간 부분은 모두 마스킹되어 있다.
베이스라인 이해하기
1. 전처리
트레인 데이터셋을 데이터프레임으로 만든다. 데이터프레임에서 필요한 부분, "dialogue, summary"를 뽑아온다.
훈련할 때에는 인코더에 원본 대화 텍스트를 입력하고, 디코더에는 시작토큰과 실제 요약문을 입력한다. 그리고 디코더의 정답에는 실제 요약문과 종료 토큰을 사용한다.
테스트를 할 때에는 인코더로 원본 대화 텍스트를 입력하고 디코더에는 시작 토큰만 넣어줘서 모델이 직접 요약문을 만들게 한다.
인코더와 디코더에 들어갈 데이터셋을 처리할 때:
- input_ids (인코더)
- attention_mask (인코더)
- decoder_input_ids (디코더)
- decoder_attention_mask (디코더)
- labels (정답)
이렇게 5가지 키를 가진 하나의 딕셔너리로 만들어준다. 여기서
input_ids는 텍스트 원문을 토크나이저가 숫자로 변환한 시퀀스.
attention_mask는 각 위치의 토큰이 실제 의미 있는 토큰인지(1) 패딩 토큰인지(0)를 나타내는 이진 마스크.
2. 토큰화
텍스트 데이터 준비 -> 토큰화 -> 숫자(ID) -> 토큰화된 데이터로 구조화(위에서 정의한 Dataset 클래스로 모델이 요구하는 형식으로 정리해줌)
원본 데이터가 텍스트로 있으면 ->
prepare_train_dataset 함수안에 있는 tokenized_encoder_inputs로 대화문을 토큰화, 요약문도 토큰화 ->
데이터셋 클래스에서 인코더와 디코더에 넣을 입력 구성 -> 모델에 입력
최종적으로 모델에 들어가는 형태
# 인코더 입력: 숫자 ID의 시퀀스
# 디코더 입력: 숫자 ID의 시퀀스
# 둘 다 텐서(tensor) 형태로 변환되어 입력됨
3. 학습, 평가지표 만들기
모델이 숫자를 출력(모델이 생성한 pred) -> 숫자를 텍스트로 변환 -> 특수 토큰(불필요한 토큰) 제거 -> 최종 텍스트
허깅페이스에서 Trainer 클래스가 자동으로 제공하는 기능으로 compute_metrics 함수 만듦.
pred 객체에는 pred.predictions(모델의 예측값), pred.label_ids(실제 정답 레이블) 두 가지 속성을 가진다.
pred는 평가 단계에서 자동으로 생성되며 validation 데이터로 예측을 수행 -> 예측 결과와 실제 레이블을 pred 객체에 담아서 compute_metrics 함수 호출.
predictions[predictions == -100] = tokenizer.pad_token_id
labels[labels == -100] = tokenizer.pad_token_id
여기서 -100의 의미?
Hugging Face 트랜스포머 라이브러리에서 사용하는 특별한 패딩 레이블로, 손실 계산 시 무시해야 할 토큰을 표시
숫자로 된 토큰은 다시 텍스트로 변환하고,
#숫자로 된 토큰 ID들을 다시 사람이 읽을 수 있는 텍스트로 변환
decoded_preds = tokenizer.batch_decode(predictions, clean_up_tokenization_spaces=True)
labels = tokenizer.batch_decode(labels, clean_up_tokenization_spaces=True)
특수 토큰은 제거, ROUGE 점수 계산
4. 추론
학습 중에 생성한 체크포인트 불러와서 추론
'공부방 > Upstage AI Lab 4기' 카테고리의 다른 글
[NLP] 대화의 턴수와 주요 발화자를 토큰으로 추가해보자 (1) | 2024.11.19 |
---|---|
[NLP] EDA | max_length 확인 (0) | 2024.11.19 |
RNN에 attention 더하기 (3) | 2024.11.15 |
Attention! Attention! Attention! (0) | 2024.11.15 |
패스트캠퍼스 Upstage AI Lab 부트캠프 4기, "Upstage 경진대회 CV편" (1) | 2024.11.12 |