记录内容来自《Tensorflow实战Google一书》及MOOC人工智能实践 http://www.icourse163.org/learn/PKU-1002536002?tid=1002700003
--梯度下降算法主要用于优化单个参数的取值, 反向传播算法给出了一个高效的方式在所有参数上使用梯度下降算法。
从而神经网络模型在训练数据的孙师函数尽可能小。
--反向传播算法是训练神经网络的核心算法, 它可以跟据定义好的损失函数优化神经网络中参数的取值, 从而使神经网络模型在训练数据集上的损失函数达到一个较小值。
假设损失函数如下:
x轴表示参数取值, y轴表示损失函数的值。, 假设当前的参数和损失函数值的位置为图中小黑点的位置, 那么梯度下降算法将会将参数向x轴左侧移动, 从而使小圆点朝箭头的方向
移动。参数的梯度可以通过求骗到的方式计算。
通过以下是实例来解释梯度下降算法作用于损失函数的应用。
根据例子我们可以看出梯度下降算法可以顺利的使参数值朝着真实的值靠近。但是它并不能保证被优化的函数达到全局最优解。如下图实例所示:
为解决这一问题引进了随机梯度下降算法(stochastic gradient descent):这个算法优化的不是在全部训练数据上的损失函数, 而是在每一轮迭代中,随机优化
某一条训练数据上的损失函数。
神经网络的进一步优化
学习率的设置:
学习率表示了每次参数更新的幅度大小。学习率过大, 会导致待优化的参数在最小值附近波动, 不收敛;学习率过小, 会导致待优化的参数收敛缓慢。
在训练过程中, 参数的更新向着损失函数梯度下降的方向。
一个实例:来自大学MOOCTensorflow笔记
通过梯度下降算法优化损失函数 loss= (w+1)^2, w初始值设置为20, 学习率设置为0.2, 定义反向传播算法最后得到w的值为-1, loss为0, 符合函数曲线。
如果学习率设置为1 则会出现不收敛的情况
1 #coding:utf-8 2 #设损失函数 loss=(w+1)^2, 令w初值是常数5。反向传播就是求最优w,即求最小loss对应的w值 3 import tensorflow as tf 4 #定义待优化参数w初值赋5 5 w = tf.Variable(tf.constant(20, dtype=tf.float32)) 6 #定义损失函数loss 7 loss = tf.square(w+1) 8 #定义反向传播方法 9 train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss) 10 #生成会话,训练40轮 11 with tf.Session() as sess: 12 init_op=tf.global_variables_initializer() 13 sess.run(init_op) 14 for i in range(40): 15 sess.run(train_step) 16 w_val = sess.run(w) 17 loss_val = sess.run(loss) 18 print "After %s steps: w is %f, loss is %f." % (i, w_val,loss_val)
学习率为0.2运行结果如下, 较正常的结果:
学习率为1则会出现震荡不收敛的结果w的值在20和-22之间跳动,这就是不收敛: