Tensorflow--梯度及梯度下降法

Tensorflow–梯度及梯度下降法

一.梯度

Tensorflow通过函数gradients(ys,xs,grad_ys=None,name=“gradients”)实现自动计算梯度,代码如下:

import tensorflow as tf
import numpy as np

x=tf.placeholder(tf.float32,(2,1))

w=tf.constant([[3,4]],tf.float32)
y=tf.matmul(w,x)

F=tf.pow(y,2)

grades=tf.gradients(F,x)
session=tf.Session()

print(session.run(grades,{x:np.array([[2],[3]])}))
[array([[ 108.],
       [ 144.]], dtype=float32)]

二.导数计算的链式法则

1.梯度下降法

一元函数的梯度下降法
梯度下降法是求解凸函数无约束最优化问题常用的方法,其中η常称为学习率

求:f(x)=(x-1)的最小值点

初始化:x1=4,η=0.25

第一次迭代:x2=x1-ηf’(x1)=4-0.25_2_(4-1)=2.5

第二次迭代:x3=x2-ηf’(x2)=2.5-0.25_2_(2.5-1)=1.75

第三次迭代:x4=x3-ηf’(x3)=1.75-0.25_2_(1.75-1)=1.375

Tensorflow通过函数tf.train.GradientDescentOptimizer(learning_rate,use_locking=False,name=“GradientDescent”)实现以上梯度下降法,利用该函数实现以上示例的迭代过程

import tensorflow as tf

x=tf.Variable(4.0,dtype=tf.float32)

y=tf.pow(x-1,2.0)

# 梯度下降,学习率设置为0.25
opti=tf.train.GradientDescentOptimizer(0.25).minimize(y)

session=tf.Session()
session.run(tf.global_variables_initializer())

# 三次迭代
for i in range(3):
    session.run(opti)
    
    print(session.run(x))
2.5
1.75
1.375

其中学习率η=0.25设置得比较大,最好设置得小一点,否则会在最小值附近震荡,稍微修改以上程序,令学习率η=0.05,迭代100次,每次打印当前寻找的点

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import math

x=tf.Variable(15.0,dtype=tf.float32)

y=tf.pow(x-1,2.0)

opti=tf.train.GradientDescentOptimizer(0.05).minimize(y)

value=np.arange(-15,17,0.01)

y_value=np.power(value-1,2.0)
plt.plot(value,y_value)

session=tf.Session()
session.run(tf.global_variables_initializer())

for i in range(100):
    session.run(opti)
    
    if(i%10==0):
        v=session.run(x)
        plt.plot(v,math.pow(v-1,2.0),"go")
        print("第%d次的x的迭代值:%f"%(i+1,v))
        
plt.show()
第1次的x的迭代值:13.600000
第11次的x的迭代值:5.393349
第21次的x的迭代值:2.531866
第31次的x的迭代值:1.534129
第41次的x的迭代值:1.186239
第51次的x的迭代值:1.064938
第61次的x的迭代值:1.022642
第71次的x的迭代值:1.007895
第81次的x的迭代值:1.002753
第91次的x的迭代值:1.000960

output_6_1.png

多元函数的梯度下降法

f(x1,x2)=x1+x2

import tensorflow as tf

x1=tf.Variable(-4.0,dtype=tf.float32)
x2=tf.Variable(4.0,dtype=tf.float32)

y=tf.square(x1)+tf.square(x2)

session=tf.Session()
session.run(tf.global_variables_initializer())

opti=tf.train.GradientDescentOptimizer(0.25).minimize(y)

for i in range(2):
    session.run(opti)
    
    print((session.run(x1),session.run(x2)))
(-2.0, 2.0)
(-1.0, 1.0)

采用矩阵的形式组织变量

import tensorflow as tf

x=tf.Variable(tf.constant([-4,4],tf.float32),tf.float32)

y=tf.reduce_sum(tf.square(x))

session=tf.Session()
session.run(tf.global_variables_initializer())

opti=tf.train.GradientDescentOptimizer(0.25).minimize(y)

for i in range(2):
    session.run(opti)
    
    print(session.run(x))
[-2.  2.]
[-1.  1.]

利用Tensorflow对某一函数进行梯度下降,主要分为如下三步:

1.利用Variable类初始化自变量的值

2.构造出函数

3.利用函数GradientDescentOptimizer进行梯度下降法操作

三.梯度下降法

1.Adagrad法

f(x1,x2)=x1+x2

Tensorflow通过函数tf.train.AdagradOptimizer(learning_rate=0.001,initial_accumulator_value=0.1)实现Adagrad梯度下降

import tensorflow as tf

x=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)

w=tf.constant([[1,2]],tf.float32)
y=tf.reduce_sum(tf.matmul(w,tf.square(x)))

opti=tf.train.AdagradOptimizer(0.25,0.1).minimize(y)

