Günümüzde birçok alandan yer alan yapay zeka teknolojilerinden en popüler olanları doğal dil işlemedir. Doğal dil işleme ile birlikte artık makineler insan konuşmalarını anlayabiliyor, analiz edebiliyor ve hatta öğrenebiliyor! Çeviri hizmetleri, metinleri kategorilere ayırma, metin analizi yapma, metin üzerinde hata tespiti, metin üzerinde anlam tespiti gibi işlemler yapılmaktadır. Günümüzde PyTorch ve TensorFlow kütüphanelerinin popüler olması ile artık derin öğrenme katmanları bu alana dahil oldu. Kelimelere göre, cümleye göre ve paragrafa göre daha gerçekçi anlam çıkarma vb. özellikler geliştirildi. Böylece insan gibi konuşmak için makinelere yeni bir alan açıldı. Geliştirilen büyük dil modelleri(LLM) ile birlikte makineler insan gibi anlayabilecek, metin üretebilecek, sohbet edebilecek, görüş belirtebilecek ve daha fazlasını yapabilecektir. Transformes kütüphanesi ise bu alanda kendisini geliştirmek isteyen şirketler ve kullanıcılar için büyük bir ilerleme sağladı. Artık günümüzde ChatGPT, Gemini, BERT, Gemma vb. modeller herkesin kullanımına sunuldu. İsteyen herkes istediği alan ile ilgili daha ayrıntılı ve insan gibi cevap veren bu modeller ile günlük, iş, eğitim vb. hayatlarında bunları kullanıyor. Daha yaratıcı içerik üretmek, var olan bilgiyi keşfetmek veya yeniden oluşturmak vb. adımlar için bu dil modellerini kullanıyor. Örnek olarak bir insan gibi sohbet edebilen, bir ödevi hızlıca yapabilen, bir finansal ilgiyi analiz edebilen vb. işlemleri yapabilen modeller gelecekte çok daha ilerleyecek ve insanların yerini almaya aday olacaktır.
Hugging Face Nedir?
Günümüzde yapay zeka teknolojileri ile ilgilenen herkesin kullandığı bir platformdur. Bu platform içinde modeller, datasetler ve daha fazlası yer almaktadır. Bu platform içinde doğal dil işleme, görüntü işleme, görüntü oluşturma vb. çalışmalar yer almaktadır. Platforma isteyen herkes ve şirketler üye olabilir ve ücretsiz bir şekilde kendi çalışmalarınızı paylaşabilirsiniz. Biz bu yazımızda ise yaptığımız çalışmalarda Hugging Face kullanacağız.
Transformer Nedir?
Doğal dil işleme alanında kullanılan bir mimaridir. Metinsel ifadelerde anlam ve özellik bilgilerini oldukça başarılı elde etmektedir ve geleneksel yöntemlere göre cümle içindeki kelime sırasına bağlı kalmadan ilişkiler kurabilmektedir. Duygu analizi, çeviri yapma, özetleme, soru-cevap işlemi ve metin üretme gibi işlemlerde kullanılmaktadır. Bu mimari günümüzde o kadar popüler oldu ki artık teknoloji devleri bile bunu kullanmaktadır. Ayrıca birçok Transformer ile uyumlu TensorFlow ve PyTorch modelini ise Hugging Face üzerinden kolayca bulabilir ve ücretsiz kullanabilirsiniz.
GPT-2 Nedir?
Generative Pre-trained Transformer 2, OpenAI tarafından geliştirilen bir dil modelidir. Geniş bir metinsel ifade dataseti ile eğitilen model, metin üretimi için en olası ve en uygun ifadeleri seçmektedir. Ayrıca çeviri vb. işlemlerde yapabilmektedir. Transformer mimarisi ile eğitilmektedir. Sohbet etme, içerik üretimi ve hatta kod yazabilme özelliği vardır.
Eğitim Ortamı : Google Colab
Bu eğitim işlemi için Google Colab içinde yer alan Nvidia Tesla 4 GPU birimini kullanacağız. Bunun için oluşturduğunuz notebook dosyasının "çalışma zamanı türün" özelliğini ücretsiz olarak verilen GPU olarak değiştirin. Maalesef CPU ile bu işlemler uzun zaman almaktadır. İsteğe bağlı olarak ise TPU gibi birimleri de kullanabilirsiniz. Google Drive içinde yer alan "Veri Kazima" isimli klasör içinde yer alan "Deneme" isimli klasörü kullanacağız.
Veri Seti Toplamak
Veri toplama işlemi için ilgili yazımı okuyabilirsiniz. Detaylı kısımlar o yazımda yer bilgilere göre bu yazımda model eğitimi yapacağım.
Kurulumlar
Aşağıdaki kütüphaneleri ilk önce import edininiz.
import os
import re
import tensorflow as tf
!pip install datasets transformers
!apt install git-lfs
!git lfs install
Daha sonra ise eposta ve kullanıcı adı ile ilgli bilgiler ekleyiniz.
!git config --global user.email "email"
!git config --global user.name "user name"
!git config --global credential.helper store
Daha ise Hugging Face platformu üzerinde hesap açınız veya mevcut hesabınızın bilgilerini kullanacağız. Bunun için Hugging Face hesabınızın kullanıcı token bilginizi alınız.
Token almak için : https://huggingface.co/settings/tokens
Bu token'ı ise aşağıdaki alana ekleyiniz. Ekledikten sonra ise başarılı olduğuna dair bir ekran gelecektir. Token bilgisini buraya yazınız.
Sonuç ekranı
Veri Seti İşlemleri
İlk olarak Google Drive içindeki ilgili klasörümüze gidelim ve istediğimiz dosyayı bulalım.
%cd /content/drive/MyDrive/Veri-Kazima/Deneme
#veri setini yükle
dosya_kaydet = "/content/drive/MyDrive/Veri-Kazima/Deneme/2_YENI_TRT_Haber_Spor15834142024_GenisDataSet_CSV.csv"
#veri seti hakkında bilgi al
import pandas as pd
def kelime_sayisi(dosya_adi):
with open(dosya_adi, "r") as dosya:
metin = dosya.read()
kelimeler = metin.split()
return len(kelimeler)
data = pd.read_csv(dosya_kaydet)
data = pd.DataFrame(data)
Burada ise her duruma karşılık "null" değerleri ise dolduralım. "Icerik" sütunu içindeki boş satırları dolduralım. ve yeniden "deneme.csv" isimli bir dosya içine kayedelim. Artık bu dosyayı kullanacağız.
data['Icerik'].fillna('Veri Yok', inplace=True)
data.to_csv("deneme.csv")
Burada ise toplam kelime sayısını görelim.
kelime_sayisi(dosya_kaydet)
Burada ise veri setimizi kullanmaya başlayalım. Bunun için ilgili "deneme.csv" dosyasını kullanalım. Ayrıca veri setinin kullanılabilir haline bakalım.
from datasets import load_dataset
veri_dataset = load_dataset("csv", data_files= "/content/drive/MyDrive/Veri-Kazima/Deneme/deneme.csv")
veri_dataset
Burada ise "train" isimli bir bölüm açalım ve 100 değerine göre 1559 nesne seçelim.
veri_dataset_ornek = veri_dataset["train"].shuffle(seed=100).select(range(1559))
Burada ise istemediğimiz bütün sütunları kaldırabileceğimiz bir özellik kullanalım. Siz istemediğiniz sütunları ise kaldırabilirsiniz.
veri_dataset_ornek = veri_dataset_ornek.remove_columns('Unnamed: 0')
Burada ise veri setindeki her bir satırda yer alan "Icerik" için kelime sayısını bulalım.
#her bir satır değerini ilgili sütun için split et
def kelime_sayisi_bul(example):
return {"Icerik_uzunluk": len(example["Icerik"].split())}
veri_dataset_ornek = veri_dataset_ornek.map(kelime_sayisi_bul)
Burada ise veri seti üzerinde örnek bir düzenleme yapalım.
#veriler için düzenleme yap, gereksiz olanları değiştir veya kaldır
def veri_seti_duzenle(data):
data["Icerik"] = data["Icerik"].replace(',"', '. ')
return {"Icerik": data["Icerik"].replace('Devamını oku', '')}
veri_dataset_ornek = veri_dataset_ornek.map(remove_repeated)
Burada ise veri setini test, train ve validation olarak ayıralım. 100 değeri için 0.7 dağıtma oranı kullanalım ve "test" sütununu alıp "validation" içine ekleyelim.
veri_dataset_ornek = veri_dataset_ornek.train_test_split(train_size=0.9, seed=100)
veri_dataset_ornek["validation"] = veri_dataset_ornek.pop("test")
Burada ise veri setimizi artık Hugging Face içine ekleyelim. Yüklemek istediğiniz alanı yazınız(eğer yok ise kendisi oluşturacaktır.). Ben kendi hesabım içindeki "deneme" isimli alana yükleme yaptım. Bu kodu ise birkaç kez çalıştırmanız gerekebilir, sağlıklı olması açısından.
#veri setini yükle
#reviews_sample.push_to_hub("kullanıcı adı/alan adı")
veri_dataset_ornek.push_to_hub("denizzhansahin/deneme")
Burada ise yüklediğiniz veri setini veya başka bir veri setini indirip kullanabilirsiniz.
#veri setini indir
#downloaded_dataset = load_dataset("kullanıcı adı/alan adı")
from datasets import load_dataset
indirilen_dataset = load_dataset("denizzhansahin/deneme")
indirilen_dataset
Tokenizer Eğitimi
Şimdi ise tokenizer eğitmemiz gerekiyor, kısaca tokenizer bir kelime olabilir ya da bir kelimenin birden fazla parçaya ayrılmış hali olabilir. Biz çalışmamızda ise Turkcell'in kendi tokenizer verilerini kullanacağız ama kendi tokenizer eğitimimizi de yapacağız.
#hazır tokenizer kullanmak
from transformers import AutoTokenizer
uzunluk = 100
hazir_tokenizer = AutoTokenizer.from_pretrained("TURKCELL/Turkcell-LLM-7b-v1") #model içindeki tokenizer al
Hazır olan tokenizer kullanmak için bu koda bir bakınız. Burada ise kelimelere göre uygun token indislerini görmüş olacağız.
txt = "Merhaba bu örnek bir metindir."
tokens = hazir_tokenizer(txt)['input_ids']
print(tokens)
Bu indislere karşılık gelen tokenlara bakmak için kullanabilirsiniz.
tokenlar = hazir_tokenizer.convert_ids_to_tokens(tokens)
print(tokenlar)
Kendi Tokenizer Eğitimini Yap
Şimdi ise kendi tokenizer eğitimini yapalım.
def token_egitme():
batch_size = 1000
return (
veri_dataset_ornek["train"][i : i + batch_size]["Icerik"]
for i in range(0, len(veri_dataset_ornek["train"]), batch_size) #train'den parça parça veriyi al
)
token_egitme_2 = token_egitme()
#hazır bir model ayarından , belirlenen token sayısına göre tokenizer eğitimi
boyut = 10000 #boyut
tokenizer = hazir_tokenizer.train_new_from_iterator(token_egitme_2,boyut) #ayarları yap, indirilen modelden
Şimdi kendi tokenizer bilgilerine göre çıktıları inceleyebilirsin.
txt = "Merhaba bu örnek bir metindir."
tokens = tokenizer(txt)['input_ids']
print(tokens) #kendi veri setinde göre indexler
converted = tokenizer.convert_ids_to_tokens(tokens)
Şimdi ise tokenizer bilgisini kaydedelim.
#token kaydet
file_name="./deneme"
tokenizer.save_pretrained(path+file_name)
print(converted)
Şimdi bu kısımda ise önceden veya yeni yaptığınız tokenizer bilgisini ekleyebilirsiniz.
loaded_tokenizer = AutoTokenizer.from_pretrained("./deneme")
Şimdi ise bu tokenizer bilgisini
#token gönder, huggy face
os.environ["TOKENIZERS_PARALLELISM"] = "false"
tokenizer.push_to_hub("denizzhansahin/deneme")
Huggin Face Veri Hattı
Huggin Face veri hattı (pipeline) ile birlikte verilerimizi TensorFlow için uygun bir yapıya dönüştürmüş olacağız. Bu ise verilerimizi daha kolay yönetmemizi sağlayacaktır.
#gelen text'in tokenlarını al, ve gönder
def tokenize(element):
outputs = tokenizer(
element["Icerik"],
truncation=True,
max_length=uzunluj, #100'dan fazla token'ı kes
return_overflowing_tokens=False, #arta kalan tokenlardan yeni bilgi yaratma
return_length=True, #uzunluğu gönder
)
input_batch = []
for length, input_ids in zip(outputs["length"], outputs["input_ids"]): #zipleme yap, uzunluk ve index
if length == context_length: #uzunluk ve 40 token eşit ise, inputa ekle
input_batch.append(input_ids)
return {"input_ids": input_batch}
islenmis_dataset = indirilen_dataset.map(
tokenize, batched=True, remove_columns=indirilen_dataset["train"].column_names #çıktıdaki kolonları düzenle
)
from transformers import DataCollatorForLanguageModeling
tokenizer.pad_token = tokenizer.eos_token
veri_hatti = DataCollatorForLanguageModeling(tokenizer, mlm=False, return_tensors="tf") #tokenizer'ı al model bir şey false, tensor geri döndürme ise tf, metin üretimi için
Huggin Face ile hazırlanmış veri hattı için TensorFlow yapısına göre veri hattı oluşturduk.
#tensorflow objesine çevir
tf_egitim = islenmis_dataset["train"].to_tf_dataset(
columns=["input_ids", "attention_mask", "labels"],
collate_fn=veri_hatti,
shuffle=True,
batch_size=32,
)
tf_eval = islenmis_dataset["validation"].to_tf_dataset(
columns=["input_ids", "attention_mask", "labels"],
collate_fn=veri_hatti,
shuffle=False,
batch_size=32,
)
Veriler ile Model Eğitimi
Şimdi ise GPT-2 modelini indireceğiz. Ayrıca belirli eğitim ayarlarını yapalım.
from transformers import AutoTokenizer, TFGPT2LMHeadModel, AutoConfig
#gpt-2 modelini indir, mimarisini indir, configurasyonu indir, ağırlık indirmeden, sıfırdan eğit
config = AutoConfig.from_pretrained(
"gpt2",
vocab_size=len(tokenizer),#boyutunu ise tokenizer kadar yap
n_ctx=context_length, #40 olması için
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
#başlangiç ve bitiş tokenizerları ile
)
Şimdi ise modeli indirelim.
#model indir
model = TFGPT2LMHeadModel(config)
model(model.dummy_inputs) # Builds the model
model.summary()
Şimdi ise model eğitimi ayarlarına devam edelim. Burada ise TensorFlow kullanacağız.
#model eğitimi için
from transformers import create_optimizer
import tensorflow as tf
num_train_steps = len(tf_train_dataset)
optimizer, schedule = create_optimizer(
init_lr=5e-5,#başlaması için
num_warmup_steps=1_000,#başlangıç için
num_train_steps=num_train_steps,#her adımda
weight_decay_rate=0.01, #ağırlık azalt
)
Şimdi ise bu model eğitimi için optimizer ayarlayalım.
model.compile(optimizer=optimizer) #kerasın özelliği ile compile et, optimizer ile
tf.keras.mixed_precision.set_global_policy("mixed_float16") #gpu ile eğit
Şimdi ise model eğitimi yapalım. Ben 100 epoch
model.fit(tf_egitim, validation_data=tf_eval, epochs=100) #model eğitimi
Şimdi ise modelimizi Hugging Face içine yükleyelim.
#istersen bunun yerine model eğitimi bittikten sonra
model.push_to_hub("denizzhansahin/deneme")
Model ile Metin Üretimi
Burada ise sırası ile ilgili kütüphanelerimizi yükleyelim. Modelimizi ve tokenizer bilgilerimizi indirdik. Bunları ise veri hattını inşa edelim.
from transformers import pipeline
from transformers import AutoTokenizer, TFGPT2LMHeadModel, AutoConfig
from datasets import load_dataset
model = TFGPT2LMHeadModel.from_pretrained("denizzhansahin/deneme")
tokenlar = AutoTokenizer.from_pretrained("denizzhansahin/deneme")
pipe = pipeline(
"text-generation", model=model, tokenizer=tokenlar, device=0
)
Burada ise istediğiniz bir cümle yazınız. Bu cümleye göre ise model size bir çıktı verecektir.
prompts = ["Pardus topluluk portalı nedir?"]
output0=pipe(prompts, num_return_sequences=1)[0][0]["generated_text"]
print(output0)
Örnek çalışmalar için aşağıdaki bağlantıları takip edebilirsiniz, Burada ise sizin için hazırladığım örnekler vardır:
Hugging Face: https://huggingface.co/denizzhansahin