chaoz的杂货铺

生命有息、学无止境、折腾不止

0%

《深度学习》读书笔记

day1:感知机卡

day2: 神经网络1

day3: 神经网络2

day4: 数据知识卡1

day5: 数据知识卡2

day6: 计算图卡

误差反向传播法:理解的话两种方法,一种是基于数学式:另一种是基于计算图(computational graph)。

计算图

计算图将计算过程用图形表示出来。这里说的图形是数据结构图,通过多个节点和边表示(连接节点的直线称为“边”)。

从左向右进行计算”是一种正方向上的传播,简称为正向传播(forward propagation)。正向传播是从计算图出发点到结束点的传播。

从右向左的传播称为反向传播(backward propagation)。反向传播将在接下来的导数计算中发挥重要作用。

局部计算

“局部”这个词的意思是“与自己相关的某个小范围”。局部计算是指,无论全局发生了什么,都能只根据与自己相关的信息输出接下来的结果。

废话这么多 就是局部 局部 局部 的意思嘛。

为何用计算图解题

化繁为简,简化问题。

PS:而反向传播将局部导数向正方向的反方向(从右到左)传递??

链式法则

传递这个局部导数的原理,是基于链式法则(chain rule)的。

如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示。

计算图的反向传播

计算图的反向传播:沿着与正方向相反的方向,乘上局部导数

链式法则和计算图

反向传播

加法节点的反向传播

day7 层卡

day8 参数技巧卡1

参数的更新

神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化(optimization)。

SGD 随机梯度下降法(stochastic gradient descent):

为了找到最优参数,我们将参数的梯度(导数)作为了线索。使用参数的梯度,沿梯度方向更新参数,并重复这个步骤多次,从而逐渐靠近最优参数。

SGD 的缺点:

如果函数的形状非均向(anisotropic),比如呈延伸状,搜索的路径就会非常低效。因此,我们需要比单纯朝梯度方向前进的 SGD 更聪明的方法。SGD 低效的根本原因是,梯度的方向并没有指向最小值的方向。

Momentum

AdaGrad

在神经网络的学习中,学习率(数学式中记为 η)的值很重要。学习率过小,会导致学习花费过多时间;反过来,学习率过大,则会导致学习发散而不能正确进行。

学习率衰减(learning rate decay):
即随着学习的进行,使学习率逐渐减小。实际上,一开始“多”学,然后逐渐“少”学的方法,在神经网络的学习中经常被使用。

Adam

Adam 是 2015 年提出的新方法。它的理论有些复杂,直观地讲,就是融合了 Momentum 和 AdaGrad 的方法。通过组合前面两个方法的优点,有望实现参数空间的高效搜索。此外,进行超参数的“偏置校正”也是 Adam 的特征。

权重的初始值

在神经网络的学习中,权重的初始值特别重要。实际上,设定什么样的权重初始值,经常关系到神经网络的学习能否成功。

为了防止“权重均一化”(严格地讲,是为了瓦解权重的对称结构),必须随机生成初始值。不可以将权重初始值设为 0 。

隐藏层的激活值的分布

梯度消失:

各层的激活值呈偏向 0 和 1 的分布。这里使用的 sigmoid 函数是 S 型函数,随着输出不断地靠近 0(或者靠近 1),它的导数的值逐渐接近 0。因此,偏向 0 和 1 的数据分布会造成反向传播中梯度的值不断变小,最后消失。
层次加深的深度学习中,梯度消失的问题可能会更加严重。

ReLU的权重初始值

Xavier 初始值是以激活函数是线性函数为前提而推导出来的。因为 sigmoid 函数和 tanh 函数左右对称,且中央附近可以视作线性函数,所以适合使用 Xavier 初始值。但当激活函数使用 ReLU 时,一般推荐使用 ReLU 专用的初始值,也就是 Kaiming He 等人推荐的初始值,也称为“He 初始值”。

总结一下,当激活函数使用 ReLU 时,权重初始值使用 He 初始值,当激活函数为 sigmoid 或 tanh 等 S 型曲线函数时,初始值使用 Xavier 初始值。这是目前的最佳实践。(***)

基于 MNIST 数据集的权重初始值的比较

MNIST :
是深度学习的经典入门demo,他是由6万张训练图片和1万张测试图片构成的,每张图片都是28*28大小(如下图),而且都是黑白色构成(这里的黑色是一个0-1的浮点数,黑色越深表示数值越靠近1),这些图片是采集的不同的人手写从0到9的数字。TensorFlow将这个数据集和相关操作封装到了库中,下面我们来一步步解读深度学习MNIST的过程。

