feed-forward-neural-network-tensorflow slides

Feed Forward Neural Networks

In [2]:
from IPython.display import Image
Image(filename='./pics/Deeplearning 2.png') 
Out[2]:

Eine Schicht von Neuronen:

Input: $\vec x^T = (x_1, x_2, \dots x_n)$

Output des j-ten Neurons: $$ h_j = \sigma(\sum_{i=1}^n w_{ij} x_i + b_j) $$

Mit der Gewichtsmatrix $W$:

$$ \vec h = \sigma(\vec x \cdot W + \vec b) $$
  • Elementweise Anwendung der Funktion $\sigma$ auf die Vektorelemente.

Trainingsdaten - nicht "linear separabel"

In [6]:
plot_train_data(X_train[t_train==0], X_train[t_train==1])

Händisch konstruierte Merkmalstransformation

$$ \phi_1(\vec x) = x_1^2 $$$$ \phi_2(\vec x) = x_2^2 $$

Im konstruierten Merkmalsraum sind die Daten linear-separabel.

In [8]:
phi_train = X_train**2
plot_train_transformed(phi_train[t_train==0], phi_train[t_train==1])

Lernen der Transformation

Mit Neuronalen Netzen können Feature-Transformationen gelernt werden.

  • Der Aktivitätsvektor der "Hidden-Layers" kann als transformierter Input-Vektor interpretiert werden.

Feed Forward Neural Network mit einer verdeckten Schicht

Aktivität der (ersten) Hidded-Layer:

$$ \vec h^{(1)} = \sigma_1 \left(\vec x \cdot W^{(1)} + \vec b^{(1)} \right) $$

Aktivität des Output-Neurons $o$:

$$ o = h^{(2)}= \sigma_2 \left( \vec h^{(1)} \cdot W^{(2)} + b^{(2)} \right) $$
In [15]:
# (first) hidden layer
a = tf.matmul(x, W_h) + b_h

# activity function "rectified linear units"
h = tf.nn.relu(a)

# output neuron:
y = logistic_function(tf.matmul(h, W_o) + b_o)

Kostenfunktion und l2-Regulierung

In [16]:
cross_entropy = -tf.reduce_sum(y_*tf.log(y[:,0]) + (1.-y_)*tf.log(1.-y[:,0]))

l2_reg = tf.reduce_sum(tf.square(W_h)) + tf.reduce_sum(tf.square(W_o))

lambda_ = 0.002
cost = cross_entropy + lambda_ * l2_reg
In [22]:
# Note: there is also a visualization tool called TensorBoard, not used here.
plt.plot(range(epochs), cost_, '-b')
plt.xlabel('Iterations')
plt.ylabel('Cost')
cost_
Out[22]:
array([ 44.88797379,  44.88481522,  44.88169098, ...,   6.09101915,
         6.09098625,   6.09095526])

Entscheidungsfläche (Decision Boundary)

In [27]:
plot_contour(X_train[t_train==0], X_train[t_train==1], 'train data')
In [28]:
plot_contour(X_test[t_test==0], X_test[t_test==1], 'test data')

Anteil der korrekten Vorhersagen der Testdaten (accuracy)

In [29]:
y_e = y.eval(feed_dict={x: X_test})
((y_e>0.5).reshape(-1)==t_test).mean() 
Out[29]:
0.84999999999999998
In [31]:
plot_hidden_neurons_activities()
  • In jedem schraffierten Gebiet ist die Anzahl der aktiven "Hidden Neurons" konstant.
  • Zwei hintereinandergeschaltete affine Transformationen entsprechen einer affinen Transformation gefolgt von der logistischen Funktion. D.h. in jedem schraffierten Gebiet verhält sich das Neuronale Netz wie die "logistische Regression": Hyperebene als Entscheidungsgrenze.
  • An den Grenzen der schraffierten Gebiete kommt man von einer Entscheidungshyperebene zur nächsten.

siehe auch [Mon14, Pas14]

Übung:

  • Variieren Sie die Anzahl der Hidden-Neurone, $\lambda$ und die Anzahl der Trainingsdaten?
  • Wie manifestiert sich dabei Underfitting und Overfitting?

