【周志华机器学习】五、神经网络

参考资料

  1. Machine-learning-learning-notes
  2. LeeML-Notes
  3. ML-NLP

本博客为作者根据周志华的西瓜书和参考资料1、2、3所做的笔记,主要用于学习,非技术类博客,因此存在大量复制粘贴,请见谅。
如果本篇博客有后记部分,则该部分表示的是在书本原有的基础知识上,进行的知识点的扩充。

1. 基本概念

在机器学习中,神经网络一般指的是“神经网络学习”,是机器学习与神经网络两个学科的交叉部分。所谓神经网络,目前用得最广泛的一个定义是“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应”。

实际上,这样理解神经网络的确很高大上,但是却不接地气。神经网络其实就是一个函数近似器。只是需要用神经网络拟合的这个函数关系一般很难用显式的表达表示出来。

不过,下面就根据西瓜书的内容来介绍了。

1.1 神经元模型

神经网络中最基本的单元是神经元模型(neuron)。在生物神经网络的原始机制中,每个神经元通常都有多个树突(dendrite),一个轴突(axon)和一个细胞体(cell body),树突短而多分支,轴突长而只有一个;在功能上,树突用于传入其它神经元传递的神经冲动,而轴突用于将神经冲动传出到其它神经元,当树突或细胞体传入的神经冲动使得神经元兴奋时,该神经元就会通过轴突向其它神经元传递兴奋。
1.png
一直沿用至今的“M-P神经元模型”正是对这一结构进行了抽象,也称“阈值逻辑单元“,其中树突对应于输入部分,每个神经元收到n个其他神经元传递过来的输入信号,这些信号通过带权重的连接传递给细胞体,这些权重又称为连接权(connection weight)。细胞体分为两部分,前一部分计算总输入值(即输入信号的加权和,或者说累积电平),后一部分先计算总输入值与该神经元阈值的差值,然后通过激活函数(activation function)的处理,产生输出从轴突传送给其它神经元。M-P神经元模型如下图所示:
2.png

与线性分类十分相似,神经元模型最理想的激活函数也是阶跃函数,即将神经元输入值与阈值的差值映射为输出值1或0,若差值大于零输出1,对应兴奋;若差值小于零则输出0,对应抑制。但阶跃函数不连续,不光滑,故在M-P神经元模型中,也采用Sigmoid函数来近似, Sigmoid函数将较大范围内变化的输入值挤压到 (0,1) 输出值范围内,所以也称为挤压函数(squashing function)。

3.png

将多个神经元按一定的层次结构连接起来,就得到了神经网络。它是一种包含多个参数的模型,比方说10个神经元两两连接,则有100个参数需要学习(每个神经元有9个连接权以及1个阈值),若将每个神经元都看作一个函数,则整个神经网络就是由这些函数相互嵌套而成。

2. 感知机与多层网络

感知机(Perceptron)是由两层神经元组成的一个简单模型,但只有输出层是M-P神经元,即只有输出层神经元进行激活函数处理,也称为功能神经元(functional neuron);输入层只是接受外界信号(样本属性)并传递给输出层(输入层的神经元个数等于样本的属性数目),而没有激活函数。

这样一来,感知机与之前线性模型中的对数几率回归的思想基本是一样的,都是通过对属性加权与另一个常数求和,再使用sigmoid函数将这个输出值压缩到0-1之间,从而解决分类问题

不同的是感知机的输出层应该可以有多个神经元,从而可以实现多分类问题,同时两个模型所用的参数估计方法十分不同

给定训练集,则感知机的n+1个参数(n个权重+1个阈值)都可以通过学习得到。阈值Θ可以看作一个输入值固定为-1的哑结点的权重ωn+1,即假设有一个固定输入xn+1=-1的输入层神经元,其对应的权重为ωn+1,这样就把权重和阈值统一为权重的学习了。简单感知机的结构如下图所示:

4.png

感知机权重的学习规则如下:对于训练样本(x,y),当该样本进入感知机学习后,会产生一个输出值,若该输出值与样本的真实标记不一致,则感知机会对权重进行调整,若激活函数为阶跃函数,则调整的方法为(基于梯度下降法):
在这里插入图片描述

