目录
梯度下降法是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找到一个函数的局部极小值,必须响函数上当前对于梯度(或者近似梯度)的反方向的规定步长居里点进行迭代搜索。所以梯度下降法可以帮助我们求解某个函数的极小值或者最小值。对于n为问题就是最优解,梯度下降法是最常用的方法之一。
借助 TensorFlow 的可训练变量和自动求导机制使用梯度下降法求解线性回归问题。
第一步:加载数据(导入库、加载数据样本)
第二步:设置超参数(学习率、循环次数、显示结果间隔)
第三步:初始化模型(设置模型参数初值)
第四步:训练模型
第一步:加载数据
# 导入库
import numpy as np
import matplotlib.pyplot as plt
# 加载数据样本
x = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00,
106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])
y = np.array([145.00, 110.00, 93.00, 116.00, 65.32, 104.00, 118.00, 91.00,
62.00, 133.00, 51.00, 45.00, 78.50, 69.65, 75.69, 95.30])
第二步:设置超参数
learn_rate = 0.00001 # 学习率
iter = 100 # 循环次数
display_step = 10 # 显示结果间隔
第三步:初始化模型(设置模型参数初值)
np.random.seed(612)
w = np.random.randn()
b = np.random.randn()
第四步:训练模型
for i in range(0, iter+1):
# 计算梯度
dL_dw = np.mean(x*(w*x+b-y))
dL_db = np.mean(w*x+b-y)
# 使用梯度结果更新模型参数
w = w-learn_rate*dL_dw
b = b-learn_rate*dL_db
# 使用更新后的参数计算估计值和均方误差
pred = w*x+b
Loss = 0.5*np.mean(np.square(y-pred))
mse.append(Loss)
第一步:加载数据
# 导入库
import numpy as np
import tensorflow as tf
print("TensorFlow version:", tf.__version__)
# 加载数据样本
x = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00,
106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])
y = np.array([145.00, 110.00, 93.00, 116.00, 65.32, 104.00, 118.00, 91.00,
62.00, 133.00, 51.00, 45.00, 78.50, 69.65, 75.69, 95.30])
第二步:设置超参数
learn_rate = 0.00001 # 学习率(调整步长)
iter = 100 # 循环次数
display_step = 10 # 显示结果间隔
第三步:设置模型参数初始值
np.random.seed(612)
w = tf.Variable(np.random.randn())
b = tf.Variable(np.random.randn())
第四步:训练模型
for i in range(0, iter+1):
# 把线性模型和损失函数的表达式写在梯度带的with语句中
with tf.GandientTape() as tape:
pred = w*x+b
Loss = 0.5*tf.reduce_mean(tf.square(y-pred))
mse.append(Loss)
# 把手工计算梯度的代码改为使用梯度带gradient方法,自动获取梯度
dL_dw,dL_db = tape.gradient(Loss,[w,b])
# 使用迭代公式更新模型参数,给Variable对象赋值需要使用assign方法,这里使用assign_sub方法实现减法运算
w.assign_sub(learn_rate * dL_dw)
b.assign_sub(learn_rate * dL_db)
值得注意的是:numpy默认浮点数64位 ;TensorFlow默认浮点数32位。
如指定64位,则得到和numpy完全相同的结果
使用TensorFlow实现梯度下降法,梯度带会自动计算损失函数的梯度而不用我们写代码实现偏导数的实现过程。
感谢阅读