paint-brush
Wav2vec2 작업 1부: 자동 음성 인식을 위한 XLS-R 미세 조정~에 의해@pictureinthenoise
1,799 판독값
1,799 판독값

Wav2vec2 작업 1부: 자동 음성 인식을 위한 XLS-R 미세 조정

~에 의해 Picture in the Noise29m2024/05/04
Read on Terminal Reader

너무 오래; 읽다

이 가이드에서는 자동 음성 인식("ASR")을 위해 Meta AI의 wav2vec2 XLS-R 모델을 미세 조정하는 단계를 설명합니다. 이 가이드에는 모델을 미세 조정하는 데 사용할 수 있는 Kaggle Notebook을 구축하는 방법에 대한 단계별 지침이 포함되어 있습니다. 이 모델은 칠레 스페인어 데이터세트로 학습되었습니다.
featured image - Wav2vec2 작업 1부: 자동 음성 인식을 위한 XLS-R 미세 조정
Picture in the Noise HackerNoon profile picture
0-item
1-item

소개

Meta AI는 2021년 말에 wav2vec2 XLS-R("XLS-R")을 출시했습니다. XLS-R은 교차 언어 음성 표현 학습을 위한 기계 학습("ML") 모델입니다. 128개 언어로 공개적으로 사용 가능한 400,000시간 이상의 음성 오디오를 통해 훈련되었습니다. 출시 당시 이 모델은 53개 언어에 걸쳐 약 50,000시간의 음성 오디오에 대해 훈련된 Meta AI의 XLSR-53 교차 언어 모델을 뛰어넘는 도약을 나타냈습니다.


이 가이드에서는 Kaggle Notebook을 사용하여 자동 음성 인식("ASR")을 위해 XLS-R을 미세 조정하는 단계를 설명합니다. 모델은 칠레 스페인어로 미세 조정되지만 일반적인 단계에 따라 원하는 다른 언어로 XLS-R을 미세 조정할 수 있습니다.


미세 조정된 모델에서 추론을 실행하는 방법은 이 가이드를 두 부분 중 첫 번째 부분으로 만드는 동반 튜토리얼에서 설명됩니다. 이번 미세조정 가이드가 좀 길어져서 추론별 가이드를 따로 만들기로 했습니다.


기존 ML 배경 지식이 있고 기본 ASR 개념을 이해하고 있다고 가정합니다. 초보자는 빌드 단계를 따르거나 이해하는 데 어려움을 겪을 수 있습니다.

XLS-R에 대한 약간의 배경 지식

2020년에 도입된 원래 wav2vec2 모델은 960시간의 Librispeech 데이터 세트 음성 오디오와 ~53,200시간의 LibriVox 데이터 세트 음성 오디오로 사전 훈련되었습니다. 출시 당시에는 두 가지 모델 크기, 즉 9,500만 개의 매개변수를 가진 BASE 모델과 3억 1,700만 개의 매개변수를 가진 LARGE 모델을 사용할 수 있었습니다.


반면 XLS-R은 5개 데이터 세트의 다국어 음성 오디오에 대해 사전 학습되었습니다.


  • VoxPopuli : 유럽 의회의 23개 유럽 언어에 대한 총 372,000시간의 연설 오디오입니다.
  • 다국어 도서관 : 8개 유럽 언어에 걸쳐 총 ~50,000시간의 음성 오디오가 제공되며, 대부분(~44,000시간)의 오디오 데이터는 영어로 제공됩니다.
  • CommonVoice : 60개 언어에 걸쳐 총 7,000시간의 음성 오디오를 제공합니다.
  • VoxLingua107 : YouTube 콘텐츠를 기반으로 107개 언어로 총 6,600시간의 음성 오디오를 제공합니다.
  • BABEL : 전화 대화를 기반으로 아프리카 및 아시아 17개 언어에 걸쳐 총 1,100시간 분량의 음성 오디오가 제공됩니다.


XLS-R 모델에는 3억 개의 매개변수가 있는 XLS-R(0.3B) , 10억 개의 매개변수가 있는 XLS-R(1B) , 20억 개의 매개변수가 있는 XLS-R(2B) 등 3가지 모델이 있습니다. 이 가이드에서는 XLS-R(0.3B) 모델을 사용합니다.

접근하다

wav2vev2 모델을 미세 조정하는 방법에 대한 훌륭한 글이 있으며 아마도 이것이 일종의 "최고 표준"일 것입니다. 물론 여기서의 일반적인 접근 방식은 다른 가이드에서 볼 수 있는 내용을 모방합니다. 당신은:


  • 오디오 데이터 및 관련 텍스트 전사의 훈련 데이터세트를 로드합니다.
  • 데이터 세트의 텍스트 전사에서 어휘를 만듭니다.
  • 입력 데이터에서 기능을 추출하고 텍스트 전사를 레이블 시퀀스로 변환하는 wav2vec2 프로세서를 초기화합니다.
  • 처리된 입력 데이터에서 wav2vec2 XLS-R을 미세 조정합니다.


그러나 이 가이드는 다른 가이드와 세 가지 주요 차이점이 있습니다.


  1. 이 가이드에서는 관련 ML 및 ASR 개념에 대한 "인라인" 논의를 많이 제공하지 않습니다.
    • 개별 노트북 셀의 각 하위 섹션에는 특정 셀의 사용/목적에 대한 세부 정보가 포함되어 있지만 기존 ML 배경 지식이 있고 기본 ASR 개념을 이해하고 있다고 가정합니다.
  2. 여러분이 구축할 Kaggle Notebook은 최상위 셀에 유틸리티 메소드를 구성합니다.
    • 많은 미세 조정 노트북이 일종의 "의식의 흐름" 유형 레이아웃을 갖는 경향이 있는 반면, 나는 모든 유틸리티 방법을 함께 구성하기로 결정했습니다. wav2vec2를 처음 사용하는 경우 이 접근 방식이 혼란스러울 수 있습니다. 그러나 다시 한번 강조하지만, 각 셀의 전용 하위 섹션에서 각 셀의 목적을 명확하게 설명하기 위해 최선을 다합니다. wav2vec2에 대해 막 배우고 있다면 HackerNoon의 일반 영어 자동 음성 인식에 대한 wav2vec2 기사를 잠깐 살펴보는 것이 도움이 될 것입니다.
  3. 이 가이드에서는 미세 조정 단계만 설명합니다.
    • 소개 에서 언급했듯이, 생성할 미세 조정된 XLS-R 모델에 대해 추론을 실행하는 방법에 대한 별도의 동반 가이드를 만들기로 결정했습니다. 이는 이 가이드가 지나치게 길어지는 것을 방지하기 위해 수행되었습니다.

전제 조건 및 시작하기 전

