Ana içeriğe geç

Transformers ve Hugging Face Kullanımına Giriş

Transformers’ı anlayın ve güçlerinden yararlanarak gerçek hayattaki problemleri çözün.
· 15 dk. oku

Yapay Zeka ile Keşfedin

Giriş

Doğal Dil İşleme (Natural Language Processing, NLP) alanındaki araştırmacıların son on yıllardaki yoğun katkıları, farklı alanlarda yenilikçi sonuçlar üretti. Aşağıda, Doğal Dil İşleme'nin pratikteki bazı örneklerini bulabilirsiniz:

  • Apple’ın Siri kişisel asistanı, alarm kurma, mesaj gönderme, soruları yanıtlama gibi günlük aktivitelerde kullanıcılara yardımcı olur.
  • Tıp alanındaki araştırmacılar NLP’yi daha hızlı ilaç keşfinin önünü açmak için kullanıyor.  
  • Dil çevirisi, iletişim engellerini aşmamızı sağladığı için bir diğer güçlü uygulamadır.  

Bu kavramsal blog yazısı, Doğal Dil İşleme’de bugüne kadar oluşturulan en güçlü modellerden biri olan Transformers’ı ele almayı amaçlıyor. Yinelenen sinir ağlarına kıyasla avantajlarını açıkladıktan sonra, Transformers’a dair kavrayışınızı geliştireceğiz. Ardından, Hugging Face transformers kullanarak bazı gerçek dünya senaryolarında size yol göstereceğiz.

Kod eşliğinde anlatımımızla Hugging Face ile NLP Uygulamaları Geliştirme hakkında daha fazla bilgi edinebilirsiniz.

Yinelenen Ağ — Transformers'tan önceki parlak dönem 

Transformers’ın temel kavramına dalmadan önce, kısaca yinelenen modellerin ne olduğunu ve sınırlamalarını anlayalım.

Yinelenen ağlar, kodlayıcı-çözümleyici (encoder-decoder) mimarisini kullanır ve genellikle hem girdilerin hem de çıktıların belirli bir sırayla diziler olduğu görevlerde kullanılır. Yinelenen ağların en önemli kullanım alanlarından bazıları makine çevirisi ve zaman serisi veri modellemedir.

Yinelenen ağlardaki zorluklar 

Aşağıdaki Fransızca cümleyi İngilizceye çevirmeyi düşünelim. Kodlayıcıya iletilen girdi, orijinal Fransızca cümledir ve çevrilmiş çıktı çözümleyici tarafından üretilir.

Encoder

Dil çevirisi için yinelenen ağın basit bir çizimi

  • Girdi olarak verilen Fransızca cümle, kelimeler tek tek kodlayıcıya aktarılır ve sözcük gömmeleri (embedding’ler) aynı sırayla çözümleyici tarafından üretilir; bu da eğitimi yavaşlatır.
  • Geçerli kelimenin gizli durumu, önceki kelimelerin gizli durumlarına bağlıdır; bu da, kullanılan hesaplama gücü ne olursa olsun paralel hesaplamayı imkansız kılar. 
  • Dizi-dizi (sequence-to-sequence) sinir ağları, ağ çok uzun olduğunda patlayan gradyanlara yatkındır; bu da kötü performansa yol açar. 
  • Yinelenen ağların bir türü olan Uzun Kısa Süreli Bellek (LSTM) ağları, sönümlenen gradyanı azaltmak için tanıtılmıştır ancak dizi modellerinden bile daha yavaştır. 

Yinelenen ağların avantajlarını birleştiren ve paralel hesaplamayı mümkün kılan bir model harika olmaz mıydı? 

İşte burada transformers devreye giriyor.

NLP’de transformers nedir?

Transformers, Google Brain tarafından 2017’de yayımlanan ünlü “Attention is All You Need” makalesiyle tanıtılan, basit ama güçlü yeni bir sinir ağı mimarisidir. Yinelenen ağlarda gördüğümüz sıralı hesaplama yerine dikkat (attention) mekanizmasına dayanır. 

Transformers’ın temel bileşenleri nelerdir?

