梯度、梯度法、python实现神经网络的梯度计算

【机器学习】梯度、梯度法、python实现神经网络的梯度计算

    • 一、python实现求导的代码:
    • 二、what is 梯度
    • 三、使用梯度法寻找神经网络的最优参数
    • 四、神经网络的梯度计算

一、python实现求导的代码:

导数含义也就是:变量x一个微小的变化将导致f(x)的值在多大程度上变化。

def numerical_diff(f, x):h = 1e-4return (f(x+h) - f(x-h)) / (2*h)

偏导数怎么求,对哪个变量求偏导,就把其他变量固定为某个值,然后就像求一元函数导数那样对这个变量求导。

举个例子,对x0^ 2+x1 ^2=y这个二元函数,求x0=3,x1=4时,对x0的偏导数。

代码如下:

def numerical_diff(f, x):h = 1e-4return (f(x+h) - f(x-h)) / (2*h)def func_1(x):return x[0]**2+x[1]**2# 求x0=3,x1=4时,x0的偏导数def func_temp1(x0):return x0**2+4**2if __name__ == '__main__':res = numerical_diff(func_temp1,3.0)print(res)

输出:

6.00000000000378

二、what is 梯度

由全部变量的偏导数汇总而成的向量叫梯度。

求梯度代码如下:

函数 _numerical_gradient_no_batch 的参数f为函数,x为Numpy数组。

grad = np.zeros_like(x)生成一个形状和x相同,所有元素均为0的数组,梯度就存到这里面。

这里面fxh1计算的时候,如果在这(x[0],x[1])这一点对x[0]求编导,变的是x[0],x[1]不变。而且对x[1]求偏导的时候,变的是x[1],x[0]不变。所以,要用tmp_val存变化前的数,并且,在求完偏导后把一切恢复。

下面代码是对x0 ^ 2+x1 ^ 2=y这个二元函数,求点(3,4)处的梯度。

import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as npdef _numerical_gradient_no_batch(f, x):h = 1e-4  # 0.0001grad = np.zeros_like(x)for idx in range(x.size):tmp_val = x[idx]x[idx] = float(tmp_val) + hfxh1 = f(x)  # f(x+h)x[idx] = tmp_val - hfxh2 = f(x)  # f(x-h)grad[idx] = (fxh1 - fxh2) / (2 * h)x[idx] = tmp_val  # 还原值return graddef func_1(x):return x[0]**2+x[1]**2if __name__ == '__main__':#求点(3,4)处的梯度res = _numerical_gradient_no_batch(func_1, np.array([3.0, 4.0]))print(res)

结果:

[6. 8.]

用python画很多点的梯度向量,那么就发现一个很神奇的结果:梯度指向函数最小值,离最小值越远,箭头越大。

严格来讲,梯度指示的方向是各点处函数值减小最多的方向。无法保证梯度所指方向就是函数最小值。

虽然梯度的方向不一定指向最小值,但是沿着它的方向能够最大限度减小函数的值,这就是梯度法

在这里插入图片描述

三、使用梯度法寻找神经网络的最优参数

通过不断地沿着梯度方向前进,逐渐减小函数值的过程就是梯度法。

梯度法的数学表示:

在这里插入图片描述

η表示更新量,在神经网络的学习中,称为学习率( learningrate)。学习率决定在一次学习中,应该学习多少,以及在多大程度上更新参数。

这个数学表示是什么意思,其实就是沿着梯度走,如上图,(x0,x1)取(0,2)时,梯度是(0,4)。这里的x0-η乘f在x0处的偏导,表示沿那个梯度方向走的一小步。学习率小的话,每次走的步子会很小,学习率大的话,步子就大。

用python实现梯度法的代码如下:

f是要进行最优化的函数, init_x是初始值, lr是学习率, step_num是梯度法的重复次数。

gradient_descent函数里面调用了numerical_gradient函数,用来求函数的梯度。gradient_descent函数里面会一直循环step_num次梯度法,每一次都用梯度乘以学习率得到新值,并更新。最后如果梯度法进行的顺利,将走到最小值的位置。

def gradient_descent(f, init_x, lr=0.01, step_num=100):x = init_xx_history = []for i in range(step_num):x_history.append( x.copy() )grad = numerical_gradient(f, x)x -= lr * gradreturn x, np.array(x_history)

下面这个例子,用了梯度法求f(x0,x1)=x0^ 2+x1 ^2的最小值。最终结果接近(0,0),说明我们的结果基本正确,因为最小值确实是在(0,0)点取到。

import numpy as np
import matplotlib.pylab as plt
from gradient_2d import numerical_gradientdef gradient_descent(f, init_x, lr=0.01, step_num=100):x = init_xx_history = []for i in range(step_num):x_history.append( x.copy() )grad = numerical_gradient(f, x)x -= lr * gradreturn x, np.array(x_history)def function_2(x):return x[0]**2 + x[1]**2init_x = np.array([-3.0, 4.0])    lr = 0.1
step_num = 20
x, x_history = gradient_descent(function_2, init_x, lr=lr, step_num=step_num)
print(x)plt.plot( [-5, 5], [0,0], '--b')
plt.plot( [0,0], [-5, 5], '--b')
plt.plot(x_history[:,0], x_history[:,1], 'o')plt.xlim(-3.5, 3.5)
plt.ylim(-4.5, 4.5)
plt.xlabel("X0")
plt.ylabel("X1")
plt.show()

输出:

[-0.03458765  0.04611686]

在这里插入图片描述

学习率取的过大或者过小都无法得到好结果。

对上面代码进行修改:

学习率过大的话,结果会发散成一个很大的值。

lr = 10
step_num = 100
x, x_history = gradient_descent(function_2, init_x, lr=lr, step_num=step_num)
print(x)

结果:

[-2.58983747e+13 -1.29524862e+12]

学习率过小,基本上没怎么更新就结束了。

lr = 1e-10
step_num = 100
x, x_history = gradient_descent(function_2, init_x, lr=lr, step_num=step_num)
print(x)

结果:

[-2.99999994  3.99999992]

四、神经网络的梯度计算

神经网络的学习中的梯度,指的是损失函数关于权重参数的梯度。

假设,有一个形状为2*3的权重W的神经网络,损失函数是L,下面是该网络权重和梯度的数学表示。

在这里插入图片描述

下面是一个例子,首先要实现一个simpleNet类,这个网络的权重矩阵是2*3的。

最后输出的dw如下,这个是梯度。

[[ 0.12894287  0.31807705 -0.44701992][ 0.19341431  0.47711557 -0.67052988]]

比如,如果w11增加h,那么损失函数的值会增加0.47h。从减小损失函数值的观点看,w11应该向负方向更新。

import sys, os
sys.path.append(os.pardir)  # 为了导入父目录中的文件而进行的设定
import numpy as np
from common.functions import softmax, cross_entropy_error
from common.gradient import numerical_gradientclass simpleNet:def __init__(self):self.W = np.random.randn(2,3)def predict(self, x):return np.dot(x, self.W)def loss(self, x, t):z = self.predict(x)y = softmax(z)loss = cross_entropy_error(y, t)return lossnet = simpleNet()
print(net.W) # 权重参数x = np.array([0.6, 0.9])#输入数据
p = net.predict(x) #由输入经过神经网络得到的输出预测值
print(p)
print(np.argmax(p))#最大值的索引t = np.array([0, 0, 1]) # 正确解标签
print(net.loss(x, t)) #输出损失函数的值def f(W):return net.loss(x, t)
# f = lambda w: net.loss(x, t)dW = numerical_gradient(f, net.W)#求梯度print(dW)

输出:

[[-0.66110535 -2.3121261   0.61870626][-0.43594672  1.66798289 -1.09922476]]
[-0.78901526  0.11390894 -0.61807852]
1
1.366622688011303
[[ 0.12894287  0.31807705 -0.44701992][ 0.19341431  0.47711557 -0.67052988]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用反向传播算法计算参数的梯度并用python实现加法和乘法节点的反向传播

使用反向传播算法计算参数的梯度并用python实现加法和乘法节点的反向传播一、what is 反向传播二、乘法节点的反向传播三、加法节点的反向传播四、加法层和乘法层混合应用一、what is 反向传播 误差反向传播法是一种高效计算权重参数的梯度的方法。所谓的反向传播,…

结合反向传播算法使用python实现神经网络的ReLU、Sigmoid、Affine、Softmax-with-Loss层

结合反向传播算法使用python实现神经网络的ReLU、Sigmoid激活函数层 这里写目录标题一、ReLU层的实现二、Sigmoid层的实现三、实现神经网络的Affine层四、Softmax-with-Loss层实现一、ReLU层的实现 正向传播时的输入大于0,则反向传播会将上游的值原封不动地传给下游…

神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现

神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现一、SGD二、Momentum-动量三、AdaGrad四、Adam一、SGD 右边的值更新左边的值,每次更新朝着梯度方向前进一小步。 class SGD:"""随机梯度下降法(Stochastic Gradient Des…

关于神经网络权重初始值的设置的研究

关于神经网络权重初始值的设置的研究一、权重初始值二、权重初始值会影响隐藏层的激活值分布三、Xavier初始值四、He初始值五、基于MNIST数据集的权重初始值的比较一、权重初始值 权值衰减—抑制过拟合、提高泛化能力。 所谓权值衰减,即,以减小权重参数…

使用权值衰减算法解决神经网络过拟合问题、python实现

使用权值衰减算法解决神经网络过拟合问题、python实现一、what is 过拟合二、过拟合原因三、权值衰减四、实验验证4.1制造过拟合现象4.2使用权值衰减抑制过拟合一、what is 过拟合 过拟合指只能拟合训练数据,但不能很好拟合不包含在训练数据中的其他数据的状态。 …

解决神经网络过拟合问题—Dropout方法、python实现

解决神经网络过拟合问题—Dropout方法一、what is Dropout?如何实现?二、使用和不使用Dropout的训练结果对比一、what is Dropout?如何实现? 如果网络模型复杂,L2范数权值衰减方法就难以对付过拟合。这种情况下&#…

神经网络如何调参、超参数的最优化方法、python实现

神经网络如何调参、超参数的最优化方法、python实现一、what is 超参数二、超参数优化实验一、what is 超参数 超参数是什么,其实就是,各层神经元数量、batch大小、学习率等人为设定的一些数。 数据集分为训练数据、测试数据、验证数据。 用测试数据评…

卷积神经网络的整体结构、卷积层、池化、python实现

卷积神经网络的整体结构、卷积层、池化、python实现一、整体结构二、卷积层三、池化层四、python实现卷积层、池化层一、整体结构 神经网络相邻层所有神经元之间都有连接,称为全连接。前面用Affine层实现了全连接。 举个例子 全连接神经网络结构: 卷积…

基于随机梯度下降法的手写数字识别、epoch是什么、python实现

基于随机梯度下降法的手写数字识别、epoch是什么、python实现一、普通的随机梯度下降法的手写数字识别1.1 学习流程1.2 二层神经网络类1.3 使用MNIST数据集进行学习注:关于什么是epoch二、基于误差反向传播算法求梯度的手写数字识别2.1 学习流程2.2 实现与结果分析一…

基于卷积神经网络的手写数字识别、python实现

一、CNN网络结构与构建 参数: 输入数据的维数,通道,高,长 input_dim(1, 28, 28)卷积层的超参数,filter_num:滤波器数量,filter_size:滤波器大小,stride:步幅…

基于深度学习的手写数字识别、python实现

基于深度学习的手写数字识别、python实现一、what is 深度学习二、加深层可以减少网络的参数数量三、深度学习的手写数字识别一、what is 深度学习 深度学习是加深了层的深度神经网络。 二、加深层可以减少网络的参数数量 加深层的网络可以用更少参数获得与没有加深层同等水…

二极管的结构、特性、参数、稳压管的特性和参数

二极管的结构、特性、参数、稳压管的特性和参数本文介绍的定义一、半导体类型二、PN结的结构与单向导电性三、二极管的伏安特性四、二极管的参数五、稳压管本文介绍的定义 本文介绍的定义:半导体、本征半导体、空穴、载流子、杂质半导体、N型半导体、P型半导体、PN…

双极结型三极管的结构、特性曲线、参数、lceda仿真

双极结型三极管的结构、特性、参数本文介绍的定义一、三极管结构二、三极管特性曲线三、三极管参数本文介绍的定义 硅平面管、锗合金管、发射区、基区,集电区、发射极、基极、集电极、发射结、集电结、发射、发射极电流、复合和扩散、基极电流、收集、集电极电流、…

结型场效应管的结构、特性、参数

结型场效应管的结构、特性、参数本文介绍的定义一、N沟道结型场效应管结构二、N沟道结型场效应管特性曲线本文介绍的定义 场效应管、结型场效应管、N沟道结型场效应管的结构、耗尽层、栅极、源极、漏极、N沟道结型场效应管、夹断电压、预夹断、输出特性、可变电阻区、恒流区、…

绝缘栅型场效应管的结构、特性、参数

绝缘栅型场效应管的结构、特性、参数本文介绍的定义一、N沟道增强型MOS场效应管结构二、N沟道增强型MOS场效应管特性曲线三、N沟道耗尽型MOS场效应管结构和特性曲线本文介绍的定义 绝缘栅型场效应管、N沟道增强型MOS场效应管、耗尽型场效应管、增强型场效应管、反型层、开启电…

放大电路、单管共发射极放大电路结构、工作原理、lceda仿真

放大电路、单管共发射极放大电路结构、工作原理本文介绍的定义一、放大电路基本概念二、单管共发射极放大电路本文介绍的定义 放大、实现放大作用、放大电路技术指标测量、电压放大倍数、电流放大倍数、相量表示、最大输出幅度、峰峰值、非线性失真系数、输入电阻、输出电阻、…

放大电路分析方法、图解法分析放大电路、lceda仿真

放大电路分析方法、图解法分析放大电路一、本文介绍的定义二、放大电路分析方法三、图解法一、本文介绍的定义 放大电路分析、图解法、微变等效电路法、静态分析、动态分析、直流通路、交流通路、单管共射放大电路的直流和交流通路、静态工作点、图解法分析静态、直流负载线、…

通过共现矩阵和余弦相似度实现机器对单词的认知、python实现

通过共现矩阵和余弦相似度实现机器对单词的认知、python实现本文介绍的定义:一、语料库预处理二、单词的分布式表示三、单词的相似度四、相似单词排序本文介绍的定义: 语料库、计数方法的目的、语料库预处理、单词的分布式表示、分布式假设、上下文、窗…

使用PPMI改进共现矩阵

使用PPMI改进共现矩阵 共现矩阵的元素表示两个单词同时出现的次数,这里的次数并不具备好的性质,举个例子,有短语叫the car,因为the是个常用词,如果以两个单词同时出现的次数为衡量相关性的标准,与drive 相…

基于SVD的降维优化

基于SVD的降维优化 向量降维:尽量保留数据“重要信息”的基础上减少向量维度。可以发现重要的轴(数据分布广的轴),将二维数据 表示为一维数据,用新轴上的投影值来表示各个数据点的值,示意图如下。 稀疏矩阵…