一、深度学习之激活函数
1.阶跃函数
定义:
阶跃函数是一种特殊的连续时间函数,是一个从0跳变到1的过程,属于奇异函数。
公式:
图像:
2.sigmoid 函数
定义:
激活函数的作用在于决定如何来激活输入信号的总和。
公式:
图像:
作用:
sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化,sigmoid函数的平滑性对神经网络的学习具有重要意义。
区别:
神经网络中使用的是平滑变化的sigmoid函数,而感知机中使用的是信号急剧变化的阶跃函数。
3.ReLU(Rectified Linear Unit)函数
定义:
线性整流函数(Rectified Linear Unit, ReLU),又称修正线性单元。ReLU函数在输入大于 0时,直接输出该值;在输入小于等于 0时,输出 0。
公式:
图像:
作用:
增加神经网络各层之间的非线性关系。
二、深度学习之三层神经网络的实现
1.三层神经网络
输入层(第0层)有2个神经元,第1个隐藏层(第 1层)有3个神经元,第2个隐藏层(第 2层)有2个神经元,输出层(第 3层)有2个神经元。
2.权重符号
3.信号传递
从输入层到第1层的信号传递
(1)第1层到第2层的信号传递
(2)第 2层到输出层的信号传递
补充:
关于输出层的激活函数,回归问题中一般用恒等函数,分类问题中一般用softmax函数。
三、深度学习之输出层的设计
1.定义
神经网络可以用在分类问题和回归问题上,不过需要根据情况改变输出层的激活函数。一般而言,回归问题用恒等函数,分类问题用softmax函数。
2.恒等函数
恒等函数会将输入按原样输出,对于输入的信息,不加以任何改动地直接输出。
3.Softmax函数
Softmax函数,或称归一化指数函数,是逻辑函数的一种推广。Softmax函数实际上有限项离散概率分布的梯度对数归一化。
(1)公式
(2)图像
特征Softmax函数的输出值的总和是1。
目的通过使用 softmax函数,我们可以用概率的(统计的)方法处理问题。
改进加入常数,防止超大值进行除法运算时结果“不确定“情况。
4.输出层的神经元数量
输出层的神经元数量需要根据待解决的问题来决定。对于分类问题,输出层的神经元数量一般设定为类别的数量。
四、深度学习之神经网络的学习
1.学习的目的
就是以该损失函数为基准,找出能使它的值达到最小的权重参数。
2.损失函数
定义损失函数(loss function)是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。
公式
yk是表示神经网络的输出,tk 表示监督数据,k表示数据的维数
3.交叉熵误差
公式
yk 是神经网络的输出,tk 是正确解标签,实际上只计算对应正确解标签的输出的自然对数。
图像
正确解标签对应的输出越大,上式的值越接近0;当输出为1时,交叉熵误差为0。
4.为什么要导入损失函数
在进行神经网络的学习时,不能将识别精度作为指标。因为如果以识别精度为指标,则参数的导数在绝大多数地方都会变为0。
识别精度对微小的参数变化基本上没有什么反应,即便有反应,它的值也是不连续地、突然地变化。
5.one-hot表示
one-hot表示是一种将正确解标签表示为1,其他标签表示为 0的表示方法。
6.梯度
本质:梯度指示的方向是各点处的函数值减小最多的方向。
7.梯度法
表示更新量,在神经网络的学习中,称为学习率。学习率决定在一次学习中,应该学习多少,以及在多大程度上更新参数,通过不断地沿梯度方向前进,逐渐减小函数值的过程。
8.学习率
像学习率这样的参数称为超参数。
学习率这样的超参数则是人工设定的。一般来说,超参数需要尝试多个值,以便找到一种可以使学习顺利进行的设定。
9.神经网络的梯度
形状为2×3的权重 W的神经网络,损失函数用L表示。此时梯度可以用
10.学习算法的实现
步骤 1(mini-batch)从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch的损失函数的值。
步骤 2(计算梯度)为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
步骤 3(更新参数)将权重参数沿梯度方向进行微小更新。
步骤 4(重复)重复步骤1、步骤2、步骤3。
简要步骤输入层->隐藏层 x,w1,b1->a1隐藏层->隐藏层 sigmoid(a1)->z1 z1,w2,b2->a2隐藏层->输出层 sigmoid(a2)->z2 z2,w3,b3->a3 softmax(a3)->y
五、深度学习之误差反向传播法
1.引入误差反向传播发目的
虽然数值微分虽然简单,也容易实现,但缺点是计算上比较费时间。因此引入误差反向传播法,能够高效计算权重参数的梯度。
2.理解方法
(1)基于数学式
这种方法严密且简洁,所以确实非常合理,但如果一上来就围绕数学式进行探讨,会忽略一些根本的东西,止步于式子的罗列。
(2)基于计算图
通过计算图,可以直观地理解误差反向传播法。
3.用计算图解题的步骤
第一步:构建计算图。
第二步:在计算图上,从左向右进行计算。
4.正向传播(forward propagation)
正向传播是从计算图出发点到结束点的传播。
5.反向传播(backward propagation)
反向传播将在接下来的导数计算中发挥重要作用。
(1)加法节点的反向传播
加法节点的反向传播只乘以 1,所以输入的值会原封不动地流向下一个节点
(2)乘法节点的反向传播
乘法的反向传播会将上游的值乘以正向传播时的输入信号的“翻转值”后传递给下游
6.计算图的特征
层的实现中有两个共通的方法(接口)forward()和backward()。forward()对应正向传播,backward()对应反向传播。
乘法节点称为“乘法层”(MulLayer)
加法节点称为“加法层”(AddLayer)
7.激活函数层的实现
(1)激活函数 ReLU(Rectified Linear Unit)
函数式
计算图表示
正向传播
反向传播
反向传播(简洁版)
简化输出
8.Affine/Softmax 层的实现
(1)仿射变换
神经网络的正向传播中进行的矩阵的乘积运算在几何学领域被称为“仿射变换”,将进行仿射变换的处理实现为“Affine 层”。
(2)Affine层的计算图
正向传播
推导式
反向传播
(3)批版本的Affine层
9.Softmax-with-Loss层
Softmax层输出
Softmax-with-Loss层的计算图
神经网络中进行的处理有推理(inference)和学习两个阶段。神经网络的推理通常不使用 Softmax 层。神经网络中未被正规化的输出结果有时被称为“得分”也就是说,当神经网络的推理只需要给出一个答案的情况下,因为此时只对得分最大值感兴趣,所以不需要 Softmax 层。不过,神经网络的学习阶段则需要Softmax 层。
注意反向传播时,将要传播的值除以批的大小(batch_size)后,传递给前面的层的是单个数据的误差。
10.学习算法的实现
步骤 1(mini-batch)从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch的损失函数的值。
步骤 2(计算梯度)为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
步骤 3(更新参数)将权重参数沿梯度方向进行微小更新。
步骤 4(重复)重复步骤1、步骤2、步骤3。
11.梯度确认
确认数值微分求出的梯度结果和误差反向传播法求出的结果是否一致的操作称为梯度确认。
六、深度学习之相关技巧
1.参数的更新
神经网络的学习的目的是找到使损失函数的值尽可能小的参数,解决这个问题的过程称为最优化。
(1)SGD
随机梯度下降法的缺点:如果函数的形状非均向(anisotropic),比如呈延伸状,搜索的路径就会非常低效。SGD低效的根本原因是,梯度的方向并没有指向最小值的方向。
(2)Momentum(动量)
Momentum参照小球在碗中滚动的物理规则进行移动。
αv:对应物理上的地面摩擦或空气阻力,α设定为 0.9之类的值。η:表示学习率。偏L/偏W表示损失函数关于 W的梯度
(3)AdaGrad
AdaGrad为参数的每个元素适当地调整更新步伐。
学习率衰减方法
即随着学习的进行,使学习率逐渐减小。AdaGrad会为参数的每个元素适当地调整学习率,与此同时进行学习。
数学式
偏L/偏W表示损失函数关于 W的梯度,η表示学习率,h保存了以前的所有梯度值的平方和,圆心符号表示对应矩阵元素的乘法
参数更新
在更新参数时,通过乘以1/根号h,就可以调整学习的尺度。可以按参数的元素进行学习率衰减,使变动大的参数的学习率逐渐减小。
Adam
直观地讲,就是融合了 Momentum和 AdaGrad的方法,实现参数空间的高效搜索。
各优化方法的比较图
各优化方法的比较图
2.权重的初始值
隐藏层的激活值的分布,层次加深的深度学习中,梯度消失的问题可能会更加严重。
ReLU的权重初始值
3.Batch Normalization
优点:(1)可以使学习快速进行(可以增大学习率)。(2)不那么依赖初始值(对于初始值不用那么神经质)。(3)抑制过拟合(降低Dropout等的必要性)。
数学式
一开始 γ = 1,β = 0,然后再通过学习调整到合适的值。
结论通过使用 Batch Norm,可以推动学习的进行。并且,对权重初始值变得健壮(“对初始值健壮”表示不那么依赖初始值)。
3.正则化
过拟合模型拥有大量参数、表现力强。训练数据少。
权值衰减权值衰减是一直以来经常被使用的一种抑制过拟合的方法,该方法通过在学习的过程中对大的权重进行惩罚,来抑制过拟合。解决方法:L2范数的权值衰减方法。
DropoutDropout是一种在学习的过程中随机删除神经元的方法选出隐藏层的神经元,然后将其删除。Dropout 将集成学习的效果(模拟地)通过一个网络实现了。
4.超参数的验证
超参数比如各层的神经元数量、batch大小、参数更新时的学习率或权值衰减等。
验证数据调整超参数时,必须使用超参数专用的确认数据。训练数据用于参数(权重和偏置)的学习,验证数据用于超参数的性能评估。
超参数的最优化步骤0 设定超参数的范围。步骤1 从设定的超参数范围中随机采样。步骤2 使用步骤1中采样到的超参数的值进行学习,通过验证数据评估识别精度(但是要将epoch设置得很小)。步骤3 重复步骤1和步骤2(100次等),根据它们的识别精度的结果,缩小超参数的范围。
七、深度学习之卷积神经网络
1.整体结构
全连接相邻层的所有神经元之间都有连接
基于全连接层(Affine层)的网络
基于CNN的网络
CNN中新出现了卷积层(Convolution层)和池化层(Pooling层)
CNN的层的连接顺序是“Convolution - ReLU -(Pooling)”(Pooling层有时会被省略)。这可以理解为之前的“Affi ne - ReLU”连接被替换成了“Convolution - ReLU -(Pooling)”连接。
靠近输出的层中使用了之前的“Affine - ReLU”组合。此外,最后的输出层中使用了之前的“Affi ne - Softmax”组合。
2.卷积层
目的解决全连接层存在的问题,数据的形状被“忽视”了。
特征图CNN 中,称卷积层的输入输出数据为特征图。
卷积运算卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”。
步骤:
(1)无偏置
将各个位置上滤波器的元素和输入的对应元素相乘,然后再求和(有时将这个计算称为乘积累加运算)。然后,将这个结果保存到输出的对应位置。以一定间隔滑动滤波器的窗口并应用。
(2)有偏置
向应用了滤波器的数据加上了偏置,偏置通常只有 1个(1×1)
这个值会被加到应用了滤波器的所有元素上。
填充(1)填充方法在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如 0等)。对大小为 (4, 4)的输入数据应用了幅度为 1的填充。“幅度为 1的填充”是指用幅度为 1像素的 0填充周围。(2)填充图像
(3)填充目的
使用填充主要是为了调整输出的大小,保证卷积运算就在保持空间大小不变的情况下将数据传给下一层。
步幅应用滤波器的位置间隔称为步幅。增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。
步幅为2的卷积运算
如何计算输出大小
假设输入大小为 (H, W),滤波器大小为 (FH, FW),输出大小为(OH, OW),填充为 P,步幅为 S。
3维数据的卷积运算图像是3维数据,除了高、长方向之外,还需要处理通道方向。通道方向上有多个特征图时,会按通道进行输入数据和滤波器的卷积运算,并将结果相加,从而得到输出。
对3维数据进行卷积运算
对3维数据进行卷积运算的计算顺序
在3维数据的卷积运算中,输入数据和滤波器的通道数要设为相同的值。
结合方块思考卷积运算
(1)输出一张特征图
在这个例子中,数据输出是 1张特征图,即通道数为 1的特征图
(2)输出多张特征图
需要用到多个滤波器(权重)。滤波器的权重数据要按 (output_channel, input_channel, height, width)的顺序书写。比如,通道数为 3、大小为 5 ×5的滤波器有 20个时,可以写成 (20, 3, 5, 5)。
(3)加入偏置
偏置的形状是 (FN, 1, 1),滤波器的输出结果的形状是 (FN, OH, OW)
这两个方块相加时,要对滤波器的输出结果 (FN, OH, OW)按通道加上相同的偏置值。另外,不同形状的方块相加时,可以基于 NumPy的广播功能轻松实现。
3.池化层
目的池化是缩小高、长方向上的空间的运算。
Max池化的处理顺序
Max池化”是获取最大值的运算.一般来说,池化的窗口大小会和步幅设定成相同的值。比如,3 ×3的窗口的步幅会设为 3,4 ×4的窗口的步幅会设为4。
池化层的特征(1)没有要学习的参数(2)通道数不发生变化(3)对微小的位置变化具有鲁棒性(健壮)
4.卷积层和池化层的实现
基于 im2col 的展开
(1)原因
如果老老实实地实现卷积运算,估计要重复好几层的 for语句。这样的实现有点麻烦,而且,NumPy中存在使用 for语句后处理变慢的缺点。因此使用 im2col这个便利的函数进行简单的实现。
(2)im2col的示意图
对 3维的输入数据应用 im2col后,数据转换为 2维矩阵(正确地讲,是把包含批数量的 4维数据转换成了 2维数据)。im2col会把输入数据展开以适合滤波器(权重).
将滤波器的应用区域从头开始依次横向展开为 1列.使用 im2col展开输入数据后,之后就只需将卷积层的滤波器(权重)纵向展开为 1列,并计算 2个矩阵的乘积即可
卷积运算的滤波器处理的细节
卷积层的实现(1)im2col提供的接口
(2)im2col初始化
(3)im2col来实现卷积层
滤波器是(FN,C,FH,FW)的4维形状。另外,FN、C、FH、FW分别是Filter
Number(滤波器数量)、Channel、FilterHeight、FilterWidth的缩写.输入数据的四维形状(N,C,H,W).这里通过 reshape(FN,-1)将参数指定为 -1,这是reshape的一个便利的功能。reshape函数会自动计算 -1维度上的元素个数,以使多维数组的元素个数前后一致。比如,(10, 3, 5, 5)形状的数组的元素个数共有 750个,指定 reshape(10,-1)后,就会转换成 (10, 75)形状的数组。forward的实现中,最后会将输出大小转换为合适的形状。
池化层的实现(1)对输入数据展开池化的应用区域
(2)求得池化的应用区域内的最大值
5.CNN 的实现
简单 CNN的网络构成
(1)CNN 的可视化
第 1 层权重的可视化学习前的滤波器是随机进行初始化的,所以在黑白的浓淡上没有规律可循,但学习后的滤波器变成了有规律的图像。
通过学习,滤波器被更新成了有规律的滤波器,比如从白到黑渐变的滤波器、含有块状区域(称为 blob)的滤波器等。
有规律的滤波器在“观察”什么,答案就是它在观察边缘(颜色变化的分界线)和斑块(局部的块状区域)等。 比如,左半部分为白色、右半部分为黑色的滤波器的情况下,会对垂直方向上的边缘有响应。
(2)基于分层结构的信息提取
如果堆叠了多层卷积层,则随着层次加深,提取的信息也愈加复杂、抽象,这是深度学习中很有意思的一个地方。最开始的层对简单的边缘有响应,接下来的层对纹理有响应,再后面的层对更加复杂的物体部件有响应。也就是说,随着层次加深,神经元从简单的形状向“高级”信息变化。换句话说,就像我们理解东西的“含义”一样,响应的对象在逐渐变化。
具有代表性的 CNN(1)LeNet(2)AlexNet