가이드를 완료하려면 다음이 필요합니다.


  • 기존 Kaggle 계정 . 기존 Kaggle 계정이 없다면 계정을 만들어야 합니다.
  • 기존 가중치 및 편향 계정("WandB") . 기존 가중치 및 편향 계정이 없으면 계정을 만들어야 합니다.
  • WandB API 키. WandB API 키가 없으면 여기의 단계를 따르세요.
  • Python에 대한 중급 지식.
  • Kaggle Notebook 작업에 대한 중급 지식.
  • ML 개념에 대한 중급 지식.
  • ASR 개념에 대한 기본 지식.


Notebook 작성을 시작하기 전에 바로 아래의 두 하위 섹션을 검토하는 것이 도움이 될 수 있습니다. 그들은 다음을 설명합니다:


  1. 훈련 데이터 세트.
  2. 훈련 중에 사용되는 단어 오류율("WER") 측정항목입니다.

훈련 데이터세트

소개 에서 언급했듯이 XLS-R 모델은 칠레 스페인어로 미세 조정될 예정입니다. 특정 데이터 세트는 Guevara-Rukoz et al.이 개발한 칠레 스페인어 음성 데이터 세트 입니다. OpenSLR 에서 다운로드할 수 있습니다. 데이터 세트는 두 개의 하위 데이터 세트로 구성됩니다. (1) 칠레 남성 화자의 오디오 녹음 2,636개와 (2) 칠레 여성 화자의 오디오 녹음 1,738개.


각 하위 데이터세트에는 line_index.tsv 인덱스 파일이 포함되어 있습니다. 각 색인 파일의 각 줄에는 오디오 파일 이름 쌍과 관련 파일의 오디오 녹음 내용이 포함되어 있습니다. 예:


 clm_08421_01719502739 Es un viaje de negocios solamente voy por una noche clm_02436_02011517900 Se usa para incitar a alguien a sacar el mayor provecho del dia presente


편의를 위해 칠레 스페인어 음성 데이터 세트를 Kaggle에 업로드했습니다. 칠레 남성 화자의 녹음을 위한 하나의 Kaggle 데이터세트와 칠레 여성 화자의 녹음을 위한 하나의 Kaggle 데이터세트가 있습니다. 이러한 Kaggle 데이터 세트는 이 가이드의 단계에 따라 구축할 Kaggle Notebook에 추가됩니다.

단어 오류율(WER)

WER은 자동 음성 인식 모델의 성능을 측정하는 데 사용할 수 있는 측정항목 중 하나입니다. WER은 텍스트 예측이 텍스트 참조에 얼마나 가까운지 측정하는 메커니즘을 제공합니다. WER은 3가지 유형의 오류를 기록하여 이를 수행합니다.


  • 대체( S ): 예측에 참조의 유사 단어와 다른 단어가 포함된 경우 대체 오류가 기록됩니다. 예를 들어, 예측에서 참조 단어의 철자가 잘못되었을 때 이런 일이 발생합니다.

  • 삭제( D ): 예측에 참조에 없는 단어가 포함된 경우 삭제 오류가 기록됩니다.

  • 삽입( I ): 예측에 참조에 있는 단어가 포함되지 않은 경우 삽입 오류가 기록됩니다.


분명히 WER은 단어 수준에서 작동합니다. WER 측정항목의 공식은 다음과 같습니다.


 WER = (S + D + I)/N where: S = number of substition errors D = number of deletion errors I = number of insertion errors N = number of words in the reference


스페인어로 된 간단한 WER 예는 다음과 같습니다.


 prediction: "Él está saliendo." reference: "Él está saltando."


테이블은 예측의 오류를 시각화하는 데 도움이 됩니다.

텍스트

단어 1

단어 2

단어 3

예측

엘자

에스타

살리엔도

참조

엘자

에스타

살탄도


옳은

옳은

치환

예측에는 대체 오류 1개, 삭제 오류 0개, 삽입 오류 0개가 포함되어 있습니다. 따라서 이 예의 WER은 다음과 같습니다.


 WER = 1 + 0 + 0 / 3 = 1/3 = 0.33


단어 오류율이 반드시 어떤 특정 오류가 존재하는지 알려주는 것은 아니라는 점은 분명합니다. 위의 예에서 WER은 WORD 3에 예측 텍스트에 오류가 포함되어 있음을 식별하지만 예측에서 문자 ie가 틀렸다는 것을 알려주지는 않습니다. 보다 정확한 오류 분석을 위해 문자 오류율("CER")과 같은 다른 측정항목을 사용할 수 있습니다.

미세 조정 노트북 만들기

이제 미세 조정 노트북 작성을 시작할 준비가 되었습니다.


  • 1단계2단계 에서는 Kaggle Notebook 환경을 설정하는 과정을 안내합니다.
  • 3단계에서는 노트북 자체를 구축하는 과정을 안내합니다. 여기에는 미세 조정 노트북의 32개 셀을 나타내는 32개의 하위 단계가 포함되어 있습니다.
  • 4단계 에서는 노트북 실행, 교육 모니터링, 모델 저장 과정을 안내합니다.

1단계 - WandB API 키 가져오기

WandB API 키를 사용하여 훈련 실행 데이터를 WandB로 보내도록 Kaggle Notebook을 구성해야 합니다. 그러기 위해서는 복사를 해야 합니다.


  1. www.wandb.com 에서 WandB에 로그인하세요.
  2. www.wandb.ai/authorize 로 이동합니다.
  3. 다음 단계에서 사용할 수 있도록 API 키를 복사하세요.

2단계 - Kaggle 환경 설정

2.1단계 - 새로운 Kaggle 노트북 만들기


  1. 캐글에 로그인하세요.
  2. 새로운 캐글 노트북을 만듭니다.
  3. 물론 노트북 이름은 원하는대로 변경할 수 있습니다. 이 가이드에서는 노트북 이름 xls-r-300m-chilean-spanish-asr 사용합니다.

2.2단계 - WandB API 키 설정

Kaggle Secret은 WandB API 키를 안전하게 저장하는 데 사용됩니다.


  1. Kaggle Notebook 메인 메뉴에서 Add-ons를 클릭하세요.
  2. 팝업 메뉴에서 비밀을 선택하세요.
  3. 라벨 필드에 WANDB_API_KEY 라벨을 입력하고 값에 WandB API 키를 입력하세요.
  4. WANDB_API_KEY 라벨 필드 왼쪽에 있는 첨부됨 확인란이 선택되어 있는지 확인하세요.
  5. 완료 를 클릭합니다.

2.3단계 - 훈련 데이터 세트 추가

칠레 스페인어 음성 데이터 세트는 2개의 개별 데이터 세트로 Kaggle에 업로드되었습니다.


이 두 데이터 세트를 모두 Kaggle Notebook에 추가하세요.

3단계 - 미세 조정 노트북 구축

다음 32개의 하위 단계는 미세 조정 노트북의 32개 셀을 각각 순서대로 구축합니다.

3.1단계 - CELL 1: 패키지 설치

