— Claude Elwood Shannon
Scientific American (1971), volume 225, page 180.
Das mit dem (Un-)Supervised Learning schauen wir uns nun in einem sehr einfachen Beispiel an und fragen uns
Wieviele Bits kann ein einziges Neuron eigentlich speichern?
Tiefe Neuronale Netze (a.k.a. Deep Learning) bilden das Forschungsgebiet unserer Zeit. Bevor wir in später in der Vorlesung in die Thematik einsteigen werden, möchten wir etwas zu dem wichtigsten Baustein, dem Skalarproduktes (a.k.a. dem Neuron), aus informationstheoretischer Sicht lernen. Konkret leiten wir in dieser Aufgabe her, wieviele Daten sich ein Neuron überhaupt merken kann. Wir starten mit dem Konzept, dass wir Daten über einen Kanal übertragen wollen, danach müssen wir "lediglich" zählen, wieviele Möglichkeiten es gibt diese Daten mit dem gegebenen Modell abzubilden. Warum "lediglich" und nicht lediglich? Diese Aufgabe ist durchaus mit etwas Knobeln verbunden. Beachten Sie, dass die Kerneinsicht (letzte Aufgabenteile) aber auch ohne Lösung für die vorhergehenden Knobelaufgaben erarbeitet werden kann.
Wir betrachten also die Rekonstruktionen \(\hat y_i\) des Neuron gegeben durch \(f_\omega(x) := w^T\cdot x\) mit Parameter \(\omega\) und Aktivierungsfunktion \(a\): \[ \hat y_i := a\left(f_\omega\left(x_i\right)\right),\qquad a(x) = \left\{\begin{matrix} 1 & x>0\\ 0 & x ≤ 0\end{matrix}\right. \]
Es sei nun \(T(N,K)\) die Anzahl verschiedener Funktionen \(f_\omega\), um eine beliebige aber feste Menge von \(N\) Punkte in \(K\) Dimensionen auf je eine Ausgabe \(\{0,1\}\) abzubilden. (Alle Punkte seien dabei in allgemeiner Lage. Im Prinzip gehen wir so davon aus, dass keine zwei Punkte gleichzeitig auf der so definierten Null-Ebene von \(f_\omega\) liegen).)
Wir drehen die Aufgabe nun um: Wir starten mit dem Skalarprodukt auf einem gegebenen Datensatz, dass diesen möglichst "optimal" löst. Das Ziel ist nun zu bestimmen, wieviele Bits dieses Skalarprodukt in der Praxis tatsächlich speichert bzw. rekonstruieren kann.
Dazu schaun wir uns den Datensatz CIFAR-10 an: Der Datensatz besteht aus 10 Klassen (airplane
, automobile
, bird
, cat
, deer
, dog
, frog
, horse
, ship
, truck
) zu je \(12.000\) Farb-Bildern, wiederum jeweils bestehend aus \(32\cdot 32\) Pixeln.
import matplotlib.pyplot as plt
import numpy as np
def imshow(img):
img = img / 2 + 0.5 # unnormalize
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show()
batch_size = 64 # number of images to get for every iteration of trainloader
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=2)
classes = ('class-%i' % i for i in range(10))
# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()
# show images
imshow(torchvision.utils.make_grid(images))
# print labels
print(' '.join('%5s' % classes[labels[j]] for j in range(batch_size)))
sklearn
.svm = LinearSVC(dual=False, max_iter=25)
svm.fit(traindata.reshape((num_examples,-1)), trainlabels)
trainlabels_reconstruct = svm.predict(traindata.reshape((num_examples,-1)))
# übrigens: das Gewicht w können Sie per svm.coeff_ einsehen.
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=torchvision.transforms.ToTensor())
traindata = trainset.train_data.numpy()
trainlabels = trainset.test_labels.numpy()
4
und 7
.predict
wie oben angegeben, und Zählen Sie wieviele Punkte (des Trainingssets!) korrekt auswendig gelernt wurden.