【读书笔记】《深度学习入门——基于python的理论与实现》


提高学习效果tips

集成学习、dropout层、学习衰减率、data augmentation(如图像的旋转、平移、crop、flip处理等) 、加深层(Resnet,加深层的网络可以用更少的参数达到同等水平表现力)都有助于提高识别精度
尤其是data augmentation虽然方法简单,但是识别精度上效果显著。
例VGG:
网络层比简单CNN,全连接中使用Dropout,基于Adam最优化,He权重初始值


参数

W是和控制输入信号的重要新的参数, 偏置是调整神经元被激活的容易程度
设置权重参数:权重使用符合高斯分布的随机数进行初始化,偏置使用0进行初始化( np.zeros(hidden_size) )

optimizers:寻找最优权重参数最优化方法

  • SGD:简单易实现,没效率
  • Momentum:参照小球在碗中滚动的物理规则进行移动,变量v对应物理上速度
  • AdaGrad:学习率衰减,为参数的每个元素适当地调整学习率(更新步伐)
  • Adam:融合了Momentum和AdaGrad的方法,设置三个超参数:学习率,momentum1, momentum2

权重参数初始值

权值衰减:权值衰减就是一种以减小权重参数的值为目的进行学习的方法。通过减小权重参数的值来抑制过拟合的发生。

  • 使用由高斯分布生成的值 * 0.01 后得到的值(标准差为0.01的高斯分布),避免梯度消失
  • Xavier初始值——激活函数是线性函数为前提,如sigmoid, tanh,缺点是随着层加深偏向会变大(层加深、偏向变大学习时会出现梯度消失问题)
  • He初始值——Relu
  • PS
    加Batch Norm层后可以对权重初始值变得很健壮(不那么依赖初始值)
    在手头数据集较少的时候,可以用迁移学习后的权重(的一部分)作为初始值复制到其他神经网络在进行学习。

设定超参数

如神经元数量、batch大小、学习率、权值衰减等

  • 验证集——用于超参数的性能评估,逐渐缩小超参数的“好值”的存在范围
  • 贝叶斯最优化

过拟合

  • 正则化 权值衰减:对大的权重进行惩罚,来抑制过拟合。L1,L2范数作为正则化项
  • Dropout:训练时,随机选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递(与集成学习相关)

函数

激活函数

阶跃函数(感知机),神经网络的函数如sigmoid函数,Relu函数

  • 激活函数不能使用线性函数。因为使用线性函数的话,加深神经网络的层数就没有意义了
  • 激活函数最好使用关于原点对称的性质,比如tanh函数关于原点(0,0)对称,但sigmoid函数关于(0,0.5)对称

输出层函数

一般地,回归问题可以使用恒等函数、二元分类问题可以使用 sigmoid函数、多元分类问题可以使用 softmax函数。

Softmax函数:
1. 实现的时候 + C'
2. 输出0.0-1.0之间实数,输出总和是1,所以输出解释为概率
3. 各个元素之间大小关系不会改变( 因此神经网络分类问题中输出层的softmax函数可以省略)

损失函数

以损失函数为基准,寻找最优权重参数。这个损失函数可以使用任意函数,但一般用均方误差和交叉熵误差等。
不用全部的训练集来计算损失函数,用mini-batch随机选出一批数据然后求梯度和损失函数(但这个损失函数是对训练数据的某个mini-batch的损失函数值,光看这个结果不能说明该神经网络在其他数据集上也能一定有同等程度表现)。
所以损失函数比较的是(y, t),参数就是预测值y和标签t

主要看y的维度
若y是一维,则比如y.shape==(1,10)(表示一张图预测的概率值),求单个数据的交叉熵误差要改变形状,那么t也要变成一维(1, t_size)
若y是二维(mini-batch批量预测  y.shape ==(batch_size,10), 则t和y同维,后面除以batch_size计算得到单个数据的平均损失函数就可以了

为了找到使损失函数最小的值尽可能小的地方,需要计算参数的导数(梯度),然后以这个导数为指引逐步更新参数的值。
对权重参数的损失函数求导,表示“如果稍微改变这个权重参数的值,损失函数的值会如果变化”。
如果导数的值为负,通过使该权重参数向正方向改变,可以减小损失函数的值;反过来,如果导数的值为正,则通过使该权重参数向负方向改变,可以减小损失函数的值。

梯度
由全部变量的偏导数汇总而成的向量称为梯度(gradient)

扫描二维码关注公众号,回复: 9940544 查看本文章
grads={}这个字典里就是保存各个权重参数的偏导数,梯度表示的是各点处的函数值减小最多的方向,因此以梯度的信息为线索决定前进方向。
数值微分法求偏导数的函数gradient(or  numerical_gradient)值需要用到的参数是:( f, x );
f是函数,x是权重参数,以numpy数组形式保存。通常后面调用用到loss(x,t)作为函数f, 用各个权重参数如w1,b2等来计算梯度。(误差反向传播法不用f做参数)

神经网络的梯度

损失函数用L表示,梯度见下图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

im2col函数

将输入数据展开以适合滤波器(权重)

对3维的输入数据应用im2col后,数据转换为2维矩阵(正确地讲,是把包含批数量的4维数据转换成了2维数据)。也就是将3维方块展开为1列。
im2col可以将卷积层进行的运算转换为大型矩阵的乘积,这个方式的实现对GPU来说是非常方便的实现方式。

im2col会考虑滤波器大小、步幅、填充:m2col (input_data, filter_h, filter_w, stride=1, pad=0)

在这里插入图片描述
在这里插入图片描述


简单层:relu层、sigmoid层

Affine层

实现矩阵的乘积运算(仿射变换),仿射变换的处理实现。如 Y = X*W = B
反向传播:
在这里插入图片描述
批版本Affine层
在这里插入图片描述
全连接层需要将3维数据拉平为1维数据。全连接层会忽略形状,将全部都是输入数据作为统一维度的神经元处理

Softmax-with-loss层

神经网络学习阶段要softmax层
交叉熵误差是cross entropy error层
softmax-with-loss层也就是softmax和cross entropy error层的组合
在这里插入图片描述
使用交叉熵误差作为 softmax函数的损失函数后,反向传播得到(y1 − t1, y2 − t2, y3 − t3)这样“漂亮”的结果。然后神经网络的反向传播会把这个差分表示的误差传递给前面的层(传递给前面层的是单个数据的误差,也就是说如果是mini-batch的话要除以批的大小batch_size),这是神经网络学习中的重要性质。

Batch Norm层

调整各层的激活值分布使其拥有适当的广度。为此,要向神经网络中插入对数据分布进行正规化的层,即Batch Normalization层(下文简称Batch Norm层),
在这里插入图片描述
Batch Norm,顾名思义,以进行学习时的mini-batch为单位,按mini-batch进行正规化。插入到激活函数的前面(或者后面),可以减少数据分布的偏向

CNN

卷积层

能保持输入形状不变,比如保持输入的三维图像
卷积运算——滤波器运算;滤波器就是权重,在CNN的实现里是权重参数
增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。
在这里插入图片描述
在3维数据的卷积运算中,输入数据和滤波器的通道数要设为相同的值。(C相同)
如果要在通道方向上也拥有多个卷积运算的输出,要用多个滤波器(权重)。下图中的滤波器就是四维数据。
在这里插入图片描述

批处理:
批处理的话要各层见传递的数据保存为4维数据(batch_num, C,H,W) 顺序保存数据
在这里插入图片描述
如果堆叠多层卷积层,随着层次加深,提取的信息也越抽象、越复杂。

池化层

一般来说,池化的窗口大小会和步幅设定成相同的值,池化层应用区域按通道单独展开
在这里插入图片描述

简单CNN

在这里插入图片描述

发布了63 篇原创文章 · 获赞 13 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/changreal/article/details/90750298