Feature-Transformation

In [35]:
plot_data() # each point is a training example
In [38]:
plt.plot(range(epochs), cost_, '-b')
plt.xlabel('Iterations')
plt.ylabel('Cost')
Out[38]:
<matplotlib.text.Text at 0x11af2e9b0>
In [39]:
#train classification error
y_e = y.eval(feed_dict={x: X})
((y_e>0.5).reshape(-1)==t).mean() 
Out[39]:
1.0

Transformierter Merkmalsraum - Aktivitäten der verdeckten Neurone

  • Grüne Line: Entscheidungsgrenze im Merkmalsraum
In [41]:
plot_hidden_space(h=h, x=x, grid_points=grid_points, x_0=x_0, x_1=x_1, W_o=W_o, b_o = b_o, blue=blue, red=red)

"Spiral Data" mit drei Klassen

In [69]:
plot_spiral_data()

Feed Forward Neural Network mit zwei verdeckten Schichten

Aktivitäten der Hidded-Layer:

$$ \vec h^{(1)} = \sigma_1 \left(\vec x \cdot W^{(1)} + \vec b^{(1)} \right) $$$$ \vec h^{(2)}= \sigma_2 \left( \vec h^{(1)} \cdot W^{(2)} + \vec b^{(2)} \right) $$

Aktivität der Output-Neuronen $\vec o$:

$$ \vec o = \vec h^{(3)}= \sigma_3 \left( \vec h^{(2)} \cdot W^{(3)} + \vec b^{(3)} \right) $$

Softmax

$$ \sigma_3 (\vec a) = \frac{\exp(\vec a)}{\sum_i\exp(a_i)} $$

mit

  • $\exp(\vec a)$: elementweise Anwendung, sodass das Ergebnis ein Vektor mit der gleichen Dimensionalität ist.
In [73]:
plt.plot(range(epochs), cost_, '-b')
plt.xlabel('Iterations')
plt.ylabel('Cost')
Out[73]:
<matplotlib.text.Text at 0x11b37ea20>
In [76]:
plot_spriral_db()
In [79]:
plot_spiral_hdb()

Übungen

  • Variieren Sie die Anzahl der Neurone und beobachten Sie die Veränderungen der Entscheidungsflächen im Datenraum.
  • Erklären Sie das Verhalten.

Der Fluch der Dimensionen

In [84]:
from IPython.display import Image
Image(filename='./pics/Deeplearning 7.png') 
Out[84]:
  • "Real world data" für "KI Tasks" ist hochdimensional.
  • Volumen wächst exponentiell $r^n$ mit Anzahl der Dimensionen $n$
  • Warum sind hier nicht (exponentiell mit n) viele Trainingsdaten notwendig?

Manifold Hypothesis

  • Trainingsdaten nur noch in wenig Bereichen des Raums in nicht-linearen "Manifolds".
  • Grund: starke statistische Abhängigkeit der Variablen.
  • Manifolds weisen starke Krümmungen im eingebettenten Raum auf
    • z.B. Translation des gleichen Bildes um ein Pixel verschiebt das Bild in einen völlig anderen Bereich des einbettenden Datenraums
In [86]:
from IPython.display import Image
Image(filename='./pics/picture-vs-random-pixels.png') 
Out[86]:

"Deep Learning" ist "Feature Learning"

  • Wenn ein Algorithmus bzw. ein Neuronales Netz ohne hinreichende Tiefe gewählt wird, so werden exponentiell unnötig viele Units in den Schichten benötigt (siehe [Ben09, Eld16, Tel16]).
In [87]:
from IPython.display import Image
Image(filename='./pics/traditional-ml.png') 
# adapted from [LeCun]
Out[87]:
In [88]:
from IPython.display import Image
Image(filename='./pics/tradional-imageprocessing-speech-approach.png') 
# adapted from [LeCun]
Out[88]:
In [89]:
from IPython.display import Image
Image(filename='./pics/trainable-feature-transformations.png') 
# adapted from [LeCun]
Out[89]: