# _*_ coding:UTF-8 _*_
# 文件名:Learning_of_Neural_Networks_02.py
# 开发工具:PyCharm
import numpy as np
"""
梯度法
利用求导数的方法来获得优秀的参数设置来达到损失函数较小的目的
具体分析和论证建议看吴恩达的《机器学习入门》视频,配合本书看极其适合
以下来实现梯度法
"""
def function_1(x):
"""
实现0.01x²+0.1x
:param x: int
:return: float
"""
return 0.1 * x ** 2 + 0.1 * x
def function_2(x):
"""
实现 x(0)² + x(1)²
:param x: list
:return: float
"""
return np.sum(x ** 2)
def numerical_gradient(f, x):
"""
求解某点的梯度
:param f:函数,上面的两个
:param x:自变量x,ndarry
:return:ndarry
"""
h = 1e-4
grad = np.zeros_like(x) # 生成和x一样大小的数组
for idx in range(x.size):
tmp_val = x[idx]
# f(x+h)
x[idx] = tmp_val + h
fxh1 = f(x)
# f(x-h)
x[idx] = tmp_val - h
fxh2 = f(x)
grad[idx] = (fxh1 - fxh2) / (2 * h)
x[idx] = tmp_val
return grad
print(numerical_gradient(function_2, np.array([0, 2.0])))
def gradient_descent(f, init_x, lr, step_num=100):
"""
:param f:method
:param init_x: int
:param lr:int 学习率,每次step_num 重复时修改参数的比例,要适中
:param step_num: 重复次数
:return: 和 init_x 一个type
"""
x = init_x
for i in range(step_num):
grad = numerical_gradient(f, x)
x -= lr * grad
return x
init_x = np.array([-3.0, 4.0])
print(gradient_descent(function_2, init_x, lr=0.1)) # [-6.11110793e-10 8.14814391e-10]
# 解读:init_x为起始位置,经过梯度下降后可以明显看到结果无限接近于(0,0)这个点,也就是function_2这个函数的最低点
"""学习率是一种超参数,也就是人工设定的参数,过大或者过小都不利于参数的更新。类似于权重这种可以通过网络自己更新获得"""
# 过大
init_x = np.array([-3.0, 4.0])
print(gradient_descent(function_2, init_x, lr=10.0)) # [-2.58983747e+13 -1.29524862e+12]
# 过小
init_x = np.array([-3.0, 4.0])
print(gradient_descent(function_2, init_x, lr=0.5)) # [-2.99999994 3.99999992]
"""
过大会导致参数发散成一个很大的值,过小会导致参数还没怎么变化就结束梯度法了
"""
深度学习入门(基于python实现)--第四章 神经网络的学习 02
最新推荐文章于 2024-07-27 12:20:46 发布