其 中 η ∈ ( 0 , 1 ) \eta \in (0,1) η(0,1) 称 为 学 习 率 (learning rate). 从 式 (5.1) 可 看 出 , 若 感 知 机 对 训 绕样 例 (x,y) 预 测 正 确 , 即 y ^ = y \hat{y}=y y^=y , 则 感 知 机 不 发 生 变 化 , 否 则 将 根 据 错 误 的 程 度进 行 权 重 调 整.

需 注 意 的 是 , 感 知 机 只 有 输 出 层 神 经 元 进 行 激 活 函 数 处 理 , 即 只 拥 有 一 层功 能 神 经 元 (functional neuron), 其 学 习 能 力 非 常 有 限 . 事 实 上 , 与 、 或 、非 问 题 都 是 线 性 可 分 (linearly separable) 的 问 题 . 可 以 证 明 若 两 类 模 式 是 线 性 可 分 的 , 即 存 在 一 个 线 性 超 平 面 能 将 它 们 分 开 , 如 图5.4(a)-( c ) 所 示 , 则 感 知 机 的 学 习 过 程 一 定 会 收 敛 (converge) 而 求 得 适 当 的 权 向 量 w = ( w 1 , w 2 , . . . , w n + 1 ) w=(w_1,w_2,...,w_{n+1}) w=(w1,w2,...,wn+1); 否 则 感 知 机 学 习 过 程 将 会 发 生 振 荡 (Huctuation), w w w 难 以 稳 定 下 来 , 不 能 求 得 合 适 解 , 例 如 感 知 机 甚 至 不 能 解 决 如 图 5.4(d) 所 示 的异 或 这 样 筒 单 的 非 线 性 可 分 问 题
在这里插入图片描述

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

要 解 决 非 线 性 可 分 问 题 , 需 考 虑 使用 多 层 功 能 神 经 元 . 例 动 图 5.5 中 这 个简 单 的 不 层 感 知 机 就 能 解 决 异 或 问 题 . 在 图 5.5(a) 中 , 输 出 层 与 输 入 层 之 间 的 一层 神 经 元 , 被 称 为 隐 层 或 隐 含层 (hidden layer), 隐 含 层 和 输 出 层 神 经 元 都 是 拥 有 激 活 函 数 的 功 能 神 经 元 .

在这里插入图片描述

只需包含一个隐层便可以称为多层神经网络,常用的神经网络称为“多层前馈神经网络”(multi-layer feedforward neural network),该结构满足以下几个特点:

  • 每层神经元与下一层神经元之间完全互连
  • 神经元之间不存在同层连接
  • 神经元之间不存在跨层连接

7.png

这里的“前馈”指的是网络拓扑结构中不存在环或回路,而不是指该网络只能向前传播而不能向后传播(下节中的BP神经网络正是基于前馈神经网络而增加了反馈调节机制)。神经网络的学习过程就是根据训练数据来调整神经元之间的“连接权”以及每个神经元的阈值,换句话说:神经网络所学习到的东西都蕴含在网络的连接权与阈值中

在这里插入图片描述

一般说到神经网络的层数是这样计算的,输入层不算,从隐藏层开始一直到输出层,一共有几层就代表着这是一个几层的神经网络,例如上图就是一个三层结构的神经网络。

隐藏层的解释

  • 多隐藏层的神经网络比 单隐藏层的神经网络工程效果好很多。
  • 提升隐层层数或者隐层神经元个数,神经网络“容量”会变大,空间表达力会变强。
  • 过多的隐层和神经元节点,会带来过拟合问题。
  • 不要试图通过降低神经网络参数量来减缓过拟合,用正则化或者dropout。

3. BP神经网络算法

神经网络的学习主要蕴含在权重和阈值中,多层网络使用上面简单感知机的权重调整规则显然不够用了,BP神经网络算法即误差逆传播算法(error BackPropagation)正是为学习多层前馈神经网络而设计,BP神经网络算法是迄今为止最成功的的神经网络学习算法。

3.1 算法思想

一般而言,只需包含一个足够多神经元的隐层,就能以任意精度逼近任意复杂度的连续函数,故下面以训练单隐层的前馈神经网络为例,介绍BP神经网络的算法思想。

在这里插入图片描述

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

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

BP算法的基本流程如下所示:
10.png

BP算法的更新规则是基于每个样本的预测值与真实类标的均方误差来进行权值调节,即BP算法每次更新只针对于单个样例。需要注意的是:BP算法的最终目标是要最小化整个训练集D上的累积误差,即:
在这里插入图片描述

如果基于累积误差最小化的更新规则,则得到了累积误差逆传播算法(accumulated error backpropagation),即每次读取全部的数据集一遍,进行一轮学习,从而基于当前的累积误差进行权值调整,因此参数更新的频率相比标准BP算法低了很多,但在很多任务中,尤其是在数据量很大的时候,往往标准BP算法会获得较好的结果。另外对于如何设置隐层神经元个数的问题,至今仍然没有好的解决方案,常使用“试错法”进行调整。

3.2 过拟合问题

前面提到,BP神经网络强大的学习能力常常容易造成过拟合问题,有以下两种策略来缓解BP网络的过拟合问题:

  • 早停:将数据分为训练集与测试集,训练集用于学习,测试集用于评估性能,若在训练过程中,训练集的累积误差降低,而测试集的累积误差升高,则停止训练。
  • 引入正则化(regularization):基本思想是在累积误差函数中增加一个用于描述网络复杂度的部分,例如所有权值与阈值的平方和,其中λ∈(0,1)用于对累积经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。误差目标函数(5.16)改变为:
    在这里插入图片描述

4. 全局最小与局部最小

学习的过程实质上就是一个寻找最优参数的过程,例如BP算法试图通过梯度下降来寻找使得累积经验误差最小的权值与阈值,在谈到最优时,一般会提到局部极小(local minimum)和全局最小(global minimum)。

  • 局部极小解:参数空间中的某个点,其邻域点的误差函数值均不小于该点的误差函数值。
  • 全局最小解:参数空间中的某个点,所有其他点的误差函数值均不小于该点的误差函数值。
    13.png

要成为局部极小点,只要满足该点在参数空间中的梯度为零。局部极小可以有多个,而全局最小只有一个。

全局最小一定是局部极小,但局部最小却不一定是全局最小。

显然在很多机器学习算法中,都试图找到目标函数的全局最小。

梯度下降法的主要思想就是沿着负梯度方向去搜索最优解,负梯度方向是函数值下降最快的方向,若迭代到某处的梯度为0,则表示达到一个局部最小,参数更新停止。因此在现实任务中,通常使用以下策略尽可能地去接近全局最小。

  • 以 多 组 不 同 参 数 值 初 始 化 多 个 神 经 网 络 , 按 标 准 方 法 训 练 后 , 取 其 中 误 差 最 小 的 解 作 为 最 终 参 数 . 这 相 当 于 从 多 个 不 同 的 初 始 点 开 始 搜 索 , 这 样 就 可 能 陷 入 不 同 的 局 部 极 小 , 从 中 进 行 选 择 有 可 能 获 得 更 接 近 全 局 最 小 的 结 果 .

  • 使用模拟退火。模 拟 退 火 在 每 一 步 都 以 一 定 的 概 率 接 受 比 当 前 解 更 差 的 结 果 , 从 而 有 助
    于 “ 跳 出 “ 局 部 极 小 . 在 每 步 迭 代 过 程 中 , 接 受 “ 次 优 解 “ 的 概 率 要 随 着时 间 的 推 移 而 逐 渐 降 低 , 从 而 保 证 算 法 稳 定 .

  • 使用随机梯度下降,即在计算梯度时加入了随机因素,使得在局部最小时,计算的梯度仍可能不为0,从而迭代可以继续进行。

5. 深度学习

5.1 理解

理论上,参数越多,模型复杂度就越高,容量(capability)就越大,从而能完成更复杂的学习任务。深度学习(deep learning)正是一种极其复杂而强大的模型

Deep = Many hidden layer

怎么增大模型复杂度呢?两个办法,一是增加隐层的数目,二是增加隐层神经元的数目。前者更有效一些,因为它不仅增加了功能神经元的数量,还增加了激活函数嵌套的层数。但是对于多隐层神经网络,经典算法如标准BP算法往往会在误差逆传播时发散(diverge),无法收敛达到稳定状态。

