Hızlı Tasarım Sanatı: Hızlı Sınırlar ve Token İyileştirme

May 09 2023
Bu (Marco Tulio Ribeiro ile ortaklaşa yazılmıştır), büyük dil modellerini (LLM'ler) rehberlikle kontrol etmekten bahsettiğimiz hızlı tasarım sanatı üzerine bir dizinin 2. kısmıdır (burada 1. kısım). Bu yazıda, dil modelleri tarafından kullanılan açgözlü tokenleştirme yöntemlerinin istemlerinize nasıl ince ve güçlü bir önyargı getirebileceğini ve şaşırtıcı nesillere yol açabileceğini tartışacağız.
Tüm resimler orijinal kreasyonlardır.

Bu ( Marco Tulio Ribeiro ile ortaklaşa yazılmıştır ) , hızlı tasarım sanatı üzerine bir dizinin 2. bölümüdür ( burada 1. bölüm ), burada büyük dil modellerini (LLM'ler) guidance.

Bu yazıda, dil modelleri tarafından kullanılan açgözlü tokenleştirme yöntemlerinin istemlerinize nasıl ince ve güçlü bir önyargı getirebileceğini ve şaşırtıcı nesillere yol açabileceğini tartışacağız.

Dil modelleri ham metin üzerinde değil, sözcüklere benzer şekilde genellikle birlikte oluşan metin parçaları olan belirteçler üzerinde eğitilir. Bu, dil modellerinin bilgi istemleri de dahil olmak üzere metni nasıl 'gördüğünü' etkiler (çünkü bilgi istemleri yalnızca belirteç kümeleridir). GPT tarzı modeller, tüm giriş baytlarını açgözlü bir şekilde belirteç kimliklerine eşleyen Bayt Çifti Kodlama (BPE) gibi simgeleştirme yöntemlerini kullanır. Bu, eğitim için iyidir, ancak aşağıdaki örnekte gösterildiği gibi, çıkarım sırasında ince sorunlara yol açabilir.

Hızlı sınır problemine bir örnek

Bir HTTP URL dizesi oluşturmaya çalıştığımız aşağıdaki örneği ele alalım:

import guidance

# we use StableLM as an example, but these issues impact all models to varying degrees
guidance.llm = guidance.llms.Transformers("stabilityai/stablelm-base-alpha-3b", device=0)

# we turn token healing off so that guidance acts like a normal prompting library
program = guidance('The link is <a href="http:{{gen max_tokens=10 token_healing=False}}')
program()

      
                
Notebook output.

guidance('The link is <a href="http{{gen max_tokens=10 token_healing=False}}')()

      
                

print_tokens(guidance.llm.encode('The link is <a href="http:'))

      
                

print_tokens(guidance.llm.encode('The link is <a href="http://www.google.com/search?q'))

      
                

Eğitimdeki URL'ler 1358 ( ) belirteci ile kodlanırken ://, istemimiz LLM'nin bunun yerine belirteci 27( :) görmesini sağlar ve bu da yapay olarak bölme yoluyla tamamlamayı iptal eder ://.

Aslında, model belirteci 27( ) görmenin , modelin eğitim verilerinde bu karakterler olacağından, :bir sonraki öğenin aşağıdaki gibi "daha uzun bir belirteç" kullanılarak iki nokta üst üste ile birlikte kodlanmış olabilecek herhangi bir şey olma ihtimalinin çok düşük olduğu anlamına geldiğinden oldukça emin olabilir. ://(daha sonra tartışacağımız bir istisna, eğitim sırasında alt sözcük düzenlemesidir). Bir belirteci görmenin, hem o belirtecin gömülmesini görme anlamına geldiği hem de bundan sonra gelen şeyin açgözlü belirteç oluşturucu tarafından sıkıştırılmadığı gerçeğini unutmak kolaydır, ancak hızlı sınırlarda önemlidir.

Hangilerinin iki nokta üst üste ile başladığını görmek için modelin sözlüğündeki tüm belirteçlerin dize temsilini araştıralım:

print_tokens(guidance.llm.prefix_matches(":"))

      
                

print_tokens(guidance.llm.prefix_matches("http"))

      
                

# Accidentally adding a space, will lead to weird generation
guidance('I read a book about {{gen max_tokens=5 token_healing=False temperature=0}}')()

      
                
# No space, works as expected guidance('I read a book about{{gen max_tokens=5 token_healing=False temperature=0}}')()

guidance('An example ["like this"] and another example [{{gen max_tokens=10 token_healing=False}}')()

      
                

print_tokens(guidance.llm.prefix_matches(" ["))

      
                

İstenmeyen önyargıyı "token iyileştirme" ile düzeltme

Bu istenmeyen önyargılardan kaçınmak için ne yapabiliriz? Bir seçenek, istemlerimizi her zaman daha uzun belirteçlere genişletilemeyen belirteçlerle sonlandırmaktır (örneğin, sohbet tabanlı modeller için bir rol etiketi), ancak bu ciddi bir sınırlamadır.

Bunun yerine, guidanceistemin bitiminden önce oluşturma sürecini otomatik olarak bir belirteçle yedekleyen ve ardından oluşturulan ilk belirteci bilgi istemindeki son belirteçle eşleşen bir öneke sahip olacak şekilde sınırlayan "belirteç iyileştirme" adlı bir özelliği vardır. URL örneğimizde bu, öğesinin kaldırılması :ve ilk belirtecin bir :ön eke sahip olmaya zorlanması anlamına gelir. Belirteç iyileştirme, kullanıcıların belirteç sınırları hakkında endişelenmeden istemleri istedikleri gibi ifade etmelerine olanak tanır.

Örneğin, belirteç iyileştirme açıkken yukarıdaki URL örneklerinden bazılarını yeniden çalıştıralım (Transformer modelleri için varsayılan olarak açıktır, bu nedenle öğesini kaldırırız token_healing=False):

# With token healing we generate valid URLs,
# even when the prompt ends with a colon:
guidance('The link is <a href="http:{{gen max_tokens=10}}')()

      
                
# With token healing, we will sometimes generate https URLs, # even when the prompt ends with "http": program = guidance('''The link is <a href="http{{gen 'completions' max_tokens=10 n=10 temperature=1}}''') program()["completions"]

# Accidentally adding a space will not impact generation
program = guidance('''I read a book about {{gen max_tokens=5 temperature=0}}''')
program()

      
                
# This will generate the same text as above program = guidance('''I read a book about{{gen max_tokens=6 temperature=0}}''') program()

guidance('An example ["like this"] and another example [{{gen max_tokens=10}}')()

      
                

Dil modellerinin nasıl eğitildiğine aşina iseniz, alt kelime düzenlemesinin tüm bunlara nasıl uyduğunu merak ediyor olabilirsiniz . Alt kelime düzenlileştirme, modelin sağlamlığını artırmak için eğitim sırasında optimumun altında belirteçleştirmelerin rastgele tanıtıldığı bir tekniktir. Bu, modelin her zaman en iyi açgözlü simgeleştirmeyi görmediği anlamına gelir. Alt kelime düzenlemesi, modelin belirteç sınırlarına karşı daha sağlam olmasına yardımcı olmakta harikadır, ancak modelin standart açgözlü simgeleştirmeye yönelik önyargısını tamamen ortadan kaldırmaz. Bu, eğitim sırasındaki alt kelime düzenlileştirme miktarına bağlı olarak modellerin az ya da çok belirteç sınırları yanlılığı sergileyebileceği anlamına gelirken, tüm modellerin hala bu yanlılığa sahip olduğu anlamına gelir. Ve yukarıda gösterildiği gibi, model çıktısı üzerinde yine de güçlü ve beklenmedik bir etkiye sahip olabilir.

Çözüm

Bilgi istemleri yazarken, açgözlü belirteçleştirmenin, özellikle bilgi istemi daha uzun bir simgeye genişletilebilecek bir belirteçle sona erdiğinde, dil modellerinin istemlerinizi nasıl yorumladığı üzerinde önemli bir etkiye sahip olabileceğini unutmayın. Bu gözden kaçması kolay önyargı kaynağı, sonuçlarınızı şaşırtıcı ve istenmeyen şekillerde etkileyebilir.

Bunu ele almak için isteminizi genişletilemez bir belirteçle sonlandırın veya guidance"belirteç iyileştirme" özelliği gibi bir şey kullanın, böylece belirteç sınırı yapaylıkları hakkında endişelenmeden istemlerinizi istediğiniz gibi ifade edebilirsiniz.

Bu makaledeki sonuçları kendiniz yeniden oluşturmak için not defteri sürümünü kontrol edin.