Yinelenen ağlara benzer şekilde, transformers’ta da her biri öz-dikkat (self-attention) mekanizmasına sahip iki ana blok bulunur: kodlayıcı ve çözümleyici. Transformers’ın ilk sürümü RNN ve LSTM kodlayıcı-çözümleyici mimarisine sahipti; daha sonra bunlar öz-dikkat ve ileri beslemeli (feed-forward) ağlarla değiştirildi.

Bir sonraki bölüm, transformers’ın her bloğunun ana bileşenlerine genel bir bakış sunar. 

components of transformers

Transformers’ın Genel Mimarisi (Yazardan uyarlanmıştır)

Girdi cümlesi ön işleme aşaması

Bu bölüm iki ana adımdan oluşur: (1) girdi cümlesinin gömmelerinin (embedding) oluşturulması ve (2) girdi cümlesindeki her kelimenin konumsal vektörünün hesaplanması. Tüm hesaplamalar, hem kaynak cümle (kodlayıcı bloğundan önce) hem de hedef cümle (çözümleyici bloğundan önce) için aynı şekilde gerçekleştirilir. 

Girdi verisinin gömülmesi (embedding)

Girdi verisinin gömmelerini oluşturmadan önce, önce belirteçleştirme (tokenization) yapılır; ardından cümledeki ilişkilerine bakılmaksızın her bir kelimenin gömmesi oluşturulur. 

Konumsal kodlama (positional encoding)

Belirteçleştirme, girdi cümlesinde var olan ilişki kavramlarını yok sayar. Konumsal kodlama, her kelime için bağlam vektörü üreterek bu özgün döngüsel doğayı yeniden kurmaya çalışır. 

Kodlayıcı bloğu 

Önceki adımın sonunda, her kelime için iki vektör elde ederiz: (1) gömme ve (2) bağlam vektörü. Bu vektörler toplanarak her kelime için tek bir vektör oluşturulur ve ardından kodlayıcıya iletilir. 

Çok başlı dikkat (multi-head attention)

Daha önce belirtildiği gibi, ilişki kavramını tamamen kaybettik. Dikkat katmanının amacı, girdi cümlesindeki farklı kelimeler arasındaki bağlamsal ilişkileri yakalamaktır. Bu adımın sonunda, her kelime için bir dikkat vektörü oluşturulur.

Konum bazlı ileri beslemeli ağ (FFN)

Bu aşamada, her dikkat vektörüne bir ileri beslemeli sinir ağı uygulanır ve bunlar, çözümleyicideki bir sonraki çok başlı dikkat katmanının beklediği formata dönüştürülür.

Çözümleyici bloğu

Çözümleyici bloğu üç ana katmandan oluşur: maskeli çok başlı dikkat, çok başlı dikkat ve konum bazlı ileri beslemeli ağ. Son iki katmanı zaten biliyoruz; bunlar kodlayıcıdakiyle aynıdır. 

Çözümleyici, ağın eğitimi sırasında devreye girer ve iki ana girdi alır: (1) çevirmek istediğimiz girdi cümlesinin dikkat vektörleri ve (2) hedef dildeki (İngilizce) çevrilmiş cümleler. 

Peki maskeli çok başlı dikkat katmanı ne yapar?

Bir sonraki İngilizce kelime üretilirken, ağın Fransızca cümledeki tüm kelimeleri kullanmasına izin verilir. Ancak hedef dizideki (İngilizce çeviri) belirli bir kelimeyle uğraşırken, ağ yalnızca önceki kelimelere erişebilmelidir; sonraki kelimeleri erişilebilir kılmak, ağın “hile yapmasına” ve doğru şekilde öğrenmeye çaba göstermemesine yol açar. İşte maskeli çok başlı dikkat katmanının faydası burada ortaya çıkar. Bu katman, sonraki kelimeleri sıfırlara dönüştürerek maskeler; böylece dikkat ağı tarafından kullanılamazlar. 

Maskeli çok başlı dikkat katmanının çıktısı, bir olasılık skoru üreterek bir sonraki kelimeyi tahmin etmek için kalan katmanlardan geçer. 

Bu mimarinin başarılı olmasının nedenleri şunlardır:

  • Her katmandaki toplam hesaplama karmaşıklığı RNN’lere kıyasla daha düşüktür. 
  • Tekrarlılığın gerekliliğini tamamen ortadan kaldırır ve RNN’lerin aksine dizi paralelleştirmesine olanak tanır; RNN’ler girdinin sıralı olmasını bekler. 
  • RNN’ler, ağdaki ileri ve geri sinyallerin yol uzunlukları nedeniyle uzun menzilli dizilerden öğrenmede verimli değildir. Bu yol, öz-dikkat kullanılarak kısaltılır ve öğrenme süreci iyileştirilir.

