paint-brush
Telegram Sohbet Geçmişimle Bir Llm'ye İnce Ayar Yaptım. İşte Öğrendiklerimile@furiousteabag
634 okumalar
634 okumalar

Telegram Sohbet Geçmişimle Bir Llm'ye İnce Ayar Yaptım. İşte Öğrendiklerim

ile Alex7m2024/06/13
Read on Terminal Reader

Çok uzun; Okumak

Yazı stilimi ve konuşma kalıplarımı kopyalayıp kopyalayamayacağını görmek için Telegram mesajlarımı kullanarak bir dil modeline ince ayar yaptım. Performansı nedeniyle Mistral 7B modelini seçtim ve hem LoRA (düşük dereceli adaptasyon) hem de tam ince ayar yaklaşımlarını denedim. Beş yıl boyunca toplam 15.789 oturuma ulaşan tüm Telegram mesajlarımı çıkardım ve başlangıçta genel sohbete ince ayarlı Mistral modeliyle test ettim. LoRA için, RTX 3090 üzerindeki eğitim 5,5 saat sürdü ve maliyeti 2 dolardı; bu da stil taklitçiliğini geliştiriyor ancak bağlam ve dilbilgisi konusunda zorluk çekiyordu. Sekiz A100 GPU'yu kullanan tam ince ayar, dil performansını ve bağlam korumasını iyileştirdi, ancak yine de bazı hatalar vardı. Genel olarak model, konuşma tarzını ve ortak konuları iyi bir şekilde yakalasa da yanıtlarda çoğunlukla bağlam eksikliği yaşadı.
featured image - Telegram Sohbet Geçmişimle Bir Llm'ye İnce Ayar Yaptım. İşte Öğrendiklerim
Alex HackerNoon profile picture
0-item
1-item

Etkileşimde bulunduğum çoğu insan için çoğu zaman yalnızca metin tabanlı bir programdan ibaretim. Giriş ve çıkış bu kadar basitse, model benim değiştirilebilir mi? Bunun işe yaraması için modelin yalnızca yazma tarzımı anlaması değil, aynı zamanda benim hakkımda da çok şey bilmesi gerekiyor. Bunun için en iyi kaynak, günlük olarak kullandığım Telegram messenger'ımdır ve sohbet geçmişleri biçiminde düşüncelerim ve eylemlerim hakkında neredeyse her şeyi içerir.

Yaklaşmak

En basit yaklaşım, tüm mesajlarımı çıkarmak, bunları ChatGPT'nin bağlamına yüklemek ve yeni mesajlara yanıt verirken tarzımı taklit etmek için bu bilgileri kullanması talimatını vermek olacaktır. Ancak bu yaklaşım bağlam penceresi boyutuyla sınırlıdır ve önemli noktaları çıkarmak için iletileri önceden işlememi gerektirir. Bu güçlükten kaçınmak istediğim için, gerektiğinde gerekli bilgileri almak için belki de Erişim Artırılmış Üretim (RAG) kullanılabilir. Ancak deneyimlerime göre, sohbet oturumları gibi çeşitli verilerden veri almak genellikle geri alma modelinde denetimli bir ince ayar gerektirir ve ben böyle bir veri kümesi oluşturmaya pek meraklı değilim. Bu nedenle ince ayar en iyi seçenek gibi görünüyor. Birkaç nedenden dolayı idealdir: Yazma stilimi yansıtmalı ve önemli olanı seçmek zorunda kalmadan tüm mesajlarımdan potansiyel olarak bilgi toplamalıdır.


OpenAI ince ayar yetenekleri sunuyor ancak özel mesajlarımı kullanacağım için üçüncü taraf ince ayar hizmetlerini kullanmak istemiyorum. Bu yüzden bir temel model seçmem gerekiyor. Hugging Face Open LLM Leaderboard'a göre en küçük modellerden biri (≤13B parametreleri) Mistral 7B'dir . Hatta Llama 2 13B'den bile daha iyi performans gösteriyor. Şimdi soru, LoRA'nın yeterli olup olmadığı veya tam ince ayarın gerekli olup olmadığıdır. Çeşitli karşılaştırmalar [1] [2] LoRA'nın tam ince ayardan biraz daha kötü olduğunu ancak çoğu zaman hala iyi olduğunu göstermektedir. Bununla birlikte, benimki gibi belirli görevler (Rus dili + sohbet) için, araştırmacıların Lama talimatlarının ince ayarını Çince olarak gerçekleştirdikleri, karmaşıklık açısından hedefime benzer bir makale buldum. Önceden talimat ayarı yapılmadan temel modelde LoRA tabanlı ayarın, tam ince ayardan daha az etkili olduğunu buldular. Ancak talimatlar için halihazırda ince ayar yapılmış bir model üzerinde LoRA tabanlı ayarlama, karşılaştırılabilir sonuçlar verebilir. Benim durumumda bu, ya temel modelde tam ince ayar yapılması ya da Rusça sohbet için zaten ince ayar yapılmış bir modelde LoRA anlamına geliyor. Rusça sohbet için ince ayarlı bir model bulamadığım için LoRA'yı, ince ayarlı Mistral modeli Dolphin gibi İngilizce sohbet için ince ayarlı bir model üzerinde deneyeceğim.