미세 조정 노트북의 첫 번째 셀은 종속성을 설치합니다. 첫 번째 셀을 다음으로 설정합니다.


 ### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer


  • 첫 번째 줄은 torchaudio 패키지를 최신 버전으로 업그레이드합니다. torchaudio 오디오 파일을 로드하고 오디오 데이터를 리샘플링하는 데 사용됩니다.
  • 두 번째 줄은 나중에 사용되는 HuggingFace Datasets 라이브러리 load_metric 메서드를 사용하는 데 필요한 jiwer 패키지를 설치합니다.

3.2단계 - CELL 2: Python 패키지 가져오기

두 번째 셀은 필수 Python 패키지를 가져옵니다. 두 번째 셀을 다음과 같이 설정합니다.


 ### CELL 2: Import Python packages ### import wandb from kaggle_secrets import UserSecretsClient import math import re import numpy as np import pandas as pd import torch import torchaudio import json from typing import Any, Dict, List, Optional, Union from dataclasses import dataclass from datasets import Dataset, load_metric, load_dataset, Audio from transformers import Wav2Vec2CTCTokenizer from transformers import Wav2Vec2FeatureExtractor from transformers import Wav2Vec2Processor from transformers import Wav2Vec2ForCTC from transformers import TrainingArguments from transformers import Trainer


  • 아마도 이러한 패키지 대부분에 이미 익숙할 것입니다. 노트북에서의 사용은 후속 셀이 구축될 때 설명됩니다.
  • HuggingFace transformers 라이브러리 및 관련 Wav2Vec2* 클래스가 미세 조정에 사용되는 기능의 백본을 제공한다는 점은 언급할 가치가 있습니다.

3.3단계 - CELL 3: WER 측정항목 로드

세 번째 셀은 HuggingFace WER 평가 지표를 가져옵니다. 세 번째 셀을 다음과 같이 설정합니다.


 ### CELL 3: Load WER metric ### wer_metric = load_metric("wer")


  • 앞서 언급했듯이 WER은 평가/홀드아웃 데이터에 대한 모델의 성능을 측정하는 데 사용됩니다.

3.4단계 - CELL 4: WandB에 로그인

네 번째 셀은 2.2단계 에서 설정된 WANDB_API_KEY 비밀을 검색합니다. 네 번째 셀을 다음과 같이 설정합니다.


 ### CELL 4: Login to WandB ### user_secrets = UserSecretsClient() wandb_api_key = user_secrets.get_secret("WANDB_API_KEY") wandb.login(key = wandb_api_key)


  • API 키는 교육 실행 데이터가 WandB로 전송되도록 Kaggle Notebook을 구성하는 데 사용됩니다.

3.5단계 - CELL 5: 상수 설정

다섯 번째 셀은 노트북 전체에서 사용될 상수를 설정합니다. 다섯 번째 셀을 다음과 같이 설정합니다.


 ### CELL 5: Constants ### # Training data TRAINING_DATA_PATH_MALE = "/kaggle/input/google-spanish-speakers-chile-male/" TRAINING_DATA_PATH_FEMALE = "/kaggle/input/google-spanish-speakers-chile-female/" EXT = ".wav" NUM_LOAD_FROM_EACH_SET = 1600 # Vocabulary VOCAB_FILE_PATH = "/kaggle/working/" SPECIAL_CHARS = r"[\d\,\-\;\!\¡\?\¿\।\'\'\"\–\'\:\/\.\“\”\৷\…\‚\॥\\]" # Sampling rates ORIG_SAMPLING_RATE = 48000 TGT_SAMPLING_RATE = 16000 # Training/validation data split SPLIT_PCT = 0.10 # Model parameters MODEL = "facebook/wav2vec2-xls-r-300m" USE_SAFETENSORS = False # Training arguments OUTPUT_DIR_PATH = "/kaggle/working/xls-r-300m-chilean-spanish-asr" TRAIN_BATCH_SIZE = 18 EVAL_BATCH_SIZE = 10 TRAIN_EPOCHS = 30 SAVE_STEPS = 3200 EVAL_STEPS = 100 LOGGING_STEPS = 100 LEARNING_RATE = 1e-4 WARMUP_STEPS = 800


  • 노트북은 이 셀에서 생각할 수 있는 모든 상수를 표시하지 않습니다. 상수로 표현될 수 있는 일부 값은 인라인으로 남겨졌습니다.
  • 위의 많은 상수를 사용하는 것은 자명합니다. 그렇지 않은 경우에는 다음 하위 단계에서 사용법을 설명합니다.

3.6단계 - CELL 6: 색인 파일 읽기, 텍스트 정리 및 어휘 생성을 위한 유틸리티 방법

여섯 번째 셀은 데이터 세트 인덱스 파일을 읽는 것(위의 교육 데이터 세트 하위 섹션 참조)은 물론 전사 텍스트를 정리하고 어휘를 생성하기 위한 유틸리티 메서드를 정의합니다. 여섯 번째 셀을 다음과 같이 설정합니다.


 ### CELL 6: Utility methods for reading index files, cleaning text, and creating vocabulary ### def read_index_file_data(path: str, filename: str): data = [] with open(path + filename, "r", encoding = "utf8") as f: lines = f.readlines() for line in lines: file_and_text = line.split("\t") data.append([path + file_and_text[0] + EXT, file_and_text[1].replace("\n", "")]) return data def truncate_training_dataset(dataset: list) -> list: if type(NUM_LOAD_FROM_EACH_SET) == str and "all" == NUM_LOAD_FROM_EACH_SET.lower(): return else: return dataset[:NUM_LOAD_FROM_EACH_SET] def clean_text(text: str) -> str: cleaned_text = re.sub(SPECIAL_CHARS, "", text) cleaned_text = cleaned_text.lower() return cleaned_text def create_vocab(data): vocab_list = [] for index in range(len(data)): text = data[index][1] words = text.split(" ") for word in words: chars = list(word) for char in chars: if char not in vocab_list: vocab_list.append(char) return vocab_list


  • read_index_file_data 메소드는 line_index.tsv 데이터 세트 인덱스 파일을 읽고 오디오 파일 이름 및 녹음 데이터가 포함된 목록 목록을 생성합니다. 예:


 [ ["/kaggle/input/google-spanish-speakers-chile-male/clm_08421_01719502739", "Es un viaje de negocios solamente voy por una noche"] ... ]


  • truncate_training_dataset 메소드는 3.5단계 에서 설정한 NUM_LOAD_FROM_EACH_SET 상수를 사용하여 목록 인덱스 파일 데이터를 자릅니다. 특히 NUM_LOAD_FROM_EACH_SET 상수는 각 데이터세트에서 로드해야 하는 오디오 샘플 수를 지정하는 데 사용됩니다. 이 가이드의 목적에 따라 숫자는 1600 으로 설정되어 있으며 이는 결국 총 3200 개의 오디오 샘플이 로드된다는 의미입니다. 모든 샘플을 로드하려면 NUM_LOAD_FROM_EACH_SET 문자열 값 all 로 설정합니다.
  • clean_text 메소드는 3.5단계 에서 SPECIAL_CHARS 에 할당된 정규 표현식에 지정된 문자의 각 텍스트 전사를 제거하는 데 사용됩니다. 구두점을 포함한 이러한 문자는 오디오 기능과 텍스트 전사 간의 매핑을 학습하기 위해 모델을 교육할 때 의미론적 값을 제공하지 않으므로 제거할 수 있습니다.
  • create_vocab 메소드는 깨끗한 텍스트 전사에서 어휘를 생성합니다. 간단히 말해서 정리된 텍스트 사본 세트에서 모든 고유 문자를 추출합니다. 3.14단계 에서 생성된 어휘의 예를 볼 수 있습니다.

