Semantic Text similarity(STS)
NLP Tasks
Sequence to Sequence(S2S) Learning
Pytorch Lightning
def prepare_data()
로 데이터 다운로드 혹은 로드def setup()
으로 데이터 분할#Data Preparation, dataloader()안에 생성 후 반환
def train_dataloader(self):
return DataLoader(self.mnist_train, batch_size = self.batch_size, shuffle = True)
Tokenization
Transformer
# example
self.config = transformers.BartConfig.from_pretrained('facebook/bart-base')
self.encoder_decoder = transformers.AutoModelForSeq2SeqLM(config=self.config)
Fastapi
Streamlit
EDA
# 입력의 두 문장을 토크나이징하여 길이와 unk 토큰의 개수를 분석합니다.
def tokenizing(df):
tokenizer = AutoTokenizer.from_pretrained('klue/roberta-small')
sentence1_len = []
sentence2_len = []
sentence1_unk = []
sentence2_unk = []
for i, item in df.iterrows():
sentence1 = tokenizer(item['sentence1'])['input_ids']
sentence2 = tokenizer(item['sentence2'])['input_ids']
sentence1_len.append(len(sentence1))
sentence2_len.append(len(sentence2))
sentence1_unk.append(sentence1.count(tokenizer.unk_token_id))
sentence2_unk.append(sentence2.count(tokenizer.unk_token_id))
tokenized_df = pd.DataFrame([sentence1_len, sentence2_len, sentence1_unk, sentence2_unk]).transpose()
tokenized_df.columns = ['1_len', '2_len', '1_unk', '2_unk']
print(tokenized_df.describe())
Train with Sweep
# Sweep을 통해 최적화된 hyperparameter를 찾기
import wandb
sweep_config = {
'method': 'random',
'parameters' : {
'lr' : {
'distribution' : 'uniform', # parameter를 uniform하게 설정합니다.
'min' : 1e-5,
'max' : 1e-4
}
}
}
if args.bce:
sweep_config['metric'] = { # sweep_config의 metric은 최적화를 진행할 목표를 설정
'name' : 'val_f1', # F1 점수가 최대화가 되는 방향으로 학습을 진행
'goal' : 'maximize'
}
else:
sweep_config['metirc] = {'name' : 'val_pearson', 'goal' : 'maximize'} # Pearson 점수가 최대화가 되는 방향
def sweep_train(config=None):
wandb.init(config=config)
config = wandb.config
dataloader = Dataloader(args.model_name, args.batch_size, args.train_ratio, args.shuffle, args.bce)
model = Model(args.model_name, config.lr, args.bce)
wandb_logger = WandbLogger(project="klue-sts")
trainer = pl.Trainer(gpus=1, max_epochs=args.max_epoch, logger=wandb_logger, log_every_n_steps=1)
trainer.fit(model=model, datamodule=dataloader)
trainer.test(model=model, datamodule=dataloader)
# Sweep 생성
sweep_id = wandb.sweep(
sweep=sweep_config, # config 딕셔너리를 추가합니다.
project='project_name' # project의 이름을 추가합니다.
)
wandb.agent(
sweep_id=sweep_id, # sweep의 정보를 입력하고
function=sweep_train, # train이라는 모델을 학습하는 코드를
count=5 # 총 5회 실행해봅니다.
)
KFold
# KFold Dataloader
def setup(self, stage='fit'):
if stage == 'fit':
# 데이터셋 준비
total_data = self.read_json('train')
total_input, total_targets = self.preprocessing(total_data)
total_dataset = Dataset(total_input, total_targets)
# num_splits 번 fold
kf = KFold(n_splits=self.num_splits, shuffle=self.shuffle, random_state = self.split_seed)
all_splits = [k for k in kf.split(total_dataset)]
# k번째 fold 된 데이터셋의 index 선택
train_indexes, val_indexes = all_splits[self.k]
train_indexes, val_indexes = train_indexes.tolist(), val_indexes.tolist()
else:
# 평가 데이터 준비
...
# 새 모델 생성
Kmodel = Model(args.model_name, args.learning_rate, args.bce)
results = []
# K fold 횟수 3
nums_folds = 3
split_seed = 12345
# nums_folds는 fold의 개수, k는 k번째 fold datamodule
for k in range(nums_folds):
datamodule = KfoldDataloader(args.model_name, args.batch_size, args.shuffle, args.bce, k=k, split_seed=split_seed, num_splits=nums_folds)
datamodule.prepare_data()
datamodule.setup()
trainer = pl.Trainer(gpus=1, max_epochs=1)
trainer.fit(model=model, datamodule=dataloader)
score = trainer.test(model=model, datamodule=dataloader)
results.extend(score)
# 모델의 평균 성능
if args.bce:
result = [x['test_f1'] for x in results]
score = sum(result) / nums_folds
print("K fold Test f1 score: ", score)
else:
result = [x['test_pearson'] for x in results]
score = sum(result) / nums_folds
print("K fold Test pearson: ", score)
Prediction_Check
results = trainer.predict(model=model, datamodule=dataloader)
pred = torch.cat(results)
wrongs = []
for i, pred in enumerate(preds):
# test dataset에서 i번쨰에 해당하는 input값과 target값을 가져옵니다.
input_ids, target = dataloader.test_dataset.__getitem__(i)
if round(pred.items()) != target.item():
wrongs.append([dataloader.tokenizer.decode(input_ids).replace(' [PAD]', ''), pred.item(), target.item()])
wrong_df = pd.DataFrame(wrongs, columns=['text','pred','target'])
출처 : Naver Boost Camp