boostcampaitech2 / mrc-level2-nlp-02

mrc-level2-nlp-02 created by GitHub Classroom
0 stars 6 forks source link

scheduler를 변경하는 방법!! #11

Open changyong93 opened 3 years ago

changyong93 commented 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"

j961224 commented 3 years ago

저도 1번 좋은 결과 나온 것에 적용해보겠습니다! 감사합니다!