저자원 ASR을 위한 MMS 어댑터 모델 미세 조정
TL;DR
Hugging Face는 MMS-1B 체크포인트의 어댑터 레이어만 미세 조정함으로써, 약 4시간의 Common Voice 데이터로 단 10-20분간 학습시킨 후에도 전체 모델 미세 조정보다 훨씬 적은 학습 가능 파라미터를 사용하여 강력한 터키어 음성 인식을 달성할 수 있음을 보여줍니다.
세계의 언어 다양성 보존
MMS는 언어 간의 언어적 가교 역할을 하는 작은 어댑터 레이어를 사용하여, 소멸 위기에 처한 언어를 포함한 1,100개 이상의 언어에 대한 전사(transcription)를 지원합니다.
MMS 미세 조정 개요
MMS-1B 체크포인트는 1,400개 이상의 언어에 걸쳐 50만 시간 이상의 오디오로 사전 학습되었으며, 이후 1,000개 이상의 언어에 대해 공동 어휘 출력 레이어로 미세 조정되었습니다. 그 후 각 약 2.5M 개의 가중치를 가진 언어별 어댑터 레이어로 교체되었습니다.
세 가지 ASR 지향 체크포인트를 사용할 수 있습니다: mms-1b-fl102, mms-1b-l1107, 그리고 mms-1b-all.
적응형 가중치 학습 – 어댑터가 도움이 되는 이유
어댑터 레이어는 고정된(frozen) 트랜스포머 블록 사이에 작은 학습 가능 모듈을 삽입하여, 사전 학습된 가중치의 대부분을 업데이트하지 않고도 모델이 언어 특유의 음성 및 문법적 특성을 습득할 수 있도록 합니다. 이 접근 방식은 메모리 사용량을 줄이고, 수렴 속도를 높이며, 저자원 데이터에 대한 과적합(over-fitting)을 방지합니다.
노트북 설정 – 데이터 및 전처리
노트북은 Common Voice 6.1의 터키어 분할 데이터(검증된 학습 오디오 약 4시간)를 사용합니다. 오디오는 16kHz로 재샘플링되고, 특수 문자가 제거되며, 텍스트는 소문자로 변환되고, 터키어 특유의 분음 부호(diacritics)가 정규화됩니다. 전사 데이터로부터 37개의 토큰(공백, 문장 부호, [UNK], [PAD] 포함)으로 구성된 어휘집이 구축되어 ISO-639-3 코드 tur로 저장됩니다.
Wav2Vec2Processor는 Wav2Vec2FeatureExtractor (feature_size=1, sampling_rate=16000, padding_value=0.0, do_normalize=True, return_attention_mask=True)를 커스텀 토크나이저와 결합합니다.
학습 과정 및 결과
학습에는 입력 값과 레이블을 별도로 패딩하고, 레이블 패딩을 -100으로 마스킹하며, 단어 오류율(WER)을 평가 지표로 사용하는 커스텀 DataCollatorCTCWithPadding이 사용됩니다.
모델은 facebook/mms-1b-all에서 로드되며, 드롭아웃 레이어는 비활성화되고, 어휘집 크기는 37로 설정되며, 일치하지 않는 크기는 무시됩니다(새로 초기화된 LM head가 새 어휘집과 일치함).
어댑터 레이어는 (재)초기화되고, 베이스 모델은 고정되며, 어댑터 가중치에만 그래디언트가 전달됩니다.
학습 인자: group_by_length=True, per_device_train_batch_size=32, num_train_epochs=4, learning_rate=1e-3, gradient_checkpointing=True, fp16=True, save_steps=200, eval_steps=100, logging_steps=100, push_to_hub=True.
100 학습 스텝 후 검증 WER은 0.280이었고, 200 스텝 후에는 0.232로 떨어졌으며, 300 스텝 후에는 0.229, 400 스텝 후에는 0.223이 되었습니다. 동일한 기간 동안 학습 손실(loss)은 4.905에서 0.2398로 감소했습니다.
이러한 결과는 어댑터 전용 미세 조정이 동일한 저자원 터키어 데이터에 대해 더 작은 XLS-R-300M 체크포인트를 전체 미세 조정하는 것보다 메모리 효율적이면서도 더 나은 성능을 보임을 나타냅니다.
미세 조정된 어댑터 로드 및 사용
학습 후 어댑터 가중치는 베이스 모델과 함께 adapter.tur.safetensors로 저장됩니다. 추론을 위해서는 target_lang="tur"로 체크포인트를 로드하고 토크나이저의 대상 언어를 그에 맞게 설정하십시오:
model = Wav2Vec2ForCTC.from_pretrained("patrickvonplaten/wav2vec2-large-mms-1b-turkish-colab", target_lang="tur").to("cuda")
processor = Wav2Vec2Processor.from_pretrained("patrickvonplaten/wav2vec2-large-mms-1b-turkish-colab")
processor.tokenizer.set_target_lang("tur")
터키어 테스트 샘플에 대한 포워드 패스(forward pass) 결과는 사소한 띄어쓰기 차이를 제외하고는 참조 전사 내용과 일치하는 예측을 생성합니다.
동일한 베이스 모델은 model.load_adapter("swe")를 호출하여 스웨덴어 어댑터(adapter.swe.safetensors)를 로드할 수 있습니다.