那要怎么有效地训练多隐层神经网络呢?一般来说有以下两种方法:

  • 无监督逐层训练(unsupervised layer-wise training):每次训练一层隐节点,把上一层隐节点的输出当作输入来训练,本层隐结点训练好后,输出再作为下一层的输入来训练,这称为预训练(pre-training)。全部预训练完成后,再对整个网络进行微调(fine-tuning)训练。一个典型例子就是深度信念网络(deep belief network,简称DBN)。这种做法其实可以视为把大量的参数进行分组,先找出每组较好的设置,再基于这些局部最优的结果来训练全局最优

  • 权共享(weight sharing):令同一层神经元使用完全相同的连接权,典型的例子是卷积神经网络(Convolutional Neural Network,简称CNN)。这样做可以大大减少需要训练的参数数目

深度学习可以理解为一种特征学习(feature learning)或者表示学习(representation learning),无论是DBN还是CNN,都是通过多个隐层来把与输出目标联系不大的初始输入转化为与输出目标更加密切的表示,使原来只通过单层映射难以完成的任务变为可能。即通过多层处理,逐渐将初始的“低层”特征表示转化为“高层”特征表示,从而使得最后可以用简单的模型来完成复杂的学习任务。

传统任务中,样本的特征需要人类专家来设计,这称为特征工程(feature engineering)。特征好坏对泛化性能有至关重要的影响。而深度学习为全自动数据分析带来了可能,可以自动产生更好的特征。

本质:通过隐藏层进行特征转换

把隐藏层通过特征提取来替代原来的特征工程,这样在最后一个隐藏层输出的就是一组新的特征(相当于黑箱操作)而对于输出层,其实是把前面的隐藏层的输出当做输入(经过特征提取得到的一组最好的特征)然后通过一个多分类器(可以是softmax函数)得到最后的输出y。

5.2 深度学习3步骤

在这里插入图片描述

  • Step1:神经网络(Neural network)
  • Step2:模型评估(Goodness of function)
  • Step3:选择最优函数(Pick best function)

6. 后记

6.1 为什么神经网络具有非线性切分能力

假设对下图进行分类,圆圈为一类,红叉叉为另一类,如果用线性切分的话无论如何都不能把它们进行分开。
在这里插入图片描述

这时,引入神经网络(2层神经网络),包含一个隐藏层,在隐藏层中,分别得到了P1和P2的图形,P1这条线以上的部分都是红叉叉,P2这条线以下的部分都是红叉叉,两个神经元就有2条线性直线。从隐藏层到输出层要做的事情就是把这两条直线给合并起来,就会得到h(x)的图形,也就是说P1以上的空间交上P2以下的空间就是红叉叉的分类,其余空间分类为圆圈。这就使得原本不能够线性切分变成非线性切分了。

在这里插入图片描述

如果隐藏层更加复杂的话,就能够完美的实现复杂平面样本点分布的划分(类似于抠图),如下图所示:
在这里插入图片描述

6.2 随机初始化模型参数

在神经网络中,通常需要随机初始化模型参数。下⾯我们来解释这样做的原因。

假设输出层只保留⼀个输出单元o1,且隐藏层使⽤相同的激活函数。如果将每个隐藏单元的参数都初始化为相等的值,那么在正向传播时每个隐藏单元将根据相同的输⼊计算出相同的值, 并传递⾄输出层。在反向传播中,每个隐藏单元的参数梯度值相等。因此,这些参数在使⽤基于梯度的优化算法迭代后值依然相等。之后的迭代也是如此。

在这种情况下,⽆论隐藏单元有多少, 隐藏层本质上只有1个隐藏单元在发挥作⽤。因此,我们通常将神经⽹络的模型参数,特别是权重参数,进⾏随机初始化。

有两种初始化方法:

  • 采用正态分布的随机初始化方法。

  • Xavier初始化方法:假设某全连接层的输入个数为a,输出个数为b,Xavier随机初始化将使该层中权重参数的每个元素都随机采样于均匀分布:
    在这里插入图片描述

    初始化后,每层输出的方差不会受该层输入个数的影响,且每层梯度的方差也不受该层输出个数的影响。

6.3 激活函数

