神经网络
①梯度
梯度法:在学习时找到最优参数,使用梯度寻找函数最小值方法:函数取值从
梯度:表示各点处函数减少最多的方向,不一定指向最小值,但沿着方向可以最大限度减少函数的值。所以在寻找函数最小值的时候,以梯度信息为线索决定前进方向。
学习率:在神经网络学习中,决定在一次学习中应该学习多少,以及在多大程度上更新参数
使用python实现梯度下降法
def gradient_descent(f,init_x,lr=0.01,step_num=100): x=init_x for i in range(setp_num): grad=numrical_gradient(f(x),x) x -= lr*grad return x
f是要进行优化的函数,init_x是初始值,lr是学习率learning rate,step_num是梯度法的重复次数
numerical_gradient(f,x)求函数的梯度,使用该计算的梯度乘以学习率得到的值更新操作,由step_num指定重复的次数。该函数还可以求函数最小值
学习率过大,会发散成一个比较大的值;学习率过小,基本上没怎么更新就结束。设置合适的学习率非常重要。
※神经网络的梯度
example:
对于一个2*3权重W的神经网络,损失用L表示
以一个简单的神经网络为例,实现求梯度代码
实现一个名为simpleNet的类
# coding: utf-8 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_gradient class 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 loss x = np.array([0.6, 0.9]) t = np.array([0, 0, 1]) net = simpleNet() print(net.W) #输出权重参数 p=net.predict(x) print(p) f = lambda w: net.loss(x, t) dW = numerical_gradient(f, net.W) print(dW)
numerical_gradient(f,x)参数是f函数,x为传给f的参数
这里参数x取net.W,定义一个计算损失函数的新函数f,把新定义的函数传给numerical_gradient(f,x)