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 개념을 이해하고 있다고 가정합니다. 초보자는 빌드 단계를 따르거나 이해하는 데 어려움을 겪을 수 있습니다.
2020년에 도입된 원래 wav2vec2 모델은 960시간의 Librispeech 데이터 세트 음성 오디오와 ~53,200시간의 LibriVox 데이터 세트 음성 오디오로 사전 훈련되었습니다. 출시 당시에는 두 가지 모델 크기, 즉 9,500만 개의 매개변수를 가진 BASE 모델과 3억 1,700만 개의 매개변수를 가진 LARGE 모델을 사용할 수 있었습니다.
반면 XLS-R은 5개 데이터 세트의 다국어 음성 오디오에 대해 사전 학습되었습니다.
XLS-R 모델에는 3억 개의 매개변수가 있는 XLS-R(0.3B) , 10억 개의 매개변수가 있는 XLS-R(1B) , 20억 개의 매개변수가 있는 XLS-R(2B) 등 3가지 모델이 있습니다. 이 가이드에서는 XLS-R(0.3B) 모델을 사용합니다.
wav2vev2 모델을 미세 조정하는 방법에 대한 훌륭한 글이 있으며 아마도 이것이 일종의 "최고 표준"일 것입니다. 물론 여기서의 일반적인 접근 방식은 다른 가이드에서 볼 수 있는 내용을 모방합니다. 당신은:
그러나 이 가이드는 다른 가이드와 세 가지 주요 차이점이 있습니다.
가이드를 완료하려면 다음이 필요합니다.
Notebook 작성을 시작하기 전에 바로 아래의 두 하위 섹션을 검토하는 것이 도움이 될 수 있습니다. 그들은 다음을 설명합니다:
소개 에서 언급했듯이 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은 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에 예측 텍스트에 오류가 포함되어 있음을 식별하지만 예측에서 문자 i 와 e가 틀렸다는 것을 알려주지는 않습니다. 보다 정확한 오류 분석을 위해 문자 오류율("CER")과 같은 다른 측정항목을 사용할 수 있습니다.
이제 미세 조정 노트북 작성을 시작할 준비가 되었습니다.
WandB API 키를 사용하여 훈련 실행 데이터를 WandB로 보내도록 Kaggle Notebook을 구성해야 합니다. 그러기 위해서는 복사를 해야 합니다.
www.wandb.com
에서 WandB에 로그인하세요.www.wandb.ai/authorize
로 이동합니다.
xls-r-300m-chilean-spanish-asr
사용합니다.Kaggle Secret은 WandB API 키를 안전하게 저장하는 데 사용됩니다.
WANDB_API_KEY
라벨을 입력하고 값에 WandB API 키를 입력하세요.WANDB_API_KEY
라벨 필드 왼쪽에 있는 첨부됨 확인란이 선택되어 있는지 확인하세요.칠레 스페인어 음성 데이터 세트는 2개의 개별 데이터 세트로 Kaggle에 업로드되었습니다.
이 두 데이터 세트를 모두 Kaggle Notebook에 추가하세요.
다음 32개의 하위 단계는 미세 조정 노트북의 32개 셀을 각각 순서대로 구축합니다.
미세 조정 노트북의 첫 번째 셀은 종속성을 설치합니다. 첫 번째 셀을 다음으로 설정합니다.
### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer
torchaudio
패키지를 최신 버전으로 업그레이드합니다. torchaudio
오디오 파일을 로드하고 오디오 데이터를 리샘플링하는 데 사용됩니다.Datasets
라이브러리 load_metric
메서드를 사용하는 데 필요한 jiwer
패키지를 설치합니다.두 번째 셀은 필수 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
transformers
라이브러리 및 관련 Wav2Vec2*
클래스가 미세 조정에 사용되는 기능의 백본을 제공한다는 점은 언급할 가치가 있습니다.세 번째 셀은 HuggingFace WER 평가 지표를 가져옵니다. 세 번째 셀을 다음과 같이 설정합니다.
### CELL 3: Load WER metric ### wer_metric = load_metric("wer")
네 번째 셀은 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)
다섯 번째 셀은 노트북 전체에서 사용될 상수를 설정합니다. 다섯 번째 셀을 다음과 같이 설정합니다.
### 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
여섯 번째 셀은 데이터 세트 인덱스 파일을 읽는 것(위의 교육 데이터 세트 하위 섹션 참조)은 물론 전사 텍스트를 정리하고 어휘를 생성하기 위한 유틸리티 메서드를 정의합니다. 여섯 번째 셀을 다음과 같이 설정합니다.
### 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단계 에서 생성된 어휘의 예를 볼 수 있습니다. 일곱 번째 셀은 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
로 다운샘플링되어야 합니다. 16000
는 3.5단계 의 상수 TGT_SAMPLING_RATE
에 의해 캡처됩니다.여덟 번째 셀은 오디오 및 전사 데이터를 처리하는 유틸리티 메서드를 정의합니다. 여덟 번째 셀을 다음과 같이 설정합니다.
### 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단계 에서 샘플 인코딩을 볼 수 있습니다.아홉 번째 셀은 최종 유틸리티 방법 셀이며 참조 전사와 예측 전사 사이의 단어 오류율을 계산하는 방법을 포함합니다. 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}
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")
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)
NUM_LOAD_FROM_EACH_SET
상수는 각 데이터세트에서 보관할 샘플 수량을 정의합니다. 이 가이드에서는 총 3200
개의 샘플에 대해 상수가 1600
으로 설정되어 있습니다.12번째 셀은 잘린 훈련 데이터 목록을 결합합니다. 12번째 셀을 다음과 같이 설정합니다.
### CELL 12: Combine training samples data ### all_training_samples = training_samples_male_cl + training_samples_female_cl
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])
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}
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}
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)
Wav2Vec2CTCTokenizer
클래스를 초기화하는 데 사용됩니다. 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}
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 )
Wav2Vec2FeatureExtractor
이니셜라이저에 전달된 매개변수 값은 기본값이 False
인 return_attention_mask
를 제외하고 모두 기본값입니다. 명확성을 위해 기본값이 표시/전달됩니다.feature_size
매개변수는 입력 기능(예: 오디오 데이터 기능)의 크기 크기를 지정합니다. 이 매개변수의 기본값은 1
입니다.sampling_rate
오디오 데이터가 디지털화되어야 하는 샘플링 속도를 특징 추출기에 알려줍니다. 3.7단계 에서 설명한 대로 wav2vec2는 16000
로 샘플링된 오디오에 대해 사전 학습되었으므로 16000
이 매개변수의 기본값입니다.padding_value
매개변수는 다양한 길이의 오디오 샘플을 일괄 처리할 때 필요에 따라 오디오 데이터를 채울 때 사용되는 값을 지정합니다. 기본값은 0.0
입니다.do_normalize
입력 데이터를 표준 정규 분포로 변환해야 하는지 지정하는 데 사용됩니다. 기본값은 True
입니다. Wav2Vec2FeatureExtractor
클래스 문서에는 "[정규화]가 일부 모델의 성능을 크게 향상시키는 데 도움이 될 수 있습니다."라고 나와 있습니다.return_attention_mask
매개변수는 주의 마스크를 전달해야 하는지 여부를 지정합니다. 이 사용 사례에서는 값이 True
로 설정됩니다. 19번째 셀은 Wav2Vec2Processor
인스턴스를 초기화합니다. 19번째 셀을 다음과 같이 설정합니다.
### CELL 19: Initialize processor ### processor = Wav2Vec2Processor(feature_extractor = feature_extractor, tokenizer = tokenizer)
Wav2Vec2Processor
클래스는 3.17단계 와 3.18단계 의 tokenizer
와 feature_extractor
각각 단일 프로세서로 결합합니다.
Wav2Vec2Processor
클래스 인스턴스에서 save_pretrained
메소드를 호출하여 프로세서 구성을 저장할 수 있습니다.
processor.save_pretrained(OUTPUT_DIR_PATH)
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
라는 것을 알고 있으므로 이 단계에서는 샘플링 속도가 무시됩니다.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)
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))
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%가 교육/미세 조정에 사용됩니다.Dataset
객체로 변환 24번째 셀은 train_data_df
및 valid_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_data
및 valid_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 })
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단계 에서 토크나이저를 초기화한 후의 어휘 크기이며 네트워크의 전방 부분의 출력 계층 노드 수를 반영합니다.26번째 셀은 특징 추출기의 사전 훈련된 가중치를 고정합니다. 26번째 셀을 다음과 같이 설정합니다.
### CELL 26: Freeze feature extractor ### model.freeze_feature_extractor()
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
으로 설정됩니다.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
Trainer
인스턴스에 미니 배치로 전달됩니다. 각 미니 배치마다 입력 시퀀스와 레이블 시퀀스의 길이가 다르기 때문에 일부 시퀀스는 모두 동일한 길이가 되도록 채워야 합니다.DataCollatorCTCWithPadding
클래스는 미니 배치 데이터를 동적으로 채웁니다. True
로 설정된 경우 padding
매개변수는 더 짧은 오디오 입력 기능 시퀀스와 레이블 시퀀스가 미니 배치에서 가장 긴 시퀀스와 동일한 길이를 가져야 함을 지정합니다.0.0
으로 채워집니다.-100
으로 대체되므로 WER 측정항목을 계산할 때 이러한 레이블이 무시됩니다.29번째 셀은 이전 단계에서 정의한 데이터 조합기의 인스턴스를 초기화합니다. 29번째 셀을 다음과 같이 설정합니다.
### CELL 29: Initialize instance of data collator ### data_collator = DataCollatorCTCWithPadding(processor = processor, padding = True)
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
클래스는 다음과 같이 초기화됩니다.model
.train_data
Dataset
객체.valid_data
Dataset
개체입니다.tokenizer
매개변수는 processor.feature_extractor
에 할당되고 data_collator
와 함께 작동하여 입력을 각 미니 배치의 최대 길이 입력에 자동으로 채웁니다. 31번째 셀은 Trainer
클래스 인스턴스의 train
메서드를 호출하여 모델을 미세 조정합니다. 31번째 셀을 다음과 같이 설정합니다.
### CELL 31: Finetune the model ### trainer.train()
32번째 셀은 마지막 노트북 셀입니다. Trainer
인스턴스에서 save_model
메서드를 호출하여 미세 조정된 모델을 저장합니다. 30초 셀을 다음과 같이 설정합니다.
### CELL 32: Save the finetuned model ### trainer.save_model(OUTPUT_DIR_PATH)
이제 노트북의 모든 셀이 구축되었으므로 미세 조정을 시작할 차례입니다.
NVIDIA GPU P100 가속기로 실행되도록 Kaggle Notebook을 설정합니다.
Kaggle에서 노트북을 커밋합니다.
WandB 계정에 로그인하고 관련 실행을 찾아 훈련 실행 데이터를 모니터링하세요.
NVIDIA GPU P100 가속기를 사용하면 30세대가 넘는 훈련에 최대 5시간이 소요됩니다. 홀드아웃 데이터의 WER은 훈련이 끝나면 ~0.15로 떨어져야 합니다. 최첨단 결과는 아니지만 미세 조정된 모델은 여전히 많은 응용 프로그램에 충분히 유용합니다.
미세 조정된 모델은 3.5단계 에서 지정된 상수 OUTPUT_DIR_PATH
에 의해 지정된 Kaggle 디렉터리로 출력됩니다. 모델 출력에는 다음 파일이 포함되어야 합니다.
pytorch_model.bin config.json preprocessor_config.json vocab.json training_args.bin
이러한 파일은 로컬로 다운로드할 수 있습니다. 또한 모델 파일을 사용하여 새로운 Kaggle 모델을 만들 수 있습니다. Kaggle 모델은 동반 추론 가이드와 함께 사용되어 미세 조정된 모델에 대한 추론을 실행합니다.
wav2vec2 XLS-R의 미세 조정을 축하합니다! 이러한 일반적인 단계를 사용하여 원하는 다른 언어로 모델을 미세 조정할 수 있다는 점을 기억하세요. 이 가이드에서 생성된 미세 조정된 모델에 대한 추론을 실행하는 것은 매우 간단합니다. 추론 단계는 이에 대한 별도의 동반 가이드에 설명되어 있습니다. 동반 가이드를 찾으려면 내 HackerNoon 사용자 이름을 검색하세요.