在隐层接一个线性变换后 ,再接一个非线性变换(如sigmoid),这个非线性变换叫做传递函数或者激活函数。上面的例子用的都是逻辑回归的Sigmoid激活函数,如果还不明白激活函数在哪,可以看下面这幅图。
在这里插入图片描述

sigmoid函数

在这里插入图片描述

在这里插入图片描述

tanh(双曲正切)函数

事实上,tanh 函数是 sigmoid 的向下平移和伸缩后的结果。对它进行了变形后,穿过了(0,0)点,并且值域介于+1 和-1 之间。
在这里插入图片描述

在这里插入图片描述

sigmoid函数和tanh函数两者共同的缺点是,在𝑧特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于 0,导致降低梯度下降的速度。

ReLu(修正线性单元)函数

只要𝑧是正值的情况下,导数恒等于 1,当𝑧是负 值的时候,导数恒等于 0。

在这里插入图片描述
导数的表达式为:
在这里插入图片描述

这有一些选择激活函数的经验法则: 如果输出是 0、1 值(二分类问题),则输出层选择 sigmoid 函数,然后其它的所有单 元都选择 Relu 函数。

softmax激活函数

可参考博客

  • 非线性变换之前计算:
  • 经过非线性变换,临时变量:
  • 归一化
  • a l a^l al表示的就是第几个类别的概率值,这些概率值和为1

之前,我们的激活函数都是接受单行数值输入,例如 SigmoidReLu 激活函数,输入一个实数,输出一个实数。Softmax 激活函数的特殊之处在于,因为需要将所有可能的输出归一化,就需要输入一个向量,最后输出一个向量。

hardmax 函数会观察𝑧的元素,然后在𝑧中最大元素的位置放上 1,其它位置放上 0,Softmax 所做的从𝑧到这些概率的映射更为温和。

Softmax 回归将 logistic 回归推广到了两种分类以上。

优缺点

  • 在𝑧的区间变动很大的情况下,激活函数的导数或者激活函数的斜率都会远大于0,在程序实现就是一个 if-else 语句,而 sigmoid 函数需要进行浮点四则运算,在实践中,使用 ReLu 激活函数神经网络通常会比使用 sigmoid 或者 tanh 激活函数学习的更快。

  • sigmoidtanh 函数的导数在正负饱和区的梯度都会接近于 0,这会造成梯度弥散(即梯度消失),而 ReluLeaky ReLu 函数大于 0 部分都为常数,不会产生梯度弥散现象。同时应该注意到的是,Relu 进入负半区的时候,梯度为 0,神经元此时不会训练,产生所谓的稀疏性,而 Leaky ReLu 不会有这问题。 𝑧在 ReLu 的梯度一半都是 0,但是,有足够的隐藏层使得 z 值大于 0,所以对大多数的 训练数据来说学习过程仍然可以很快。

6.4 为什么使用激活函数

如果你使用线性激活函数或者没有使用一个激活函数,那么无论你的神经网络有多少层一直在做的只是计算线性函数,所以不如直接去掉全部隐藏层。在我们的简明案例中,事实证明如果你在隐藏层用线性激活函数,在输出层用 sigmoid 函数,那么这个模型的复杂度和没有任何隐藏层是一样的。

在这里线性隐层一点用也没有,因为这两个线性函数的组合本身就是线性函数,所以除非你引入非线性,否则你无法计算更有趣的函数,即使你的网络层数再多也不行。

6.5 人工神经网络中为什么ReLu要好过于tanh和sigmoid function?

  1. 采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法和指数运算,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。

  2. 对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),这种现象称为饱和,从而无法完成深层网络的训练。而ReLU就不会有饱和倾向,不会有特别小的梯度出现。

  3. Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。当然现在也有一些对relu的改进,比如prelu,random relu等,在不同的数据集上会有一些训练速度上或者准确率上的改进。

6.6 激活函数有哪些性质?

  1. 非线性: 当激活函数是线性的,一个两层的神经网络就可以基本上逼近所有的函数。但如果激活函数是恒等激活函数的时候,即 f ( x ) = x f(x)=x f(x)=x,就不满足这个性质,而且如果 MLP 使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的;
  2. 可微性: 当优化方法是基于梯度的时候,就体现了该性质;
  3. 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数;
  4. f ( x ) ≈ x f(x)\approx x f(x)x: 当激活函数满足这个性质的时候,如果参数的初始化是随机的较小值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要详细地去设置初始值;
  5. 输出值的范围: 当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的 Learning Rate。

