DL&ML/code.data.tips 10

Kaggle Shopee 대회 top-solution 정리

얼마 전 종료 되었던 Shoppe - Price Match Guarantee 대회 비록 뒤늦게 참여해서 아쉽게 메달은 획득하지 못했지만, 짧은 기간 동안 즐겁게 팀플레이를 할 수 있었던 대회였다. 상품 이미지와 제목이 주어졌을 때 유사한 제품 id를 찾는 멀티모달리티를 이용한 대회였다. 탑솔루션이 몇 개 공개되어, 상위권 사람들이 보여준 핵심 아이디어 몇 가지를 정리해보았다. 1등 솔루션 (한국인 yoonsoo님, from embeddings to matches) https://www.kaggle.com/c/shopee-product-matching/discussion/238136 eca_nfnet_l1, xlm-roberta-large, xlm-roberta-base, bert-base-indonesi..

모델이 학습 이후에 모든 입력에 대해 동일한 출력을 내는 문제

유사도 판단을 위한 임베딩을 얻기 위해 pretrained model을 가져다 fine-tuning을 통해 태스크에 좀 더 적합한 임베딩을 만들기 위해서 Arcface Loss를 학습을 했는데, 학습 후에 모든 입력에 대해 동일한 출력을 내는 기이한 현상을 겪었다. Loss는 줄어드는 것을 보고 학습은 되고 있는게 아닌가 싶었는데... 아래 글에서 힌트를 얻어 확인해보니, 결국 Learning Rate이 너무 높은게 문제였다. 아마 이 때, ArcFace에 속한 FC Layer에 높은 LR을 부여하다가, 너무 큰 LR을 할당해버리는 바람에 학습이 이상하게 된 듯 싶다. https://discuss.pytorch.org/t/outputs-from-a-simple-dnn-are-always-the-same-..

모델 학습이 잘 되는지 여부를 판단할 수 있는 지표

모델 학습이 잘 진행되는지 parameter norm과 gradient norm을 활용할 수 있다. (김기현님 강의를 보다가 알게 됨...) 일반적으로(?) parameter norm(L2)은 학습이 진행될 수록 커져야 한다. 모델이 복잡해 지면서... gradient norm(L2)는 점점 작아져야 한다. grad norm이 크다? 그 만큼 많이 배우고 있다는 뜻. 학습이 진행되면서 점점 작아진다. 학습 초반일 수록 틀리는 것이 많고, 많이 틀릴 수록 기울기가 가팔라짐. @torch.no_grad() def get_grad_norm(parameters, norm_type=2): parameters = list(filter(lambda p: p.grad is not None, parameters)) to..

Kaggle TSE 2020 대회 top-solution 정리

작년에 참여해서 은메달을 획득했던 Kaggle Tweet Sentiment Extraction 대회에서 다른 사람들은 어떻게 성능을 끌어올렸는지 top solution을 훑어 보면서 정리해보려고 한다. Tweet Sentiment Extraction Extract support phrases for sentiment labels www.kaggle.com 흥미롭고 배울 게 많은 답안 위주로... 13-th www.kaggle.com/c/tweet-sentiment-extraction/discussion/159505 RoBERTa-base로 시작 데이터가 적어서 아이디어를 검증할 때, 5-CV를 10번(random seed 다르게) 돌려 벨리데이션을 수행 빈칸 자체도 패턴이 될 수 있다고 판단해서, 전처리..

분류 문제 관련 torch loss (BCEWithLogitsLoss, CrossEntropyLoss, LogSoftmax, NLLLoss)

torch.nn.BCEWithLogitsLoss 이진 분류 문제를 풀 때 쓰는 BCEWithLogitsLoss Sigmoid layer + BCELoss의 조합으로 구현되어 있다. 이미 최적화 되어 있으므로 별도로 구현하기 보다 갖다 쓰는게 낫다고 한다. 기본적으로는 'mean'으로 reduction 되어 스칼라 값을 리턴한다. single label 이진 분류 문제 뿐만 아니라 multi-label 이진 분류 문제를 풀 때도 활용 가능하다. single label 이진 분류 예시 logits = model(ids, token_type_ids=token_type_ids, attention_mask=mask, ans_indices=ans_indices) # |logits| = (batch, 1) # |la..

torch amp mixed precision (autocast, GradScaler)

1.5 버전 부터인가 nvidia의 amp모듈이 torch 기본 모듈로 자리잡았다. amp의 Mixed Precision 기능을 이용하면 float16으로 Type Casting 되는 것이 빠른 연산(Linear Layer, Conv Layer etc.)은 float16으로 변환해서 연산을 수행하는 것이 가능해진다. (계산 정확도를 유지하는 선에서) torch amp 모듈은 autocasting을 위한 모듈을 제공하며, 아래 예시 코드에서 확인할 수 있듯 그 이름도 autocast이다. with 문과 함께 선언해서 사용하면 그 안에 선언되는 토치 연산들은 mixed precision으로 실행이 된다. model의 forward 연산과, loss 계산 연산을 with문 아래에 위치 시키자. autocast..

Focal Loss

Object Detection에서 Background / Foreground Class의 불균형 문제를 로스 함수로 해결하기 위해 제안된 focal loss 이걸 클래스 분균형이 심한 일반 분류 문제에도 적용할 수 있을 것 같아서 살펴보았다.. 핵심 아이디어는 다음과 같다. 모델 입장에서 쉽다고 판단하는 example에 대해서 모델의 출력 확률(confidence) Pt가 높게 나올테니 (1-Pt)^gamma를 CE에 추가해줌으로써 높은 확신에 대해 패널티를 주는 방법 반대로 어려워하고 있는 example에 대해선 Pt가 낮게 나올테니 (1-Pt)^gamma가 상대적으로 높게 나올 것! gamma가 높을 수록 (1-Pt)가 작을 수록 더 작아진다 (확신이 높은 example은 패널티를 더 받음) 일반적인..