PLM(Electra) Practice(네이버 리뷰 분류 모델)
전체 순서
- 라이브러리 로드 → 데이터셋 만들고 → 모델 로드하고 → Optimizer 설정하고, 데이터 로더로 데이터셋을 배치 사이즈에 맞게 불러올 수 있도록 준비하고 → Epoch에 맞게 반복 → Epoch 때마다 Gradient 초기화하고, 디바이스로 Label 보내주고, Input에 기준해서 예측하고, 평가하고, Backforwarding 하고, Loss 계산하고, 반복
라이브러리 로딩
- Pandas → 데이터 로드하고, 필요에 따라 re, spacy 등 불러와서 전처리 필요
- Torch → Device 인식하고 해당 Device로 데이터 보내기 위해서 필요
- Torch.nn.functional → Evaluation Metric(Cross Entrophy)를 위해서 필요
- Torch.optim.AdamW→ Optimizer Function
- Transformer→ Model, Tokenizer
- GPUI device detection
데이터셋
- 데이터셋을 Load할 때 필요한 전처리를 진행해준다. 이후에 전체 구조를 Train, Prediction으로 나누고, 다시 전처리, 훈련, 평가로 나눈다고 할 때, 전처리 부분을 별도 Function으로 만들어주는게 용이할 수는 있겠다.
- 데이터셋 사이즈( len)나, 아이템을 추출하기 위한(getitem) Function을 정의해준다.
- getitem Function을 써야지 만들어진 데이터셋에 대해서 Index를 통해서 가지고 올 수 있게 된다.
- 여기서 Tokenizer를 설정해주는데 AutoTokenizer를 써서 역시 Pretrained된 것을 가지고 와도 된다.
- 이 때 Padding은 padding="max_length"을 걸어줘서 tokenizer에 할당된 최대 길이에 맞춰 자동으로 Padding 해준다. 기존에는 pad_to_max_length=True라는 Option을 주었는데 바뀌었다.
훈련
- Model 역시 PLM기준, 사용하고 싶은 Model을 가지고 온다. Electra를 쓴다고 하면 Transformer에서 ElectraForSequenceClassification를 가지고 오면 된다.
- Pretrained Model을 가지고 온 이후 활용하려는 GPU Device에 할당해주면 된다.
- Optimizer을 설정한다. adamW를 쓴다고 할 때 torch.optim.adamW를 써도 되고, transformer에 있는 adamW를 써도 된다.
- Epoch 별로 이제 반복해서 훈련을 하면 된다.
- model.train()을 실행해줘서 Model을 Train하는 Status로 변경해놓도록 한다.
- Loader별로 데이터를 가지고 올 때 Gradient 초기화 → 예측 → Loss 체크를 반복하게 하면 된다.
평가
- model.eval()을 해놓고, 기존에 Train 했을 때 사용했던 부분을 그대로 사용한다.
- 즉 prediction이후에 $\hat{y}$ $y$를 비교해서 Metric을 계산한다.
추가적으로 살펴볼 부분
- Optimizer 변경할 필요 있는지 확인하기 → Question: AdamW가 최선인가?
- Function으로 재정리하기 → FetchData → Preprocessing → Train → Evaluation 형태로 정리하기
- 다른 감성분석 데이터도 처리할 수 있도록 Data Dependency를 없애고 하나의 개인용 Framework로 정리하기
- 감성분석 외에 추가적인 Task 정의하기