“深度学习”学习日记。神经网络的学习--学习率

2023.1.10

昨天学习到了学习率这个概念,学习率是指我们利用梯度法求取损失函数的最小值时,梯度每进行先前进行一段距离以后,在新的位置再求取梯度,进而更新参数。

学习率具体指η,在代码中这样表示:x_{0} = x_{0} - \eta \frac{\partial f}{\partial x_{0} }

                                                           x_{1} = x_{1} - \eta \frac{\partial f}{\partial x_{1} }

我们以这个函数来实现代码 :利用梯度法 f(x_{0},x_{1})=x_{0}^{2}+x_{1}^{3}+9 损失函数的最小值:

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]

这个例子举得不好因为这个函数的最小值时无穷小,当损失函数是这样的话,我想这个神经网络的性能理论上可以达到非常好的效果,但是昨天用了这个函数,今天现在也用这个函数啰嗦一段吧。

现在来举一个新的例子: 求函数 f(x_{0},x_{1})=x_{0}^{2} + x_{1}^{2} 最小值 易得最小值等于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,他会离散到一个很离谱的值

“深度学习”学习日记。神经网络的学习--学习率_第1张图片

 学习率过小:

当lr=0.0000000001

“深度学习”学习日记。神经网络的学习--学习率_第2张图片

 结果和输入[2,2]没有什么区别,相当于没有怎么更新就结束了。

学习率这样的参数称为超参数。是一种和神经网络的参数(权重、偏置)性质不同的参数。权重和偏执时神经网络通过训练自动获得的,学习率这样的参数时人工设定的,这样性质的参数往往需要人工的实验取试错

 

你可能感兴趣的:(深度学习,神经网络,学习)