Tensorflow机器学习(二) Optimizer是什么,优化过程中改变了什么,learning rate是什么?

在线性回归或者监督学习中,我们会计算预测值与真实值之间的差距,也就是loss

在计算得出loss之后,通常会使用Optimizer对所构造的数学模型/网络模型进行参数优化,

通常情况下,优化的最终目的是使得loss趋向于最小。


首先,要了解的是,Optimizer是基类,在实际使用过程中,使用的是它的复写类,有:

  • GradientDescentOptimizer 
  • AdagradOptimizer 
  • AdagradDAOptimizer 
  • MomentumOptimizer 
  • AdamOptimizer 
  • FtrlOptimizer 
  • RMSPropOptimizer

其中GradientDescentOptimizer和AdamOptimizer是最常使用的两个Optimizer。


以下将举一个非常简单的例子,来说明Optimizer的使用方法和其作用过程。

import tensorflow as tf

train_X = 1.0
train_Y = 2.0

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
k = tf.Variable(0.0)
loss = tf.abs(k * X - Y)
train_op = tf.train.GradientDescentOptimizer(learning_rate=0.25).minimize(loss)
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    for epoch in range(10):
        _, _k, _loss = sess.run([train_op, k, loss], feed_dict={X: train_X, Y: train_Y})
        print("Epoch: %d | k = %f | loss = %f" % (epoch+1, _k, _loss))

现在已知X = 1,Y = 2,目的是找出一个参数k,来构建模型Y = kX

程序的基本思想是:

  1. 定义loss = |kX - Y|
  2. 通过Optimizer对参数k进行优化,不断改变参数k的值,最终使得loss趋向最小。
Epoch: 1 | k = 0.000000 | loss = 2.000000
Epoch: 2 | k = 0.250000 | loss = 1.750000
Epoch: 3 | k = 0.500000 | loss = 1.500000
Epoch: 4 | k = 0.750000 | loss = 1.250000
Epoch: 5 | k = 1.000000 | loss = 1.000000
Epoch: 6 | k = 1.250000 | loss = 0.750000
Epoch: 7 | k = 1.500000 | loss = 0.500000
Epoch: 8 | k = 1.750000 | loss = 0.250000
Epoch: 9 | k = 2.000000 | loss = 0.000000
Epoch: 10 | k = 2.000000 | loss = 0.000000

 由此我们可以联想:在一个较复杂的神经网络模型(比如CNN)中,optimizer优化过程中,改变了什么呢?

改变的是网络各层的参数(一般有权重w和偏置b)。


在Optimizer中,我们常会定义一个参数learning_rate, 学习率。

learning_rate可以理解为学习步长,在上面可以看出learning_rate=0.25,所以参数k的变化值每一个epoch也是0.25。

(特别的可以看出loss的变化值也是0.25,但这与loss定义有关,与learning_rate无关)

learning_rate的选择也是需要考虑的一件事,

1. learning_rate选择过小会导致收敛过程变长。

eg. 对于上例,learning_rate=0.2时,将会比learning_rate=0.25时多进行两个epoch才能达到loss最小。

2. learning_rate选择过大或者选择不当可能会导致参数无法准确收敛到loss最小的点。

eg. 对于上例,learning_rate=0.3时,将无法收敛到loss最小的点:

Epoch: 1 | k = 0.000000 | loss = 2.000000
Epoch: 2 | k = 0.300000 | loss = 1.700000
Epoch: 3 | k = 0.600000 | loss = 1.400000
Epoch: 4 | k = 0.900000 | loss = 1.100000
Epoch: 5 | k = 1.200000 | loss = 0.800000
Epoch: 6 | k = 1.500000 | loss = 0.500000
Epoch: 7 | k = 1.800000 | loss = 0.200000
Epoch: 8 | k = 2.100000 | loss = 0.100000
Epoch: 9 | k = 1.800000 | loss = 0.200000
Epoch: 10 | k = 2.100000 | loss = 0.100000

猜你喜欢

转载自blog.csdn.net/kane7csdn/article/details/84372463