深度学习入门(基于python实现)--第四章 神经网络的学习 02

# _*_ 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]
"""
过大会导致参数发散成一个很大的值,过小会导致参数还没怎么变化就结束梯度法了
"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值