Deep Learning(An MIT Press book) 6.1

最近 Deep Learning(An MIT Press book) を読んでいるのですが、記憶の失われが激しいので要点をメモしていくことにしました。

5章までは機械学習の基礎で6章からが deep らしいので、そこから読んでいます。

あと、さすがにタイトルの 575nize はあきらめました。

Chapter 6 Deep Feedforward Networks

  • feedforward network の目的は何らかの関数 f^* を近似すること
    • y = f(x; \theta) の θ を学習する
  • 線形モデルは2変数間の相互作用を理解できない
  • 入力 x に非線形変換を施した φ(x) に対して線形モデルを適用する
    • RBF カーネルのように無限次元の φ を使えば常に訓練データへの fit はできるが、汎化性能は低いままの場合がある
    • 人手で作った φ は deep 以前は主なアプローチだったが、分野ごとのエキスパートが必要で他分野への転用がしにくい
    • deep では φ は隠れ層に当たる。他の φ と異なり凸性を失っているが、それを補う利点がある
  • network のデザイン
    • optimizer, cost function, output units
    • deep ではこれに加えて、activation functions, layer 数, layer 間の接続, 層ごとの unit 数
  • back-propagation による学習

6.1 Example: Learning XOR

  • XOR の学習
  • 本文の式を(ほぼ)そのまま tensorflow で書いてみた
    • 隠れ層は本文だと units=4 だったけど、うまく学習できる気配がなかったので 256 に増やした
    • 本文だときちんと regression してるけど、できる気配がなかったので閾値(0.5)以上かどうかで判定している
    • そもそも本文だと勾配法で学習していない(解の例がいきなり書いてある)
import numpy as np
import tensorflow as tf


sess = tf.Session()

x_ph = tf.placeholder(tf.float32, shape=(None, 2))
y_ph = tf.placeholder(tf.float32, shape=(None,))

hidden = tf.layers.dense(x_ph, 256, activation=tf.nn.relu)
output = tf.layers.dense(hidden, 1)

loss = tf.reduce_mean(tf.square(y_ph - output))
optimizer = tf.train.AdamOptimizer().minimize(loss)


sess.run(tf.global_variables_initializer())

x_list = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y_list = np.array([0, 1, 1, 0])
for i in range(5000):
    if i % 1000 == 0:
        print('epoc: {}'.format(i))
    indices = np.random.randint(0, len(x_list), (4,))
    sess.run(optimizer, feed_dict={x_ph: x_list[indices], y_ph: y_list[indices]})

y_list2 = sess.run(output, feed_dict={x_ph: x_list})
for x, y in zip(x_list, y_list2):
    print('{} XOR {} is {}'.format(x[0], x[1], 1 if y[0] > 0.5 else 0)

せっかくなので日本語版のやつをはっておきます。