《深度学习入门》(俗称:鱼书)读书笔记-第四章(神经网络的学习)

《深度学习入门》(俗称:鱼书)读书笔记 Day2

神经网络的学习

学习:从训练数据中自动获取最优权重参数的过程。目的是以损失函数为基准,找到能让其达到最小的权重参数。

1.从数据中学习

感知机收敛定理:感知机可以通过有限次数的学习,解决线性可分的问题。但不能通过学习解决非线性可分的问题。但神经网络uo可以直接将原始数据进行学习,避免了人力的特征工程。
特征量:可以从输入数据中准确提取出重要数据的转换器。不同的问题要选择合适的特征量。
训练数据,测试数据,过拟合,欠拟合
过程:通过训练数据学习参数,然后通过测试数据评价模型能力。划分原因:未来保证泛化能力。

2.损失函数

用来评价网络性能。方法是利用梯度来逐步更新参数的值从而使得损失函数尽可能小。
使用损失函数不使用精度的原因
因为精度是离散的不连续的,微调参数不能改善精度
神经网络使用sigmoid不适用阶跃函数的原因
阶跃函数导数一般为0或者突变。因此无法通过导数(梯度)来指导参数修正。而sigmoid导数是连续的。

1.均方误差

python表示

def mean_squared_error(y,t):#y为网络输出,t为label
    return 0.5*np.sum((y-t)**2)#**2表示2次方

one-hot:正确标签为1,其他标签为0

2.交叉熵误差

python表示

def class_entropy_error(y,t):#同样y为网络输出,t为label
    delta=1e-7 #设置微笑量,因为y有可能为0,那么logy为无穷
    retrun -np.sum(t*np.log(y+delta))

以上均为单个输入的误差,应用时要使用整体误差来调整参数。因此要n个数据的误差累加最后再除以n
mini-batch学习:从全部的数据中选出一部分,作为全部数据的近似。原因:如果数据很多全部计算损失函数花费时间会很长。比对批处理
python_keys:

num=np.random.choice(train_size,batch_size)#[0,train_size)中随意选取batch_size个
arr=np.arange(size)#生成[0,size)的数组

3.数值微分

数值微分:利用微小的差分求导数的过程,含有误差。
解析行求解:利用数学公式求导的过程,不含误差。

4.梯度

python_keys:

np.zeros_like(x)#生成一个和x大小相同的全零矩阵

梯度指示的是个点函数值降低最快的方向,但在复杂函数中指示的方向一般不是函数的最小值处。
学习高原:梯度法寻找的是梯度为0的地方,但如果函数复杂且呈扁平状时,学习可能会进入这个平坦地区,导致无法下降。
学习率:指每次调节参数的幅度大小。被称为超参数,一般是由人来设定的需要尝试多个值。和由神经网络的参数(权重,偏置)不同。

5.学习算法的实现

步骤:

  • 1.从训练数据中随机选出一部分数据称为mini-batch。目标是减小mini-batch的损失函数的值。
  • 2.求出各个权重参数的梯度(即损失函数关于权重的偏导数)
  • 3.将权重参数眼梯度下降的方向微小更新
  • 4.重复1,2,3
    随机梯度下降:对随机选择的数据(mini-batch)选择的数据使用梯度下降方法。一般命名为SGD函数
    一些小技巧书中还是使用的手写数字识别,此处的代码不可运行
train_size=train.shape[0]#数组组数
batch_size=100#mini-batch每次取的组数
train_loss_list=[]
train_acc_list=[]
test_acc_list=[]
#epoch指所有训练数据被使用过一次时的更新次数
iter_per_epoch=max(train_size/batch_size,1)
#人工设定的超参数
items_num=10000 #梯度下降法的更新次数
learning_rate=0.1
network=TwoLayerNet(input_size=784,hidden_size=50,output_size=10)#初始化一个网络
for i in range(items_num):
    batch_mask=np.random.choice(train_size,batch_size)
    x_batch=x_train[batch_mask]#数组里边放数组,取出相应数组下标的元素,最后构成数组。
    t_batch=t_train[batch_mask]
    grad=network.gradient(x_batch,tbatch)#梯度
    for key in ('W1','b1','W2','b2'):
        network.params[key]-=learning_rate*grad[key]
    loss=network.loss(x_batch,t_batch)
    train_loss_list.append(loss)# 计算损失函数,最后可以画图,最后逐渐逼近x轴的是收敛的。
    if i%iter_per_epoch==0:
        train_acc=network.accuracy(x_train,t_train)
        test_acc=netwrok.accuracy(x_test,t_test)
        train.acc_list.append(train_acc)
        test_acc_list.append(test.acc)#训练集,测试集的准确率,最后画图是逼近1(过好会导致过拟合)的曲线代表训练好了
        #ps 数组支持==运算

不学啦不学啦,这本书只适合入门,很简单。
峡谷见面 0.0

你可能感兴趣的:(《深度学习入门》(俗称:鱼书)读书笔记-第四章(神经网络的学习))