Soru yanıtlama sistemlerinde BERT!

Ali Orhun Akkirman
4 min readApr 8, 2023

Özellikle veri bilimci olmayan fakat matematik ve bilgisayar bilimlerine yoğun ilgili birisi olarak yakın zamanda Yapay Zeka’da soru yanıtlama (question answering) servisleri ve altyapılarını inceleme fırsatı buldum. Öğrencilik yıllarımdaki NLP’den farklı bir noktada olduğunu gördükten sonra elbette ilgim detaylandı ve öğrendiğim kadarını yazmak istiyorum.

İlk adım

Öncelikle soru yanıtlama işlemini insan odaklı düşündüğümüzde 2 bölüme ayırabiliriz. Birinci kısım “soruyu anlama”, diğeri ise “bildiğimiz kadarıyla cevap verme”. Bu bölümlerden öncelikle soruyu anlama kısmını detaylandırmak gerekecektir.

Yine insan olarak düşündüğümüzde soruyu anlamak için öncelikle soruyu duymamız veya okumamız gerekmektedir. Ve tabi ki bu kelimelerin beynimizde daha önceden “öğrendiğimiz” başka şeylerle eşdeğerinin belirlenmesi gerekmektedir. Herhangi “yarım bildiğimiz bir dil” ile sorulan soruda beynimizin nasıl çalıştığını düşünebiliriz. Önce en çok bildiğimiz kelimeler (soru sıfat ve zamirleri) ve tabi ki sonrasında ana aktör nesne ve fiillerin tanıdık gelmesi veya gelmemesi. Ama bir dakika! Beynimiz gerçekten her seferinde ilk öğrendiğimiz şekilde kelimeleri analiz mi ediyor? “How old are you?” sorusunu duyduğumuzda, gerçekten de cümleyi analiz mi ediyoruz yoksa alışkanlıktan yaşımızı söylüyor veya söylememek mi istiyoruz? Bizim için nasıl çalışıyor bilmiyorum ama yapay zeka’nın bu modelde yaptıklarına bakabiliriz.

Efendim, ne dediniz anlayamadım?

Öncelikle sorudan bahsetmiştik. Soruyu anlamlandırmak için ilk ve en temel aşama “Belirteçleştirme” olarak çevrildiğini gördüğüm “Tokenization” olarak gözükmektedir. Peki nedir bu belirteçleştirme dersek “kelimeleri” matematiksel “vektör uzayına” taşımak için yaptığımız bir aşama olarak düşünebiliriz.

Belirteçleştirme için bazı standart algoritmalar bulunmakla birlikte temel olarak girilen soru içerisindeki kelimeleri belirli bir sözlük yardımı ile belirteçlere (token) çevrilmesi olarak düşünebiliriz.

https://vaclavkosar.com/ml/Tokenization-in-Machine-Learning-Explained

Belirteçler kelimelerin tekil bir id ile ifade edilmesini sağlamaktadır. Dolayısıyla sorumuzu anlamlandıracak bir matematiksel ifade oluşturulabilmektedir. Eğer aynı kelime geçiyorsa bu ifade aynı belirtece karşılık geleceğini anlamak önemlidir.

Sayılar yetmez, vektör verelim

Belirteçlerle kelimelere tekil bir id vermiş olmamızın yanında bir de “gömme” adı verilen embedding diye bir kavram gündemimize girmektedir. Gömme işlemi, belirteçlere karşılık, düşük boyutlu bir vektöre çevrilme işlemidir.

Bu işlemin nedenini nokta ile vektör arasındaki ikişki gibi görüp, vektör ile n boyutlu daha fazla bir ifade içerilebileceği gibi temel bir özellikle bağlamak ilk aşamada yeterli olacaktır. Faydaları ise Lineer Cebir bakış açısıyla belki de tartışılamaz boyutta.

https://vaclavkosar.com/ml/Tokenization-in-Machine-Learning-Explained