Yani plan şu:

  1. Mistral'in ince ayarlı İngilizce sohbeti Dolphin'in yanı sıra LoRA ile başlayın
  2. Kalite yeterli değilse Mistral'da tam ince ayar yapmayı deneyin

Veri Hazırlama

Telegram gibi uygulamalardaki mesajlaşmanın e-postalara kıyasla benzersiz bir yönü, konuşma akışıdır. Mesajlar genellikle siz ve kişiniz arasında tek tek değişmez. Bunun yerine, kendinizi sıklıkla arka arkaya birkaç mesaj gönderirken ve ardından diğer kişiden birkaç yanıt alırken bulursunuz. Bu mesajlar da genellikle kısadır. Verilerimde bu doğal konuşma tarzını korumak istedim.


Telegram, tüm sohbetleri JSON'a aktarmak için yerleşik bir özellik sunar. Mesajları biraz filtreleyip oturumlar halinde grupladıktan sonra, Telegram'ı kullandığım son beş yıla ait verileri derledim. Bu, ortalama 8,51 mesaj uzunluğundaki 466 sohbetten 15.789 oturumla sonuçlandı. Verileri yapılandırmak için ChatML bilgi istemi formatını seçtim. İşte örnek bir oturum (Rusça'dan tercüme edilmiştir):


<|im_start|>John Smith
>>> kahretsin, 135 süre sınırını aşamıyorum

>>> her şeyi en iyi şekilde yapmaya çalışıyorum ama şansım yok<|im_end|>

<|im_start|>Alexander Smirnov
>>> evet aynı

>>> hala aynı fikirde misin?<|im_end|>

<|im_start|>John Smith
>>> bilmiyorum, sanırım aynı fikirdeyiz

>>> dediğin gibi

>>> ters çevrilmiş dizeyle gidip orada bir şey bulmaya çalışmak

>>> gerçekten bok gibi görünüyor çünkü z işlevi her şeyi mahvediyor……………………<|im_end|>

<|im_start|>Alexander Smirnov
>>> z'nin bu işin neresine girdiğini anlamadım<|im_end|>

<|im_start|>John Smith
>>> bilmiyorum, her şeyi yinelemeli olarak yapıyorum gibi görünüyor, ancak evet, z işlevini oluşturmak için bazı dizeleri tersine çevirmem gerekiyor

>>> ve bu sadece rastgele bir çözüm

>>> tartışmalardan<|im_end|>

<|im_start|>Alexander Smirnov
>>> anladım<|im_end|>


Veri derleyicim, kaybın yalnızca birinin yanıtına göre hesaplanmasını sağlıyor. Sırada kimin konuşacağını tahmin etmek nispeten basittir ve modelin bunu öğrenmeye odaklanmasını istemiyoruz. Bu nedenle konuşmanın kaybın hesaplandığı kısımları kalın harflerle vurgulanmıştır.


Kayıp hesaplamasında sadece benim yanıtlarımın değil, başkalarının yanıtlarının da kullanıldığını fark etmişsinizdir. Bu kasıtlıdır. Bunu yaparak, model sadece benim gibi değil aynı zamanda sık sık konuştuğum ortaklarım olarak da rol oynayabilecek!

Değerlendirme planı

Modelleri iki şekilde sohbet ederek test edeceğim. Öncelikle model beni taklit edecek ve ben de farklı arkadaşlarımın bakış açısından kendimle sohbet edeceğim. Daha sonra model arkadaşım gibi davranırken ben de kendim gibi sohbet edeceğim. Konuşma başlatıcım her zaman aynı 2 mesaj olacak: "hey" ve "naber?" (Rusça’da “прив” ve “как дела?”). Oluşturulan ifadeler ve kişiler model olarak kimlerden hareket ettiği vurgulanacaktır . Test için oobabooga/text-jenerasyon-webui kullanacağım.


Başlangıçta, genel konuşmanın ince ayarlı Mistral modelinin, benden herhangi bir ön eğitim almadan bu görevle nasıl başa çıktığını keşfetmek istiyorum.


Arkadaş 1 vs Alexander Smirnov


Alexander Smirnov, Arkadaş 1'e Karşı


Tamam, tutarlı cümleler kurma yeteneğine sahip. En göze çarpan sorun, konuşmaların bağlamına ilişkin farkındalık eksikliğidir, bu da yumuşak ve genel yanıtlara yol açmaktadır. Mesajlar belirgin bir üsluptan yoksundu ve oldukça basit bir his veriyordu. Diğer bir konu ise modelin Rusçasının zayıf olmasıdır. Model, birincil dil olan İngilizce dışındaki dillere genelleştirilemeyecek kadar küçük olduğundan bu beklenen bir durumdur. Ek olarak, model aşırı derecede proaktif olma eğilimindeydi ve neredeyse her cümleyi bir soruyla bitiriyordu; bu, gerçek insanların genellikle mesajlaşma programlarında iletişim kurma şekli değildir.


Bütün bunları düzeltmeye çalışalım!

LoRA

LoRA, hem eğitim hattı hem de donanım gereksinimleri açısından düşük çaba gerektiren bir yaklaşım sunar. Toplam ağırlığın yaklaşık %1'ini çalıştırır. 1024 dizi uzunluğunu ve 8 parti boyutunu seçtim. RTX 3090'da 20 GB VRAM tüketen eğitim, üç dönem sürdü ve 5,5 saat sürdü. Bunun için, GPU maliyetinin saat başına 0,362 ABD doları olduğu, deneyler ve hata düzeltmeleri için harcanan süre hariç, tüm eğitim için toplam 2 ABD doları olan geniş.ai'yi kullandım.


Sonuçlar burada:


Arkadaş 1 vs Alexander Smirnov


Arkadaş 2 Alexander Smirnov'a karşı


Alexander Smirnov, Arkadaş 1'e Karşı


Alexander Smirnov Arkadaş 2'ye Karşı


Bu daha iyi. Adına yanıt verdiği kişinin tarzını kesinlikle yansıtıyor. Ayrıca belirli insan çiftleri arasında tartışılan en yaygın konuları da tanımlar. Örneğin, arkadaş 2'de odak noktası açıkça daha çok iş üzerindedir. Ancak dilbilgisi hâlâ bozuk ve konuşmanın bağlamı hızla kayboluyor. LoRA'nın İngilizce'de makul kalitede çalışacağından ve tam ince ayar gerekmeyebileceğinden oldukça eminim. Ancak modelin ana dili Rusça olmadığından tam ince ayar yapmayı deneyelim.

Tam ince ayar

Çoklu GPU eğitimine duyulan ihtiyaç nedeniyle tam ince ayar yapmak daha zordur. Popüler yöntemler arasında ZeRO ve DeepSpeed [3] veya FSDP [4] bulunur; FSDP esas olarak bir ZeRO3'tür [5] . FSDP'ye gitmeye karar verdim.


Eğitim hattını uygularken Stanford Alpaca ince ayar koduna ve Anton Bacaj'ın Mistral ince ayar koduna başvurdum.


1024 dizi uzunluğuna ve 2 mikro toplu iş boyutuna sahip yarı duyarlı bir FSDP tam parçanın kullanılması, sekiz A100 80 GB GPU'nun her birinde 63 GB VRAM gerektiriyordu. Üç dönem süren eğitim sadece 20 dakika sürdü. VM'nin toplam maliyeti saat başına 8,88 dolardı; bu da deneyler ve hata düzeltmeleri için harcanan süre hariç 3 dolar anlamına geliyordu.


Konuşmalar:


Arkadaş 1 vs Alexander Smirnov


Arkadaş 2 Alexander Smirnov'a karşı


Alexander Smirnov, Arkadaş 1'e Karşı


Alexander Smirnov Arkadaş 2'ye Karşı


Konuşmalar daha ilginç ve ilgi çekici hale geldi, ancak hâlâ bağlamı kaybetme riski var. Rusça dil performansı iyileşti ancak hatalar hâlâ devam ediyor. Benimki gibi sınırlı verilere sahip belirli bir göreve ince ayar yapmadan önce, büyük bir Rusça metin külliyatı üzerinde denetimsiz olarak modele ince ayar yapmanın faydalı olacağına inanıyorum. Ek olarak, ortak konuşma ortaklarının adlarının ayrı belirteçler olarak birleştirilmesi kaliteyi artırabilir.


LoRA'dan çok daha iyi olduğunu söyleyemem. Konuşma partnerlerinin her birini öğrenmeye çalışmak yerine yalnızca tek bir kişiye odaklanmak ve kaybı yalnızca benim yanıtlarıma (veya bir başkasının yanıtlarına) dayanarak hesaplamak daha etkili olabilir.

Düşünceleri kapatmak

Elbette, modelin yanıtlarının çoğunun yetersiz olması nedeniyle değil, birçoğunun doğal olarak sık görülen "Seni sonra arayacağım", "meşgul" ve "tamam" gibi basit yanıtlar olması nedeniyle sonuçları isteğe göre seçmek zorunda kaldım. konuşmalarda. Buna rağmen modelin, taklit ettiği kişinin tarzını taklit etme konusunda başarılı olduğu açık. Aynı zamanda iki kişi arasında yaygın olarak tartışılan konuları da yakalar. Ancak konuşmalarda bağlamdan önemli ölçüde yoksundur. "Evet, öyle mi?" gibi sorulara yanıt vermek veya "hafta sonu için planlarınız neler?" tam bir bağlam olmadan zorlayıcıdır. Belki kullanıcının bilgisayarda yaptığı her şeyi kaydeden Rewind gibi bir sistemin kullanılması yararlı olabilir.

Kod

Bu projenin kodunu ve bunu kendiniz nasıl kopyalayacağınıza ilişkin talimatları github depomdaki kendi Telegram dökümünüzde bulabilirsiniz. Eğitim günlüklerine WandB'den erişilebilir.