Back Translation이나 EDA(Easy Data Augmentation)과 같은 기법들은 RNN, LSTN 같은 모델들에 대하여 효과가 있었지만,BERT, RoBERTa 같은 모델들에는 효과적으로 작용하지 못했다는 논문 :
How Effective is Task-Agnostic Data Augmentation for
Pretrained Transformers?
Chat GPT를 이용한 증강
AugGPT: Leveraging ChatGPT for Text Data Augmentation
병렬 말뭉치 필터링은 번역 모델을 학습하기 위해 사용되는 병렬 코퍼스(문장 쌍)의 품질을 개선하는 과정이다.
이를 위해 다양한 방법론이 사용되며, 크게 Rule Based, Statistic Based, NMT Based 세 가지로 나눌 수 있다.
규칙에 기반하여 병렬 문장 쌍의 품질을 평가하고 필터링하는 방법
최근에도 많이 사용되는 기법으로, 거의 모든 최근 좀 괜찮은 논문들이 이 방법들을 기본으로 전제하고 이후 연구를 진행하고 있음.
통계적 방법론을 사용하여 병렬 문장 쌍의 품질을 평가
위 방법의 경우에는 요즘 대세는 아니다. 많이 적용되지는 못하는 실정
신경망 기반 모델을 활용하여 병렬 문장 쌍의 품질을 평가한다.
Sentence Embedding을 적용하는 것.
특정 Threshold를 적용하여 해당 수치를 넘지 못하면 드롭
LASER란, Facebook AI에서 개발한 다국어 문장 임베딩 모델로, 다양한 언어의 문장을 ㄹ동일한 임베딩 공간에 매핑하여 언어 간의 의미적 유사성을 효과적으로 비교할 수 있도록 함.
- 다국어를 지원하고, 문장 임베딩을 하며, 코사인 유사도를 통해 임베딩 된 벡터 간 유사도를 측정한다는 것이 주요 특징
LASER 관련 이하 코드 참고
from laserembeddings import Laser
import numpy as np
# LASER 모델 초기화
laser = Laser()
# 예시 문장
src = "집에 가고 싶다"
tgt = "I want to go home"
# 문장 임베딩
src_embed = laser.embed_sentences(src, lang='ko')
tgt_embed = laser.embed_sentences(tgt, lang='en')
# 코사인 유사도 계산 함수
def cosine_similarity(v1, v2):
n1 = np.linalg.norm(v1)
n2 = np.linalg.norm(v2)
return np.dot(v1, v2.T).squeeze() / (n1 * n2)
# 두 문장 간의 유사도 계산
cs_score = cosine_similarity(src_embed, tgt_embed)
print(f"Cosine Similarity: {cs_score}")
구체적인 예시
Model Cross Entropy를 사용한 소스-타겟 교차 검증에 관하여 NMT(Neural Machine Translation)에서 소스문장을 타겟 문장으로 번역하고, 그 반대 방향으로도 번역하여 각 방향의 번역 품질을 평가하는 방법이다. 이 과정에서 교차 엔트로피 손실을 사용하여 모델의 예측과 실제 정답 간의 차이를 측정한다.
주로 번역모델에서 사용된다.
import torch
import torch.nn as nn
from transformers import MarianMTModel, MarianTokenizer
# 모델과 토크나이저 로드
model_name = 'Helsinki-NLP/opus-mt-en-de'
tokenizer = MarianTokenizer.from_pretrained(model_name)
model = MarianMTModel.from_pretrained(model_name)
# 입력 문장
src_text = "I want to go home"
tgt_text = "Ich möchte nach Hause gehen"
# 토큰화 및 텐서 변환
src_tokens = tokenizer(src_text, return_tensors='pt', padding=True, truncation=True)
tgt_tokens = tokenizer(tgt_text, return_tensors='pt', padding=True, truncation=True)
# 모델 예측
with torch.no_grad():
output = model(**src_tokens, labels=tgt_tokens['input_ids'])
loss = output.loss
print(f"Cross Entropy Loss: {loss.item()}")
# 반대 방향 번역 (타겟 -> 소스)
model_name_reverse = 'Helsinki-NLP/opus-mt-de-en'
tokenizer_reverse = MarianTokenizer.from_pretrained(model_name_reverse)
model_reverse = MarianMTModel.from_pretrained(model_name_reverse)
# 타겟을 소스로 사용하여 다시 번역
src_tokens_reverse = tokenizer_reverse(tgt_text, return_tensors='pt', padding=True, truncation=True)
tgt_tokens_reverse = tokenizer_reverse(src_text, return_tensors='pt', padding=True, truncation=True)
with torch.no_grad():
output_reverse = model_reverse(**src_tokens_reverse, labels=tgt_tokens_reverse['input_ids'])
loss_reverse = output_reverse.loss
print(f"Reverse Cross Entropy Loss: {loss_reverse.item()}")
위 논문은 다양한 Task에 적용 가능 한 IAA measure을 제안하고 있다.
Everyone's Voice Mattters: Quantifying Annotation Disagreement Using Demographic Information
주석 작업자의 정보가 공개된 SBIC, SChem 101 데이터로 RoBERTa-base 모델을 학습한다.
Label Errors
Data-centric Evaluation of ML Models
Class Imbalance, Outliers, and Distribution Shift
Data Privacy and Security
Training Strategies
영어 BERT에서 인코딩 레이어는 FREEZE하고 adapter layer를 추가 시켰다. 영어와 한국어의 차이를 학습할 수 있도록 하는 레이어 !
그래서 영어 BERT를 데려와서 Post-training 한다.
그리고서는 이제 이 인코더 레이어 마져도 프리즈 풀고 training.
모델링을 급격하게 변화시키지 않고 성능을 끌어올릴 수 있다.