NLP’de Transfer Öğrenme

Transformers gibi derin sinir ağlarını sıfırdan eğitmek kolay değildir ve şu zorlukları barındırabilir: 

  • Hedef problem için gerekli veri miktarını bulmak zaman alıcı olabilir
  • Böylesi derin ağları eğitmek için gerekli GPU gibi hesaplama kaynaklarını edinmek oldukça maliyetli olabilir.  

Transfer öğrenme kullanmak; eğitim süresini azaltma, yeni modellerin eğitimini hızlandırma ve proje teslim süresini kısaltma gibi pek çok fayda sağlayabilir.

Mandingo dilini Wolof’a çevirecek bir modeli sıfırdan inşa ettiğinizi hayal edin; her iki dil de düşük kaynaklıdır. Bu dillere ilişkin verileri toplamak maliyetlidir. Tüm bu zorluklardan geçmek yerine, yeni modeli eğitmeye başlamak için önceden eğitilmiş derin sinir ağları yeniden kullanılabilir. 

Bu tür modeller, başkaları (gerçek kişiler, kuruluşlar vb.) tarafından sağlanan büyük bir veri külliyatı üzerinde eğitilmiş, değerlendirilmiş ve Fransızcadan İngilizceye çeviri gibi dil çevirisi görevlerinde çok iyi çalıştığı gösterilmiştir. 

NLP’ye yeniyseniz, Python ile Doğal Dil İşlemeye Giriş kursu, gerçek dünyadaki problemleri çözmek için temel becerileri edinmenize yardımcı olabilir.

Peki derin sinir ağlarının yeniden kullanımıyla neyi kastediyoruz?

Modelin yeniden kullanımı; kullanım senaryonuza benzer önceden eğitilmiş bir model seçmeyi, hedef görevinize ait girdi-çıktı çiftlerini rafine etmeyi ve önceden eğitilmiş modelin tepe (head) katmanını kendi verilerinizle yeniden eğitmeyi içerir. 

Transformers’ın tanıtımı, aşağıdaki gibi en güncel transfer öğrenme modellerinin geliştirilmesine yol açtı: 

  • Google araştırmacıları tarafından 2018’de geliştirilen, Transformers’tan Çift Yönlü Kodlayıcı Temsiller anlamına gelen BERT. ad varlık tanıma, duygu analizi, soru-cevaplama, metin özetleme gibi en yaygın dil görevlerini çözmeye yardımcı olur. BERT hakkında daha fazlasını bu NLP eğitiminde okuyun.
  • OpenAI araştırmacıları tarafından önerilen GPT-3 (Generative Pre-Training-3). Çok katmanlı bir transformer olup, ağırlıklı olarak her tür metin üretimi için kullanılır. GPT modelleri, verilen bir soruya insana benzer metin yanıtları üretebilir. Bu harika makale, GPT-3’ü benzersiz kılan unsurlar, onu destekleyen teknoloji, riskleri ve sınırlamaları hakkında daha derin bilgi sağlayabilir.

Hugging Face Transformers’a Giriş

Hugging Face, 2016’da Julien Chaumond, Clément Delangue ve Thomas Wolf tarafından oluşturulan bir yapay zeka topluluğu ve Makine Öğrenimi platformudur. Veri Bilimcilere, Yapay Zeka uygulayıcılarına ve Mühendislere, en ileri transformer mimarisi temelinde eğitilmiş 20.000’i aşkın önceden eğitilmiş modele anında erişim sağlayarak NLP’yi demokratikleştirmeyi amaçlar. Bu modeller şu alanlara uygulanabilir:

  • Metin: 100’den fazla dilde sınıflandırma, bilgi çıkarımı, soru yanıtlama, üretim ve çeviri gibi görevler için. 
  • Ses: nesneye yönelik ses sınıflandırma ve konuşma tanıma gibi görevler için. 
  • Görsel: nesne tespiti, görüntü sınıflandırma, segmentasyon için.
  • Tablolu veriler: regresyon ve sınıflandırma problemleri için. 
  • Pekiştirmeli Öğrenme transformers. 

