Meta AI, 2021'in sonunda wav2vec2 XLS-R'yi ("XLS-R") tanıttı. XLS-R, diller arası konuşma temsillerini öğrenmeye yönelik bir makine öğrenimi ("ML") modelidir; ve 128 dilde 400.000 saatten fazla kamuya açık konuşma sesiyle eğitildi. Piyasaya sürülmesinin ardından model, Meta AI'nin 53 dilde yaklaşık 50.000 saatlik konuşma sesiyle eğitilmiş XLSR- 53 diller arası modeli üzerinde bir sıçramayı temsil ediyordu.
Bu kılavuz, Kaggle Notebook kullanarak otomatik konuşma tanıma ("ASR") için XLS-R'ye ince ayar yapma adımlarını açıklamaktadır. Model, Şili İspanyolcasına ince ayar yapılacaktır, ancak XLS-R'ye istediğiniz farklı dillerde ince ayar yapmak için genel adımlar takip edilebilir.
İnce ayarlı model üzerinde çıkarım yapmak, bu kılavuzu iki bölümden ilki haline getiren yardımcı bir eğitimde açıklanacaktır. Bu ince ayar kılavuzu biraz uzun olduğundan, çıkarımlara özel ayrı bir kılavuz oluşturmaya karar verdim.
Mevcut bir ML geçmişine sahip olduğunuz ve temel ASR kavramlarını anladığınız varsayılmaktadır. Yeni başlayanlar yapım adımlarını takip etmekte/anlamakta zorlanabilirler.
2020'de tanıtılan orijinal wav2vec2 modeli, 960 saatlik Librispeech veri kümesi konuşma sesi ve ~53.200 saatlik LibriVox veri kümesi konuşma sesi üzerinde önceden eğitildi. Piyasaya sürülmesinden sonra iki model boyutu mevcuttu: 95 milyon parametreli BASE modeli ve 317 milyon parametreli LARGE modeli.
Öte yandan XLS-R, 5 veri kümesindeki çok dilli konuşma sesiyle önceden eğitildi:
3 adet XLS-R modeli bulunmaktadır: 300 milyon parametreli XLS-R (0,3B) , 1 milyar parametreli XLS-R (1B) ve 2 milyar parametreli XLS-R (2B) . Bu kılavuz XLS-R (0.3B) modelini kullanacaktır.
Wav2vev2 modellerine nasıl ince ayar yapılacağına dair bazı harika yazılar var, belki de bu bir tür "altın standart"tır. Elbette buradaki genel yaklaşım diğer kılavuzlarda bulacağınız yaklaşımı taklit ediyor. Olacaksın:
Ancak bu kılavuz ile diğerleri arasında üç temel fark vardır:
Kılavuzu tamamlamak için şunlara sahip olmanız gerekir:
Not defterini oluşturmaya başlamadan önce doğrudan aşağıdaki iki alt bölümü incelemeniz faydalı olabilir. Onlar tanımlar:
Giriş bölümünde belirtildiği gibi, XLS-R modeline Şili İspanyolcası üzerinde ince ayar yapılacaktır. Spesifik veri seti, Guevara-Rukoz ve diğerleri tarafından geliştirilen Şili İspanyolca Konuşma Veri Setidir . OpenSLR'den indirilebilir. Veri seti iki alt veri setinden oluşur: (1) Şilili erkek konuşmacılara ait 2.636 ses kaydı ve (2) Şilili kadın konuşmacılara ait 1.738 ses kaydı.
Her alt veri kümesi bir line_index.tsv
dizin dosyası içerir. Her indeks dosyasının her satırı, bir çift ses dosyası adı ve ilgili dosyadaki sesin transkripsiyonunu içerir, örneğin:
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
Kolaylık olması açısından Şili İspanyolca Konuşma Veri Kümesini Kaggle'a yükledim. Şilili erkek konuşmacıların kayıtları için bir Kaggle veri seti ve Şilili kadın konuşmacıların kayıtları için bir Kaggle veri seti bulunmaktadır. Bu Kaggle veri kümeleri, bu kılavuzdaki adımları izleyerek oluşturacağınız Kaggle Not Defteri'ne eklenecektir.
WER, otomatik konuşma tanıma modellerinin performansını ölçmek için kullanılabilecek bir ölçümdür. WER, bir metin tahmininin bir metin referansına ne kadar yakın olduğunu ölçen bir mekanizma sağlar. WER bunu 3 türdeki hataları kaydederek başarır:
ikameler ( S
): Tahmin, referanstaki benzer kelimeden farklı bir kelime içerdiğinde bir ikame hatası kaydedilir. Örneğin bu durum, tahminin referanstaki bir kelimeyi yanlış yazması durumunda ortaya çıkar.
silmeler ( D
): Tahmin, referansta bulunmayan bir kelimeyi içerdiğinde bir silme hatası kaydedilir.
eklemeler ( I
): Tahmin, referansta bulunan bir kelimeyi içermediğinde bir ekleme hatası kaydedilir.
Açıkçası, WER kelime düzeyinde çalışıyor. WER metriğinin formülü aşağıdaki gibidir:
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
İspanyolca'da basit bir WER örneği aşağıdaki gibidir:
prediction: "Él está saliendo." reference: "Él está saltando."
Bir tablo, tahmindeki hataların görselleştirilmesine yardımcı olur:
METİN | KELİME 1 | KELİME 2 | KELİME 3 |
---|---|---|---|
tahmin | Él | bu | saliendo |
referans | Él | bu | saltando |
| doğru | doğru | ikame |
Tahmin 1 değiştirme hatası, 0 silme hatası ve 0 ekleme hatası içeriyor. Bu örnek için WER şu şekildedir:
WER = 1 + 0 + 0 / 3 = 1/3 = 0.33
Kelime Hata Oranının bize hangi belirli hataların mevcut olduğunu söylemediği açık olmalıdır. Yukarıdaki örnekte WER, WORD 3'ün tahmin edilen metinde bir hata içerdiğini tanımlar ancak tahminde i ve e karakterlerinin yanlış olduğunu bize söylemez. Daha kesin hata analizi için Karakter Hata Oranı ("CER") gibi diğer ölçümler kullanılabilir.
Artık ince ayar not defterini oluşturmaya başlamaya hazırsınız.
Kaggle Not Defteriniz, WandB API anahtarınızı kullanarak eğitim çalıştırma verilerini WandB'ye gönderecek şekilde yapılandırılmalıdır. Bunu yapmak için kopyalamanız gerekir.
www.wandb.com
adresinden WandB'de oturum açın.www.wandb.ai/authorize
adresine gidin.
xls-r-300m-chilean-spanish-asr
dizüstü bilgisayar adını kullanır.WandB API anahtarınızı güvenli bir şekilde saklamak için bir Kaggle Sırrı kullanılacaktır.
WANDB_API_KEY
etiketini girin ve değer için WandB API anahtarınızı girin.WANDB_API_KEY
etiket alanının solundaki Eklendi onay kutusunun işaretli olduğundan emin olun.Şili İspanyolcası Konuşma Veri Seti, Kaggle'a 2 farklı veri seti olarak yüklendi:
Bu veri kümelerinin her ikisini de Kaggle Not Defterinize ekleyin.
Aşağıdaki 32 alt adım, ince ayar not defterinin 32 hücresinin her birini sırayla oluşturur.
İnce ayar not defterinin ilk hücresi bağımlılıkları yükler. İlk hücreyi şu şekilde ayarlayın:
### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer
torchaudio
paketini en son sürüme yükseltir. torchaudio
ses dosyalarını yüklemek ve ses verilerini yeniden örneklemek için kullanılacaktır.Datasets
kütüphanesi load_metric
yöntemini kullanmak için gerekli olan jiwer
paketini yükler.İkinci hücre gerekli Python paketlerini içe aktarır. İkinci hücreyi şu şekilde ayarlayın:
### 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
kütüphanesinin ve ilgili Wav2Vec2*
sınıflarının ince ayar için kullanılan işlevselliğin omurgasını sağladığını belirtmekte fayda var.Üçüncü hücre HuggingFace WER değerlendirme metriğini içe aktarır. Üçüncü hücreyi şu şekilde ayarlayın:
### CELL 3: Load WER metric ### wer_metric = load_metric("wer")
Dördüncü hücre, Adım 2.2'de belirlenen WANDB_API_KEY
sırrınızı alır. Dördüncü hücreyi şu şekilde ayarlayın:
### CELL 4: Login to WandB ### user_secrets = UserSecretsClient() wandb_api_key = user_secrets.get_secret("WANDB_API_KEY") wandb.login(key = wandb_api_key)
Beşinci hücre, not defterinin tamamında kullanılacak sabitleri ayarlar. Beşinci hücreyi şu şekilde ayarlayın:
### 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
Altıncı hücre, veri kümesi indeks dosyalarını okumak (yukarıdaki Eğitim Veri Kümesi alt bölümüne bakın) ve aynı zamanda transkripsiyon metnini temizlemek ve sözcük dağarcığı oluşturmak için faydalı yöntemleri tanımlar. Altıncı hücreyi şu şekilde ayarlayın:
### 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
yöntemi, line_index.tsv
veri kümesi indeks dosyasını okur ve ses dosyası adı ve transkripsiyon verilerini içeren listelerin bir listesini üretir, örneğin:
[ ["/kaggle/input/google-spanish-speakers-chile-male/clm_08421_01719502739", "Es un viaje de negocios solamente voy por una noche"] ... ]
truncate_training_dataset
yöntemi , Adım 3.5'te ayarlanan NUM_LOAD_FROM_EACH_SET
sabitini kullanarak bir liste dizin dosyası verilerini keser. Özellikle NUM_LOAD_FROM_EACH_SET
sabiti, her veri kümesinden yüklenmesi gereken ses örneklerinin sayısını belirtmek için kullanılır. Bu kılavuzun amaçları doğrultusunda, sayı 1600
olarak ayarlanmıştır, bu da sonuçta toplam 3200
ses örneğinin yükleneceği anlamına gelir. Tüm örnekleri yüklemek için NUM_LOAD_FROM_EACH_SET
all
dize değerine ayarlayın.clean_text
yöntemi , Adım 3.5'te SPECIAL_CHARS
atanan normal ifade tarafından belirtilen karakterlerin her metin transkripsiyonunu çıkarmak için kullanılır. Noktalama işaretleri de dahil olmak üzere bu karakterler, modeli ses özellikleri ve metin transkripsiyonları arasındaki eşlemeleri öğrenmek üzere eğitirken herhangi bir anlamsal değer sağlamadıkları için ortadan kaldırılabilir.create_vocab
yöntemi, temiz metin transkripsiyonlarından bir kelime dağarcığı oluşturur. Basitçe, temizlenmiş metin transkripsiyonları kümesindeki tüm benzersiz karakterleri çıkarır. Oluşturulan kelime dağarcığının bir örneğini Adım 3.14'te göreceksiniz. Yedinci hücre, ses verilerini yüklemek ve yeniden örneklemek için torchaudio
kullanan yardımcı program yöntemlerini tanımlar. Yedinci hücreyi şu şekilde ayarlayın:
### 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
yöntemi, belirtilen bir ses dosyasını yükler ve bir torch.Tensor
döndürür. Sesin örnekleme hızıyla birlikte ses verilerinin çok boyutlu matrisini tensor edin. Eğitim verilerindeki tüm ses dosyalarının örnekleme hızı 48000
Hz'dir. Bu "orijinal" örnekleme hızı, Adım 3.5'teki ORIG_SAMPLING_RATE
sabiti tarafından yakalanır.resample
yöntemi, ses verilerini 48000
ila 16000
örnekleme oranından alt örneklemek için kullanılır. wav2vec2, 16000
Hz'de örneklenen ses üzerinde önceden eğitilmiştir. Buna göre, ince ayar için kullanılan herhangi bir sesin aynı örnekleme hızına sahip olması gerekir. Bu durumda ses örneklerinin 48000
Hz'den 16000
Hz'ye altörneklenmesi gerekir. 16000
Hz, Adım 3.5'teki TGT_SAMPLING_RATE
sabiti tarafından yakalanır.Sekizinci hücre, ses ve transkripsiyon verilerini işleyen yardımcı program yöntemlerini tanımlar. Sekizinci hücreyi şu şekilde ayarlayın:
### 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
yöntemi, sağlanan bir eğitim örneğinden giriş değerlerini döndürür.process_target_text
yöntemi, her metin transkripsiyonunu bir etiket listesi, yani sözlükteki karakterlere atıfta bulunan indekslerin bir listesi olarak kodlar. Adım 3.15'te örnek bir kodlama göreceksiniz.Dokuzuncu hücre, son faydalı yöntem hücresidir ve bir referans transkripsiyonu ile tahmin edilen bir transkripsiyon arasındaki Kelime Hata Oranını hesaplama yöntemini içerir. Dokuzuncu hücreyi şu şekilde ayarlayın:
### 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}
Onuncu hücre, Adım 3.6'da tanımlanan read_index_file_data
yöntemini kullanarak erkek konuşmacıların kayıtları ve kadın konuşmacıların kayıtları için eğitim veri indeksi dosyalarını okur. Onuncu hücreyi şu şekilde ayarlayın:
### 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")
On birinci hücre, Adım 3.6'da tanımlanan truncate_training_dataset
yöntemini kullanarak eğitim veri listelerini kısaltır. Onbirinci hücreyi şu şekilde ayarlayın:
### 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
sabiti, her veri kümesinden saklanacak örneklerin miktarını tanımlar. Bu kılavuzda toplam 3200
örnek için sabit 1600
olarak ayarlanmıştır.On ikinci hücre, kısaltılmış eğitim veri listelerini birleştirir. On ikinci hücreyi şu şekilde ayarlayın:
### CELL 12: Combine training samples data ### all_training_samples = training_samples_male_cl + training_samples_female_cl
On üçüncü hücre, her bir eğitim veri örneği üzerinde yinelenir ve Adım 3.6'da tanımlanan clean_text
yöntemini kullanarak ilgili transkripsiyon metnini temizler. On üçüncü hücreyi şu şekilde ayarlayın:
for index in range(len(all_training_samples)): all_training_samples[index][1] = clean_text(all_training_samples[index][1])
On dördüncü hücre, önceki adımdaki temizlenmiş transkripsiyonları ve Adım 3.6'da tanımlanan create_vocab
yöntemini kullanarak bir sözcük dağarcığı oluşturur. On dördüncü hücreyi şu şekilde ayarlayın:
### CELL 14: Create vocabulary ### vocab_list = create_vocab(all_training_samples) vocab_dict = {v: i for i, v in enumerate(vocab_list)}
Kelime hazinesi, anahtar olarak karakterlerin ve değer olarak kelime dizinlerinin bulunduğu bir sözlük olarak depolanır.
Aşağıdaki çıktıyı üretmesi gereken vocab_dict
yazdırabilirsiniz:
{'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}
On beşinci hücre, sözcük sınırlayıcı karakterini ekler |
kelime dağarcığına. On beşinci hücreyi şu şekilde ayarlayın:
### CELL 15: Add word delimiter to vocabulary ### vocab_dict["|"] = len(vocab_dict)
Kelime sınırlayıcı karakteri, metin transkripsiyonlarını bir etiket listesi olarak belirtirken kullanılır. Özellikle bir kelimenin sonunu tanımlamak için kullanılır ve Adım 3.17'de görüleceği gibi Wav2Vec2CTCTokenizer
sınıfını başlatırken kullanılır.
Örneğin, aşağıdaki liste Adım 3.14'teki sözcükleri kullanarak no te entiendo nada
kodlamaz:
# 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}
On altıncı hücre, kelimeleri bir dosyaya aktarır. On altıncı hücreyi şu şekilde ayarlayın:
### CELL 16: Export vocabulary ### with open(VOCAB_FILE_PATH + "vocab.json", "w", encoding = "utf8") as vocab_file: json.dump(vocab_dict, vocab_file)
Wav2Vec2CTCTokenizer
sınıfını başlatmak için kullanılacaktır. On yedinci hücre, Wav2Vec2CTCTokenizer
örneğini başlatır. On yedinci hücreyi şu şekilde ayarlayın:
### CELL 17: Initialize tokenizer ### tokenizer = Wav2Vec2CTCTokenizer( VOCAB_FILE_PATH + "vocab.json", unk_token = "[UNK]", pad_token = "[PAD]", word_delimiter_token = "|", replace_word_delimiter_char = " " )
Belirteç, metin transkripsiyonlarını kodlamak ve bir etiket listesinin kodunu tekrar metne dönüştürmek için kullanılır.
tokenizer
, unk_token
atanmış [UNK]
ve pad_token
atanmış [PAD]
ile başlatıldığını unutmayın; ilki, metin transkripsiyonlarında bilinmeyen belirteçleri temsil etmek için kullanılırken, ikincisi, farklı uzunluklarda transkripsiyon grupları oluştururken transkripsiyonları doldurmak için kullanılır. Bu iki değer tokenizer tarafından sözlüğe eklenecektir.
Belirteç oluşturucunun bu adımda başlatılması aynı zamanda kelime dağarcığına sırasıyla cümlelerin başlangıcını ve sonunu ayırmak için kullanılan <s>
ve /</s>
olmak üzere iki ek belirteç ekleyecektir.
|
Adım 3.15'te karakter sözlüğüne eklememize uygun olarak kelimelerin sonunu belirlemek için boru sembolünün kullanılacağını yansıtmak üzere bu adımda açıkça word_delimiter_token
atanır. |
sembol, word_delimiter_token
için varsayılan değerdir. Dolayısıyla bunun açıkça belirlenmesine gerek yoktu, ancak açıklık sağlamak adına böyle yapıldı.
word_delimiter_token
olduğu gibi, replace_word_delimiter_char
açıkça tek bir boşluk atanmıştır ve bu da dikey çizgi simgesinin |
metin transkripsiyonlarındaki boşluk karakterlerini değiştirmek için kullanılacaktır. Boş alan, replace_word_delimiter_char
için varsayılan değerdir. Dolayısıyla bunun da açıkça belirlenmesine gerek yoktu, ancak açıklık sağlamak adına böyle yapıldı.
tokenizer
üzerinde get_vocab()
yöntemini çağırarak tokenizer sözlüğünün tamamını yazdırabilirsiniz.
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}
On sekizinci hücre Wav2Vec2FeatureExtractor
örneğini başlatır. On sekizinci hücreyi şu şekilde ayarlayın:
### 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
başlatıcısına iletilen parametre değerlerinin tümü, varsayılan olarak False
olan return_attention_mask
haricindeki varsayılan değerlerdir. Açıklık sağlamak amacıyla varsayılan değerler gösterilir/geçirilir.feature_size
parametresi, giriş özelliklerinin (yani ses verisi özelliklerinin) boyut boyutunu belirtir. Bu parametrenin varsayılan değeri 1
.sampling_rate
, özellik çıkarıcıya ses verilerinin dijitalleştirilmesi gereken örnekleme hızını söyler. Adım 3.7'de tartışıldığı gibi wav2vec2, 16000
Hz'de örneklenen ses üzerinde önceden eğitilir ve dolayısıyla bu parametre için varsayılan değer 16000
.padding_value
parametresi, farklı uzunluklardaki ses örneklerini toplu olarak işlerken gerektiği gibi ses verilerini doldururken kullanılan değeri belirtir. Varsayılan değer 0.0
.do_normalize
giriş verilerinin standart normal dağılıma dönüştürülmesi gerekip gerekmediğini belirtmek için kullanılır. Varsayılan değer True
. Wav2Vec2FeatureExtractor
sınıfı belgelerinde "[normalleştirmenin] bazı modellerin performansını önemli ölçüde artırmaya yardımcı olabileceği" belirtiliyor.return_attention_mask
parametreleri dikkat maskesinin geçirilip geçirilmeyeceğini belirtir. Bu kullanım durumu için değer True
olarak ayarlanmıştır. On dokuzuncu hücre Wav2Vec2Processor
örneğini başlatır. On dokuzuncu hücreyi şu şekilde ayarlayın:
### CELL 19: Initialize processor ### processor = Wav2Vec2Processor(feature_extractor = feature_extractor, tokenizer = tokenizer)
Wav2Vec2Processor
sınıfı, sırasıyla Adım 3.17 ve Adım 3.18'deki tokenizer
ve feature_extractor
tek bir işlemcide birleştirir.
İşlemci yapılandırmasının, Wav2Vec2Processor
sınıfı örneğinde save_pretrained
yöntemi çağrılarak kaydedilebileceğini unutmayın.
processor.save_pretrained(OUTPUT_DIR_PATH)
Yirminci hücre, all_training_samples
listesinde belirtilen her ses dosyasını yükler. Yirminci hücreyi şu şekilde ayarlayın:
### 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
olarak döndürülür.Tensor ve all_input_data
bir sözlük listesi olarak saklanır. Her sözlük, sesin metin transkripsiyonunun yanı sıra belirli bir örnek için ses verilerini içerir.read_audio_data
yönteminin ses verilerinin örnekleme hızını da döndürdüğünü unutmayın. Bu kullanım durumunda tüm ses dosyaları için örnekleme hızının 48000
Hz olduğunu bildiğimizden, bu adımda örnekleme hızı göz ardı edilir.all_input_data
Pandas DataFrame'e dönüştürme Yirmi birinci hücre, verilerin işlenmesini kolaylaştırmak için all_input_data
listesini bir Pandas DataFrame'e dönüştürür. Yirmi birinci hücreyi şu şekilde ayarlayın:
### CELL 21: Convert audio training data list to Pandas DataFrame ### all_input_data_df = pd.DataFrame(data = all_input_data)
Yirmi saniye hücresi, her ses verisi örneğinden özellikler çıkarmak ve her metin transkripsiyonunu bir etiket listesi olarak kodlamak için Adım 3.19'da başlatılan processor
kullanır. Yirmi ikinci hücreyi şu şekilde ayarlayın:
### 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))
Yirmi üçüncü hücre , Adım 3.5'teki SPLIT_PCT
sabitini kullanarak all_input_data_df
DataFrame'i eğitim ve değerlendirme (doğrulama) veri kümelerine böler. Yirmi üçüncü hücreyi şu şekilde ayarlayın:
### 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
değeri 0.10
; bu, tüm girdi verilerinin %10'unun değerlendirme için tutulacağı ve verilerin %90'ının eğitim/ince ayar için kullanılacağı anlamına gelir.Dataset
Nesnelerine Dönüştürme Yirmi dördüncü hücre, train_data_df
ve valid_data_df
DataFrames'ı Dataset
nesnelerine dönüştürür. Yirmi dördüncü hücreyi şu şekilde ayarlayın:
### 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)
Dataset
nesneleri, Adım 3.30'da göreceğiniz gibi HuggingFace Trainer
sınıfı örnekleri tarafından tüketilir.
Bu nesneler, veri kümesinin yanı sıra veri kümesiyle ilgili meta verileri de içerir.
Her iki Dataset
nesnesinin meta verilerini görüntülemek için train_data
ve valid_data
yazdırabilirsiniz.
print(train_data) print(valid_data) # Output: Dataset({ features: ['input_values', 'labels'], num_rows: 2880 }) Dataset({ features: ['input_values', 'labels'], num_rows: 320 })
Yirmi beşinci hücre, önceden eğitilmiş XLS-R (0,3) modelini başlatır. Yirmi beşinci hücreyi şu şekilde ayarlayın:
### 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
çağrılan from_pretrained
yöntemi, belirtilen model için önceden eğitilmiş ağırlıkları yüklemek istediğimizi belirtir.MODEL
sabiti Adım 3.5'te belirtildi ve XLS-R (0.3) modelini yansıtacak şekilde facebook/wav2vec2-xls-r-300m
olarak ayarlandı.ctc_loss_reduction
parametresi, Bağlantıcı Zamansal Sınıflandırma ("CTC") kayıp fonksiyonunun çıkışına uygulanacak azaltma türünü belirtir. CTC kaybı, sürekli bir giriş (bu durumda ses verileri) ile bir hedef dizi (bu durumda metin transkripsiyonları) arasındaki kaybı hesaplamak için kullanılır. Değerin mean
olarak ayarlanmasıyla, bir grup girdinin çıktı kayıpları hedef uzunluklara bölünecektir. Daha sonra partinin ortalaması hesaplanır ve azalma, kayıp değerlerine uygulanır.pad_token_id
toplu işlem sırasında dolgu için kullanılacak belirteci belirtir. Adım 3.17'de belirteç başlatılırken [PAD]
kimlik ayarına ayarlanır.vocab_size
parametresi modelin kelime dağarcığı boyutunu tanımlar. Bu, Adım 3.17'de tokenizer'ın başlatılmasından sonraki sözcük boyutudur ve ağın ileri kısmındaki çıktı katmanı düğümlerinin sayısını yansıtır.Yirmi altıncı hücre, özellik çıkarıcının önceden eğitilmiş ağırlıklarını dondurur. Yirmi altıncı hücreyi şu şekilde ayarlayın:
### CELL 26: Freeze feature extractor ### model.freeze_feature_extractor()
Yirmi yedinci hücre, Trainer
örneğine aktarılacak eğitim argümanlarını başlatır. Yirmi yedinci hücreyi şu şekilde ayarlayın:
### 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
sınıfı 100'den fazla parametreyi kabul eder.False
durumunda save_safetensors
parametresi, ince ayarı yapılan modelin, safetensors
formatını kullanmak yerine bir pickle
dosyasına kaydedilmesi gerektiğini belirtir.True
olduğunda group_by_length
parametresi, yaklaşık olarak aynı uzunluktaki örneklerin birlikte gruplanması gerektiğini belirtir. Bu, dolguyu en aza indirir ve eğitim verimliliğini artırır.per_device_train_batch_size
eğitim mini grubu başına örnek sayısını ayarlar. Bu parametre , Adım 3.5'te atanan TRAIN_BATCH_SIZE
sabiti aracılığıyla 18
ayarlanır. Bu, çağ başına 160 adım anlamına gelir.per_device_eval_batch_size
değerlendirme (bekletme) mini grubu başına örnek sayısını ayarlar. Bu parametre , Adım 3.5'te atanan EVAL_BATCH_SIZE
sabiti aracılığıyla 10
ayarlanır.num_train_epochs
eğitim dönemlerinin sayısını ayarlar. Bu parametre, Adım 3.5'te atanan TRAIN_EPOCHS
sabiti aracılığıyla 30
ayarlanır. Bu, eğitim sırasında toplam 4.800 adım anlamına gelir.True
olduğunda gradient_checkpointing
parametresi, degrade hesaplamalarını kontrol ederek bellekten tasarruf etmenize yardımcı olur, ancak geriye doğru geçişlerin daha yavaş olmasına neden olur.evaluation_strategy
parametresi, steps
ayarlandığında, eğitim sırasında değerlendirmenin eval_steps
parametresi tarafından belirtilen bir aralıkta gerçekleştirileceği ve günlüğe kaydedileceği anlamına gelir.logging_strategy
parametresi, steps
ayarlandığında, eğitim çalıştırma istatistiklerinin logging_steps
parametresi tarafından belirtilen bir aralıkta günlüğe kaydedileceği anlamına gelir.save_strategy
parametresi, steps
ayarlandığında, ince ayarı yapılmış modelin bir kontrol noktasının save_steps
parametresi tarafından belirtilen bir aralıkta kaydedileceği anlamına gelir.eval_steps
uzatma verilerinin değerlendirilmesi arasındaki adım sayısını ayarlar. Bu parametre, Adım 3.5'te atanan EVAL_STEPS
sabiti aracılığıyla 100
ayarlanır.save_steps
ince ayarı yapılmış modelin bir kontrol noktasının kaydedileceği adım sayısını ayarlar. Bu parametre, Adım 3.5'te atanan SAVE_STEPS
sabiti aracılığıyla 3200
ayarlanır.logging_steps
eğitim çalıştırma istatistiklerinin günlükleri arasındaki adım sayısını ayarlar. Bu parametre, Adım 3.5'te atanan LOGGING_STEPS
sabiti aracılığıyla 100
ayarlanır.learning_rate
parametresi başlangıç öğrenme oranını ayarlar. Bu parametre, Adım 3.5'te atanan LEARNING_RATE
sabiti aracılığıyla 1e-4
ayarlanır.warmup_steps
parametresi, öğrenme oranını 0'dan learning_rate
tarafından ayarlanan değere doğrusal olarak ısıtmak için gereken adım sayısını ayarlar. Bu parametre, Adım 3.5'te atanan WARMUP_STEPS
sabiti aracılığıyla 800
ayarlanır.Yirmi sekizinci hücre, giriş ve hedef dizilerinin dinamik olarak doldurulması mantığını tanımlar. Yirmi sekizinci hücreyi şu şekilde ayarlayın:
### 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
örneğine iletilir. Giriş dizileri ve etiket dizilerinin uzunluğu her mini grupta farklılık gösterdiğinden, bazı dizilerin hepsinin aynı uzunlukta olması için doldurulması gerekir.DataCollatorCTCWithPadding
sınıfı, mini toplu verileri dinamik olarak doldurur. padding
parametresi True
olarak ayarlandığında, daha kısa ses girişi özelliği dizilerinin ve etiket dizilerinin bir mini gruptaki en uzun diziyle aynı uzunluğa sahip olması gerektiğini belirtir.0.0
değeriyle doldurulur.-100
ile değiştirilir, böylece WER metriği hesaplanırken bu etiketler dikkate alınmaz.Yirmi dokuzuncu hücre, önceki adımda tanımlanan veri derleyicinin bir örneğini başlatır. Yirmi dokuzuncu hücreyi şu şekilde ayarlayın:
### CELL 29: Initialize instance of data collator ### data_collator = DataCollatorCTCWithPadding(processor = processor, padding = True)
Otuzuncu hücre Trainer
sınıfının bir örneğini başlatır. Otuzuncu hücreyi şu şekilde ayarlayın:
### 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
sınıfı şu şekilde başlatılıyor:model
Adım 3.25'te başlatıldı.train_data
Dataset
nesnesi.valid_data
Dataset
nesnesi.tokenizer
parametresi, processor.feature_extractor
atanır ve girişleri her mini grubun maksimum uzunluktaki girişine otomatik olarak doldurmak için data_collator
ile birlikte çalışır. Otuz birinci hücre, modele ince ayar yapmak için Trainer
sınıfı örneğindeki train
yöntemini çağırır. Otuz birinci hücreyi şu şekilde ayarlayın:
### CELL 31: Finetune the model ### trainer.train()
Otuz saniyelik hücre son defter hücresidir. Trainer
örneğinde save_model
yöntemini çağırarak ince ayarlı modeli kaydeder. Otuz ikinci hücreyi şu şekilde ayarlayın:
### CELL 32: Save the finetuned model ### trainer.save_model(OUTPUT_DIR_PATH)
Artık dizüstü bilgisayarın tüm hücreleri oluşturulduğuna göre ince ayar yapmaya başlamanın zamanı geldi.
Kaggle Notebook'u NVIDIA GPU P100 hızlandırıcıyla çalışacak şekilde ayarlayın.
Not defterini Kaggle'a teslim et.
WandB hesabınızda oturum açarak ve ilgili koşuyu bularak egzersiz koşusu verilerini izleyin.
NVIDIA GPU P100 hızlandırıcıyı kullanarak 30'dan fazla dönemi kapsayan eğitim ~5 saat sürmelidir. Uzatma verilerindeki WER, eğitimin sonunda ~0,15'e düşmelidir. Bu son teknoloji ürünü bir sonuç olmasa da, ince ayarlı model birçok uygulama için hâlâ yeterince kullanışlıdır.
İnce ayarı yapılan model , Adım 3.5'te belirtilen OUTPUT_DIR_PATH
sabiti tarafından belirtilen Kaggle dizinine çıkarılacaktır. Model çıktısı aşağıdaki dosyaları içermelidir:
pytorch_model.bin config.json preprocessor_config.json vocab.json training_args.bin
Bu dosyalar yerel olarak indirilebilir. Ayrıca model dosyalarını kullanarak yeni bir Kaggle Modeli oluşturabilirsiniz. Kaggle Modeli, ince ayarlı model üzerinde çıkarım yapmak için yardımcı çıkarım kılavuzuyla birlikte kullanılacaktır.
wav2vec2 XLS-R'ye ince ayar yaptığınız için tebrikler! Modelin istediğiniz diğer dillerde ince ayarını yapmak için bu genel adımları kullanabileceğinizi unutmayın. Bu kılavuzda oluşturulan ince ayarlı model üzerinde çıkarım yapmak oldukça basittir. Çıkarım adımları bu kılavuza ayrı bir yardımcı kılavuzda özetlenecektir. Tamamlayıcı kılavuzu bulmak için lütfen HackerNoon kullanıcı adımı arayın.