2023.1.10
昨天学习到了学习率这个概念,学习率是指我们利用梯度法求取损失函数的最小值时,梯度每进行先前进行一段距离以后,在新的位置再求取梯度,进而更新参数。
学习率具体指η,在代码中这样表示:
我们以这个函数来实现代码 :利用梯度法 损失函数的最小值:
import numpy as np
def f(x):
return x[0] ** 2 + x[1] ** 3 + 9
def numercial_gradient(f, x): # 利用数值微分求梯度
h = 1e-4
grad = np.zeros_like(x)
for i in range(x.size):
tmp = x[i]
x[i] = tmp + h
fxh1 = f(x)
x[i] = tmp - h
fxh2 = f(x)
grad[i] = (fxh1 - fxh2) / (2 * h)
x[i] = tmp
return grad
print("求函数的梯度", '\n')
print("输入x0的值")
x0 = float(input()) # 2
print("输入x1的值")
x1 = float(input()) # 2
x = np.array([x0, x1])
print("函数的该点梯度", '\n')
print(numercial_gradient(f, x), '\n') # [ 4. 12.00000001]
def gradient_descent(f, x, lr, step_num):
init_x = x
for i in range(step_num):
grad = numercial_gradient(f, init_x)
x -= lr * grad
return x
print("函数在该点的最小值")
print(gradient_descent(f, x, 0.01, 100)) # [0.26523911 0.28092286]
这个例子举得不好因为这个函数的最小值时无穷小,当损失函数是这样的话,我想这个神经网络的性能理论上可以达到非常好的效果,但是昨天用了这个函数,今天现在也用这个函数啰嗦一段吧。
现在来举一个新的例子: 求函数 最小值 易得最小值等于0
# 只需要变动一个函数
def f(x): return x[0] ** 2 + x[1] ** 2# 结果
求函数的梯度
输入x0的值
2
输入x1的值
2
函数的该点梯度[4. 4.]
函数在该点的最小值
[0.26523911 0.26523911]
事实上这数也接近于(0,0)
# lr调整到0.1的话
函数在该点的最小值
[4.07407195e-10 4.07407195e-10]
step_num 表示学习的次数,意思重复的次数;学习率需要预定好一个值。一般而言学习率过大或者过小都无法到达一个好位置,如果学习率过大,那么他会发散成一个很大的值,如果学习率过小那么他会几乎没有这么更新就结束
代码演示:
学习率过大
当lr=10.0,他会离散到一个很离谱的值
学习率过小:
当lr=0.0000000001
结果和输入[2,2]没有什么区别,相当于没有怎么更新就结束了。
学习率这样的参数称为超参数。是一种和神经网络的参数(权重、偏置)性质不同的参数。权重和偏执时神经网络通过训练自动获得的,学习率这样的参数时人工设定的,这样性质的参数往往需要人工的实验取试错