最近 Deep Learning(An MIT Press book) を読んでいるのですが、記憶の失われが激しいので要点をメモしていくことにしました。
5章までは機械学習の基礎で6章からが deep らしいので、そこから読んでいます。
あと、さすがにタイトルの 575nize はあきらめました。
Chapter 6 Deep Feedforward Networks
- feedforward network の目的は何らかの関数 を近似すること
- の θ を学習する
- 線形モデルは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)
せっかくなので日本語版のやつをはっておきます。