Bir BERT Modelini Sıfırdan Nasıl Eğitirsiniz?

Kaynak Düğüm: 1013329

Bir BERT Modelini Sıfırdan Nasıl Eğitirsiniz?

BERT'in İtalyan kuzeni FiliBERTo ile tanışın.


By James Briggs, Veri Bilimcisi



BERT, ancak İtalya'da — yazar tarafından resim

 

Makalelerimin çoğu, doğal dil işleme (NLP) dünyasına gelip hakim olan ve dil modelleri için yeni bir çağa işaret eden model olan BERT'e odaklandı.

Daha önce transformatör modellerini kullanmamış olanlar için (örn. BERT nedir), süreç biraz şuna benzer:

  • pip install transformers
  • Önceden eğitilmiş bir transformatör modelini başlatın — from_pretrained.
  • Bazı veriler üzerinde test edin.
  • Olabilir modele ince ayar yapın (biraz daha eğitin).

Bu harika bir yaklaşım ama eğer bunu yaparsak kendi transformatör modellerimizi yaratmanın ardındaki anlayıştan yoksun oluruz.

Ve eğer kendi transformatör modellerimizi yaratamıyorsak sorunumuza uyan önceden eğitilmiş bir modelin varlığına güvenmeliyiz, bu her zaman böyle değildir:



İngilizce olmayan BERT modelleri hakkında soru soran birkaç yorum

 

Dolayısıyla bu makalede, kendi transformatör modelimizi, özellikle de BERT'in RoBERTa adı verilen daha gelişmiş bir versiyonunu oluşturmak için atmamız gereken adımları inceleyeceğiz.

Genel Bakış

 
 
Sürecin birkaç adımı var, bu yüzden dalmadan önce yapmamız gerekenleri özetleyelim. Toplamda dört temel bölüm vardır:

  • Verileri alma
  • Bir tokenizer oluşturmak
  • Giriş hattı oluşturma
  • Modelin eğitimi

Bu bölümlerin her birinde çalıştıktan sonra, oluşturduğumuz tokenizer'ı ve modeli alıp ikisini de kaydedeceğiz, böylece bunları daha sonra genellikle kullandığımız şekilde kullanabiliriz. from_pretrained.

Verileri Alma

 
 
Her makine öğrenimi projesinde olduğu gibi verilere ihtiyacımız var. Bir transformatör modelini eğitmeye yönelik veriler açısından, gerçekten seçim yapmakta zorlanıyoruz; neredeyse her türlü metin verisini kullanabiliriz.



HuggingFace'in veri kümesi kitaplığını kullanarak OSCAR veri kümesini indirmek için izlenecek video

 

Ve internette bolca bulunan bir şey varsa o da yapılandırılmamış metin verileridir.

İnternetten alınan metin alanındaki en büyük veri kümelerinden biri OSCAR veri kümesidir.

OSCAR veri seti çok sayıda farklı dile sahiptir ve sıfırdan eğitim için en net kullanım durumlarından biri, BERT'i Telugu veya Navajo gibi daha az kullanılan bazı dillere uygulayabilmemizdir.

Ne yazık ki, herhangi bir düzeyde yeterlilikle konuşabildiğim tek dil İngilizce - ancak kız arkadaşım İtalyan ve bu yüzden o - Laura, İtalyanca konuşulan BERT modelimiz - FiliBERTo'nun sonuçlarını değerlendirecek.

OSCAR veri setinin İtalyanca bölümünü indirmek için HuggingFace'i kullanacağız. datasets kütüphane — bununla kurabiliriz pip install datasets. Daha sonra OSCAR_IT'i şununla indiriyoruz:

Bir göz atalım dataset nesne.

Harika, şimdi verilerimizi tokenizer'ımızı oluştururken kullanabileceğimiz bir formatta saklayalım. Yalnızca aşağıdakileri içeren bir dizi düz metin dosyası oluşturmamız gerekiyor: text Veri kümemizdeki özellik ve her birini böleceğiz örnek yeni satır kullanma n.

bizim yerimizde data/text/oscar_it bulacağımız dizin:


Düz metin OSCAR verilerini temsil eden .txt dosyalarıyla dolu bir Windows gezgini penceresini gösteren ekran görüntüsü
Düz metin OSCAR dosyalarımızı içeren dizin

 

Tokenizer Oluşturmak

 
 
Sırada tokenizer var! Transformatörleri kullanırken, ilgili transformatör modelinin yanı sıra genellikle bir tokenizer yükleriz; tokenizer, süreçteki önemli bir bileşendir.



Özel tokenizer'ımızı oluşturmak için izlenecek video

 