Hugging Face Transformers ayrıca yaklaşık 2000 veri kümesi ve katmanlı API’ler sunar; böylece programcılar bu modellere yaklaşık 31 kütüphane kullanarak kolayca etkileşim sağlayabilir. Çoğu derin öğrenme kütüphanesidir: Pytorch, Tensorflow, Jax, ONNX, Fastai, Stable-Baseline 3 vb. 

Bu kurslar, derin evrişimsel sinir ağları kurmak için Pytorch ve Tensorflow kullanımına harika bir giriş niteliğindedir. Hugging Face Transformers’ın diğer bileşenleri de Pipelines’tır. 

Transformers’ta Pipelines nedir?

  • Çeşitli görevlerde çıkarım (inference) yapmak için pipeline() yöntemi üzerinden kullanımı kolay bir API sunarlar.
  • Metin temizleme, belirteçleştirme, gömme gibi her bir Doğal Dil İşleme görevinin genel sürecini kapsüllemek için kullanılırlar.

pipeline() yönteminin yapısı şöyledir: 

from transformers import pipeline

# To use a default model & tokenizer for a given task(e.g. question-answering)
pipeline("<task-name>")

# To use an existing model
pipeline("<task-name>", model="<model_name>")

# To use a custom model/tokenizer
pipeline('<task-name>', model='<model name>',tokenizer='<tokenizer_name>')

Hugging Face Eğitimi : DÜZENLEME DEVAM EDİYOR …

Artık Transformers ve Hugging Face platformunu daha iyi anladığınıza göre, sizi şu gerçek dünya senaryolarında adım adım yönlendireceğiz: dil çevirisi, sıfır örnekli sınıflandırma (zero-shot classification) ile dizi sınıflandırma, duygu analizi ve soru-cevaplama. 

Veri kümeleri hakkında bilgiler

Bu veri kümesi, Datacamp’in Datasets bölümünde yer alır, Facebook tarafından zenginleştirilmiştir ve bir makalenin yayınlanmadan önceki popülerliğini tahmin etmek amacıyla oluşturulmuştur. Analiz, açıklama (description) sütununa dayanacaktır. Örnekleri göstermek için veriden yalnızca üç örnek kullanacağız. 

Aşağıda verinin kısa bir açıklaması bulunuyor. 14 sütun ve 1428 satırdan oluşur.

import pandas as pd
# Load the data from the path
data_path = "datacamp_workspace_export_2022-08-08 07_56_40.csv"
news_data = pd.read_csv(data_path, error_bad_lines=False)




# Show data information
news_data.info()

info dataset

Dil Çevirisi

MariamMT, verimli bir Makine Çevirisi çerçevesidir. Kaputun altında, Microsoft ve Edinburgh Üniversitesi ile Poznań Adam Mickiewicz Üniversitesi gibi birçok akademik kurum tarafından tamamen C++ ile geliştirilen MarianNMT motorunu kullanır. Aynı motor şu anda Microsoft Translator hizmetinin arkasındadır. 

Helsinki Üniversitesi NLP grubu, Hugging Face Transformers üzerinde birden fazla çeviri modelini açık kaynaklı hale getirdi ve bunların tümü şu biçimdedir: Helsinki-NLP/opus-mt-{src}-{tgt}; burada {src} ve {tgt} sırasıyla kaynak ve hedef dillere karşılık gelir. 

Bizim durumumuzda kaynak dil İngilizce (en), hedef dil ise Fransızca (fr).

MarianMT, Opus’ta toplanan paralel veriler üzerinde Marian kullanılarak daha önce eğitilen bu modellerden biridir.

  • MarianMT, Transformers’a ek olarak sentencepiece gerektirir:
pip install transformers sentencepiece
from transformers import MarianTokenizer, MarianMTModel



  • Önceden eğitilmiş modeli seçin, belirteçleyiciyi (tokenizer) alın ve önceden eğitilmiş modeli yükleyin
# Get the name of the model
model_name = 'Helsinki-NLP/opus-mt-en-fr'