Böylelikle her bir belirtece bir vektör gömülmüş oluyor.

Özetle belirteçleştirme (tokenization) metni tamsayı listesine çevirmekte ve gömme (embedding) ise tam sayı listesini vektör listesine çevirmektedir.

Dönüştürücünün gücü adına!

Buraya kadar temel ama güzel bir fikir ile geldik. Bundan sonraki hikaye 2017'de Google’ın duyurduğu “Dönüştürücü” (Transformer) adı verilen model ile başlıyor desek yeridir. Bu model çok özet olarak kodlayıcı-kod çözücü esası ile “dikkat” (attention) kavramını işin içerisine katmakta olduğu görülüyor.

Özetle Dönüştürücü, bir diziyi, Dikkat mekanizması yardımı ile kodlayıcı ve kod çözücü kullanarak başka bir diziye çevirmeye yaramaktadır.

Tüm bu konularla ilgili yazılarda orjinal makalede kullanılan yukarıdaki görsel bulunmaktadır. Bu görseli özetlemek gerekirse solda “kodlayıcı”, sağda ise “kod çözücü” mimarisinin bulunduğunu görmekteyiz. Fakat BERT’te kod çözücü kullanılmadığını söylememiz gerekir.

Bu kısımlarda en önemli nokta kodlayıcıdaki “Multi-Head Attention” kısmı olup, bu kısma “self-attention” olarak isim verilmektedir. Bu kısımda özetle her bir gömülü girdi değeri için farklı şekillerde anahtar-değer çifti olarak arama yapar ve tüm sonuçları “feed-forward” kısmına girdi olarak ekler. “feed-forward” katmanı verileri doğrusal dönüşümle “cross-attention” katmanına ileterek çıkış verileri olasılıklarını sunar.

Ayrıca daha detaylı bilgi için 2018 yılı ile 2021 yılları arasında duyurulan Dönüştürücü modellerini incelemekte de fayda var. GPT ve BERT bu süreçte en çok konuşulanlar olarak görülebilmekte.

Peki ya BERT?

Altyapıdan bahsettikten sonra şimdi BERT hakkında birkaç detaya da girebiliriz. BERT, Apache 2.0 lisansı ile lisanslanmış açık kaynak kodlu bir modeldir. BERT’in internette bulabileceğiniz iki farklı modeli bulunmaktadır. Bunlar Base ve Large modelleridir.

Bu modeller arasındaki en önemli 2 fark Dönüştürücü katman sayısının 12 ve 24 olması ile Parametre sayısının 110 Milyon ve 340 Milyon olması olarak özetleyebiliriz. Bunun yanında çeşitli ihtiyaçlara yönelik bir çok BERT modeli de bulunmaktadır. Daha detaylı bilgi için bu yazıda da bolca yararlandığım adresten bilgi alabilirsiniz.

BERT’in mimarisinde 2 önemli yöntem de bulunmaktadır. Bunlar; MLM yani Maskeli Dil Modeli ve NSP yani Sonraki Cümle Tahmini olarak belirtilmektedir. MLM, herhangi bir cümlede boş bırakılan yere hangi kelimenin gelmesi gerektiğini bulmaya yarayan bir altyapıyı sağlamaktadır. NSP ise farklı cümleler arasında anlam bütünlüğünün sağlanması için gerekli bir yapıdır.

BERT’i nasıl kullanırım?

BERT, Pytorch veya TensorFlow ile rahatlıkla kullanılabilmektedir. Yine bunun için Python ile geliştirilen açık kaynak kodlu bir kütüphane bulunmaktadır. Ve Python paket yöneticisi pip ile rahatlıkla kurulabilmektedir.

pip install transformers

Bu şekilde çeşitli projeler için BERT ve hatta farklı Dönüştürücü modellerini de kullanabilirsiniz.

--

--

Ali Orhun Akkirman

Sistem Yönetim Yazılım Geliştirme Takım Lideri @HAVELSAN