Tokenizer'ımızı oluştururken, ona tüm OSCAR verilerimizi besleyeceğiz, sözcük dağarcığı boyutumuzu (tokenizer'daki token sayısı) ve varsa özel tokenleri belirteceğiz.

Artık RoBERTa özel tokenları şöyle görünüyor:

Bu nedenle, bunları listeye dahil ettiğimizden emin oluyoruz. special_tokens tokenizerimizin parametresi train yöntem çağrısı.

Tokenizer'ımız artık hazır ve dosyayı daha sonra kullanmak üzere kaydedebiliriz:

Artık yeni dosyamızı tanımlayan iki dosyamız var. FiliBERTo belirteç:

  • birleştirmeler.txt — metnin belirteçlerle ilk eşlemesini gerçekleştirir
  • vocab.json — belirteçleri belirteç kimlikleriyle eşler

Ve bunlarla birlikte, tokenizer'ımızı başlatma aşamasına geçebiliriz, böylece onu da diğer herhangi bir aracı kullandığımız gibi kullanabiliriz. from_pretrained belirteç.

Tokenizer'ın başlatılması

 
 
İlk olarak daha önce oluşturduğumuz iki dosyayı kullanarak tokenizer'ı başlatıyoruz. from_pretrained:

Artık tokenizerimiz hazır, onunla bazı metinleri kodlamayı deneyebiliriz. Kodlama sırasında genellikle kullandığımız iki yöntemi kullanırız: encode ve encode_batch.

Kodlama nesnesinden tokens biz çıkaracağız input_ids ve attention_mask FiliBERTo ile kullanım için tensörler.

Giriş İşlem Hattını Oluşturma

 
 
Eğitim sürecimizin girdi hattı, tüm sürecin daha karmaşık kısmıdır. Ham OSCAR eğitim verilerimizi alıp dönüştürüp bir programa yüklememizden oluşur. DataLoader eğitime hazır.



MLM giriş ardışık düzeninin video anlatımı

 

Verilerin Hazırlanması

 
 
Tek bir örnekle başlayacağız ve hazırlama mantığı üzerinde çalışacağız.

Öncelikle dosyamızı açmamız gerekiyor; kaydettiğimiz dosyaların aynısı. . Txt dosyalar daha önce. Her birini yeni satır karakterlerine göre ayırıyoruz n çünkü bu bireysel örnekleri gösterir.

Daha sonra verilerimizi kullanarak kodluyoruz. tokenizer — gibi temel parametreleri eklediğinizden emin olun max_lengthpadding, ve truncation.

Artık tensörlerimizi oluşturmaya geçebiliriz; modelimizi maskeli dil modelleme (MLM) aracılığıyla eğiteceğiz. Yani üç tensöre ihtiyacımız var:

  • girdi_kimlikleri - bizim token_ids maske jetonu kullanılarak maskelenen jetonların ~%15'i ile <mask>.
  • dikkat_maske - bir tensör 1s ve 0dikkat hesaplamalarında kullanılan 'gerçek' belirteçlerin/doldurma belirteçlerinin konumunu işaretler.
  • etiketler - bizim token_ids ile yok hayır maskeleme

MLM'ye aşina değilseniz, açıkladım okuyun.

nen attention_mask ve labels tensörler basitçe bizim dosyamızdan çıkarılır batch.  input_ids tensörler daha fazla dikkat gerektirir, ancak bu tensör için jetonların ~%15'ini maskeliyoruz - onlara jeton kimliğini atadık 3.

Son çıktıda kodlanmış bir programın bir kısmını görebiliriz. input_ids tensör. İlk belirteç kimliği: 1 - [CLS] jeton. Tensörün etrafında noktalı olarak birkaç tane var 3 belirteç kimlikleri — bunlar yeni eklediğimiz şeylerdir [MASK] Token kazanacaksınız.

DataLoader'ı Oluşturma

 
 
Daha sonra tanımlarımızı yapıyoruz Dataset sınıf - kodlanmış üç tensörümüzü PyTorch olarak başlatmak için kullanırız torch.utils.data.Dataset nesneler.

Son olarak, bizim dataset bir PyTorch'a yüklendi DataLoader eğitim sırasında verilerimizi modelimize yüklemek için kullandığımız nesne.

Modeli Eğitmek

 
 
Eğitim için iki şeye ihtiyacımız var; DataLoader ve bir model.  DataLoader elimizde var ama modelimiz yok.



Modelin Başlatılması

 
 
Eğitim için ham (önceden eğitilmemiş) bir şeye ihtiyacımız var. BERTLMHeadModel. Bunu oluşturmak için öncelikle FiliBERTo'yu başlatmak istediğimiz parametreleri tanımlayacak bir RoBERTa yapılandırma nesnesi oluşturmamız gerekiyor.

Daha sonra RoBERTa modelimizi dil modelleme (LM) kafası ile import edip başlatıyoruz.

Eğitim Hazırlığı

 
 
Eğitim döngümüze geçmeden önce birkaç şeyi ayarlamamız gerekiyor. Öncelikle GPU/CPU kullanımını ayarlıyoruz. Ardından modelimizin eğitim modunu etkinleştiriyoruz ve son olarak optimize edicimizi başlatıyoruz.

Eğitim

 
 
Sonunda - eğitim zamanı! PyTorch aracılığıyla eğitim alırken genellikle yaptığımız gibi antrenman yapıyoruz.

Tensorboard'a yönelirsek zaman içinde kaybımızı bulacağız; umut verici görünüyor.



Kayıp / zaman — bu grafikte birden fazla eğitim oturumu bir araya getirilmiştir

 

Gerçek Test

 
 
Şimdi gerçek sınavın zamanı geldi. Bir MLM hattı oluşturduk ve Laura'dan sonuçları değerlendirmesini istedik. Video incelemesini 22:44'te buradan izleyebilirsiniz:



İlk önce bir başlangıç ​​başlatıyoruz pipeline kullanarak nesne 'fill-mask' argüman. Daha sonra modelimizi şu şekilde test etmeye başlayın:

“ciao nasıl yani?” doğru cevap bu! Bu benim İtalyancamın ulaştığı seviyeye ulaştı; o yüzden bunu Laura'ya devredelim.

Ile başlıyoruz "Buongiorno, geldin mi?" - veya "iyi gunler nasilsin?":

İlk cevap, "buongiorno, chi va?" "iyi günler, kim var orada?" anlamına gelir. — örneğin saçma. Ancak ikinci cevabımız doğru!

Sırada biraz daha sert bir ifade var, "ciao, güvercin ci incontriamo oggi pomeriggio?" - veya "Merhaba, bu öğleden sonra nerede buluşacağız?":

Ve biraz daha olumlu sonuçlar döndürüyoruz:

✅ "hi, where do we see each other this afternoon?"
✅ "hi, where do we meet this afternoon?"
❌ "hi, where here we are this afternoon?"
✅ "hi, where are we meeting this afternoon?"
✅ "hi, where do we meet this afternoon?"

Son olarak daha sert bir cümle daha, "Çünkü sarebbe başarılı oldu mu, başka bir şey mi yaptın?" - veya "Başka bir gün seçseydik ne olurdu?":

Burada da birkaç iyi yanıt daha veriyoruz:

✅ "what would have happened if we had chosen another day?"
✅ "what would have happened if I had chosen another day?"
✅ "what would have happened if they had chosen another day?"
✅ "what would have happened if you had chosen another day?"
❌ "what would have happened if another day was chosen?"

Genel olarak modelimiz Laura'nın testlerini geçmiş gibi görünüyor - ve artık FiliBERTo adında yetkin bir İtalyanca dil modelimiz var!

Bir BERT modelini sıfırdan eğitmeye yönelik bu adım adım kılavuz bu kadar!

Verilerimizi almak ve biçimlendirmekten, ham BERT modelimizi eğitmek için dil modellemeyi kullanmaya kadar pek çok yol kat ettik.

Umarım bu makaleyi beğenmişsinizdir! Herhangi bir sorunuz varsa, aracılığıyla bana bildirin Twitter veya aşağıdaki yorumlarda. Bunun gibi daha fazla içerik istiyorsanız, yayınlarım YouTube çok.

Okuduğunuz için teşekkür ederim!

 

70 indirim! Doğal Dil İşleme: Python'da Transformers ile NLP

Transformatör modelleri modern NLP'de fiili standarttır. Kendilerini en etkileyici kişiler olarak kanıtladılar…
 

*Aksi belirtilmedikçe tüm görseller yazara aittir.

 
Bio: James Briggs Londra, İngiltere merkezli, doğal dil işleme konusunda uzmanlaşmış ve finans sektöründe çalışan bir veri bilimcisidir. Aynı zamanda serbest çalışan bir akıl hocası, yazar ve içerik yaratıcısıdır. Yazara e-posta yoluyla ulaşabilirsiniz (jamescalam94@gmail.com).

orijinal. İzinle yeniden yayınlandı.

İlgili:

Kaynak: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

Zaman Damgası:

Den fazla KDNuggets