综上,在神经网络的学习中,权重初始值非常重要。很多时候权重初始值的设定关系到神经网络的学习能否成功。权重初始值的重要性容易被忽视,而任何事情的开始(初始值)总是关键的,因此在结束本节之际,再次强调一下权重初始值的重要性。

Batch Normalization

Batch Normalization 的算法

Batch Normalization(下文简称 Batch Norm)是 2015 年提出的方法。Batch Norm 虽然是一个问世不久的新方法,但已经被很多研究人员和技术人员广泛使用。实际上,看一下机器学习竞赛的结果,就会发现很多通过使用这个方法而获得优异结果的例子。

Batch Norm,顾名思义,以进行学习时的 mini-batch 为单位,按 mini-batch 进行正规化。具体而言,就是进行使数据分布的均值为 0、方差为 1 的正规化。用数学式表示的话,如下所示。


)

Batch Normalization 的计算图(引用自文献 [13]):

优点

可以使学习快速进行(可以增大学习率)。
不那么依赖初始值(对于初始值不用那么神经质)。
抑制过拟合(降低 Dropout 等的必要性)。

Batch Normalization的评估

综上,通过使用 Batch Norm,可以推动学习的进行。并且,对权重初始值变得健壮(“对初始值健壮”表示不那么依赖初始值)。Batch Norm 具备了如此优良的性质,一定能应用在更多场合中。

有点难吧 代码还没跑 好菜哦、、、、慢慢消化。。。。。

day9 参数技巧卡2

正则化

过拟合

过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。机器学习的目标是提高泛化能力,即便是没有包含在训练数据里的未观测数据,也希望模型可以进行正确的识别。

原因:
模型拥有大量参数、表现力强。
训练数据少。

权值衰减

权值衰减是一直以来经常被使用的一种抑制过拟合的方法。该方法通过在学习的过程中对大的权重进行惩罚,来抑制过拟合。很多过拟合原本就是因为权重参数取值过大才发生的。

但是,如果网络的模型变得很复杂,只用权值衰减就难以应对了。

Dropout

Dropout 是一种在学习的过程中随机删除神经元的方法。训练时,随机选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递。训练时,每传递一次数据,就会随机选择要删除的神经元。

这个集成学习与 Dropout 有密切的关系,神经网络的识别精度可以提高好几个百分点。

可以将 Dropout 理解为,通过在学习过程中随机删除神经元,从而每一次都让不同的模型进行学习。并且,推理时,通过对神经元的输出乘以删除比例(比如,0.5 等),可以取得模型的平均值。也就是说,可以理解成,Dropout将集成学习的效果(模拟地)通过一个网络实现了。

超参数的验证

超参数(hyper-parameter)

这里所说的超参数是指,比如各层的神经元数量、batch 大小、参数更新时的学习率或权值衰减等。如果这些超参数没有设置合适的值,模型的性能就会很差。

验证数据

用测试数据确认超参数的值的“好坏”,就会导致超参数的值被调整为只拟合测试数据。

根据不同的数据集,有的会事先分成训练数据、验证数据、测试数据三部分,有的只分成训练数据和测试数据两部分,有的则不进行分割。

超参数的最优化

进行超参数的最优化时,逐渐缩小超参数的“好值”的存在范围非常重要。所谓逐渐缩小范围,是指一开始先大致设定一个范围,从这个范围中随机选出一个超参数(采样),用这个采样到的值进行识别精度的评估;然后,多次重复该操作,观察识别精度的结果,根据这个结果缩小超参数的“好值”的范围。通过重复这一操作,就可以逐渐确定超参数的合适范围。

超参数的最优化的步骤

步骤 0

设定超参数的范围。

步骤 1

从设定的超参数范围中随机采样。

步骤 2

使用步骤 1 中采样到的超参数的值进行学习,通过验证数据评估识别精度(但是要将 epoch 设置得很小)。

步骤 3

重复步骤 1 和步骤 2(100 次等),根据它们的识别精度的结果,缩小超参数的范围。

day10 CNN结构卡1

整体结构

CNN :

和之前介绍的神经网络一样,可以像乐高积木一样通过组装层来构建。不过,CNN 中新出现了卷积层(Convolution 层)和池化层(Pooling 层)。

全连接(fully-connected):

相邻层的所有神经元之间都有连接。

基于全连接层(Affine 层)的网络的例子:

CNN 的一个例子:

CNN 的层的连接顺序是“Convolution - ReLU -(Pooling)”(Pooling 层有时会被省略)。

