본문 바로가기

DATA SCIENCE/Study

Inductive Bias에 관하여...

 

1. 개 요

최근 의료 도메인의 morphological semantic segmentation 분야의 캐글 대회에 참여했었다.

진행 기간이 일주일 정도였는데, 회사 업무와 개인 일정으로 인해 시간을 내기가 어려운 상황.

때문에 기존에 짜두었던 ViT 기반의 Semantic Segmentation을 사용했다.

해당 알고리즘은 Multi Scale Windows를 병렬로 사용하고(PSPNet, Segformer 논문에서는 직렬로 사용했으나 몇 번의 실험 결과 다시 decoder를 통해 복원하는 과정에서 지나치게 많은 정보를 잃는 것으로 판단돼 병렬로 사용함으로써 이를 해결하려 했다), gpu의 메모리가 허용하는 선까지 head의 개수를 늘리는 전략을 채택했고(ViT Adapter for Dense Predictions를 참고), Semantic Segmentation을 위해 cnn을 이용한 Simple MLP 구조로 Decoder를 구현(Segformer 참고)했다.

하지만 가장 큰 문제가 있었으니 바로 해당 Kaggle Competetion의 학습 데이터셋으로 제시된 데이터셋의 규모가 100개에 불과하다는 것. 반면 사이즈는 512x512로 아주 커서 트랜스포머 기반의 모델의 성능이 제대로 나타나지 않았는데, 이 포스팅에서는 왜 이런 문제가 발생했는지와 해결 방법에 대해서 정리하고자 한다.

 

 

2. 문제 발생의 이유

가장 큰 문제는 역시 데이터셋의 규모라 보여진다. 100개 밖에 되지 않는 데이터셋을 딥러닝 모델로 예측하는 것 자체가 쉽지 않다는 것. 반면 스코어보드를 보면 거의 0.97~0.98 정도의 스코어를 달성한 이들이 꽤 많은데, 개인적으로 CNN 기반의 모델 구조를 적용했고, DCE Loss(Dice Loss)를 이용해 평가하는 과정에서 성능이 조금 고평가된 것이 아닌가 하는 생각이 들기도 한다.

또한 Loss를 기존에 사용하던 Unet 구조를 참고해 CrossEntropyLoss와 DCE Loss를 함께 사용했는데, epoch 단위로 학습이 반복되는 과정에서 DCE Loss가 음수가 되기도 했다. 이는 각 레이블별 가중치를 적용하는 과정에서 발생한 오류로 보이며, 각 레이블 별 가중치를 적용하지 않았을 때에는 DCE Loss가 음수가 되진 않았으나 CrossEntropyLoss 효율성이 떨어지는 모습을 보였다.

여튼 위 과정들의 결과로서 Transformer 기반의 모델이 '일반화 → 특화'의 과정을 온전히 거치지 못하고, 일반화 단계에만 머물러 각각의 input에 대한 특징을 반영한 결과를 제시하는 것이 아닌 전체 데이터셋에 대해 가장 보편적으로 적용가능한 결과만을 제시했다.(즉, 어떤 데이터를 넣어도 같거나 유사한 결과물을 출력했다.)

이는 inductive bias가 낮은 Transformer의 특징이기 때문에 이를 보완하고자, Albumentation 모듈을 이용한 transform을 진행하였으나 근본적인 문제 자체는 해결되지 않았다.

 

3. 해결방법

우선 첫 번째로 시도해볼 수 있는 방법은 Loss Function의 수정이다.

기존의 Loss를 계산하는 과정에서 전체 데이터의 개수로 전체 로스를 나누는 과정이 동반되는데, 이러한 과정이 inductive bias 문제를 심화시키지 않는가 하는 의문에서 시작되었고 이를 전체 로스를 복합적으로 고려하는 방식으로 구현해 테스트 중이다.

 

두 번째로는 다른 방식의 데이터 증강이다. 의료 도메인 영역의 데이터를 확인하다보니 데이터를 증강할 수 있는 범위의 한계가 존재했다. 기껏해야 좌우반전과 사이즈 조절 및 회전 정도였는데, 기본적으로 의료 CT 데이터가 정밀한 데이터이다보니 미세한 틀어짐 이외의 데이터가 존재할 가능성은 낮았다. 때문에 기존의 데이터셋을 단순히 transform해서 사용하기 전에 애초에 해당 기능을 이용해 데이터셋 자체를 키워놓고, 이에 대해 추가로 증강을 적용하는 방식으로 사용했을 때 단순히 데이터셋 규모가 늘어날 것으로 예상되며 위에서 제시된 Loss 관련 이슈가 함께 해결되지 않을까 기대되기도 한다.

 

세 번째로는 다른 구조의 모델을 적용하는 것이다. Convolution Network 위주의 모델 구조를 적용하거나, Transformer를 사용하고 싶다면 convolution structure를 teacher로 사용해 transformer의 inductive bias로 인한 이슈를 빠르게 해소하는 DeiT를 사용하는 것이 가능할 것 같다. 

 

마지막으로는 다른 input을 주는 방식이다. 이는 해당 컴피티션이 의료 도메인이기 때문에 가능한 방법 중에 하나인데, 우선 해당 컴피티션의 데이터 확장자는 dcm으로 처음 보는 양식이었다. 다행히 이를 읽어들이는 코드라거나, 간단한 전처리 코드를 함께 제시해줘 이를 응용해 입력 데이터로 변환했지만 아무래도 이에 대한 명확한 의미를 알지 못하는 상태에서 사용했기 때문에 제대로 사용하지 못한 것 같다. 추후 이와 유사한 확장자를 사용하는 컴피티션이나 프로젝트를 진행할 때에는 사용한 pydicom 모듈과 해당 확장자에 대한 추가적인 공부가 있어야 할 것처럼 보인다.

 

4. 정 리

이전 post에서 cnn과 ViT의 차이에 대해 다룬 적이 있었는데, 이를 간단히 요약하면 CNN의 경우엔 '특화(Inductive Bias)→일반화(Generalization)'의 순서로 진행된다면 ViT는 '일반화(Generalization)→특화'로 진행된다. 이러한 두 단계는 상호 trade-off 관계에 있으며 각각의 장단점이 존재하게 된다.

때문에 개인적으로는 두 방법론이 함께 적용되는 DeiT를 추가로 스터디 및 적용해보는 것이 기대되는 상황인데, 기존의 DeiT 논문을 살펴보더라도 여전히 여러 하이퍼파라미터에 좌우되고, 학습 시간 및 자원이 많이 필요하다는 단점은 조금 완화되었을뿐 여전히 존재한다고 판단된다. 
Gan과도 같은 구조를 채택함으로써 서로 다른 성격의 모델 구조를 채택해 빠르게 학습시키는 것은 분명 유용하지만, 후반으로 갈수록 Transformer가 CNN 이상의 성능을 보일 수 있다는 점을 감안해 teacher를 제외하는 Structure로 수정하는 것에 대해 고려해봐야할 듯 하다(만약 하게 되면 '청출어람' 같은 네이밍으로 구조명을 짓고 싶다).

 

Reference
1. medium Blog
2. DeiT Review(youtube)

'DATA SCIENCE > Study' 카테고리의 다른 글

[Computer Vision] CNN vs ViT  (0) 2022.11.18
[BentoML 1.x] 1편 : BentoML 시작  (0) 2022.06.24
Docker : npm install error  (0) 2022.05.02
WSL에서 Docker 사용  (0) 2022.05.01
PYTHON Interface Option : argv와 flags, 그리고 argparse  (0) 2022.03.08