🏷️sec_information_theory
Evren bilgi ile dolup taşıyor. Bilgi, disiplinler arası açıklıklarda ortak bir dil sağlar: Shakespeare'in Sone'sinden Cornell ArXiv'deki araştırmacıların makalesine, Van Gogh'un eseri Yıldızlı Gece'den Beethoven'in 5. Senfonisi'ne, ilk programlama dili Plankalkül'den son teknoloji makine öğrenmesi algoritmalarına. Biçimi ne olursa olsun, her şey bilgi teorisinin kurallarını izlemelidir. Bilgi teorisi ile, farklı sinyallerde ne kadar bilgi bulunduğunu ölçebilir ve karşılaştırabiliriz. Bu bölümde, bilgi teorisinin temel kavramlarını ve bilgi teorisinin makine öğrenmesindeki uygulamalarını inceleyeceğiz.
Başlamadan önce, makine öğrenmesi ve bilgi teorisi arasındaki ilişkiyi özetleyelim. Makine öğrenmesi, verilerden ilginç sinyaller çıkarmayı ve kritik tahminlerde bulunmayı amaçlar. Öte yandan, bilgi teorisi, bilgiyi kodlama, kod çözme, iletme ve üstünde oynama yapmayı inceler. Sonuç olarak, bilgi teorisi, makine öğrenmesi sistemlerinde bilgi işlemeyi tartışmak için temel bir dil sağlar. Örneğin, birçok makine öğrenmesi uygulaması çapraz entropi kaybını şurada açıklandığı gibi kullanır :numref:sec_softmax
. Bu kayıp, doğrudan bilgi teorisel değerlendirmelerinden türetilebilir.
Bilgi teorisinin "ruhu" ile başlayalım: Bilgi. Bilgi, bir veya daha fazla kodlama biçimli belirli bir dizi ile kodlanabilir. Kendimizi bir bilgi kavramını tanımlamaya çalışmakla görevlendirdiğimizi varsayalım. Başlangıç noktamız ne olabilir?
Aşağıdaki düşünce deneyini düşünün. Kart destesi olan bir arkadaşımız var. Desteyi karıştıracaklar, bazı kartları ters çevirecekler ve bize kartlar hakkında açıklamalar yapacaklar. Her ifadenin bilgi içeriğini değerlendirmeye çalışacağız.
Önce, bir kartı çevirip bize "Bir kart görüyorum" diyorlar. Bu bize hiçbir bilgi sağlamaz. Durumun bu olduğundan zaten emindik, bu yüzden bilginin sıfır olduğu umuyoruz.
Sonra bir kartı çevirip "Bir kalp görüyorum" diyorlar. Bu bize biraz bilgi sağlar, ancak gerçekte, her biri eşit olasılıkla mümkün olan yalnızca
Sonra, bir kartı çevirip "Bu maça
Bunu mantıksal uç noktaya götürelim. Sonunda destedeki her kartı çevirdiklerini ve karışık destenin tüm dizisini okuduklarını varsayalım. Destede
Geliştirdiğimiz herhangi bir bilgi kavramı bu sezgiye uygun olmalıdır. Aslında, sonraki bölümlerde bu olayların
Bu düşünce deneylerini okursak, doğal bir fikir görürüz. Başlangıç noktası olarak, bilgiyi önemsemekten ziyade, bilginin olayın sürpriz derecesini veya soyut olasılığını temsil ettiği fikrini geliştirebiliriz. Örneğin, alışılmadık bir olayı tanımlamak istiyorsak, çok fazla bilgiye ihtiyacımız var. Genel (sıradan) bir olay için fazla bilgiye ihtiyacımız olmayabilir.
1948'de Claude E. Shannon bilgi teorisini oluşturan İletişimin Bir Matematiksel Teorisi (A Mathematical Theory of Communication) çalışmasını yayınladı :cite:Shannon.1948
. Shannon makalesinde ilk kez bilgi entropisi kavramını tanıttı. Yolculuğumuza buradan başlayacağız.
Bilgi bir olayın soyut olasılığını içerdiğinden, olasılığı bit adeti ile nasıl eşleştirebiliriz? Shannon, başlangıçta John Tukey tarafından oluşturulmuş olan bit terimini bilgi birimi olarak tanıttı. Öyleyse "bit" nedir ve bilgiyi ölçmek için neden onu kullanıyoruz? Tarihsel olarak, antika bir verici yalnızca iki tür kod gönderebilir veya alabilir:
Şimdi, herhangi bir kod dizisi için, her
yani bu
Öz-bilgiyi aşağıda gösterildiği gibi hesaplayabiliriz. Ondan önce, önce bu bölümdeki gerekli tüm paketleri içe aktaralım.
from mxnet import np
from mxnet.metric import NegativeLogLikelihood
from mxnet.ndarray import nansum
import random
def self_information(p):
return -np.log2(p)
self_information(1 / 64)
#@tab pytorch
import torch
from torch.nn import NLLLoss
def nansum(x):
# Define nansum, as pytorch doesn't offer it inbuilt.
return x[~torch.isnan(x)].sum()
def self_information(p):
return -torch.log2(torch.tensor(p)).item()
self_information(1 / 64)
#@tab tensorflow
import tensorflow as tf
def log2(x):
return tf.math.log(x) / tf.math.log(2.)
def nansum(x):
return tf.reduce_sum(tf.where(tf.math.is_nan(
x), tf.zeros_like(x), x), axis=-1)
def self_information(p):
return -log2(tf.constant(p)).numpy()
self_information(1 / 64)
Öz-bilgi yalnızca tek bir ayrık olayın bilgisini ölçtüğü için, ayrık veya sürekli dağılımın herhangi bir rastgele değişkeni için daha genelleştirilmiş bir ölçüme ihtiyacımız var.
Ne istediğimiz konusunda belirli olmaya çalışalım. Bu, Shannon entropisinin aksiyomları olarak bilinenlerin gayri resmi bir ifadesi olacaktır. Aşağıdaki sağduyu beyanları topluluğunun bizi benzersiz bir bilgi tanımına zorladığı ortaya çıkacaktır. Bu aksiyomların usule uygun bir versiyonu, diğer birçoklarıyla birlikte şu adreste bulunabilir :cite:Csiszar.2008
.
- Rastgele bir değişkeni gözlemleyerek kazandığımız bilgi, elemanlar dediğimiz şeye veya olasılığı sıfır olan ek elemanların varlığına bağlı değildir.
- İki rastgele değişkeni gözlemleyerek elde ettiğimiz bilgi, onları ayrı ayrı gözlemleyerek elde ettiğimiz bilgilerin toplamından fazlası değildir. Bağımsız iseler, o zaman tam toplamdır.
- (Neredeyse) Kesin olayları gözlemlerken kazanılan bilgi (neredeyse) sıfırdır.
Bu gerçeğin kanıtlanması kitabımızın kapsamı dışında olduğu halde, bunun entropinin alması gereken şekli benzersiz bir şekilde belirlediğini bilmek önemlidir. Bunların izin verdiği tek belirsizlik, daha önce gördüğümüz seçimi yaparak normalize edilen temel birimlerin seçimidir; tek bir adil yazı tura ile sağlanan bilginin bir bit olması gibi.
Olasılık yoğunluk fonksiyonu (pdf/oyf) veya olasılık kütle fonksiyonu (pmf/okf)
eq_ent_def
Belirleyici olmak gerekirse,
Aksi takdirde,
Entropiyi aşağıdaki gibi tanımlayabiliriz.
def entropy(p):
entropy = - p * np.log2(p)
# `nansum` işlemcisi, nan (not a number - sayı olmayan) olmayan sayıyı toplayacaktır
out = nansum(entropy.as_nd_ndarray())
return out
entropy(np.array([0.1, 0.5, 0.1, 0.3]))
#@tab pytorch
def entropy(p):
entropy = - p * torch.log2(p)
# `nansum` işlemcisi, nan (not a number - sayı olmayan) olmayan sayıyı toplayacaktır
out = nansum(entropy)
return out
entropy(torch.tensor([0.1, 0.5, 0.1, 0.3]))
#@tab tensorflow
def entropy(p):
return nansum(- p * log2(p))
entropy(tf.constant([0.1, 0.5, 0.1, 0.3]))
Merak ediyor olabilirsiniz: Entropi tanımında :eqref:eq_ent_def
, neden negatif bir logaritma ortalaması kullanıyoruz? Burada bazı sezgileri verelim.
İlk olarak, neden logaritma işlevi
Sonra, neden negatif
Son olarak, beklenti (ortalama) işlevi nereden geliyor? Rastgele bir değişken olan
Yukarıdaki örnekler ve yorumlarla, entropinin :eqref:eq_ent_def
şu özelliklerini türetebiliriz. Burada,
-
Tüm ayrık
$X$ değerleri için$H(X) \geq 0$ 'dır (sürekli$X$ için entropi negatif olabilir). -
Bir o.y.f veya o.k.f.
$p(x)$ ile$X \sim P$ ise ve o.y.f veya o.k.f.$q(x)$ 'ya sahip yeni bir olasılık dağılımı$Q$ ile$P$ 'yi tahmin etmeye çalışıyoruz, o zaman$$H(X) = - E_{x \sim P} [\log p(x)] \leq - E_{x \sim P} [\log q(x)], \text {eşitlikle ancak ve ancak eğer } P = Q.$$ Alternatif olarak,$H(X)$ ,$P$ 'den çekilen sembolleri kodlamak için gereken ortalama bit sayısının alt sınırını verir. -
$X \sim P$ ise,$x$ tüm olası sonuçlar arasında eşit olarak yayılırsa maksimum bilgi miktarını iletir. Özel olarak,$P$ $k$ -sınıflı ayrık olasılık dağılımı${p_1, \ldots, p_k }$ ise, o halde$$H(X) \leq \log(k), \text {eşitlikle ancak ve ancak eğer } p_i = \frac{1}{k}, \forall i.$$ Eğer$P$ sürekli bir rastgele değişkense, öykü çok daha karmaşık hale gelir. Bununla birlikte, ek olarak$P$ 'nin sonlu bir aralıkta (tüm değerler$0$ ile$1$ arasında) desteklenmesini zorlarsak, bu aralıkta tekdüze dağılım varsa$P$ en yüksek entropiye sahip olur.
Daha önce tek bir rastgele değişken
Aşağıdaki tartışma için, her zaman
Tek bir rastgele değişkenin entropisine benzer şekilde :eqref:eq_ent_def
, rastgele değişken çiftinin,
eq_joint_ent_def
Tam olarak, bir yandan
Öte yandan,
Şunu düşünebiliriz :eqref:eq_joint_ent_def
bize rastgele değişkenler çiftindeki toplam rastgeleliği anlatıyor. Bir çift uç vaka olarak, eğer
Ortak entropiyi en başından uygulayalım.
def joint_entropy(p_xy):
joint_ent = -p_xy * np.log2(p_xy)
# `nansum` işlemcisi, nan (not a number - sayı olmayan) olmayan sayıyı toplayacaktır
out = nansum(joint_ent.as_nd_ndarray())
return out
joint_entropy(np.array([[0.1, 0.5], [0.1, 0.3]]))
#@tab pytorch
def joint_entropy(p_xy):
joint_ent = -p_xy * torch.log2(p_xy)
# `nansum` işlemcisi, nan (not a number - sayı olmayan) olmayan sayıyı toplayacaktır
out = nansum(joint_ent)
return out
joint_entropy(torch.tensor([[0.1, 0.5], [0.1, 0.3]]))
#@tab tensorflow
def joint_entropy(p_xy):
joint_ent = -p_xy * log2(p_xy)
# `nansum` işlemcisi, nan (not a number - sayı olmayan) olmayan sayıyı toplayacaktır
out = nansum(joint_ent)
return out
joint_entropy(tf.constant([[0.1, 0.5], [0.1, 0.3]]))
Bunun öncekiyle aynı kod olduğuna dikkat edin, ancak şimdi onu iki rastgele değişkenin bileşik dağılımı üzerinde çalışırken farklı bir şekilde yorumluyoruz.
Bileşik entropi bir çift rastgele değişkende bulunan bilgi miktarının üzerinde tanımlıdır. Bu yararlıdır, ancak çoğu zaman umursadığımız şey değildir. Makine öğrenmesinin ayarlarını düşünün. Bir imgenin piksel değerlerini tanımlayan rastgele değişken (veya rastgele değişkenlerin vektörü) olarak
Olasılık teorisinde, değişkenler arasındaki ilişkiyi ölçmek için koşullu olasılığın tanımını gördük. Şimdi, koşullu entropiyi,
$$ H(Y \mid X) = - E_{(x, y) \sim P} [\log p(y \mid x)],$$
:eqlabel:eq_cond_ent_def
Burada
Şimdi bunu sormak doğaldır, koşullu entropi
Bunun sezgisel bir yorumu vardır:
Şimdi, koşullu entropiyi, :eqref:eq_cond_ent_def
, sıfırdan uygulayalım.
def conditional_entropy(p_xy, p_x):
p_y_given_x = p_xy/p_x
cond_ent = -p_xy * np.log2(p_y_given_x)
# `nansum` işlemcisi, nan (not a number - sayı olmayan) olmayan sayıyı toplayacaktır
out = nansum(cond_ent.as_nd_ndarray())
return out
conditional_entropy(np.array([[0.1, 0.5], [0.2, 0.3]]), np.array([0.2, 0.8]))
#@tab pytorch
def conditional_entropy(p_xy, p_x):
p_y_given_x = p_xy/p_x
cond_ent = -p_xy * torch.log2(p_y_given_x)
# `nansum` işlemcisi, nan (not a number - sayı olmayan) olmayan sayıyı toplayacaktır
out = nansum(cond_ent)
return out
conditional_entropy(torch.tensor([[0.1, 0.5], [0.2, 0.3]]),
torch.tensor([0.2, 0.8]))
#@tab tensorflow
def conditional_entropy(p_xy, p_x):
p_y_given_x = p_xy/p_x
cond_ent = -p_xy * log2(p_y_given_x)
# `nansum` işlemcisi, nan (not a number - sayı olmayan) olmayan sayıyı toplayacaktır
out = nansum(cond_ent)
return out
conditional_entropy(tf.constant([[0.1, 0.5], [0.2, 0.3]]),
tf.constant([0.2, 0.8]))
Önceki rastgele değişkenler
Doğrudan biçimsel (formal) tanıma dalmak yerine, önce karşılıklı bilgi için tamamen daha önce oluşturduğumuz terimlere dayalı bir ifade türetmeyi deneyerek sezgilerimizi uygulayalım. İki rastgele değişken arasında paylaşılan bilgiyi bulmak istiyoruz. Bunu yapmaya çalışmanın bir yolu, hem
Aslında bu, karşılıklı bilgi için geçerli bir tanımdır. Bu terimlerin tanımlarını genişletir ve bunları birleştirirsek, biraz cebir bunun aşağısı gibi olduğunu gösterir
eq_mut_ent_def
Tüm bu ilişkileri görsel :numref:fig_mutual_information
içinde özetleyebiliriz. Aşağıdaki ifadelerin de neden
$H(X) − H(X \mid Y)$ $H(Y) − H(Y \mid X)$ $H(X) + H(Y) − H(X, Y)$
Karşılıklı bilgiyi :eqref:eq_mut_ent_def
birçok yönden :numref:sec_random_variables
içinde gördüğümüz korelasyon katsayısının ilkesel uzantısı olarak düşünebiliriz. Bu, yalnızca değişkenler arasındaki doğrusal ilişkileri değil, aynı zamanda herhangi bir türdeki iki rastgele değişken arasında paylaşılan maksimum bilgiyi de sorabilmemize olanak tanır.
Şimdi karşılıklı bilgiyi sıfırdan uygulayalım.
def mutual_information(p_xy, p_x, p_y):
p = p_xy / (p_x * p_y)
mutual = p_xy * np.log2(p)
# `nansum` işlemcisi, nan (not a number - sayı olmayan) olmayan sayıyı toplayacaktır
out = nansum(mutual.as_nd_ndarray())
return out
mutual_information(np.array([[0.1, 0.5], [0.1, 0.3]]),
np.array([0.2, 0.8]), np.array([[0.75, 0.25]]))
#@tab pytorch
def mutual_information(p_xy, p_x, p_y):
p = p_xy / (p_x * p_y)
mutual = p_xy * torch.log2(p)
# `nansum` işlemcisi, nan (not a number - sayı olmayan) olmayan sayıyı toplayacaktır
out = nansum(mutual)
return out
mutual_information(torch.tensor([[0.1, 0.5], [0.1, 0.3]]),
torch.tensor([0.2, 0.8]), torch.tensor([[0.75, 0.25]]))
#@tab tensorflow
def mutual_information(p_xy, p_x, p_y):
p = p_xy / (p_x * p_y)
mutual = p_xy * log2(p)
# `nansum` işlemcisi, nan (not a number - sayı olmayan) olmayan sayıyı toplayacaktır
out = nansum(mutual)
return out
mutual_information(tf.constant([[0.1, 0.5], [0.1, 0.3]]),
tf.constant([0.2, 0.8]), tf.constant([[0.75, 0.25]]))
Karşılıklı bilginin tanımını, :eqref:eq_mut_ent_def
, ezberlemek yerine sadece dikkate değer özelliklerini aklınızda tutmanız gerekir:
- Karşılıklı bilgi simetriktir (bakışımlı), yani
$I(X, Y) = I(Y, X)$ . - Karşılıklı bilgi negatif olamaz, yani
$I(X, Y) \geq 0$ . -
$I(X, Y) = 0$ ancak ve ancak$X$ ve$Y$ bağımsızsa olur. Örneğin,$X$ ve$Y$ bağımsızsa,$Y$ 'yi bilmek$X$ hakkında herhangi bir bilgi vermez ve bunun tersi de geçerlidir, dolayısıyla karşılıklı bilgileri sıfırdır. - Alternatif olarak,
$X$ ,$Y$ değerinin ters çevrilebilir bir işleviyse,$Y$ ve$X$ tüm bilgiyi paylaşır ve$$I(X, Y) = H(Y) = H(X)$$ .
Bu bölümün başında entropi ile çalıştığımızda,
eq_pmi_def
:eqref:eq_pmi_def
denklemi, bağımsız rastgele sonuçlar için beklentimizle karşılaştırıldığında
Bu, karşılıklı bilgiyi, :eqref: eq_mut_ent_def
, bağımsız olsalardı bekleyeceğimiz şeyle karşılaştırıldığında iki sonucun birlikte gerçekleştiğini gördüğümüzde şaşırmamızın ortalama miktarı olarak yorumlamamıza olanak tanır.
Karşılıklı bilgi, saf tanımında biraz soyut olabilir, peki makine öğrenmesi ile nasıl ilişkilidir? Doğal dil işlemede, en zor sorunlardan biri belirsizlik çözümü yani bir kelimenin anlamının bağlamdan anlaşılmaz olması sorunudur. Örneğin son zamanlarda bir haber manşetinde "Amazon yanıyor" yazıyordu. Amazon şirketinin bir binası yanıyor mu, yoksa Amazon yağmur ormanı mı yanıyor diye merak edebilirsiniz.
Bu durumda, karşılıklı bilgi bu belirsizliği çözmemize yardımcı olabilir. İlk olarak, e-ticaret, teknoloji ve çevrimiçi gibi, her birinin Amazon şirketi ile nispeten büyük karşılıklı bilgiye sahip olduğu kelime grubunu buluruz. İkinci olarak, her biri yağmur, orman ve tropikal gibi Amazon yağmur ormanlarıyla ilgili nispeten büyük karşılıklı bilgiye sahip başka bir kelime grubu buluruz. "Amazon"'un belirsizliğini ortadan kaldırmamız gerektiğinde, hangi grubun Amazon kelimesi bağlamında daha fazla yer aldığını karşılaştırabiliriz. Bu durumda haber ormanı tarif etmeye ve bağlamı netleştirmeye devam edecektir.
:numref:sec_linear-algebra
içinde tartıştığımız gibi, herhangi bir boyutluluğun uzaydaki iki nokta arasındaki mesafeyi ölçmek için normları kullanabiliriz. Olasılık dağılımları ile de benzer bir iş yapabilmek istiyoruz. Bunu yapmanın birçok yolu var, ancak bilgi teorisi en güzellerinden birini sağlıyor. Şimdi, iki dağılımın birbirine yakın olup olmadığını ölçmenin bir yolunu sağlayan Kullback–Leibler (KL) ıraksamasını inceleyeceğiz.
Olasılık dağılımı bir o.y.f veya o.k.f. olan
eq_kl_def
Noktasal karşılıklı bilgide olduğu gibi :eqref:eq_pmi_def
, logaritmik terimin yorumunu tekrar sağlayabiliriz:
Sıfırdan KL ıraksamasını uygulayalım.
def kl_divergence(p, q):
kl = p * np.log2(p / q)
out = nansum(kl.as_nd_ndarray())
return out.abs().asscalar()
#@tab pytorch
def kl_divergence(p, q):
kl = p * torch.log2(p / q)
out = nansum(kl)
return out.abs().item()
#@tab tensorflow
def kl_divergence(p, q):
kl = p * log2(p / q)
out = nansum(kl)
return tf.abs(out).numpy()
KL ıraksamasının bazı özelliklerine bir göz atalım :eqref:eq_kl_def
.
- KL ıraksaması simetrik değildir, yani
$$D_{\mathrm{KL}}(P|Q) \neq D_{\mathrm{KL}}(Q|P), \text{ if } P \neq Q.$$ - KL ıraksaması negatif değildir, yani
$$D_{\mathrm{KL}}(P|Q) \geq 0$$ Eşitliğin yalnızca$P = Q$ olduğunda geçerli olduğuna dikkat edin. -
$p(x)> 0$ ve$q(x) = 0$ şeklinde bir$x$ varsa,$D_{\mathrm{KL}}(P|Q) = \infty$ . - KL ıraksaması ile karşılıklı bilgi arasında yakın bir ilişki vardır. :numref:
fig_mutual_information
içinde gösterilen ilişkinin yanı sıra,$I(X, Y)$ 'da aşağıdaki terimlerle sayısal olarak eşdeğerdir:-
$D_{\mathrm{KL}}(P(X, Y) \ | \ P(X)P(Y))$ ; -
$E_Y { D_{\mathrm{KL}}(P(X \mid Y) \ | \ P(X)) }$ ; -
$E_X { D_{\mathrm{KL}}(P(Y \mid X) \ | \ P(Y)) }$ .
-
İlk terim için, karşılıklı bilgiyi
Simetrisizliği açıkça görmek için bir yapay örneğin üzerinden geçelim.
İlk olarak,
random.seed(1)
nd_len = 10000
p = np.random.normal(loc=0, scale=1, size=(nd_len, ))
q1 = np.random.normal(loc=-1, scale=1, size=(nd_len, ))
q2 = np.random.normal(loc=1, scale=1, size=(nd_len, ))
p = np.array(sorted(p.asnumpy()))
q1 = np.array(sorted(q1.asnumpy()))
q2 = np.array(sorted(q2.asnumpy()))
#@tab pytorch
torch.manual_seed(1)
tensor_len = 10000
p = torch.normal(0, 1, (tensor_len, ))
q1 = torch.normal(-1, 1, (tensor_len, ))
q2 = torch.normal(1, 1, (tensor_len, ))
p = torch.sort(p)[0]
q1 = torch.sort(q1)[0]
q2 = torch.sort(q2)[0]
#@tab tensorflow
tensor_len = 10000
p = tf.random.normal((tensor_len, ), 0, 1)
q1 = tf.random.normal((tensor_len, ), -1, 1)
q2 = tf.random.normal((tensor_len, ), 1, 1)
p = tf.sort(p)
q1 = tf.sort(q1)
q2 = tf.sort(q2)
#@tab all
kl_pq1 = kl_divergence(p, q1)
kl_pq2 = kl_divergence(p, q2)
similar_percentage = abs(kl_pq1 - kl_pq2) / ((kl_pq1 + kl_pq2) / 2) * 100
kl_pq1, kl_pq2, similar_percentage
Bunun aksine,
#@tab all
kl_q2p = kl_divergence(q2, p)
differ_percentage = abs(kl_q2p - kl_pq2) / ((kl_q2p + kl_pq2) / 2) * 100
kl_q2p, differ_percentage
Bilgi teorisinin derin öğrenmedeki uygulamalarını merak ediyorsanız, işte size hızlı bir örnek.
Verilen sec_maximum_likelihood
, görüldüğü gibi uygulamak doğaldır. Daha belirleyici olmak gerekirse,
Tüm bunlar, maksimum olabilirlik üzerinde çalışılarak elde edildi. Bununla birlikte, yakından bakarsak,
KL ıraksaması gibi, rastgele bir değişken
eq_ce_def
Yukarıda tartışılan entropinin özelliklerini kullanarak, bunu
Çapraz entropi kaybını aşağıdaki gibi uygulayabiliriz.
def cross_entropy(y_hat, y):
ce = -np.log(y_hat[range(len(y_hat)), y])
return ce.mean()
#@tab pytorch
def cross_entropy(y_hat, y):
ce = -torch.log(y_hat[range(len(y_hat)), y])
return ce.mean()
#@tab tensorflow
def cross_entropy(y_hat, y):
# `tf.gather_nd`, bir tensörün belirli indekslerini seçmek için kullanılır.
ce = -tf.math.log(tf.gather_nd(y_hat, indices = [[i, j] for i, j in zip(
range(len(y_hat)), y)]))
return tf.reduce_mean(ce).numpy()
Şimdi etiketler ve tahminler için iki tensör tanımlayalım ve bunların çapraz entropi kaybını hesaplayalım.
labels = np.array([0, 2])
preds = np.array([[0.3, 0.6, 0.1], [0.2, 0.3, 0.5]])
cross_entropy(preds, labels)
#@tab pytorch
labels = torch.tensor([0, 2])
preds = torch.tensor([[0.3, 0.6, 0.1], [0.2, 0.3, 0.5]])
cross_entropy(preds, labels)
#@tab tensorflow
labels = tf.constant([0, 2])
preds = tf.constant([[0.3, 0.6, 0.1], [0.2, 0.3, 0.5]])
cross_entropy(preds, labels)
Bu bölümün başında belirtildiği gibi, çapraz entropi :eqref:eq_ce_def
optimizasyon probleminde bir kayıp fonksiyonunu tanımlamak için kullanılabilir. Aşağıdakilerin eşdeğer olduğu ortaya çıkar:
-
$P$ dağılımı için$Q$ tahmini olasılığının en üst düzeye çıkarılması (yani,$E_{x \sim P} [\log (q(x))]$ ); - Çapraz entropiyi en aza indirme
$\mathrm{E}(P, Q)$ ; - KL ıraksamasının en aza indirilmesi
$D_{\mathrm {KL}}(P|Q)$ .
Çapraz entropinin tanımı,
Çapraz entropi kaybı
Başlangıç olarak,
Örneğin, çok sınıflı bir sınıflandırma problemi
Sinir ağımızın
Dolayısıyla, çapraz entropi kaybı:
$$ \mathrm{ÇE}(\mathbf{y}, \hat{\mathbf{y}}) = - \sum_{i=1}^n \mathbf{y}i \log \hat{\mathbf{y}}i = - \sum{i=1}^n \sum{j=1}^k y_{ij} \log{p_{\theta} (y_{ij} \mid \mathbf{x}_i)}.\ $$
Öte yandan, soruna maksimum olabilirlik tahminiyle de yaklaşabiliriz. Başlangıç olarak, hızlı bir şekilde
Rastgele bir değişken
Görülebileceği gibi, her veri örneğinin etiketi, $\mathbf{y}i$, $k$-sınıflı $\boldsymbol{\pi} =$ ($\pi{1}, \ldots, \pi_{k}$) olasılıklı bir multinoulli dağılımını takip ediyor. Bu nedenle, her veri örneği $\mathbf{y}i$ için bileşik o.k.f $\mathbf{\pi}^{\mathbf{y}i} = \prod{j=1}^k \pi{j}^{y_{ij}}$'dir. Bu nedenle, logaritmik-olabilirlik işlevi şöyle olacaktır:
$$ \begin{aligned} l(\theta) = \log L(\theta) = \log \prod_{i=1}^n \boldsymbol{\pi}^{\mathbf{y}i} = \log \prod{i=1}^n \prod_{j=1}^k \pi_{j}^{y_{ij}} = \sum_{i=1}^n \sum_{j=1}^k y_{ij} \log{\pi_{j}}.\ \end{aligned} $$
Maksimum olabilirlik tahmini olduğundan,
Yukarıdaki kanıtı test etmek için, yerleşik NegativeLogLikelihood
ölçütünü uygulayalım. Önceki örnekte olduğu gibi aynı labels
(etiketler) ve preds
(tahminler) değişkenlerini kullanarak, 5 ondalık basamağa kadar önceki örnekteki aynı sayısal kaybı elde edeceğiz.
nll_loss = NegativeLogLikelihood()
nll_loss.update(labels.as_nd_ndarray(), preds.as_nd_ndarray())
nll_loss.get()
#@tab pytorch
# PyTorch'ta çapraz entropi kaybının uygulanması `nn.LogSoftmax()` ve
# `nn.NLLLoss()` öğelerini birleştirir
nll_loss = NLLLoss()
loss = nll_loss(torch.log(preds), labels)
loss
#@tab tensorflow
def nll_loss(y_hat, y):
# Birebir vektörlere çevir
y = tf.keras.utils.to_categorical(y, num_classes= y_hat.shape[1])
# Tanımdan negatif logaritmik-olabilirliği hesaplamayacağız.
# Bunun yerine döngüsel bir argüman izleyeceğiz. Bize NLL verecek olan çapraz entropiyi
# hesaplarsak, NLL, `cross_entropy` ile aynı olur.
cross_entropy = tf.keras.losses.CategoricalCrossentropy(
from_logits = True, reduction = tf.keras.losses.Reduction.NONE)
return tf.reduce_mean(cross_entropy(y, y_hat)).numpy()
loss = nll_loss(tf.math.log(preds), labels)
loss
- Bilgi teorisi, bilgiyi kodlama, kod çözme, iletme ve üzerinde oynama ile ilgili bir çalışma alanıdır.
- Entropi, farklı sinyallerde ne kadar bilginin sunulduğunu ölçen birimdir.
- KL ıraksaması, iki dağılım arasındaki farklılığı da ölçebilir.
- Çapraz Entropi, çok sınıflı sınıflandırmanın amaç işlevi olarak görülebilir. Çapraz entropi kaybını en aza indirmek, logaritmik-olabilirlik fonksiyonunu maksimize etmeye eşdeğerdir.
- İlk bölümdeki kart örneklerinin gerçekten iddia edilen entropiye sahip olduğunu doğrulayınız.
-
$D(p|q)$ KL ıraksamasının tüm$p$ ve$q$ dağılımları için negatif olmadığını gösteriniz. İpucu: Jensen'in eşitsizliğini kullanınız, yani$-\log x$ 'in dışbükey (konveks) bir fonksiyon olduğu gerçeğini kullanınız. - Entropiyi birkaç veri kaynağından hesaplayalım:
- Bir daktiloda bir maymun tarafından üretilen çıktıyı izlediğinizi varsayınız. Maymun, daktilonun
$44$ tane tuşundan herhangi birine rasgele basar (henüz herhangi bir özel tuşun veya shift tuşunun bulunmadığını varsayabilirsiniz). Karakter başına kaç bit rastgelelik gözlemliyorsunuz? - Maymundan mutsuz olduğunuz için, onun yerine sarhoş bir dizici koydunuz. Tutarlı olmasa da kelimeler üretebiliyor. Bununla birlikte,
$2000$ tanelik bir kelime dağarcığından rastgele bir kelime seçiyor. Bir kelimenin ortalama uzunluğunun İngilizce olarak$4.5$ harf olduğunu varsayalım. Şimdi karakter başına kaç bit rastgelelik gözlemliyorsunuz? - Sonuçtan hâlâ memnun olmadığınızdan dizgiciyi yüksek kaliteli bir dil modeliyle değiştiriyorsunuz. Dil modeli şu anda kelime başına
$15$ noktaya kadar şaşkınlık (perplexity) sayıları elde edebiliyor. Bir dil modelinin şaşkınlık karakteri, bir dizi olasılığın geometrik ortalamasının tersi olarak tanımlanır, her olasılık sözcükteki bir karaktere karşılık gelir. Belirleyici olmak gerekirse, eğer verilne bir kelimenin uzunluğu$l$ ise, o zaman$\mathrm{PPL}(\text{kelime}) = \left[\prod_i p(\text{karakter}_i)\right]^{ -\frac{1}{l}} = \exp \left[ - \frac{1}{l} \sum_i{\log p(\text{karakter}_i)} \right]$ . Test kelimesinin 4.5 harfli olduğunu varsayalım, şimdi karakter başına kaç bit rastgelelik gözlemliyorsunuz?
- Bir daktiloda bir maymun tarafından üretilen çıktıyı izlediğinizi varsayınız. Maymun, daktilonun
- Neden
$I(X, Y) = H(X) - H(X|Y)$ olduğunu sezgisel olarak açıklayın. Ardından, her iki tarafı da bileşik dağılıma göre bir beklenti şeklinde ifade ederek bunun doğru olduğunu gösterin. - İki Gauss dağılımı,
$\mathcal{N} (\mu_1, \sigma_1^2)$ ve$\mathcal{N}(\mu_2, \sigma_2^2)$ , arasındaki KL ıraksaması nedir?
:begin_tab:mxnet
Tartışmalar
:end_tab:
:begin_tab:pytorch
Tartışmalar
:end_tab:
:begin_tab:tensorflow
Tartışmalar
:end_tab: