神经网络学习笔记3

神经网络
①梯度
梯度法:在学习时找到最优参数,使用梯度寻找函数最小值方法:函数取值从
梯度:表示各点处函数减少最多的方向,不一定指向最小值,但沿着方向可以最大限度减少函数的值。所以在寻找函数最小值的时候,以梯度信息为线索决定前进方向。
学习率:在神经网络学习中,决定在一次学习中应该学习多少,以及在多大程度上更新参数

使用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)

原文地址:https://www.cnblogs.com/AKsnoopy/p/13488152.html