3.7단계 - CELL 7: 오디오 데이터 로드 및 리샘플링을 위한 유틸리티 방법

일곱 번째 셀은 torchaudio 사용하여 오디오 데이터를 로드하고 리샘플링하는 유틸리티 메서드를 정의합니다. 일곱 번째 셀을 다음과 같이 설정합니다.


 ### CELL 7: Utility methods for loading and resampling audio data ### def read_audio_data(file): speech_array, sampling_rate = torchaudio.load(file, normalize = True) return speech_array, sampling_rate def resample(waveform): transform = torchaudio.transforms.Resample(ORIG_SAMPLING_RATE, TGT_SAMPLING_RATE) waveform = transform(waveform) return waveform[0]


  • read_audio_data 메소드는 지정된 오디오 파일을 로드하고 오디오 샘플링 속도와 함께 오디오 데이터의 torch.Tensor 다차원 매트릭스를 반환합니다. 훈련 데이터의 모든 오디오 파일의 샘플링 속도는 48000 입니다. 이 "원래" 샘플링 속도는 3.5단계 의 상수 ORIG_SAMPLING_RATE 에 의해 캡처됩니다.
  • resample 메서드는 48000 에서 16000 까지의 샘플링 속도에서 오디오 데이터를 다운샘플링하는 데 사용됩니다. wav2vec2는 16000 로 샘플링된 오디오에 대해 사전 학습되었습니다. 따라서 미세 조정에 사용되는 모든 오디오의 샘플링 속도는 동일해야 합니다. 이 경우 오디오 예제는 48000 에서 16000 로 다운샘플링되어야 합니다. 160003.5단계 의 상수 TGT_SAMPLING_RATE 에 의해 캡처됩니다.

3.8단계 - CELL 8: 훈련용 데이터를 준비하는 유틸리티 방법

여덟 번째 셀은 오디오 및 전사 데이터를 처리하는 유틸리티 메서드를 정의합니다. 여덟 번째 셀을 다음과 같이 설정합니다.


 ### CELL 8: Utility methods to prepare input data for training ### def process_speech_audio(speech_array, sampling_rate): input_values = processor(speech_array, sampling_rate = sampling_rate).input_values return input_values[0] def process_target_text(target_text): with processor.as_target_processor(): encoding = processor(target_text).input_ids return encoding


  • process_speech_audio 메서드는 제공된 훈련 샘플에서 입력 값을 반환합니다.
  • process_target_text 메소드는 각 텍스트 전사를 레이블 목록, 즉 어휘의 문자를 참조하는 색인 목록으로 인코딩합니다. 3.15단계 에서 샘플 인코딩을 볼 수 있습니다.

3.9단계 - CELL 9: 단어 오류율을 계산하는 유틸리티 방법

아홉 번째 셀은 최종 유틸리티 방법 셀이며 참조 전사와 예측 전사 사이의 단어 오류율을 계산하는 방법을 포함합니다. 9번째 셀을 다음과 같이 설정합니다.


 ### CELL 9: Utility method to calculate Word Error Rate def compute_wer(pred): pred_logits = pred.predictions pred_ids = np.argmax(pred_logits, axis = -1) pred.label_ids[pred.label_ids == -100] = processor.tokenizer.pad_token_id pred_str = processor.batch_decode(pred_ids) label_str = processor.batch_decode(pred.label_ids, group_tokens = False) wer = wer_metric.compute(predictions = pred_str, references = label_str) return {"wer": wer}

3.10단계 - CELL 10: 학습 데이터 읽기

10번째 셀은 Step 3.6 에서 정의한 read_index_file_data 메소드를 이용하여 남성 화자의 녹음과 여성 화자의 녹음에 대한 훈련 데이터 인덱스 파일을 읽어온다. 10번째 셀을 다음과 같이 설정합니다.


 ### CELL 10: Read training data ### training_samples_male_cl = read_index_file_data(TRAINING_DATA_PATH_MALE, "line_index.tsv") training_samples_female_cl = read_index_file_data(TRAINING_DATA_PATH_FEMALE, "line_index.tsv")


  • 보시다시피, 훈련 데이터는 이 시점에서 두 개의 성별별 목록으로 관리됩니다. 데이터는 잘린 후 3.12단계 에서 결합됩니다.

3.11단계 - CELL 11: 훈련 데이터 자르기

11번째 셀은 3.6단계 에서 정의된 truncate_training_dataset 메소드를 사용하여 훈련 데이터 목록을 자릅니다. 11번째 셀을 다음과 같이 설정합니다.


 ### CELL 11: Truncate training data ### training_samples_male_cl = truncate_training_dataset(training_samples_male_cl) training_samples_female_cl = truncate_training_dataset(training_samples_female_cl)


  • 참고로 3.5단계 에서 설정된 NUM_LOAD_FROM_EACH_SET 상수는 각 데이터세트에서 보관할 샘플 수량을 정의합니다. 이 가이드에서는 총 3200 개의 샘플에 대해 상수가 1600 으로 설정되어 있습니다.

3.12단계 - CELL 12: 훈련 샘플 데이터 결합

12번째 셀은 잘린 훈련 데이터 목록을 결합합니다. 12번째 셀을 다음과 같이 설정합니다.


 ### CELL 12: Combine training samples data ### all_training_samples = training_samples_male_cl + training_samples_female_cl

3.13단계 - CELL 13: 전사 테스트 청소

13번째 셀은 각 교육 데이터 샘플을 반복하고 3.6단계 에서 정의된 clean_text 메서드를 사용하여 관련 전사 텍스트를 정리합니다. 13번째 셀을 다음과 같이 설정합니다.


 for index in range(len(all_training_samples)): all_training_samples[index][1] = clean_text(all_training_samples[index][1])

3.14단계 - CELL 14: 어휘 생성

14번째 셀은 이전 단계에서 정리된 전사본과 3.6단계 에서 정의된 create_vocab 메소드를 사용하여 어휘를 생성합니다. 14번째 셀을 다음과 같이 설정합니다.


 ### CELL 14: Create vocabulary ### vocab_list = create_vocab(all_training_samples) vocab_dict = {v: i for i, v in enumerate(vocab_list)}


  • 어휘는 문자를 키로, 어휘 색인을 값으로 사용하여 사전으로 저장됩니다.

  • 다음과 같은 출력을 생성하는 vocab_dict 인쇄할 수 있습니다:


 {'l': 0, 'a': 1, 'v': 2, 'i': 3, 'g': 4, 'e': 5, 'n': 6, 'c': 7, 'd': 8, 't': 9, 'u': 10, 'r': 11, 'j': 12, 's': 13, 'o': 14, 'h': 15, 'm': 16, 'q': 17, 'b': 18, 'p': 19, 'y': 20, 'f': 21, 'z': 22, 'á': 23, 'ú': 24, 'í': 25, 'ó': 26, 'é': 27, 'ñ': 28, 'x': 29, 'k': 30, 'w': 31, 'ü': 32}

3.15단계 - CELL 15: 어휘에 단어 구분 기호 추가

15번째 셀에는 단어 구분 문자 | 어휘에. 15번째 셀을 다음과 같이 설정합니다.


 ### CELL 15: Add word delimiter to vocabulary ### vocab_dict["|"] = len(vocab_dict)


  • 단어 구분 기호 문자는 텍스트 전사를 레이블 목록으로 토큰화할 때 사용됩니다. 구체적으로, 단어의 끝을 정의하는 데 사용되며 Step 3.17 에서 볼 수 있듯이 Wav2Vec2CTCTokenizer 클래스를 초기화할 때 사용됩니다.

  • 예를 들어 다음 목록은 3.14단계 의 어휘를 사용하여 no te entiendo nada 인코딩합니다.


 # Encoded text [6, 14, 33, 9, 5, 33, 5, 6, 9, 3, 5, 6, 8, 14, 33, 6, 1, 8, 1] # Vocabulary {'l': 0, 'a': 1, 'v': 2, 'i': 3, 'g': 4, 'e': 5, 'n': 6, 'c': 7, 'd': 8, 't': 9, 'u': 10, 'r': 11, 'j': 12, 's': 13, 'o': 14, 'h': 15, 'm': 16, 'q': 17, 'b': 18, 'p': 19, 'y': 20, 'f': 21, 'z': 22, 'á': 23, 'ú': 24, 'í': 25, 'ó': 26, 'é': 27, 'ñ': 28, 'x': 29, 'k': 30, 'w': 31, 'ü': 32, '|': 33}


  • 자연스럽게 발생할 수 있는 질문은 "단어 구분 문자를 정의하는 것이 왜 필요한가?"입니다. 예를 들어, 영어와 스페인어로 된 단어의 끝은 공백으로 표시되므로 공백 문자를 단어 구분 기호로 사용하는 것은 간단합니다. 영어와 스페인어는 수천 개의 언어 중 두 개에 불과하다는 점을 기억하세요. 모든 서면 언어가 단어 경계를 표시하기 위해 공백을 사용하는 것은 아닙니다.

3.16단계 - CELL 16: 어휘 내보내기

16번째 셀은 어휘를 파일에 덤프합니다. 16번째 셀을 다음과 같이 설정합니다.


 ### CELL 16: Export vocabulary ### with open(VOCAB_FILE_PATH + "vocab.json", "w", encoding = "utf8") as vocab_file: json.dump(vocab_dict, vocab_file)


  • 어휘 파일은 다음 단계인 3.17단계 에서 Wav2Vec2CTCTokenizer 클래스를 초기화하는 데 사용됩니다.

3.17단계 - CELL 17: 토크나이저 초기화

17번째 셀은 Wav2Vec2CTCTokenizer 인스턴스를 초기화합니다. 17번째 셀을 다음과 같이 설정합니다.


 ### CELL 17: Initialize tokenizer ### tokenizer = Wav2Vec2CTCTokenizer( VOCAB_FILE_PATH + "vocab.json", unk_token = "[UNK]", pad_token = "[PAD]", word_delimiter_token = "|", replace_word_delimiter_char = " " )


  • 토크나이저는 텍스트 전사를 인코딩하고 레이블 목록을 다시 텍스트로 디코딩하는 데 사용됩니다.

  • 토크나이저는 unk_token 에 할당된 [UNK]pad_token 에 할당된 [PAD] 로 초기화됩니다. 전자는 텍스트 전사에서 알 수 없는 토큰을 나타내는 데 사용되고 후자는 길이가 다른 전사 배치를 생성할 때 tokenizer 를 채우는 데 사용됩니다. 이 두 값은 토크나이저에 의해 어휘에 추가됩니다.

  • 이 단계에서 토크나이저를 초기화하면 문장의 시작과 끝을 각각 구분하는 데 사용되는 <s>/</s> 라는 두 개의 추가 토큰이 어휘에 추가됩니다.

  • | 3.15단계 에서 어휘에 문자를 추가함에 따라 파이프 기호가 단어의 끝을 구분하는 데 사용된다는 점을 반영하기 위해 이 단계에서는 word_delimiter_token 에 명시적으로 할당됩니다. | 기호는 word_delimiter_token 의 기본값입니다. 따라서 명시적으로 설정할 필요는 없지만 명확성을 위해 그렇게 설정했습니다.

  • word_delimiter_token 과 마찬가지로 replace_word_delimiter_char 기호 | 텍스트 전사에서 공백 문자를 바꾸는 데 사용됩니다. replace_word_delimiter_char 의 기본값은 공백입니다. 따라서 명시적으로 설정할 필요는 없지만 명확성을 위해 그렇게 했습니다.

  • tokenizer 에서 get_vocab() 메서드를 호출하여 전체 토크나이저 어휘를 인쇄할 수 있습니다.


 vocab = tokenizer.get_vocab() print(vocab) # Output: {'e': 0, 's': 1, 'u': 2, 'n': 3, 'v': 4, 'i': 5, 'a': 6, 'j': 7, 'd': 8, 'g': 9, 'o': 10, 'c': 11, 'l': 12, 'm': 13, 't': 14, 'y': 15, 'p': 16, 'r': 17, 'h': 18, 'ñ': 19, 'ó': 20, 'b': 21, 'q': 22, 'f': 23, 'ú': 24, 'z': 25, 'é': 26, 'í': 27, 'x': 28, 'á': 29, 'w': 30, 'k': 31, 'ü': 32, '|': 33, '<s>': 34, '</s>': 35, '[UNK]': 36, '[PAD]': 37}

단계 3.18 - CELL 18: 특징 추출기 초기화