6.7 正向传播与反向传播(BP)

此部分可详细参考博客

正向传播(forward-propagation)是指对神经网络沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量(包括输出)。

逻辑回归的计算步骤:所以回想当时我们讨论逻辑回归的时候,我们有这个正向传播步骤,其中我们计算𝑧,然后𝑎,然后损失函数𝐿。 正向传播类似,计算,再计算,最后得到loss function。
在这里插入图片描述

反向传播(back-propagation)指的是计算神经网络参数梯度的方法。总的来说,反向传播依据微积分中的链式法则,沿着从输出层到输入层的顺序,依次计算并存储目标函数有关神经网络各层的中间变量以及参数的梯度。

由正向传播经过所有的隐藏层到达输出层,会得到一个输出结果,然后根据这个带入loss funcation中,利用SGD算法进行最优化求解,其中每次梯度下降都会使用一次BP来更新各个网络层中的参数值,这就是BP回传误差的意思。

正向传播求损失,BP回传误差。
根据误差信号修正每层的权重。对各个w进行求导,然后更新各个w。

6.8 随机梯度下降法(SGD)

mini-batch梯度下降

你可以把训练集分割为小一点的子集训练,这些子集被取名为 mini-batch,假设每一个子集中只有 1000 个样本,那么把其中的𝑥 (1)到𝑥 (1000)取出来,将其称为第一个子训练集,也叫做 mini-batch,然后你再取出接下来的 1000 个样本,从𝑥 (1001)到𝑥 (2000),然后再取 1000个样本,以此类推。

在训练集上运行 mini-batch 梯度下降法,你运行 for t=1……5000,因为我们有5000个各有 1000 个样本的组,在 for 循环里你要做得基本就是对𝑋 {𝑡}和𝑌 {𝑡}执行一步梯度下降法。

  • batch_size=1,就是SGD。
  • batch_size=n,就是mini-batch
  • batch_size=m,就是batch
    其中1<n<m,m表示整个训练集大小。

