<---google adsense---> <---/google adsense---> '딥러닝' 태그의 글 목록 :: noti note
반응형

주최

서울대학교 병원

아워랩(수면의학 분야 의료기기 연구개발 기업)

대회 개요

수면 데이터는 인생의 1/3을 차지하는 주요 라이프 로그 데이터
수면다원검사 결과 이미지를 이용한 수면 단계 분류 모델링에 도전하라

수면 다원 검사란

수면다원검사는 대상자가 수면을 취하며 뇌파, 심전도, 호흡 등의 생체 신호를 측정하는 검사입니다.
수면 기사 또는 수면전문의는 측정된 여러 신호들을 종합적으로 분석해 수면 단계 분류, 이상 호흡 검출, 움직임 및 각성 검출 등을 판독합니다. 이는 수면무호흡증, 기면병, 렘수면 장애 등 수면과 관련된 여러 질환을 진단하는 기반이 됩니다.

문제 정의

수면다원검사 이미지 데이터를 기반으로 각 이미지의 수면 단계(Wake, N1, N2, N3, REM) 분류

포스터

대회 포스터

후기

대회가 끝난 지 약 한 달이 지난 시점에서 후기를 적으려고 하니 벌써 기억이 가물가물한 부분이 있다. 최대한 정리해서 적어보았으니, 후에 비슷한 대회를 하는 분들에게 도움이 되길 바란다.

 

이 대회의 가장 큰 특징은 '폐쇄망에서 딥러닝 모델을 개발'하는 것이었다.

이런 환경에서 개발하는 것은 팀원뿐만 아니라 본인도 태어나서 처음 경험하는 진귀한 경험이었다고 생각한다.

 

주최 측에서 이런 환경을 제공한 이유는 간단하다. 민감정보인 '의료 데이터' 였기 때문에 데이터를 실제로 보거나 다운로드하는 행위를 방지하기 위해서였다.

 

여차저차 이러한 환경에서 개발하면서 발생한 문제점들을 적어보았다.

1. env 셋팅 에러

2. 모델 사전 다운로드 (pretrained models)

3. 데이터를 보지 못함

 

먼저 1번의 경우

우리 팀은 miniconda를 이용하여 환경셋팅을 했고, sleep이라는 새로운 env를 만듦으로써 그 안에 라이브러리를 올려놓았었다. 그러나, gpu가 잡혀있지 않은 불상사가 발생하였다. 아래에 간단히 정리해 보았다.

 

base 환경 gpu 잡혀있음
(주최측에서 기본 환경에는 잡아준 듯 하다)
라이브러리 설치
sleep 환경 gpu 안잡혀있음
cudnn 미설치? 원인은 미상이다.
yaml file을 이용하여 설치했었는데...
라이브러리 미설치

 

이해가 정확히 될지는 모르겠지만 이러한 이유로 base환경에서는 opencv 등의 라이브러리가 없고, sleep환경에서는 gpu가 잡히지 않는 현상이 있었다. 이때 굉장히 고생했던 게 sleep에 올리면서 저장된 temp(conda libarary install file)를 찾아서 일일이 library를 install 하는 노가다 작업을 했다. 이 글을 읽는 독자님들께서는 폐쇄망에서 작업할 때 특히 모든 것을 검토하길 바란다.

 

2번의 경우

우리 팀의 경우 timm에 존재하는 다수의 models weight를 다운로드를 해놓았었다. 그러나, 대회를 진행하던 와중 디스크 용량 문제로 모델을 지워달라는 연락을 받았고 눈물을 머금고? 사용하지 않을 것 같은 모델들을 상당수 삭제했다. 결국 원래의 계획이었던 se-resnet 모델을 앙상블로 사용하려 했던 것을 철회하고 다른 모델을 적용할 수밖에 없었다. (최종 솔루션은 efficientnet b0 ~ b4 앙상블)

 

3번의 경우

분석 직군을 몸담고 계시는 분들이라면 다들 느끼실 감정이라고 생각한다. 데이터를 보지 않고 분석하는 말 그대로 사막에서 눈감고 진주알을 찾아야 하는 격이다. (이 보다는 쉬울 것 같다.) 이거에 대한 팁은 다수의 경험이 필요하다고 생각한다. 논문이나 캐글 등 다양한 사례를 서치하고 준비하는 게 최선 아닐까...

 

솔루션

우리의 전략은 간단했다.

'학습효율을 극대화해서 짧은 대회 기간 동안 다양한 실험을 하자'

