MLのTrainingに欠かせないOptimizerクラスについて、整理しておこう。
——————————–
MLでは、最急降下法Gradient Descentで、損失関数lossの最小化を図る。
損失関数には、変数をtf.Variable で定義する。
モデルが y=ax+b の場合、モデルと損失関数lossは、以下の通り:
1 2 3 4 |
a = tf.Variable(tf.random_normal([])) b = tf.Variable(tf.random_normal([])) model = tf.add(tf.multiply(x, a), b) loss = tf.reduce_mean(tf.pow(model - y, 2)) |
tf,Variableは初期化する事が必要。ローカル変数、グローバル変数を初期化のための関数群を示す:
1 2 3 |
variable_initializer(var_list, name=‘init’) local_variables_initializer() global_variables_initializer() |
損失関数を最小にする関数minimize:
1 |
minimize(loss, global_step=None, var_list=None, gate_gradients=1, aggregation_method=None, colocate_gradients_with_ops=False, name=None, grad_loss=None) |
を用いて、GradientDescentOptimizerクラスに学習係数learn_rateをセットして、optimizerを生成し、
損失関数を最小限にするステップをSession()で繰り返す。
1 2 3 4 5 6 |
optimizer = tf.train.GradientDescentOptimizer(learn_rate) optimizer_op = optimizer.minimize(loss) with tf.Session() as sess: for step in range(num_steps): sess.run(optimizer_op) |
最急降下法には、GradientDescentOptimizer:
1 2 3 4 5 |
tf.train.GradientDescentOptimizer(learning_rate, use_locking=False, name='GradientDescent') learn_rate = 0.1 optimizer = tf.train.GradientDescentOptimizer(learn_rate) optimizer_op = optimizer.minimize(loss) |
MomentumOptimizer:
1 |
MomentumOptimizer(learning_rate, momentum, use_locking=False, name='Momentum', use_nesterov=False) |
AdagradOptimizer
1 |
AdagradOptimizer(learning_rate, initial_accumulator_value=0.1, use_locking=False, name='Adagrad') |
AdamOptimizer
1 |
AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam') |
などが利用できる。
学習データをSession()内で、損失関数に送り込んでOptimizeする必要があるが、この過程をData Feedingと呼ぶ。
ここで活躍するのが、プレースホルダーtf.placeholder()だ。
1 |
tf.placeholder(dtype, shape=None, name=None) |
定数(Constant)や、変数(Variable)は、宣言時に初期値を設定するが、tf.placeholder()にはその必要はない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import tensorflow as tf import numpy as np ph = tf.placeholder(tf.float32) vals = np.array([1, 2, 3]) optimizer = tf.add(ph, 1) with tf.Session() as sess: writer = tf.summary.FileWriter("logs", graph=tf.get_default_graph()) res = sess.run(optimizer, feed_dict={ph: vals}) print(res) writer.close() [2. 3. 4.] |