# Get the tokenizer
tokenizer = MarianTokenizer.from_pretrained(model_name)
# Instantiate the model
model = MarianMTModel.from_pretrained(model_name)
  • Aşağıdaki işlevin yardımıyla, her bir kaynak (İngilizce) metnin başına özel >>{tgt}<< belirtecini ekleyin.
def format_batch_texts(language_code, batch_texts):
    formated_bach = [">>{}<< {}".format(language_code, text) for text in     

                batch_texts]
return formated_bach
  • Bir toplu iş (batch) çevirisi, çevrilecek metinlerin listesi olduğundan, aşağıdaki işlevin yardımıyla toplu çeviri mantığını uygulayın.
def perform_translation(batch_texts, model, tokenizer, language="fr"):

  # Prepare the text data into appropriate format for the model
  formated_batch_texts = format_batch_texts(language, batch_texts)
 
  # Generate translation using model
  translated = model.generate(**tokenizer(formated_batch_texts,

                                          return_tensors="pt", padding=True))

  # Convert the generated tokens indices back into text
  translated_texts = [tokenizer.decode(t, skip_special_tokens=True) for t in translated]
 
  return translated_texts
  • Önceki açıklama örnekleri üzerinde çeviriyi çalıştırın
# Check the model translation from the original language (English) to French
translated_texts = perform_translation(english_texts, trans_model, trans_model_tkn)

# Create wrapper to properly format the text
from textwrap import TextWrapper
# Wrap text to 80 characters.
wrapper = TextWrapper(width=80)

for text in translated_texts:
  print("Original text: \n", text)
  print("Translation : \n", text)
  print(print(wrapper.fill(text)))
  print("")

French translation

Sıfır örnekli sınıflandırma

Çoğu zaman, bir Makine Öğrenimi modelini eğitmek, tüm aday etiketlerin/çıktıların önceden bilinmesini gerektirir; yani eğitim etiketleriniz bilim, siyaset veya eğitim ise, modeli yeniden eğitip o etiketi ve karşılık gelen girdi verisini dikkate almadıkça sağlık etiketini tahmin edemezsiniz. 

Bu güçlü yaklaşım, herhangi bir aday etiketi “görmeden” yaklaşık 15 dilde metnin hedef kategorisini tahmin etmeyi mümkün kılar. Bu modeli, hub’dan doğrudan yükleyerek kullanabiliriz. 

Buradaki amaç, önceki açıklamaların her birinin kategorisini teknoloji, siyaset, güvenlik veya finans olup olmadığı şeklinde sınıflandırmaya çalışmaktır. 

  • pipeline modülünü içe aktarın
from transformers import pipeline
  • Aday etiketleri tanımlayın. Bunlar, tahmin etmek istediğimiz kategorilere karşılık gelir: tech, politics, business veya finance
candidate_labels = ["tech", "politics", "business", "finance"]
  • Sınıflandırıcıyı çok dilli seçenekle tanımlayın
my_classifier = pipeline("zero-shot-classification",  

                           model='joeddav/xlm-roberta-large-xnli')
  • Tahminleri ilk ve son açıklama üzerinde çalıştırın 
#For the first description
prediction = my_classifier(english_texts[0], candidate_labels, multi_class = True)
pd.DataFrame(prediction).drop(["sequence"], axis=1)

Text predicted finance

Metin ağırlıklı olarak finans hakkında tahmin edildi 

Önceki sonuç, metnin genel olarak %81 oranında finans hakkında olduğunu gösteriyor. 

Son açıklama için aşağıdaki sonucu elde ederiz:

#For the last description
prediction = my_classifier(english_texts[-1], candidate_labels, multi_class = True)
pd.DataFrame(prediction).drop(["sequence"], axis=1)

Text predicted tech

Metin ağırlıklı olarak teknoloji hakkında tahmin edildi 

Önceki sonuç, metnin genel olarak %95 oranında teknoloji hakkında olduğunu gösteriyor.

Duygu analizi

Duygu sınıflandırması yapan çoğu model uygun eğitim gerektirir. Hugging Face pipeline modülü, adını belirterek hub’da bulunan belirli bir modeli kullanmak suretiyle duygu analizi tahminlerini çalıştırmayı kolaylaştırır. 

  • Gerçekleştirilecek görevi seçin ve karşılık gelen modeli yükleyin. Burada, damıtılmış BERT tabanlı modeli kullanarak duygu sınıflandırması yapmak istiyoruz. 
