우연한 계기로 이전에 VoxSRC21 대회에 참가했던 박동건, 박경완 학생과 함께 Voice AI 2021 Challenge 에 참여했습니다.
평소에 AI를 메디컬에 접목하려는 시도가 늘어나고 있으며 코로나 진단을 목소리로 진단할 수도 있다는 소문을 듣긴 하였지만 크게 관심을 가지지 않았습니다.
하지만, 이번 대회와 같은 경우 성대 질환으로 보컬에도 많은 관심을 가지고 있어서 흥미가 생겼고, 소리로 정말 진단이 가능한지에 대한 궁금증이 생겨 참여했습니다.
아무래도 적은 데이터 상황에서 효과적으로 학습 및 generalization를 하는 것이 정말 어려웠고 매번 아이디어를 뽑아내는 것도 정말 어려웠습니다.
또한, 처음부터 끝까지 모두 시스템을 구현하고 검증하는 경험은 처음이여서 python과 pytorch에 있어서도 많은 공부가 될 수 있는 시간이었습니다.
마지막에 시간이 없는 상황에서 극적으로 도움을 주었던 박동건 학생의 Data augmentation... 파뿌리 잡는 듯이 시도해본 앙상블 알고리즘들... 우리를 제외한 모든 팀들이 ResNet 구조를 사용했다는 소식... 등 저희 시스템에 아쉬움과 부족함이 많지만 다 이러면서 배우는 거라고 생각이 들었습니다.
이번기회에 다양한 Loss Function, Objective Function, 모델들을 사용해보고 비교해보는 좋은 경험이었습니다.
최종적으로 4등으로 좋은 마무리를 할 수 있어서 기뻣습니다👏👏
서울대학병원에서 MAIC 라는 대회 플랫폼으로 다양한 질병 관련 대회를 진행하고 있습니다.
이 중에서 Voice AI Challenge 는 정상과 5종류의 질병[악성/성대마비/성대결절/풀립 및 물혹/기능성발성장애]을 음성 데이터(Mel-Spectrogram)으로 분류하는 테스크입니다.
이 대회 데이터는 각 검진자들은 15개의 음절과 2개의 모음
을 순차적으로 말하며 이에 대한 발화 지점 정보 annotation
을 제공합니다.
또한 각 음절 또는 모음이 skip 또는 pronounce(뭉개짐)
되었는지도 구분되어 있습니다. (특정 발음에서 skip 또는 pronounce 되는 경향이 있는지 보려고 했다고 했음)
meta 데이터
로는 남/여 정보와 나이
를 제공해 주었는데, 여기서 성별 정보가 생각보다 중요한 부분으로 판단했습니다.
데이터는 총 639
개의 recoding이 존재하고 각 질병 및 남/여 분포는 아래와 같습니다.
굉장히 unbalanced 한 데이터 분포
를 가지며 수 또한 굉장히 작습니다.후두암은 남자만 존재
하며, 기능성 음성질환은 여성이 많은 것
으로 확인했습니다.token
으로 지칭하겠습니다.Token 별 Frame 길이는 아래 표와 같습니다. 각 음절에서 단어 개수에 따라서 Frame(시간) 길이 차이를 보이는데, 길이 차이에 따른 질병 분석을 진행하지는 않았습니다.
우리는 총 4가지의 형태를 실험해 보았습니다.
1) All sentence
2) Only one Token
3) All Token Stacked
4) All Token to Channel
최종적으로 3) All Token Stack 구조를 사용했습니다.
들어가기 앞서, 검증 실험은 Voice Disorder용 오픈 데이터인 SVD(Saarbruecken Voice Database) dataset 를 사용했습니다.
링크
데이터 다운 및 질병 정보는 web crawling 했습니다.
아래 실험은 모음 a, normal tone 인 single token 기준임을 전해드립니다.
역시나 XGBoost가 가장 좋은 성능을 보입니다.
대회 발표때 저희를 제외한 상위권 팀이 모두 CNN (ResNet) 를 사용했습니다...(나 뭐하냐 ㅠㅠ)
제가 담당했는데 데이터 사용에 있어서 아쉬움이 있었던거 같습니다😥
Data format
- 4) All token to channel
- MFCC 40 dim
Architecture
- CNN 2D Block: 4 Blocks
- Conv2D, Batch Norm, Dropout, ReLU, Pooling
- MLP (FC layer) or Attention
구조는 [1]를 참고했습니다.
[1] H. Guan and A. Lerch, "Learning Strategies for Voice Disorder Detection," 2019 IEEE 13th International Conference on Semantic Computing (ICSC)
랩실 동료인 박경완 학생이 담당한 파트입니다😍
Bidirectional LSTM
[2] Gupta, Vibhuti. "Voice disorder detection using long short term memory (lstm) model." arXiv preprint arXiv:1812.01779 (2018)
[3] Luong, M.-T., Pham, H., and Manning, C. D. “Effective approaches to attention-based neural machine translation.” In Conference on Empirical Methods in Natural Language Processing(2015).
이미지 분류에서 적은 데이터 셋에 대해서 좋은 성능을 보임
아래 그림과 같이 Loss 값에 분포가 보다 넓게 분포되어 있어 적은 데이터 셋에 대해 보다 좋은 학습 지표를 보였습니다.
코드는 [5] 블로그를 참고하였습니다.
[4] Barz, Björn & Denzler, Joachim. (2020). Deep Learning on Small Datasets without Pre-Training using Cosine Loss. 1360-1369.
[5] https://byeongjokim.github.io/posts/Cosine-Loss
6종류의 Class가 아닌 병의 존재 유무 정보를 이용한 2종류의 Class 형태의 추가적인 Loss 사용했습니다.
별도의 Fully connect를 생성하는 것이 아닌 단순히 summation으로 사용했습니다.
둘다 해보았지만 큰 성능 차이를 보이지 않았습니다.
Class-Unbalanced 데이터는 모델 학습에 있어서 Class 편향을 일으킬 수 있습니다.
큰 데이터 셋인 경우 클래스 비율을 맞춰주면 되지만 작은 데이터 셋은 이러한 방법이 어렵습니다.
이를 방지하기 위한 수단으로 학습 시에 각 클래스 별 Sampling 비율을 맞춰주는 방법인 Balanced Sampler을 사용했습니다.
코드는 [6]를 참고했습니다.
[6] https://discuss.pytorch.org/t/balanced-sampling-between-classes-with-torchvision-dataloader/2703
이미지 분류 및 컴퓨터 비전 분야에서 효과적으로 사용되는 Augmentation 기법을 적용
계산적으로 유리하고 단순한 random crop과 random padding 을 사용
질병은 어느정도 전반적으로 존재한다고 생각하고 사용을 하였습니다.
Token의 순서를 랜덤으로 Shuffling 해서 증강 시도했습니다.
큰 효과를 보지는 못했지만 잘 쓰면 좋을꺼 같습니다. (비슷한 발음 길이 위주로)
입력 Feature를 시간에 대해서 좌우 반전 시켜 데이터 증강 시도했습니다.
정방향이나 역방향이나 질병의 유무는 다르지 않다고 생각하였습니다.
아무래도 이미 뽑혀진 mel-spectrogram 을 reverse 하다보니 성능 감소를 보였습니다. raw audio 데이터에 대해서 바로 time reverse를 적용해보는 것이 더 좋아보입니다.
simple data augmentation method for speech recognition
이미지에서 random erasing과 비슷하게 볼 수 있습니다.
[7] Park, D. S., Chan, W., Zhang, Y., Chiu, C. C., Zoph, B., Cubuk, E. D., & Le, Q. V. (2019). Specaugment: A simple data augmentation method for automatic speech recognition. arXiv preprint arXiv:1904.08779.
SpecAugment에 더 나가아서 3가지 추가적인 Masking 방법 및 Hidden space 에 대한 Masking 실험을 추가했다.
대회에서는 Hidden space 까지 Masking을 적용하진 않았고 3가지 추가적인 Masking 방법을 적용했다.
Mini-batch based mixture masking (MM)
Mini-batch based cutting masking (CM)
[8] Wang, H., Zou, Y., & Wang, W. (2021). SpecAugment++: A Hidden Space Data Augmentation Method for Acoustic Scene Classification. arXiv preprint arXiv:2103.16858.
[9] https://github.com/WangHelin1997/SpecAugment-plus
Three type model Ensemble
SpecAugment (F=10, T=[12,12])
SpecAugment++ (MM, F=10, T=[12,12])
Time stretching (W=5)
Data format
- MFCC 40 dim
- 3) All Token Stacked
Architecture
- LSTM architecture
Training Strategy
- lr: 1e-4, Optimizer: adam
- loss function: Cosine Loss
- Balanced Sampler
Data Augmentation
- Random Crop
- SpecAugment
- SpecAugment++ (Time Stretch)
Ensemble
- Probability Ensemble Method
- Model Ensemble
이 파트는 박경완 학생이 맡아 주셨습니다 😘
2-branch 구조 모델
[10] Hao, Xiang, et al. "FullSubNet: A Full-Band and Sub-Band Fusion Model for Real-Time Single-Channel Speech Enhancement." ICASSP 2021-2021 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2021.
[11] Westhausen, Nils L., and Bernd T. Meyer. "Dual-signal transformation lstm network for real-time noise suppression." arXiv preprint arXiv:2005.07551 (2020).
Speech Emotion Classification에서 사용한 것과 같이 CNN과 LSTM을 직렬 병렬로도 붙여서 사용해 보았지만 잘 학습이 되지 않았었다.
[12] https://github.com/Data-Science-kosta/Speech-Emotion-Classification-with-PyTorch
아직 발전되지 않는 분야에서 처음부터 문제를 파악하고 분석해 나가는 좋은 경험을 할 수 있었던거 같고 정말 적은 데이터 상황에서 어떻게 학습을 해야하는지에 대해서도 많은 고민을 할 수 있는 경험이었습니다.
대회에서 매번 순위가 오르락 내리락 하기도하고 애써만든 method가 좋은 결과를 보여주지 않고 매번 밤새면서 몸도 마음도 치쳐가는 와중에도 옆에서 끝까지 자리를 지켜주고 재미있는 예술 작품으로 웃음을 준 랩동료 박경완 학생에게 감사의 말을 남기고 예상치 못한 상황에 장염에 걸렸지만 말끔하게 나아서 든든하게 우리의 순위를 멋지게 책임져준 랩동료 박동건 학생 정말 멋있고 모두 감사합니다.
그니까 다음에도 같이해서 1등하자🤞😎