卷积层

全连接层存在的问题

CNN 中,有时将卷积层的输入输出数据称为特征图(feature map)。其中,卷积层的输入数据称为输入特征图(input feature map),输出数据称为输出特征图(output feature map)

全连接层存在什么问题呢?那就是数据的形状被“忽视”了。比如,输入数据是图像时,图像通常是高、长、通道方向上的 3 维形状。但是,向全连接层输入时,需要将 3 维数据拉平为 1 维数据。

在 CNN 中,可以(有可能)正确理解图像等具有形状的数据。

卷积运算

乘积累加运算:

填充

“幅度为 1 的填充”是指用幅度为 1 像素的 0 填充周围(图中用虚线表示填充,并省略了填充的内容“0”):

为什么使用填充:

因为如果每次进行卷积运算都会缩小空间,那么在某个时刻输出大小就有可能变为 1,导致无法再应用卷积运算。填充后卷积运算就可以在保持空间大小不变的情况下将数据传给下一层。

步幅

计算:

假设输入大小为 (H, W),滤波器大小为 (FH, FW),输出大小为 (OH, OW),填充为 P,步幅为 S。

3 维数据的卷积运算

在 3 维数据的卷积运算中,输入数据和滤波器的通道数要设为相同的值,滤波器大小可以设定为任意值(不过,每个通道的滤波器大小要全部相同)。

结合方块思考

通道数为 C、高度为 H、长度为 W 的数据的形状可以写成(C, H, W)。滤波器也一样,要按(channel, height, width)的顺序书写。比如,通道数为 C、滤波器高度为 FH(Filter Height)、长度为 FW(Filter Width)时,可以写成(C, FH, FW)。



批处理

神经网络的处理中进行了将输入数据打包的批处理。之前的全连接神经网络的实现也对应了批处理,通过批处理,能够实现处理的高效化和学习时对 mini-batch 的对应。

批处理将 N 次的处理汇总成了 1 次进行。

卷积运算也同样对应批处理,需要将在各层间传递的数据保存为 4 维数据。具体地讲,就是按 (batch_num, channel, height, width) 的顺序保存数据。

day11 CNN结构卡2

池化层

池化是缩小高、长方向上的空间的运算。

ps:
除了 Max 池化之外,还有 Average 池化等。相对于 Max 池化是从目标区域中取出最大值,Average 池化则是计算目标区域的平均值。在图像识别领域,主要使用 Max 池化。

池化层的特征

  • 没有要学习的参数

池化层和卷积层不同,没有要学习的参数。池化只是从目标区域中取最大值(或者平均值),所以不存在要学习的参数。

  • 通道数不发生变化

经过池化运算,输入数据和输出数据的通道数不会发生变化。

  • 对微小的位置变化具有鲁棒性(健壮)

输入数据发生微小偏差时,池化仍会返回相同的结果。因此,池化对输入数据的微小偏差具有鲁棒性。

卷积层和池化层的实现

4 维数组

CNN 中各层间传递的数据是 4 维数据。所谓 4 维数据,比如数据的形状是 (10, 1, 28, 28),则它对应 10 个高为 28、长为 28、通道为 1 的数据。

基于 im2col 的展开

im2col 是一个函数,将输入数据展开以适合滤波器(权重)。

ps:
NumPy 中存在使用 for 语句后处理变慢的缺点(NumPy 中,访问元素时最好不要用 for 语句)。

卷积运算的滤波器处理的细节:将滤波器纵向展开为 1 列,并计算和 im2col 展开的数据的矩阵乘积,最后转换(reshape)为输出数据的大小:

卷积层的实现

im2col 这一便捷函数具有以下接口。

1
2
3
4
5
6
im2col (input_data, filter_h, filter_w, stride=1, pad=0):
input_data——由(数据量,通道,高,长)的 4 维数组构成的输入数据
filter_h——滤波器的高
filter_w——滤波器的长
stride——步幅
pad——填充

im2col 会考虑滤波器大小、步幅、填充,将输入数据展开为 2 维数组。

卷积层的初始化方法将滤波器(权重)、偏置、步幅、填充作为参数接收。滤波器是 (FN, C, FH, FW) 的 4 维形状。另外,FN、C、FH、FW 分别是 Filter Number(滤波器数量)、Channel、Filter Height、Filter Width 的缩写。

1
reshape(FN,-1) 将参数指定为 -1,这是 reshape 的一个便利的功能。通过在 reshape 时指定为 -1,reshape 函数会自动计算 -1 维度上的元素个数,以使多维数组的元素个数前后一致。比如,(10, 3, 5, 5) 形状的数组的元素个数共有 750 个,指定 reshape(10,-1) 后,就会转换成 (10, 75) 形状的数组。

transpose 会更改多维数组的轴的顺序。基于 NumPy 的 transpose 的轴顺序的更改:通过指定索引(编号),更改轴的顺序:

池化层的实现

池化的情况下,在通道方向上是独立的。

池化层的实现按下面 3 个阶段进行。

  • 展开输入数据。
  • 求各行的最大值。
  • 转换为合适的输出大小。

day12 CNN实现卡

CNN 的实现

组合卷积层和池化层。

“Convolution - ReLU - Pooling -Affine - ReLU - Affine - Softmax”的网络。

CNN 可以有效读取图像中的某种特性,在手写数字识别中,还可以实现高精度的识别。

CNN 的可视化

第 1 层权重的可视化

卷积层的滤波器会提取边缘或斑块等原始信息。而刚才实现的 CNN 会将这些原始信息传递给后面的层。

学习前和学习后的第 1 层的卷积层的权重:虽然权重的元素是实数,但是在图像的显示上,统一将最小值显示为黑色(0),最大值显示为白色(255)。

学习前的滤波器是随机进行初始化的,所以在黑白的浓淡上没有规律可循,但学习后的滤波器变成了有规律的图像。有规律的滤波器在它在观察边缘(颜色变化的分界线)和斑块(局部的块状区域)等。

基于分层结构的信息提取

一般物体识别(车或狗等)的 8 层 CNN。

ps:
AlexNet 网络结构堆叠了多层卷积层和池化层,最后经过全连接层输出结果。

第 1 层的神经元对边缘或斑块有响应,第 3 层对纹理有响应,第 5 层对物体部件有响应,最后的全连接层对物体的类别(狗或车)有响应。

最开始的层对简单的边缘有响应,接下来的层对纹理有响应,再后面的层对更加复杂的物体部件有响应。也就是说,随着层次加深,神经元从简单的形状向“高级”信息变化

具有代表性的 CNN

CNN 元祖 LeNet;
AlexNet。

LeNet

AlexNet

AlexNet 叠有多个卷积层和池化层,最后经由全连接层输出结果。

AlexNet 和 LeNet 差异

  • 激活函数使用 ReLU。
  • 使用进行局部正规化的 LRN(Local Response Normalization)层。
  • 使用 Dropout(6.4.3 节)。

day13 深度学习

加深网络

深度学习的小历史

VGG

VGG 是由卷积层和池化层构成的基础的 CNN。
它的特点在于将有权重的层(卷积层或者全连接层)叠加至 16 层(或者 19 层),具备了深度(根据层的深度,有时也称为“VGG16”或“VGG19”)。
VGG 中需要注意的地方是,基于 3×3 的小型滤波器的卷积层的运算是连续进行的。
重复进行“卷积层重叠 2 次到 4 次,再通过池化层将大小减半”的处理,最后经由全连接层输出结果。

GoogLeNet

GoogLeNet 的特征是,网络不仅在纵向上有深度,在横向上也有深度(广度)。GoogLeNet 在横向上有“宽度”,这称为“Inception 结构”,
Inception 结构使用了多个大小不同的滤波器(和池化),最后再合并它们的结果。GoogLeNet 的特征就是将这个 Inception 结构用作一个构件(构成元素)。
在 GoogLeNet 中,很多地方都使用了大小为 1 × 1 的滤波器的卷积层。这个 1 × 1 的卷积运算通过在通道方向上减小大小,有助于减少参数和实现高速化处理。

ResNet

ResNet 是微软团队开发的网络。它的特征在于具有比以前的网络更深的结构。

在深度学习中,过度加深层的话,很多情况下学习将不能顺利进行,导致最终性能不佳。ResNet 中,为了解决这类问题,导入了“快捷结构”(也称为“捷径”或“小路”)。

不太明白。。。。。。。。。

深度学习的高速化

GPU

分布式

ps:
计算机中表示小数时,有 32 位的单精度浮点数和 64 位的双精度浮点数等格式。根据以往的实验结果,在深度学习中,即便是 16 位的半精度浮点数(half float),也可以顺利地进行学习。

NumPy 中提供了 16 位的半精度浮点数类型(不过,只有 16 位类型的存储,运算本身不用 16 位进行),即便使用 NumPy 的半精度浮点数,识别精度也不会下降。

喜欢这篇文章?打赏一下作者吧!

欢迎关注我的其它发布渠道