Niceleme, büyük bir gerçek sayılar kümesindeki değerleri küçük ayrı bir kümedeki değerlere eşleme işlemi olarak tanımlanabilir. Tipik olarak bu, sürekli girişlerin çıkıştaki sabit değerlerle eşlenmesini içerir. Bunu başarmanın yaygın bir yolu yuvarlama veya kesmedir. Yuvarlama durumunda en yakın tam sayı hesaplanır. Örneğin 1,8 değeri 2 olur. Ancak 1,2 değeri 1 olur. Kesilme durumunda, girişi tam sayıya dönüştürmek için ondalık sayıdan sonraki değerleri körü körüne kaldırırız.
Hangi yoldan gidersek gidelim, derin sinir ağlarının kuantizasyonunun ardındaki temel motivasyon, çıkarım hızını arttırmaktır çünkü sinir ağlarının çıkarımının ve eğitiminin hesaplama açısından oldukça pahalı olduğunu söylemeye gerek yoktur. Büyük Dil Modellerinin ortaya çıkışıyla birlikte, bu modellerdeki parametre sayısı yalnızca artıyor, bu da bellek ayak izinin giderek arttığı anlamına geliyor.
Bu sinir ağlarının gelişme hızıyla birlikte, bu sinir ağlarını dizüstü bilgisayarlarımızda, cep telefonlarımızda ve hatta saat gibi küçük cihazlarımızda çalıştırmaya yönelik talep de artıyor. Bunların hiçbiri kuantizasyon olmadan mümkün değildir.
Kuantizasyona dalmadan önce, eğitilmiş Sinir Ağlarının bilgisayarın belleğinde saklanan yalnızca değişken sayılar olduğunu unutmayalım.
Sayıların bilgisayarlarda saklanmasına yönelik iyi bilinen temsillerden veya formatlardan bazıları float32 veya FP32, float16 veya FP16, int8, bfloat16'dır; burada B, Google Brain anlamına gelir veya daha yakın zamanda, matris veya tensörü işlemek için özel bir format olan tensor float 32 veya TF32'dir. operasyonlar. Bu formatların her biri belleğin farklı bir kısmını tüketir. Örneğin, float32 işaret için 1 bit, üs için 8 bit ve mantis için 23 bit ayırır.
Benzer şekilde, float16 veya FP16 işaret için 1 bit ayırır, ancak üs için yalnızca 5 bit ve mantis için 10 bit ayırır. Öte yandan BF16 üs için 8 bit, mantis için ise sadece 7 bit ayırır.
Bu kadar temsil yeter. Demek istediğim, daha yüksek bir bellek formatından daha düşük bir bellek formatına dönüşüme nicemleme adı verilmektedir. Derin öğrenme açısından konuşursak, Float32'ye tek veya tam hassasiyet, Float16 ve BFloat16'ya ise yarı hassasiyet denir. Derin öğrenme modellerinin eğitilme ve saklanmasındaki varsayılan yöntem tam hassasiyettir. En sık kullanılan dönüşüm, tam duyarlıktan int8 formatına yapılan dönüşümdür.
Niceleme tek biçimli veya tek biçimli olmayabilir. Tekdüze durumda, girişten çıkışa eşleme, eşit aralıklı girişler için eşit aralıklı çıktılarla sonuçlanan doğrusal bir fonksiyondur. Düzgün olmayan durumda, girişten çıkışa eşleme doğrusal olmayan bir fonksiyondur, dolayısıyla çıkışlar tekdüze bir giriş için eşit aralıklı olmayacaktır.
Tek biçimli tipe bakıldığında, doğrusal haritalama işlevi bir ölçeklendirme ve yuvarlama işlemi olabilir. Dolayısıyla tek biçimli nicemleme, denklemde bir ölçeklendirme faktörü olan S'yi içerir.
Float16'dan int8'e dönüştürürken, her zaman -127 ile artı 127 arasındaki değerlerle sınırlandırabildiğimize ve girdinin sıfırının çıktının sıfırıyla mükemmel bir şekilde eşleştiğinden emin olabileceğimize ve simetrik bir eşlemeye yol açabileceğine dikkat edin ve bu niceleme bu nedenle simetrik olarak adlandırılır. nicemleme .
Öte yandan sıfırın her iki tarafındaki değerler aynı değilse örneğin -128 ile +127 arasında. Ek olarak, eğer girdinin sıfırını çıktıdaki sıfırdan başka bir değerle eşleştiriyorsak buna asimetrik nicemleme denir. Artık çıktıda sıfır değeri kaydırıldığı için, sıfır faktörünü ( Z ) denkleme dahil ederek bunu denklemimizde saymamız gerekir.
Ölçek faktörünü ve sıfır noktasını nasıl seçebileceğimizi öğrenmek için yukarıdaki şekildeki gibi reel sayı ekseninde dağıtılmış bir örnek girişi ele alalım. Ölçek faktörü esasen tüm girdi aralığını minimum değer r_min'den maksimum değer r_max'a kadar tek tip bölümlere ayırır. Ancak bu girdiyi bir noktada, örneğin negatif değerler için alfa ve pozitif değerler için beta olarak kesmeyi seçebiliriz. Alfa ve betanın ötesindeki herhangi bir değer anlamlı değildir çünkü alfa ile aynı çıktıya eşlenir. Bu örnekte -127 ve +127'dir. Bu kırpma değerlerinin alfa ve beta ve dolayısıyla kırpma aralığının seçilmesi işlemine kalibrasyon adı verilir.
Aşırı kırpmayı önlemek için en kolay seçenek alfayı r_min'e ve betayı da r_max'a eşit olacak şekilde ayarlamak olabilir. Ve bu r_min ve r_max değerlerini kullanarak S ölçek faktörünü memnuniyetle hesaplayabiliriz. Ancak bu, çıktının asimetrik olmasına neden olabilir. Örneğin girişteki r_max 1,5 olabilirken r_min yalnızca -1,2 olabilir. Dolayısıyla simetrik nicelemeyi sınırlamak için alfa ve betanın ikisinin maksimum değerleri olmasına ihtiyacımız var ve elbette sıfır noktasını 0 olarak ayarlıyoruz.
Eğitilmiş ağırlıklar çıkarım sırasında önceden hesaplandığından ve çıkarım sırasında değişmeyeceğinden, sinir ağı ağırlıkları nicelenirken tam olarak simetrik niceleme kullanılır. Sıfır noktası 0'a ayarlandığından hesaplama asimetrik duruma göre daha basittir.
Şimdi girdilerin bir yöne, örneğin olumlu tarafa doğru çarpık olduğu bir örneği inceleyelim. Bu, ReLU veya GeLU gibi en başarılı aktivasyon fonksiyonlarından bazılarının çıktısına benzer. Üstelik aktivasyonların çıktıları da girdiyle birlikte değişir. Örneğin, bir kedinin iki görüntüsünü gösterdiğimizde aktivasyon fonksiyonlarının çıktısı oldukça farklıdır. Şimdi soru şu: "Kuantizasyon aralığını ne zaman kalibre edeceğiz?" Antrenman sırasında mı? Veya çıkarım sırasında ve tahmin için verileri ne zaman aldığımızda?
Bu soru, özellikle Eğitim Sonrası Niceleme'de (PTQ) çeşitli niceleme modlarına yol açmaktadır. PTQ'da ek eğitim yapmadan, önceden eğitilmiş bir modelle başlıyoruz. Modelden gereken önemli veriler, kırpma aralığını ve ardından ölçek faktörünü (S) ve sıfır noktasını (Z) hesaplamak için kullanılan kalibrasyon verilerini içerir. Tipik olarak bu kalibrasyon verileri model ağırlıklarından elde edilir. Kalibrasyon işleminden sonra modeli kuantize etmeye başlayabiliriz ve sonuçta kuantize edilmiş model elde edilir.
Kuantizasyon Farkında Eğitimde veya kısaca QAT'de, standart prosedürü kullanarak eğitilmiş modeli nicelleştiririz, ancak daha sonra nicelenmiş modeli elde etmek için yeni eğitim verilerini kullanarak daha fazla ince ayar veya yeniden eğitim yaparız. QAT genellikle kayıp doğruluğu veya niceleme sırasında ilgilendiğimiz herhangi bir ölçümü kurtarmak amacıyla modelin parametresini ayarlamak için yapılır. Dolayısıyla QAT, eğitim sonrası kuantizasyondan daha iyi modeller sağlama eğilimindedir.
İnce ayarın yapılabilmesi için modelin türevlenebilir olması gerekir. Ancak niceleme işlemi türevlenemez. Bunun üstesinden gelmek için doğrudan tahmin ediciler gibi sahte niceleyiciler kullanıyoruz. İnce ayar sırasında, bu tahminciler niceleme hatasını tahmin eder ve daha iyi performans için modele ince ayar yapmak üzere hatalar eğitim hatasıyla birlikte birleştirilir. İnce ayar sırasında, nicelenmiş model üzerinde kayan noktalı ileri ve geri geçişler gerçekleştirilir. Ancak parametreler her gradyan güncellemesinden sonra nicelenir.
Derin öğrenmede model nicemlemeyi açıklayan aşağıdaki videoya göz atın
Bu, nicelemenin temellerini hemen hemen kapsıyor. Kuantizasyon ihtiyacıyla ve simetrik ve asimetrik gibi farklı kuantizasyon türleriyle başladık. Ayrıca niceleme parametrelerini (yani ölçek faktörünü ve sıfır noktasını) nasıl seçebileceğimizi de hızlı bir şekilde öğrendik. Ve farklı kuantizasyon modlarıyla sona erdik. Peki bunların hepsi PyTorch veya TensorFlow'da nasıl uygulanır? Bu başka bir gün için. Umarım bu video size Derin Öğrenmede Niceleme hakkında biraz fikir vermiştir.
Bir sonraki yazımda görüşürüz umarım. O zamana kadar kendine iyi bak!