session=tf.Session()
init=tf.global_variables_initializer()
session.run(init)

for i in range(3):
    session.run(opti)
    
    print(session.run(x))
[[ 3.75019503]
 [ 2.75008678]]
[[ 3.57927608]
 [ 2.58118463]]
[[ 3.4426589 ]
 [ 2.44730377]]

2.Momentum法

import tensorflow as tf

x=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)

w=tf.constant([[1,2]],tf.float32)
y=tf.reduce_sum(tf.matmul(w,tf.square(x)))

opti=tf.train.MomentumOptimizer(0.01,0.9).minimize(y)

session=tf.Session()
init=tf.global_variables_initializer()
session.run(init)

for i in range(2):
    session.run(opti)
    
    print(session.run(x))
[[ 3.92000008]
 [ 2.88000011]]
[[ 3.76960015]
 [ 2.65680003]]

3.NAG法

Tensorflow通过函数MomentumOptimizer实现Momentum法,该函数中有一个参数use_nesterov,只要将该参数设置为True,就是Tensorflow实现的NAG法
import tensorflow as tf

x=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)

w=tf.constant([[1,2]],tf.float32)
y=tf.reduce_sum(tf.matmul(w,tf.square(x)))

opti=tf.train.MomentumOptimizer(0.01,0.9,use_nesterov=True).minimize(y)

session=tf.Session()
init=tf.global_variables_initializer()
session.run(init)

for i in range(2):
    session.run(opti)
    
    print(session.run(x))
[[ 3.84800005]
 [ 2.77200007]]
[[ 3.636976  ]
 [ 2.46412802]]

4.RMSprop法

Tensorflow的实现代码如下:

opti=tf.train.RMSPropOptimizer(learning_rate=0.01,decay=0.9,epsilon=1e-10).minimize(y)
import tensorflow as tf

x=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)

w=tf.constant([[1,2]],tf.float32)
y=tf.reduce_sum(tf.matmul(w,tf.square(x)))

opti=tf.train.RMSPropOptimizer(learning_rate=0.01,decay=0.9,epsilon=1e-10).minimize(y)

session=tf.Session()
init=tf.global_variables_initializer()
session.run(init)

for i in range(2):
    session.run(opti)
    
    print(session.run(x))
[[ 3.97039056]
 [ 2.96932149]]
[[ 3.94826055]
 [ 2.94682598]]

5.具备动量的RMSprop法是RMSprop和Momentum结合的方法

Tensorflow的实现代码如下:

tf.train.RMSPropOptimizer(learning_rate=0.01,decay=0.9,momentum=0.9,epsilon=1e-10).minimize(y)
import tensorflow as tf

x=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)

w=tf.constant([[1,2]],tf.float32)
y=tf.reduce_sum(tf.matmul(w,tf.square(x)))

opti=tf.train.RMSPropOptimizer(learning_rate=0.01,decay=0.9,momentum=0.9,epsilon=1e-10).minimize(y)

session=tf.Session()
init=tf.global_variables_initializer()
session.run(init)

for i in range(2):
    session.run(opti)
    
    print(session.run(x))
[[ 3.97039056]
 [ 2.96932149]]
[[ 3.92161226]
 [ 2.91921544]]

6.Adadelta法

Tensorflow通过函数:

tf.train.AdadeltaOptimizer(learning_rate=0.001,rho=0.95,epsilon=1e-8).minimize(y)
import tensorflow as tf

x=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)

w=tf.constant([[1,2]],tf.float32)
y=tf.reduce_sum(tf.matmul(w,tf.square(x)))

opti=tf.train.AdadeltaOptimizer(learning_rate=0.001,rho=0.95,epsilon=1e-8).minimize(y)

session=tf.Session()
init=tf.global_variables_initializer()
session.run(init)

for i in range(2):
    session.run(opti)
    
    print(session.run(x))
[[ 3.99999928]
 [ 2.99999928]]
[[ 3.99999881]
 [ 2.99999881]]

7.Adam法

tf.train.AdamOptimizer(learning_rate=0.001,beta1=0.9,beta2=0.999,epsilon=1e-8)
import tensorflow as tf

x=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)

w=tf.constant([[1,2]],tf.float32)
y=tf.reduce_sum(tf.matmul(w,tf.square(x)))

opti=tf.train.AdamOptimizer(learning_rate=0.001,beta1=0.9,beta2=0.999,epsilon=1e-8).minimize(y)

session=tf.Session()
init=tf.global_variables_initializer()
session.run(init)

for i in range(2):
    session.run(opti)
    
    print(session.run(x))
[[ 3.99900007]
 [ 2.99900007]]
[[ 3.99800014]
 [ 2.99800014]]
原文地址:https://www.cnblogs.com/LQ6H/p/10331439.html