1 基础

1.1 基础

二分类、逻辑回归、逻辑回归的代价函数、梯度下降、导数

计算图、计算图的导数计算(反向传播)

\frac{dFinalOutputvar}{dvar},编程时通常使用dvar代指

逻辑回归中的梯度下降、m个样本的梯度下降

向量化、向量化逻辑回归、向量化逻辑回归的梯度输出

Python中的广播

1.2 浅层神经网络

表示及输出、多样本向量化、

激活函数:非线性原因、导数,ReLu/sigmod/tanh...

神经网络的梯度下降、神经网络反向传播

初始随机化

1.3 深层神经网络

前向传播和反向传播、核对矩阵维数、深层表示原因、神经网络块的搭建

超参数:如算法中的 learning rate 𝑏(学习率)、iterations(梯度下降法循环的数量)、𝑀(隐藏层数目)、𝑜 [𝑚] (隐藏层单元数目)、choice of activation function(激活函数的选择)等;

深度学习与大脑的关系

2 改善深层神经网络

2.1 实用层面

2.1.1 训练/开发/测试集

在机器学习中,我们通常将样本分成训练集,验证集和测试集三部分,数据集规模相对较小,适用传统的划分比例,数据集规模较大的,验证集和测试集要小于数据总量的 20%或 10%。

根据经验,我建议大家要确保验证集和测试集的数据来自同一分布。

搭建训练验证集和测试集能够加速神经网络的集成,也可以更有效地衡量算法地偏差和方差,从而帮助我们更高效地选择合适方法来优化算法。

2.1.2 Bias /Variance 

训练集error1%15%15%0.5%
验证集error11%16%30%1%
 高方差高偏差高方差&高偏差低方差&低偏差

2.1.3 机器学习基础

(增加多项式特征是指x_{1}^{2},x_{2}^{2},x_{1}x_{2},etc)

高方差:获得更多训练实例;尝试减少特征数量;尝试增加正则化程度

高偏差:尝试获得更多特征;尝试增加多项式特征;尝试减少正则化程度

这两步实际要做的工作是:训练网络,选择网络或者准备更多数据

2.1.4 正则化

L2正则化

L2正则化——\underset{w,b}{min}J(w,b)(权重衰减)

J(w,b)=\frac{1}{m}\sum_{i=1}^{m}L(\widehat{y}^{(i)},y^{(i)})+\frac{\lambda }{2m}\left \| w \right \|_{2}^{2},              \left \| w \right \|_{2}^{2}=w^{T}w

L1范数——\frac{\lambda }{2m}\sum_{i=1}^{m}\left | w_{j} \right |=\frac{\lambda }{2m}\left \| w \right \|_{1},最终会导致矩阵稀疏

dropout正则化

假设你在训练上图这样的神经网络,它存在过拟合,这就是 dropout 所要处理的,我们复制这个神经网络,dropout 会遍历网络的每一层,并设置消除神经网络中节点的概率。假设网络中的每一层,每个节点都以抛硬币的方式设置概率,每个节点得以保留和消除的概率都是 0.5,设置完节点概率,我们会消除一些节点,然后删除掉从该节点进出的连线,最后得到一个节点更少,规模更小的网络,然后用 backprop 方法进行训练。

方法:

首先定义向量d,d^{[3]}表示一个三层的dropout向量;

然后看它是否小于某数,我们称之为keep-prob,它表示保留某个隐藏单元的概率;

接下来要做的是从第三层中获取激活函数a^{[3]},a^{[3]}含有要计算的激活函数,a^{[3]}=a^{[3]}*d^{[3]}

最后我们向外扩展a^{[3]},用它除以keep-prob参数。

起作用原因:

直观上理解:不要依赖于任何一个特征,因为该单元的输入可能随时被清除,因此该单元通过这种方式传播下去,并为单元的四个输入增加一点权重,通过传播所有权重,dropout将产生收缩权重的平方范数的效果,和之前讲的L2正则化类似;实施 dropout 的结果实它会压缩权重,并完成一些预防过拟合的外层正则化;

L2对不同权重的衰减是不停的,它取决于激活函数倍增的大小。

其他正则化方法

(1)数据倍增;

(2)early stopping;

(你会说,神经网络已经在这个迭代过程中表现得很好了,我们在此停止训练吧,得到验证集误差,)

优点:只运行一次梯度下降,就可以找出w的较小值、中间值和较大值,而无需尝试L2正则化超级参数λ的很多值

2.1.5 归一化输入

①零均值;②归一化方差

2.1.6 梯度爆炸/梯度消失

训练神经网络,尤其是深度神经所面临的一个问题就是梯度消失或梯度爆炸,也就是你训练神经网络的时候,导数或坡度有时会变得非常大,或者非常小,甚至于以指数方式变小,这加大了训练的难度。

梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的本质上是因为梯度反向传播中的连乘效应。

解决办法:权重初始化

例如:最合理的方法是设置\omega_{i}=\frac{1}{n},n表示神经元的输入特征数量;如果使用的是ReLu激活函数,方差设置为\frac{2}{n},效果会更好

2.1.7 梯度检验

作用:保障backprop正确实施

原理:双边误差、导数定义

实施:计算d\Theta _{approx}[i]-d\Theta[i]的欧几里得范数并比较(10^{-7},10^{-5},10^{-3})

注意事项:

①不要在训练中使用梯度检验,它只用于调试;

②如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出bug

③在实施梯度检验时,如果使用正则化,请注意正则项

④梯度检验不能与dropout同时使用

⑤在初始随机化时使用,并在一些神经网络训练后再次使用(在现实中几乎不会使用)

2.2 优化算法

2.2.1 mini-batch梯度下降法

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

2.2.2 随机梯度下降法

随机梯度下降:在每次更新时用1个样本,可以看到多了随机两个字,随机也就是说我们用样本中的一个例子来近似我所有的样本,来调整θ,因而随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,对于最优化问题,凸问题,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。但是相比于批量梯度,这样的方法更快,更快收敛,虽然不是全局最优,但很多时候是我们可以接受的,所以这个方法用的也比上面的多。

2.2.3 指数加权平均数

指数加权平均也叫指数加权移动平均,是一种常见的序列数据处理方式。计算公式如下:

其中,

  • θ_t:为第 t 天的实际观察值,
  • V_t: 是要代替 θ_t 的估计值,也就是第 t 天的指数加权平均值,
  • β: 为 V_{t-1} 的权重,是可调节的超参。( 0 < β < 1 )

指数加权平均数公式的好处之一在于,它占用极少内存,电脑内存中只占用一行数字而已,然后把最新数据代入公式,不断覆盖就可以了,正因为这个原因,其效率,它基本上只占用一行代码,计算指数加权平均数也只占用单行数字的存储和内存,当然它并不是最好的,也不是最精准的计算平均数的方法。

指数加权平均的偏差修正——有个办法可以修改这一估测,让估测变得更好,更准确,特别是在估测初期,也就是不用v_{t} ,而是用\frac{v_{t}}{1-\beta ^{t}},t 就是现在的天数。

2.2.4 动量梯度下降法

动量梯度下降法的核心便是对一系列梯度进行指数加权平均。

使用指数加权平均之后梯度代替原梯度进行参数更新。因为每个指数加权平均后的梯度含有之前梯度的信息,动量梯度下降法因此得名。

2.2.5 RMSProp (均方根)

S_{dW}=\beta S_{dW}+(1-\beta )dW^{2} , S_{db}=\beta S_{db}+(1-\beta )db^{2}

W:=W-\alpha \frac{dW}{S_{dW}} , b:=b-\alpha \frac{db}{S_{db}}

 

2.2.6 Adam优化算法

Adam——Adaptive Moment Estimation

Adam 的速度来自于动量和RMSProp 适应不同方向的梯度的能力。 这两者的结合使它变得更强大。

本算法中有很多超参数,学习率α很重要,也需要经常调试,β1常用缺省值为0.9,β2建议值为0.999,......

2.2.7 学习率衰减

 加快学习算法的一个办法就是随时间慢慢减少学习率,我们将之称为学习率衰减

\alpha =\frac{1}{1+decayrate*epoch-num},decay-rate称之为衰减率,epoch-num为代数

\alpha =0.95^{epoch-num}\alpha _{0}

,\alpha =\frac{k}{\sqrt{epoch-num}}\alpha _{0}\alpha =\frac{k}{\sqrt{epoch-num}}\alpha _{0} ,

离散衰减,......

2.2.8 局部最优化的问题

首先,你不太可能困在极差的局部最优中,条件是你在训练较大的神经网络,存在大量参数,并且成本函数𝐾被定义在较高的维度空间;

第二点,平稳段是一个问题,这样使得学习十分缓慢,这也是像 Momentum 或是RMSprop,Adam 这样的算法,能够加速学习算法的地方。在这些情况下,更成熟的优化算
法,如 Adam 算法,能够加快速度,让你尽早往下走出平稳段。

2.3 超参数调试、Batch正则化和程序框架

2.3.1 超参数调试

①随机抽取,精细检索,考虑使用由粗糙到精细的搜索过程

②用对数标尺搜索超参数

 ③实践

一种是你照看一个模型,通常是有庞大的数据组,但没有许多计算资源或足够的 CPU 和GPU 的前提下,基本而言,你只可以一次负担起试验一个模型或一小批模型,在这种情况下,即使当它在试验时,你也可以逐渐改良。

另一种方法则是同时试验多种模型,设置了一些超参数,尽管让它自己运行,或者是一天甚至多天,然后你获得多条学习曲线,这可以是损失函数 J 或实验误差或损失或数据误差的损失,但都是曲线轨迹的度量。,或者同时你可以开始一个有着不同超参数设定的不同模型。

以上是根据拥有的计算资源决定的。

 2.3.2  Batch归一化

BN的基本思想其实相当直观:

      因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
     其实一句话就是:对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。因为梯度一直都能保持比较大的状态,所以很明显对神经网络的参数调整效率比较高,就是变动大,就是说向损失函数最优值迈动的步子大,也就是说收敛地快。BN说到底就是这么个机制,方法很简单,道理很深刻。

方法:

实践过程中,Batch归一化常于mini-batch一起使用;

实际上,为了将你的神经网络运用于测试,就需要单独估算μ和𝜎^2 ,在典型的 Batch 归一化运用中,你需要用一个指数加权平均来估算,这个平均数涵盖了所有 mini-batch。

2.3.3 Softmax回归

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