(1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;
(2)iteration:1个iteration等于使用batchsize个样本训练一次;
(3)epoch:1个epoch等于使用训练集中的全部样本训练一次;

优缺点:

  • batch:相对噪声低些,幅度也大一些,你可以继续找最小值。
  • SGD:大部分时候你向着全局最小值靠近,有时候你会远离最小值,因为那个样本恰好给你指的方向不对,因此随机梯度下降法是有很多噪声的,平均来看,它最终会靠近最小值,不过有时候也会方向错误,因为随机梯度下降法永远不会收敛,而是会一直在最小值附近波动。一次性只处理了一个训练样本,这样效率过于低下。
  • mini-batch:实践中最好选择不大不小的 mini-batch,得到了大量向量化,效率高,收敛快。

首先,如果训练集较小,直接使用 batch 梯度下降法,这里的少是说小于 2000 个样本。一般的 mini-batch 大小为 64 到 512,考虑到电脑内存设置和使用的方式,如果 mini-batch 大小是 2 的𝑛次方,代码会运行地快一些。

调节 Batch_Size 对训练效果影响到底如何?

对于batch size的设置,可参考博客

增大batchsize的好处

  • 内存的利用率提高了,大矩阵乘法的并行化效率提高。

    • 跑完一次epoch(全数据集)所需迭代次数减少,对于相同的数据量的处理速度进一步加快。

    • 一定范围内,batchsize越大,其确定的下降方向就越准,引起训练震荡越小。

盲目增大batchsize的坏处

  • 当数据集太大时,内存撑不住。

  • 跑完一次epoch所需迭代次数减少了,但要想达到相同的精度,时间开销太大,参数的修正更加缓慢。

  • batchsize增大到一定的程度,其确定的下降方向已经基本不再变化。

减小batchsize的好处与坏处

  • 当数据量足够大的时候,由于数据量太大,内存不够,可以适当的减小batch_size。

  • 但盲目减少会导致无法收敛,batch_size=1时为在线学习,也是标准的SGD,这样学习,如果数据量不大,noise数据存在时,模型容易被noise带偏;如果数据量足够大,noise的影响会被“冲淡”,对模型几乎不影响。

batch的选择,首先决定的是下降方向,如果数据集比较小,则完全可以采用全数据集的形式。这样做的好处:

  • 全数据集的方向能够更好的代表样本总体,确定其极值所在。

  • 由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。

总结来看

  1. Batch_Size 太小,模型表现效果极其糟糕(error飙升)。
  2. 随着 Batch_Size 增大,处理相同数据量的速度越快。
  3. 随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。(batchsize增大, 相同的epoch迭代次数少了,但是因为batchsize增大会影响精度,所以想要达到相同的精度需要设置更多的epoch)。
  4. 由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。
  5. 由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。
  6. 过大的batchsize的结果是网络很容易收敛到一些不好的局部最优点。同样太小的batch也存在一些问题,比如训练速度很慢,训练不容易收敛等。
  7. 具体的batch size的选取和训练集的样本数目相关。

6.9 为什么说神经网络是端到端的网络?

端到端学习(end-to-end)是一种解决问题的思路,与之对应的是多步骤解决问题,也就是将一个问题拆分为多个步骤分步解决,而端到端是由输入端的数据直接得到输出端的结果。

就是不要预处理和特征提取,直接把原始数据扔进去得到最终结果。

特征提取包含在神经网络内部,所以说神经网络是端到端的网络。

优点

通过缩减人工预处理和后续处理,尽可能使模型从原始输入到最终输出,给模型更多可以根据数据自动调节的空间,增加模型的整体契合度。

缺点

  • 它可能需要大量的数据。要直接学到这个𝑥到𝑦的映射,你可能需要大量(𝑥, 𝑦)数据。
  • 它排除了可能有用的手工设计组件。

6.10 softmax分类器

什么是softmax

在图像分类的情景中,softmax分类器输出可以是一个图像类别的离散值,和线性回归不同的是,softmax输出单元从一个变成了多个。

softmax回归和线性回归一样将输入特征与权重做线性叠加。与线性回归的一个主要不同在于,softmax回归的输出值个数等于标签里的类别数。下图是用神经网络描绘了softmax回归,也是一个单层神经网络,由于每个输出 o 1 , o 2 , o 3 o_1,o_2,o_3 o1,o2,o3的计算都要依赖于所有的输入 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1,x2,x3,x4,softmax回归的输出层也是一个全连接层。
在这里插入图片描述

softmax的计算

一个简单的办法是将输出值 o i o_i oi当做预测类别是i的置信度,并将值最大的输出所对应的类别作为预测输出。例如,如果 o 1 , o 2 , o 3 o_1,o_2,o_3 o1,o2,o3分别为0.1 ; 10 ; 0.1,由于 o 2 o_2 o2最大,那么预测类别为2。

然而,直接使用输出层的输出会有两个问题:

  • 由于输出层的输出值的范围不确定,我们难以直观上判断这些值得意义。
  • 由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。

softmax运算解决了以上两个问题。它通过下面的公式将输出值变换成值为正且和为1的概率分布:
在这里插入图片描述

交叉熵损失函数

我们已经知道,softmax运算将输出变换成一个合法的类别预测分布。实际上,真实标签也可以用类别分布表达:

对于样本i,我们构造向量 y ( i ) ∈ R q ) y^{(i)}\in_{}R^q) y(i)Rq),使其第 y ( i ) y^{(i)} y(i)个元素为1,其余为0。这样我们的训练目标可以设为使预测概率分布 y ^ ( i ) \hat{y}^{(i)} y^(i)尽可能接近真实的标签概率 y ( i ) y^{(i)} y(i)

想要预测分类结果正确,我们其实并不需要预测概率完全等于标签概率,而平方损失则过于严格。改善这个问题的一个方法是使用更适合衡量两个概率分布差异的测量函数。其中,交叉熵(cross entropy)是一个常用的衡量方法:

其中带下标的 y j ( i ) y_j^{(i)} yj(i)是向量 y ( i ) y^{(i)} y(i)中非 0 即 1 的元素。也就是说,交叉熵只关心对正确类别的预测概率,因为只要其值足够大,就可以确保分类结果正确。即最小化交叉熵损失函数等价于最大化训练数据集所有标签类别的联合预测概率。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CHH3213

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值