model_checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"

distil_bert_model = pipeline(task="sentiment-analysis", model=model_checkpoint)
  • Model hazır! Son iki cümlenin altında yatan duyguları analiz edelim. 
# Run the predictions
distil_bert_model(english_texts[1:])

model predicted text

Model, ilk metni %96 güvenle olumsuz duyguya sahip olarak; ikincisini ise %52 güvenle olumlu duyguya sahip olarak tahmin etti. 

Duygu analizi görevlerini daha fazla keşfetmek isterseniz, bu Python Duygu Analizi kursu Python kullanarak kendi duygu analizi sınıflandırıcınızı oluşturmak ve NLP’nin temellerini anlamak için gerekli becerileri kazanmanıza yardımcı olacaktır.

Soru-Cevaplama

Apple ile ilgili olandan çok daha uzun bir raporla uğraştığınızı hayal edin. Ve ilginizi çeken tek şey, bahsi geçen etkinliğin tarihi olsun. Anahtar bilgiyi bulmak için tüm raporu okumak yerine, ilgilendiğimiz cevabı sağlayacak bir Hugging Face soru-cevap modelini kullanabiliriz. 

Bu, modele uygun bağlamı (Apple’ın raporu) ve cevabını bulmak istediğimiz soruyu vererek yapılabilir.

  • transformers’tan soru-cevap sınıfını ve belirteçleyicisini içe aktarın
from transformers import AutoModelForQuestionAnswering, AutoTokenizer
  • Modeli adını ve belirteçleyicisini kullanarak başlatın. 
model_checkpoint = "deepset/roberta-base-squad2"

task = 'question-answering'
QA_model = pipeline(task, model=model_checkpoint, tokenizer=model_checkpoint)
  • Soruyu sorup bağlamı belirterek modeli çağırın. 
QA_input = {
          'question': 'when is Apple hosting an event?',
          'context': english_texts[-1]
          }
  • Modelin sonucunu alın
model_response = QA_model(QA_input)
pd.DataFrame([model_response])

Apple event date

Model, Apple etkinliğinin 10 Eylül’de olduğunu %97 gibi yüksek bir güvenle yanıtladı. 

Sonuç

Bu yazıda, yinelenen ağlardan transformers’a uzanan doğal dil teknolojisinin evrimini ve Hugging Face’in platformu aracılığıyla NLP kullanımını nasıl demokratikleştirdiğini ele aldık. 

Transformers kullanma konusunda hâlâ tereddüt ediyorsanız, denemenin ve iş senaryolarınıza değer katmanın zamanı geldiğine inanıyoruz.

SSS Transformers ve Hugging Face

Hugging Face transformer nedir?

Hugging Face transformers, topluluğa Hugging Face hub üzerinden erişilebilen en güncel önceden eğitilmiş modellere erişmek ve bunları kullanmak için API’ler sağlayan bir platformdur. 

Önceden eğitilmiş transformer nedir?

Önceden eğitilmiş bir transformer, bir kişi ya da endüstri tarafından eğitilmiş ve doğrulanmış; benzer bir görev için başlangıç noktası olarak kullanabileceğimiz bir transformer modelidir.

Hugging Face ücretsiz mi?

Hugging Face hem topluluk hem de organizasyon sürümleri sunar. Topluluk sürümünde, sınırlamaları olan ücretsiz ve aylık 9$ ücretli pro sürümü bulunur. Organizasyonlar için ise ücretsiz olmayan Lab ve kurumsal çözümler mevcuttur.

Hugging Face’de hangi çerçeve (framework) kullanılır?

Hugging Face yaklaşık 31 kütüphane için API sağlar. Çoğu derin öğrenme kütüphanesidir: Pytorch, Tensorflow, Jax, ONNX, fastai, Stable-Baseline 3 vb.

Hugging Face’de hangi programlama dili kullanılır?

Önceden eğitilmiş modellerin bir kısmı, Javascript, Python, Rust ve Bash/Shell dillerinde çok dilli gürültü giderme (denoising) görevleriyle eğitilmiştir. Python Doğal Dil İşleme kursu, yaygın metin temizleme görevlerini başarıyla gerçekleştirmek için ilgili becerileri edinmenize yardımcı olabilir

Konular

İlgili