이 점이 다른 팀과의 차이점이 아니었을까 생각한다. (다른 팀의 솔루션을 듣지 못했으므로 본인의 뇌피셜인 것을 고려해 주었으면 좋겠다.) 

 

1. 3채널 이미지 -> 1채널 이미지 (score 하락에 비해서 학습시간이 1/3정도로 감소)

2. AMP(Automatic Mixed Precision) 적용 (학습시간이 정확히 얼마나 줄었는지는 기억이 가물가물한데 확실히 줄었던 것으로 기억한다. 마찬가지로 score는 소폭 하락)

3. Dataloader를 10개로 만들어서 각 에폭마다 다른 loader를 학습하게 만들었다. (비슷한 데이터였기 때문에 효과를 볼 수 있었던 방법이지 않았을까 생각한다; 최종 13~15 epochs 까지만 학습, 학습시간을 매우 매우 단축시켜 준 방법)

 

지금 돌아보면 3번의 경우에는 문제가 있었던 방법이다. 경험적으로 1번 데이터셋을 학습한 후 2번 데이터셋을 학습하면 1번 데이터셋에 대한 건 모델이 잊어버리는(정확히는 weight가 소실되는) 경향이 있기 때문이다. 여기서 가능했던 이유는 모든 데이터셋이 비슷한 그림과 사이즈였기 때문이 아닐까 생각한다.

 

 

이 3가지로 12시간? 정도면 모델 하나를 실험하기엔 충분했다.

 

 

'CV Strategy'

이 또한 분석을 하는 사람이라면 중요한 것을 알 것이다. 우리 팀은 user_id와 label을 이용하여 Multi-Stratified KFold를 진행하였다. 직관적으로 score가 상승하였는지는 모르겠지만(label만을 이용한 Stratified KFold와 비교하였을 때) 일반화를 위해서는 이 방법이 더 타당하다고 생각했다. (사람마다의 수면 패턴이 상이하다는 논문을 본 적이 있어서 사람도 라벨의 한 부분으로 파악하였다.)

 

 

'Model'

Efficientnet b0~b4을 사용하였다. (앙상블)

VIT(Vision Transform)도 사용했었는데 결과는 평범했다. epoch을 늘리면 괜찮을 까 싶어서 늘렸더니 overfit이 발생하였다.

디스크 용량상 다른 모델은 삭제하였기 때문에 실험을 많이 하지는 못했다.

 

'Model Architecture'

Kaggle Competition인 'Mechanisms of Action(MoA) Prediction'에서 차용한 아이디어(요즘 트랜드이기도 하다)로써 Meta data와 CNN 이후의 feature extraction된 feature를 concatenate를 진행 후 dense layer를 구축했다.

Meta data의 경우 수면 시간, 수면에 들기 시작한 시간 등의 feature를 user_id마다 만들어준 후 사용하였다.

이를 적용한 뒤 overfit을 상당히 방지할 수 있게 되었다.

 

'Augmentation'

Masking을 사용했다. (신호의 중간중간을 가려줌으로써 overfit을 방지하였다.)

blur, gaussian noise를 사용 (마찬가지로 신호에 noise를 부여함으로써 overfit을 방지하였다.)

 

'Learning Technique'

Image size는 변환하지 않고 그대로 사용했다.

warmup scheduler를 사용하였고 cosine annealing을 기반으로 사용했다.

CE(categorical cross entropy) Label smoothing을 적용했다.

 

 

 

최종 결과

1등

정말 오랜만에 달성한 1등이라서 더 기뻤고 상금도 기뻤다.

 

고생한 팀원들에게 박수를 👏👏

 

 

 

참고

대회 링크

maic.or.kr/competitions/3/infomation

 

MAIC

MAIC Copyright 2020. MAIC All Rights Reserved.

maic.or.kr

 

주최 github

github.com/AI-Challange/Sleep

 

AI-Challange/Sleep

Contribute to AI-Challange/Sleep development by creating an account on GitHub.

github.com

 

solution github

github.com/hyeonho1028/Sleep_AI_Challenge_SNU_2021

 

hyeonho1028/Sleep_AI_Challenge_SNU_2021

Code for 1st place solution in Sleep AI Challenge SNU Hospital - hyeonho1028/Sleep_AI_Challenge_SNU_2021

github.com

관련기사

www.medigatenews.com/news/3074356460

 

반응형

'Competition > 기타 대회' 카테고리의 다른 글

랜드마크 분류 AI 경진대회 참여 후기  (0) 2021.04.21
반응형

