Open changyong93 opened 3 years ago
우선 trainer_qa.py 파일에 아래와 같은 코드를 추가하여 오버라이딩을 해주시면 됩니다. 여기서 num_training_steps은 전체 학습 steps 입니다. 이 부분은 아래 설명드리도록 하겠습니다. num_cycles는 cosine 패턴을 몇 번 반복할 지 정해주는 옵션입니다.
from transformers import AdamW, get_cosine_with_hard_restarts_schedule_with_warmup def create_optimizer_and_scheduler(self, num_training_steps: int, num_cycles:int = 1, another_scheduler_flag=False): if not another_scheduler_flag: self.create_optimizer() self.create_scheduler(num_training_steps=num_training_steps, optimizer=self.optimizer) else: optimizer_kwargs = { "betas": (self.args.adam_beta1, self.args.adam_beta2), "eps": self.args.adam_epsilon, "lr" : self.args.learning_rate, } self.optimizer = AdamW(self.model.parameters(), **optimizer_kwargs) self.lr_scheduler = get_cosine_with_hard_restarts_schedule_with_warmup( self.optimizer, num_warmup_steps=self.args.warmup_steps, num_training_steps= num_training_steps, num_cycles = num_cycles)
자 이제 train.py 파일로 넘어가겠습니다. trainer = QuestionAnsweringTrainer~~~ 밑에 아래와 같이 추가해줍니다.
trainer = QuestionAnsweringTrainer( model=model, args=training_args, train_dataset=train_dataset if training_args.do_train else None, eval_dataset=eval_dataset if training_args.do_eval else None, eval_examples=datasets["validation"] if training_args.do_eval else None, tokenizer=tokenizer, data_collator=data_collator, post_process_function=post_processing_function, compute_metrics=compute_metrics, ) total_steps = math.ceil(len(train_dataset)/training_args.per_device_train_batch_size) trainer.create_optimizer_and_scheduler(total_steps, data_args.num_cycles, data_args.another_scheduler_flag)
마지막으로 각종 arguments를 새롭게 추가했으니, arguments.py 파일로 넘어갑니다. DataTrainingArguments에 다음과 같은 arguments를 추가해줍니다.
another_scheduler_flag :bool = field( default=False, metadata={"help": "create another scheduler"} ) num_cycles :bool = field( default=1, metadata={"help": "cycles for get_cosine_schedule_with_warmup"}
제 기준에선, 실행 시 명령어는 다음과 같습니다. python train.py --do_train --output_dir outputs/train --wandb_name ep1+pp1+rtt_q_t100_85_scdr-re_w500 --overwrite_cache --overwrite_output_dir --num_train_epochs 1 --preprocessing_pattern 1 --rtt_dataset_name ./csv/papago_ner.csv --rtt_dataset_name ./csv/papago_ner.csv --data_selected question --logging_steps 50 --another_scheduler_flag --warmup_steps 500 --num_cycles 2
최적화된 값은 테스트 후 진행하겠습니다.
단, 만약 cosine restart가 아닌, cosine annealing를 사용하고자 할 경우 코드를 조금 바꿔주시면 됩니다.
#self.lr_scheduler = get_cosine_with_hard_restarts_schedule_with_warmup( # self.optimizer, num_warmup_steps=self.args.warmup_steps, # num_training_steps= num_training_steps, # num_cycles = num_cycles) self.lr_scheduler = CosineAnnealingWarmupRestarts(self.optimizer, first_cycle_steps=100, cycle_mult=1.0, max_lr=5e-05, min_lr=1e-07, warmup_steps=50, gamma=0.5)
단, CosineAnnealingWarmupRestarts 관련 arguments는 아직 구현하지 않은 상태이니 필요하실 경우 따로 써주시면 됩니다. 그리고 추가로, 관련 라이브러리 설치가 필요합니다. 아래 코드 설치 부탁드립니다.
!pip install 'git+https://github.com/katsura-jp/pytorch-cosine-annealing-with-warmup'
관련 내용은 다음 깃허브를 참고하시면 됩니다. => https://github.com/katsura-jp/pytorch-cosine-annealing-with-warmup"
저도 1번 좋은 결과 나온 것에 적용해보겠습니다! 감사합니다!
우선 trainer_qa.py 파일에 아래와 같은 코드를 추가하여 오버라이딩을 해주시면 됩니다. 여기서 num_training_steps은 전체 학습 steps 입니다. 이 부분은 아래 설명드리도록 하겠습니다. num_cycles는 cosine 패턴을 몇 번 반복할 지 정해주는 옵션입니다.
자 이제 train.py 파일로 넘어가겠습니다. trainer = QuestionAnsweringTrainer~~~ 밑에 아래와 같이 추가해줍니다.
마지막으로 각종 arguments를 새롭게 추가했으니, arguments.py 파일로 넘어갑니다. DataTrainingArguments에 다음과 같은 arguments를 추가해줍니다.
제 기준에선, 실행 시 명령어는 다음과 같습니다. python train.py --do_train --output_dir outputs/train --wandb_name ep1+pp1+rtt_q_t100_85_scdr-re_w500 --overwrite_cache --overwrite_output_dir --num_train_epochs 1 --preprocessing_pattern 1 --rtt_dataset_name ./csv/papago_ner.csv --rtt_dataset_name ./csv/papago_ner.csv --data_selected question --logging_steps 50 --another_scheduler_flag --warmup_steps 500 --num_cycles 2
최적화된 값은 테스트 후 진행하겠습니다.
단, 만약 cosine restart가 아닌, cosine annealing를 사용하고자 할 경우 코드를 조금 바꿔주시면 됩니다.
단, CosineAnnealingWarmupRestarts 관련 arguments는 아직 구현하지 않은 상태이니 필요하실 경우 따로 써주시면 됩니다. 그리고 추가로, 관련 라이브러리 설치가 필요합니다. 아래 코드 설치 부탁드립니다.
관련 내용은 다음 깃허브를 참고하시면 됩니다. => https://github.com/katsura-jp/pytorch-cosine-annealing-with-warmup"