18번째 셀은 Wav2Vec2FeatureExtractor 인스턴스를 초기화합니다. 18번째 셀을 다음과 같이 설정합니다.


 ### CELL 18: Initialize feature extractor ### feature_extractor = Wav2Vec2FeatureExtractor( feature_size = 1, sampling_rate = 16000, padding_value = 0.0, do_normalize = True, return_attention_mask = True )


  • 특징 추출기는 입력 데이터(물론 이 사용 사례에서는 오디오 데이터)에서 특징을 추출하는 데 사용됩니다. 3.20단계 에서 각 훈련 데이터 샘플에 대한 오디오 데이터를 로드합니다.
  • Wav2Vec2FeatureExtractor 이니셜라이저에 전달된 매개변수 값은 기본값이 Falsereturn_attention_mask 를 제외하고 모두 기본값입니다. 명확성을 위해 기본값이 표시/전달됩니다.
  • feature_size 매개변수는 입력 기능(예: 오디오 데이터 기능)의 크기 크기를 지정합니다. 이 매개변수의 기본값은 1 입니다.
  • sampling_rate 오디오 데이터가 디지털화되어야 하는 샘플링 속도를 특징 추출기에 알려줍니다. 3.7단계 에서 설명한 대로 wav2vec2는 16000 로 샘플링된 오디오에 대해 사전 학습되었으므로 16000 이 매개변수의 기본값입니다.
  • padding_value 매개변수는 다양한 길이의 오디오 샘플을 일괄 처리할 때 필요에 따라 오디오 데이터를 채울 때 사용되는 값을 지정합니다. 기본값은 0.0 입니다.
  • do_normalize 입력 데이터를 표준 정규 분포로 변환해야 하는지 지정하는 데 사용됩니다. 기본값은 True 입니다. Wav2Vec2FeatureExtractor 클래스 문서에는 "[정규화]가 일부 모델의 성능을 크게 향상시키는 데 도움이 될 수 있습니다."라고 나와 있습니다.
  • return_attention_mask 매개변수는 주의 마스크를 전달해야 하는지 여부를 지정합니다. 이 사용 사례에서는 값이 True 로 설정됩니다.

3.19단계 - CELL 19: 프로세서 초기화

19번째 셀은 Wav2Vec2Processor 인스턴스를 초기화합니다. 19번째 셀을 다음과 같이 설정합니다.


 ### CELL 19: Initialize processor ### processor = Wav2Vec2Processor(feature_extractor = feature_extractor, tokenizer = tokenizer)


  • Wav2Vec2Processor 클래스는 3.17단계3.18단계tokenizerfeature_extractor 각각 단일 프로세서로 결합합니다.

  • Wav2Vec2Processor 클래스 인스턴스에서 save_pretrained 메소드를 호출하여 프로세서 구성을 저장할 수 있습니다.


 processor.save_pretrained(OUTPUT_DIR_PATH)

3.20단계 - CELL 20: 오디오 데이터 로드

20번째 셀은 all_training_samples 목록에 지정된 각 오디오 파일을 로드합니다. 20번째 셀을 다음과 같이 설정합니다.


 ### CELL 20: Load audio data ### all_input_data = [] for index in range(len(all_training_samples)): speech_array, sampling_rate = read_audio_data(all_training_samples[index][0]) all_input_data.append({ "input_values": speech_array, "labels": all_training_samples[index][1] })


  • 오디오 데이터는 torch.Tensor 로 반환되고 all_input_data 에 사전 목록으로 저장됩니다. 각 사전에는 오디오의 텍스트 전사와 함께 특정 샘플에 대한 오디오 데이터가 포함되어 있습니다.
  • read_audio_data 메소드는 오디오 데이터의 샘플링 속도도 반환합니다. 이 사용 사례에서는 모든 오디오 파일의 샘플링 속도가 48000 라는 것을 알고 있으므로 이 단계에서는 샘플링 속도가 무시됩니다.

3.21단계 - CELL 21: all_input_data Pandas DataFrame으로 변환

21번째 셀은 데이터를 더 쉽게 조작할 수 있도록 all_input_data 목록을 Pandas DataFrame으로 변환합니다. 21번째 셀을 다음과 같이 설정합니다.


 ### CELL 21: Convert audio training data list to Pandas DataFrame ### all_input_data_df = pd.DataFrame(data = all_input_data)

3.22단계 - CELL 22: 오디오 데이터 및 텍스트 전사 처리

20초 셀은 3.19단계 에서 초기화된 processor 사용하여 각 오디오 데이터 샘플에서 특징을 추출하고 각 텍스트 전사를 레이블 목록으로 인코딩합니다. 20초 셀을 다음과 같이 설정합니다.


 ### CELL 22: Process audio data and text transcriptions ### all_input_data_df["input_values"] = all_input_data_df["input_values"].apply(lambda x: process_speech_audio(resample(x), 16000)) all_input_data_df["labels"] = all_input_data_df["labels"].apply(lambda x: process_target_text(x))

3.23단계 - CELL 23: 입력 데이터를 교육 및 검증 데이터 세트로 분할

23번째 셀은 3.5단계SPLIT_PCT 상수를 사용하여 all_input_data_df DataFrame을 훈련 및 평가(검증) 데이터 세트로 분할합니다. 23번째 셀을 다음과 같이 설정합니다.


 ### CELL 23: Split input data into training and validation datasets ### split = math.floor((NUM_LOAD_FROM_EACH_SET * 2) * SPLIT_PCT) valid_data_df = all_input_data_df.iloc[-split:] train_data_df = all_input_data_df.iloc[:-split]


  • 이 가이드에서 SPLIT_PCT 값은 0.10 입니다. 즉, 모든 입력 데이터의 10%가 평가용으로 보관되고 데이터의 90%가 교육/미세 조정에 사용됩니다.
  • 총 3,200개의 훈련 샘플이 있으므로 320개의 샘플은 평가에 사용되고 나머지 2,880개의 샘플은 모델을 미세 조정하는 데 사용됩니다.

3.24단계 - CELL 24: 훈련 및 검증 데이터세트를 Dataset 객체로 변환

24번째 셀은 train_data_dfvalid_data_df DataFrame을 Dataset 객체로 변환합니다. 24번째 셀을 다음과 같이 설정합니다.


 ### CELL 24: Convert training and validation datasets to Dataset objects ### train_data = Dataset.from_pandas(train_data_df) valid_data = Dataset.from_pandas(valid_data_df)


  • 3.30단계 에서 볼 수 있듯이 Dataset 객체는 HuggingFace Trainer 클래스 인스턴스에서 사용됩니다.

  • 이러한 개체에는 데이터세트 자체는 물론 데이터세트에 대한 메타데이터도 포함되어 있습니다.

  • train_datavalid_data 인쇄하여 두 Dataset 개체에 대한 메타데이터를 볼 수 있습니다.


 print(train_data) print(valid_data) # Output: Dataset({ features: ['input_values', 'labels'], num_rows: 2880 }) Dataset({ features: ['input_values', 'labels'], num_rows: 320 })

3.25단계 - CELL 25: 사전 훈련된 모델 초기화

25번째 셀은 사전 훈련된 XLS-R(0.3) 모델을 초기화합니다. 25번째 셀을 다음과 같이 설정합니다.


 ### CELL 25: Initialize pretrained model ### model = Wav2Vec2ForCTC.from_pretrained( MODEL, ctc_loss_reduction = "mean", pad_token_id = processor.tokenizer.pad_token_id, vocab_size = len(processor.tokenizer) )


  • Wav2Vec2ForCTC 에서 호출된 from_pretrained 메서드는 지정된 모델에 대해 사전 훈련된 가중치를 로드하도록 지정합니다.
  • MODEL 상수는 3.5단계 에서 지정되었으며 XLS-R(0.3) 모델을 반영하여 facebook/wav2vec2-xls-r-300m 으로 설정되었습니다.
  • ctc_loss_reduction 매개변수는 연결주의자 임시 분류("CTC") 손실 함수의 출력에 적용할 감소 유형을 지정합니다. CTC 손실은 연속 입력(이 경우 오디오 데이터)과 대상 시퀀스(이 경우 텍스트 전사) 간의 손실을 계산하는 데 사용됩니다. 값을 mean 으로 설정하면 입력 배치에 대한 출력 손실이 목표 길이로 나누어집니다. 그런 다음 배치에 대한 평균이 계산되고 손실 값에 감소가 적용됩니다.
  • pad_token_id 일괄 처리 시 패딩에 사용할 토큰을 지정합니다. Step 3.17 에서 토크나이저 초기화 시 설정한 [PAD] id 로 설정됩니다.
  • vocab_size 매개변수는 모델의 어휘 크기를 정의합니다. 이는 3.17단계 에서 토크나이저를 초기화한 후의 어휘 크기이며 네트워크의 전방 부분의 출력 계층 노드 수를 반영합니다.

단계 3.26 - CELL 26: 특징 추출기 가중치 동결

26번째 셀은 특징 추출기의 사전 훈련된 가중치를 고정합니다. 26번째 셀을 다음과 같이 설정합니다.


 ### CELL 26: Freeze feature extractor ### model.freeze_feature_extractor()

3.27단계 - CELL 27: 훈련 인수 설정

27번째 셀은 Trainer 인스턴스에 전달될 훈련 인수를 초기화합니다. 27번째 셀을 다음과 같이 설정합니다.


 ### CELL 27: Set training arguments ### training_args = TrainingArguments( output_dir = OUTPUT_DIR_PATH, save_safetensors = False, group_by_length = True, per_device_train_batch_size = TRAIN_BATCH_SIZE, per_device_eval_batch_size = EVAL_BATCH_SIZE, num_train_epochs = TRAIN_EPOCHS, gradient_checkpointing = True, evaluation_strategy = "steps", save_strategy = "steps", logging_strategy = "steps", eval_steps = EVAL_STEPS, save_steps = SAVE_STEPS, logging_steps = LOGGING_STEPS, learning_rate = LEARNING_RATE, warmup_steps = WARMUP_STEPS )


  • TrainingArguments 클래스는 100개 이상의 매개변수를 허용합니다.
  • False 인 경우 save_safetensors 매개변수는 safetensors 형식을 사용하는 대신 미세 조정된 모델을 pickle 파일에 저장해야 함을 지정합니다.
  • True 인 경우 group_by_length 매개변수는 대략 동일한 길이의 샘플을 함께 그룹화해야 함을 나타냅니다. 이렇게 하면 패딩이 최소화되고 훈련 효율성이 향상됩니다.
  • per_device_train_batch_size 훈련 미니 배치당 샘플 수를 설정합니다. 이 매개변수는 3.5단계 에서 할당된 TRAIN_BATCH_SIZE 상수를 통해 18 로 설정됩니다. 이는 에포크당 160단계를 의미합니다.
  • per_device_eval_batch_size 평가(홀드아웃) 미니 배치당 샘플 수를 설정합니다. 이 매개변수는 3.5단계 에서 할당된 EVAL_BATCH_SIZE 상수를 통해 10 으로 설정됩니다.
  • num_train_epochs 훈련 에포크 수를 설정합니다. 이 매개변수는 3.5단계 에서 할당된 TRAIN_EPOCHS 상수를 통해 30 으로 설정됩니다. 이는 훈련 중 총 4,800단계를 의미합니다.
  • True 인 경우 gradient_checkpointing 매개변수는 그래디언트 계산을 체크포인트하여 메모리를 절약하는 데 도움이 되지만 역방향 전달 속도가 느려집니다.
  • evaluation_strategy 매개변수를 steps 로 설정하면 eval_steps 매개변수에 지정된 간격으로 훈련 중에 평가가 수행되고 기록된다는 의미입니다.
  • logging_strategy 매개변수를 steps 로 설정하면 훈련 실행 통계가 logging_steps 매개변수에 의해 지정된 간격으로 기록된다는 의미입니다.
  • save_strategy 매개변수를 steps 로 설정하면 save_steps 매개변수에 지정된 간격으로 미세 조정된 모델의 체크포인트가 저장된다는 의미입니다.
  • eval_steps 홀드아웃 데이터 평가 사이의 단계 수를 설정합니다. 이 매개변수는 3.5단계 에서 할당된 EVAL_STEPS 상수를 통해 100 으로 설정됩니다.
  • save_steps 미세 조정된 모델의 체크포인트가 저장되는 단계 수를 설정합니다. 이 매개변수는 3.5단계 에서 할당된 SAVE_STEPS 상수를 통해 3200 으로 설정됩니다.
  • logging_steps 훈련 실행 통계 로그 사이의 단계 수를 설정합니다. 이 매개변수는 3.5단계 에서 할당된 LOGGING_STEPS 상수를 통해 100 으로 설정됩니다.
  • learning_rate 매개변수는 초기 학습률을 설정합니다. 이 매개변수는 3.5단계 에서 할당된 LEARNING_RATE 상수를 통해 1e-4 로 설정됩니다.
  • warmup_steps 매개변수는 학습률을 0에서 learning_rate 에서 설정한 값까지 선형적으로 준비하는 단계 수를 설정합니다. 이 매개변수는 3.5단계 에서 할당된 WARMUP_STEPS 상수를 통해 800 으로 설정됩니다.

3.28단계 - CELL 28: 데이터 대조기 로직 정의

28번째 셀은 입력 및 대상 시퀀스를 동적으로 패딩하기 위한 논리를 정의합니다. 28번째 셀을 다음과 같이 설정합니다.


 ### CELL 28: Define data collator logic ### @dataclass class DataCollatorCTCWithPadding: processor: Wav2Vec2Processor padding: Union[bool, str] = True max_length: Optional[int] = None max_length_labels: Optional[int] = None pad_to_multiple_of: Optional[int] = None pad_to_multiple_of_labels: Optional[int] = None def __call__(self, features: List[Dict[str, Union[List[int], torch.Tensor]]]) -> Dict[str, torch.Tensor]: input_features = [{"input_values": feature["input_values"]} for feature in features] label_features = [{"input_ids": feature["labels"]} for feature in features] batch = self.processor.pad( input_features, padding = self.padding, max_length = self.max_length, pad_to_multiple_of = self.pad_to_multiple_of, return_tensors = "pt", ) with self.processor.as_target_processor(): labels_batch = self.processor.pad( label_features, padding = self.padding, max_length = self.max_length_labels, pad_to_multiple_of = self.pad_to_multiple_of_labels, return_tensors = "pt", ) labels = labels_batch["input_ids"].masked_fill(labels_batch.attention_mask.ne(1), -100) batch["labels"] = labels return batch


  • 훈련 및 평가 입력 레이블 쌍은 3.30 단계 에서 잠시 초기화될 Trainer 인스턴스에 미니 배치로 전달됩니다. 각 미니 배치마다 입력 시퀀스와 레이블 시퀀스의 길이가 다르기 때문에 일부 시퀀스는 모두 동일한 길이가 되도록 채워야 합니다.
  • DataCollatorCTCWithPadding 클래스는 미니 배치 데이터를 동적으로 채웁니다. True 로 설정된 경우 padding 매개변수는 더 짧은 오디오 입력 기능 시퀀스와 레이블 시퀀스가 미니 배치에서 가장 긴 시퀀스와 동일한 길이를 가져야 함을 지정합니다.
  • 오디오 입력 기능은 3.18 단계 에서 기능 추출기를 초기화할 때 설정된 값 0.0 으로 채워집니다.
  • 레이블 입력은 먼저 3.17단계 에서 토크나이저를 초기화할 때 설정된 패딩 값으로 채워집니다. 이러한 값은 -100 으로 대체되므로 WER 측정항목을 계산할 때 이러한 레이블이 무시됩니다.

3.29단계 - CELL 29: 데이터 대조기 인스턴스 초기화

29번째 셀은 이전 단계에서 정의한 데이터 조합기의 인스턴스를 초기화합니다. 29번째 셀을 다음과 같이 설정합니다.


 ### CELL 29: Initialize instance of data collator ### data_collator = DataCollatorCTCWithPadding(processor = processor, padding = True)

3.30단계 - CELL 30: 트레이너 초기화

30번째 셀은 Trainer 클래스의 인스턴스를 초기화합니다. 30번째 셀을 다음과 같이 설정합니다.


 ### CELL 30: Initialize trainer ### trainer = Trainer( model = model, data_collator = data_collator, args = training_args, compute_metrics = compute_wer, train_dataset = train_data, eval_dataset = valid_data, tokenizer = processor.feature_extractor )


  • 보시다시피 Trainer 클래스는 다음과 같이 초기화됩니다.
    • 3.25 단계 에서 초기화된 사전 훈련된 model .
    • 3.29단계 에서 초기화된 데이터 정렬기입니다.
    • 3.27단계 에서 초기화된 학습 인수입니다.
    • 3.9단계 에서 정의된 WER 평가 방법.
    • 3.24단계train_data Dataset 객체.
    • 3.24단계valid_data Dataset 개체입니다.
  • tokenizer 매개변수는 processor.feature_extractor 에 할당되고 data_collator 와 함께 작동하여 입력을 각 미니 배치의 최대 길이 입력에 자동으로 채웁니다.

3.31단계 - CELL 31: 모델 미세 조정

31번째 셀은 Trainer 클래스 인스턴스의 train 메서드를 호출하여 모델을 미세 조정합니다. 31번째 셀을 다음과 같이 설정합니다.


 ### CELL 31: Finetune the model ### trainer.train()

3.32단계 - CELL 32: 미세 조정된 모델 저장

32번째 셀은 마지막 노트북 셀입니다. Trainer 인스턴스에서 save_model 메서드를 호출하여 미세 조정된 모델을 저장합니다. 30초 셀을 다음과 같이 설정합니다.


 ### CELL 32: Save the finetuned model ### trainer.save_model(OUTPUT_DIR_PATH)

4단계 - 모델 훈련 및 저장

4.1단계 - 모델 훈련

이제 노트북의 모든 셀이 구축되었으므로 미세 조정을 시작할 차례입니다.


  1. NVIDIA GPU P100 가속기로 실행되도록 Kaggle Notebook을 설정합니다.

  2. Kaggle에서 노트북을 커밋합니다.

  3. WandB 계정에 로그인하고 관련 실행을 찾아 훈련 실행 데이터를 모니터링하세요.


NVIDIA GPU P100 가속기를 사용하면 30세대가 넘는 훈련에 최대 5시간이 소요됩니다. 홀드아웃 데이터의 WER은 훈련이 끝나면 ~0.15로 떨어져야 합니다. 최첨단 결과는 아니지만 미세 조정된 모델은 여전히 많은 응용 프로그램에 충분히 유용합니다.

4.2단계 - 모델 저장

미세 조정된 모델은 3.5단계 에서 지정된 상수 OUTPUT_DIR_PATH 에 의해 지정된 Kaggle 디렉터리로 출력됩니다. 모델 출력에는 다음 파일이 포함되어야 합니다.


 pytorch_model.bin config.json preprocessor_config.json vocab.json training_args.bin


이러한 파일은 로컬로 다운로드할 수 있습니다. 또한 모델 파일을 사용하여 새로운 Kaggle 모델을 만들 수 있습니다. Kaggle 모델은 동반 추론 가이드와 함께 사용되어 미세 조정된 모델에 대한 추론을 실행합니다.


  1. 캐글 계정에 로그인하세요. 모델 > 새 모델을 클릭합니다.
  2. 모델 제목 필드에 미세 조정된 모델의 제목을 추가합니다.
  3. 모델 생성 을 클릭합니다.
  4. 모델 세부정보 페이지로 이동을 클릭하세요.
  5. 모델 변형 아래에서 새 변형 추가를 클릭합니다.
  6. 프레임워크 선택 메뉴에서 Transformers를 선택합니다.
  7. 새 변형 추가 를 클릭합니다.
  8. 미세 조정된 모델 파일을 데이터 업로드 창으로 끌어다 놓습니다. 또는 파일 찾아보기 버튼을 클릭하여 파일 탐색기 창을 열고 미세 조정된 모델 파일을 선택합니다.
  9. 파일이 Kaggle에 업로드되면 생성을 클릭하여 Kaggle 모델을 생성합니다.

결론

wav2vec2 XLS-R의 미세 조정을 축하합니다! 이러한 일반적인 단계를 사용하여 원하는 다른 언어로 모델을 미세 조정할 수 있다는 점을 기억하세요. 이 가이드에서 생성된 미세 조정된 모델에 대한 추론을 실행하는 것은 매우 간단합니다. 추론 단계는 이에 대한 별도의 동반 가이드에 설명되어 있습니다. 동반 가이드를 찾으려면 내 HackerNoon 사용자 이름을 검색하세요.