目录
梯度下降算法
见机器学习那块
import tensorflow as tf
opt=tf.keras.optimizers.SGD(learning_rate=0.1)
#定义要更新的参数
var=tf.Variable(1.0)
#定义损失函数
loss=lambda:(var**2)/2.0
#计算损失梯度,并进行参数更新
opt.minimize(loss,[var])
#参数更新结果
var.numpy()
0.9
反向传播算法(BP算法)
前向传播与反向传播
前向传播
是指数据输入的神经网络中,逐层向前传输,一直到运算到输出层为止
在网络的训练过程中经过前向传播后得到的最终结果跟训练样本的真实值总是存在一定误差,这个误差便是损失函数。想要减少这个误差,就用损失函数ERROR,从后往前,依次求各个参数的偏导,这就是反向传播(Back Propagation)
链式法则
反向传播算法
梯度下降优化方法
动量算法(Momentum)
主要解决鞍点问题,对梯度值进行修正
opt=tf.keras.optimizers.SGD(learning_rate=0.1,momentum=0.9)
#定义要更新的参数
var=tf.Variable(1.0)
val0=var.value()
#定义损失函数
loss=lambda:(var**2)/2.0
#第一次更新
opt.minimize(loss,[var])
val1=var.value()
#第二次更新
opt.minimize(loss,[var])
val2=var.value()
val0,val1,val2
(<tf.Tensor: shape=(), dtype=float32, numpy=1.0>,
<tf.Tensor: shape=(), dtype=float32, numpy=0.9>,
<tf.Tensor: shape=(), dtype=float32, numpy=0.71999997>)
AdaGrad
对学习率进行修正
opt=tf.keras.optimizers.Adagrad(learning_rate=0.1,initial_accumulator_value=0.1,epsilon=1e-06)
#定义要更新的参数
var=tf.Variable(1.0)
#定义损失函数
def loss():
return (var**2)/2.0
#第一次更新
opt.minimize(loss,[var])
var
<tf.Variable ‘Variable:0’ shape=() dtype=float32, numpy=0.9046538>
RMSprop
用于解决AdaGrad算法在迭代后期由于学习率过小,较难找到最优解的问题,也是对学习率进行修正
opt=tf.keras.optimizers.RMSprop(learning_rate=0.1,rho=0.9)
#定义要更新的参数
var=tf.Variable(1.0)
#定义损失函数
def loss():
return (var**2)/2.0
#第一次更新
opt.minimize(loss,[var])
var
<tf.Variable ‘Variable:0’ shape=() dtype=float32, numpy=0.6837724>
Adam
opt=tf.keras.optimizers.Adam(learning_rate=0.1)
#定义要更新的参数
var=tf.Variable(1.0)
#定义损失函数
def loss():
return (var**2)/2.0
#第一次更新
opt.minimize(loss,[var])
var
<tf.Variable ‘Variable:0’ shape=() dtype=float32, numpy=0.900001>
总结
常用动量法和adam算法,但其中adam容易造成梯度爆炸的情况
学习率退火
分段常数衰减
#boundaries是设置分段更新的step值,values是针对不同分段的学习率值
tf.keras.optimizers.schedules.PiecewiseConstantDecay(boundaries,values)
指数衰减
tf.keras.optimizers.schedules.ExponentialDecay(initial_learning_rate,decay_steps,decay_rate)
1/t衰减
tf.keras.optimizers.schedules.InverseTimeDecay(initial_learning_rate,decay_steps,decay_rate)