신경망 기반의 자연어 처리를 공부하였습니다. ( 최근 동향 )

 

  • 2001 | Neural Language Models
  • 2008 | Multi-task Learning
  • 2013 | Word Embeddings
  • 2013 | Neural networks for NLP
  • 2014 | Sequence-to-sequence Models
  • 2015 | Attention
  • 2015 | Memory-based Networks
  • 2018 | Pretrained Language Models

 

 

언어 모델링은 일반적으로 RNN을 적용할 때 사용하는 언어입니다.

http://karpathy.github.io/2015/05/21/rnn-effectiveness/

 

The Unreasonable Effectiveness of Recurrent Neural Networks

There’s something magical about Recurrent Neural Networks (RNNs). I still remember when I trained my first recurrent network for Image Captioning. Within a few dozen minutes of training my first baby model (with rather arbitrarily-chosen hyperparameters)

karpathy.github.io

많은 분들이 Andrej Karpathy blog를 보시지 않았을까 생각합니다. 저 또한 RNNs을 공부하면서 참고했던 곳 중 하나입니다. 이 단순한 게시물에서 제시한 언어 모델링이 많은 발전을 통해 현재의 모델에 도달하였습니다.

 

Word embeddings : word2vec의 목적은 언어 모델링을 단순화하는 것에 의미가 있습니다.

Sequence-to-sequence models : 이러한 모델들은 한 번에 한 단어를 예측하여 output sequence를 생성합니다.

Pretrained language models : 이 방법들은 transfer learning을 위한 언어 모델의 표현을 사용합니다.

 

최근의 자연어발전은 언어 모델 개발에 치중되어 있는데, real nlp을 위한 다른 방법과 모델이 필요성을 어필합니다. ( raw form을 이용한 학습은 한계가 존재할 것이라고 합니다. )

 

 

2008 | Multi-task Learning

Multi-task Learning(이하 MTL)는 여러 작업에 대해 훈련된 모델들 간에 파라미터를 공유하는 일반적인 방법입니다. 신경망에서는 다른 layer들의 가중치를 묶음으로써 쉽게 수행할 수 있습니다. 이러한 아이디어는 93년 Rich Caruana가 제안하였으며 당시에는 도로 추적 및 폐렴 예측에 적용되었습니다.

직관적으로 MTL은 모델이 많은 태스크에 유용한 표현을 학습하도록 합니다. 이것은 일반적으로 낮은 레벨의 표현들을 학습하고 모델의 attentions 또는 제한된 학습 데이터가 있을 때 유용합니다. 

 

 

 

MTL은 2008년 Collobert와 Weston이 NLP용 신경망에 처음으로 적용하였습니다. 

Figure 1: Sharing of word embedding matrices ( Collbert & Weston, 2008; Colobert et al., 2011)

위에서 보는 것과 같이 서로 다른 작업에 대해 훈련 된 두 모델 간의 look-up table(word embedding matrices)가 공유됩니다.

word embedding을 공유하면 모델 안에서 가장 많은 수의 파라미터를 구성하는 word embedding matrix의 일반적인 low-level 정보를 공유할 수 있습니다. word embedding를 사전 훈련하고 지난 몇 년간 채택된 텍스트에 대해 CNN을 사용하는 것과 같은 아이디어를 주도했습니다.

관련 : research.fb.com/facebook-researchers-win-test-of-time-award-at-icml-2018/

 

Facebook researchers win Test of Time Award at ICML 2018 - Facebook Research

We are pleased to announce that Facebook research scientists Ronan Collobert and Jason Weston won the 2018 International Conference on…

research.fb.com

 

MTL은 광범위한 NLP 태스크에서 사용되며 기존, NLP repertoire에서 유용한 도구가 되었다고 할 수 있습니다. 파라미터 공유는 일반적으로 정의되어 있긴 하지만, 다른 공유 패턴을 학습할 수 있습니다. 모델의 일반화 능력을 평가하기 위해서 multiple tasks평가가 증가함에 따라 MTL이 중요해지고 있고 전용 벤치마크도 제안되었습니다. (Wang et al., 2018; McCann et al., 2018).

MTL 자세히 : ruder.io/multi-task/

 

An Overview of Multi-Task Learning for Deep Learning

Multi-task learning is becoming more and more popular. This post gives a general overview of the current state of multi-task learning. In particular, it provides context for current neural network-based methods by discussing the extensive multi-task learni

ruder.io

 

 

 

 

 

 

 

 

 

해당 내용은 사실과 다를 수 있습니다.

정정이 필요한 부분은 댓글로 작성 부탁드립니다. ( 혹은 reference추천도 감사합니다. )

감사합니다.

반응형

+ Recent posts