梯度

Batch Normalization

泪湿孤枕 提交于 2020-01-12 19:24:56
前文讲到 Batch Normalization 可以有效的降低梯度消失和梯度爆炸的发生。本文就对 Batch Normalization 进行详细的介绍。首先从两个角度介绍 Batch Normalization 的作用。 a、Internal Covariate Shift 在机器学习中要求"应用数据集的分布"需要与"训练的数据集分布一致", 如果不一致的话便会出现 Covariate Shift 现象,体现在预测的结果不是很准。为了降低 Covariate Shift 的影响,模型一般会对输入数据进行标准化处理。我们想另外一个问题:对于神经网络来讲,每一层都是下一层的输入,如果当前层的输出改变了,就意味这下一层的输入分布发生变化了。这叫做 Internal Covariate Shift 。为了让每一层每次都是在学习同样的分布,可以进行 Batch Normalization ,这样可以加速训练的速度。 b 、梯度消失梯度爆炸 Batch Normalization 主要是针对梯度消失的。以 sigmoid 函数为例,输入只在[-1,1]间梯度比较明显,而在这个区间之外梯度非常非常小,这样很容易导致梯度消失。为了减轻这种效果的影响,可以进行 Batch Normalization 。 Batch Normalization 过程如以下图: 整个算法流程很好理解。对于每一次

Batch Normalization

家住魔仙堡 提交于 2020-01-12 19:24:42
前言: Batch Normalization是深度学习领域在2015年非常热门的一个算法,许多网络应用该方法进行训练,并且取得了非常好的效果。 众所周知,深度学习是应用随机梯度下降法对网络进行训练,尽管随机梯度下降训练神经网络非常有效,但是它有一个缺点,就是需要人为的设定很多参数,比如学习率,权重衰减系数,Dropout比例等。这些参数的选择对训练结果至关重要,以至于训练的大多数精力都耗费在了调参上面。BN算法就可以完美的解决这些问题。当我们使用了BN算法,我们可以去选择比较大的初始学习率,这样就会加快学习的速度;我们还可以不必去理会过拟合中的dropout、正则项约束问题等,因为BN算法可以提高网络的泛化能力;我们再也不需要使用局部响应归一化层,因为BN本身就是归一化的网络;还可以打乱训练数据,防止每批训练的时候,某一个样本经常被选到。通常在训练神经网络之前,我们都会对数据进行归一化处理,为什么呢?因为神经网络训练实际是为了学习数据的分布情况,一旦训练数据与测试数据分布不同,那么网络的泛化能力也会大大降低。另外,如果每一批的训练数据都不同,那么神经网络就会去适应不同训练数据的分布,这样就会大大降低网络训练的速度。深度学习的训练是一个复杂的过程,如果前几层的数据分布发生了变化,那么后面就会积累下去,不断放大,这样就会导致神经网络在训练过程中不断适应新的数据分布,影响网络训练的速度

深度学习基础

好久不见. 提交于 2020-01-12 03:55:51
主要需要了解的东西如下: 交叉熵损失和对数损失的区别 SGD,bach,minibatch。主要是讲SGD随机梯度下降计算单个样本的梯度,bach基于整个样本计算梯度,minibatch在它们两者之间,这个主要体现在loss function上,单个样本计算梯度的loss function就没有对整个样本求和,而很多样本一起计算梯度,就要知道对每个样本的loss然后求和。 sigmoid函数及其导数。 σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ ( x ) = 1 + e − x 1 ​ ∂ σ ( x ) ∂ x = σ ( x ) ∗ ( 1 − σ ( x ) ) \frac{\partial\sigma(x)}{\partial x} = \sigma(x)*(1-\sigma(x)) ∂ x ∂ σ ( x ) ​ = σ ( x ) ∗ ( 1 − σ ( x ) ) 反向传播推导 在保证模型正确率的前提下,通常希望学习到的权值矩阵中的元素都不要太大,以防止输入有噪声时,由于权重过大使得噪声对模型的影响过大。 来源: CSDN 作者: czg792845236 链接: https://blog.csdn.net/u010630669/article/details/103880349

梯度下降法的优化算法

泄露秘密 提交于 2020-01-11 22:03:06
如前文 梯度下降法 中所介绍的,梯度下降法存在如下问题导致其迭代的可行性和效率大打折扣: (1)梯度不存在; (2)非凸函数的鞍点和局部最优解; (3)函数的信息利用率不高; (4)学习率需预设且取值固定。 本文提到的梯度下降法的优化算法指:针对问题(2)、(3)和(4)提出的基于梯度下降法的Moment、AdaGrad和Adam等一系列算法。而这系列算法的核心改良思路包括两点: (1)通过引入历史迭代点的信息,对当前点的梯度值进行修正。 (2)通过引入历史迭代点的信息,对当前点的学习率进行修正。 1. 常见的梯度下降法的优化算法 1.1. SGD+Momentum Momentum(动量)的灵感和效果非常类似于物理学里的动量项:如果迭代点在梯度为0处保持一定的速度(动量),则很有可能会冲破局部最优点或鞍点的束缚进行继续的搜索,从而发现更优的取值。 那么如何设置动量项呢? 通过过往迭代点的历史梯度信息值进行构造! 从数学公式上看,其迭代过程为: v 0 = 0 v t = ρ v t − 1 − α g t − 1 x t = x t − 1 + v t \begin{aligned}&v_0=0\\&v_t=\rho v_{t-1}-\alpha g_{t-1}\\&x_t=x_{t-1}+v_t\end{aligned} ​ v 0 ​ = 0 v t ​ = ρ v t −

最优化问题(牛顿法和梯度下降法)

泄露秘密 提交于 2020-01-11 00:19:18
---恢复内容开始--- http://www.zhihu.com/question/19723347 引自知乎 牛顿法是二阶收敛,梯度下降是一阶收敛 , 所以牛顿法就更快 。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。 根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。 wiki上给的图很形象: <img src="https://pic4.zhimg.com/365e99bcf8d2e1ef1986e09c795caef7_b.jpg" data-rawwidth="220" data-rawheight="253" class="content_image" width="220">红色的牛顿法的迭代路径,绿色的是梯度下降法的迭代路径。 红色的牛顿法的迭代路径,绿色的是梯度下降法的迭代路径。 作者:金秉文 链接:http:/

循环神经网络和LSTM

我们两清 提交于 2020-01-10 08:39:29
MENU 循环神经网络 定义 应用领域 模型结构 问题 LSTM 基本概念 核心思想 循环神经网络 定义 循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network) 应用领域 RNN的应用领域有很多, 可以说只要考虑时间先后顺序的问题都可以使用RNN来解决.这里主要说一下几个常见的应用领域: 自然语言处理(NLP): 主要有视频处理, 文本生成, 语言模型, 图像处理 机器翻译, 机器写小说 语音识别 图像描述生成 文本相似度计算 音乐推荐、网易考拉商品推荐、Youtube视频推荐等新的应用领域. 模型结构 问题 RNN存在梯度消失和梯度爆炸问题(BP算法和长时间依赖造成的): RNN的算法, 它处理时间序列的问题的效果很好, 但是仍然存在着一些问题, 其中较为严重的是容易出现梯度消失或者梯度爆炸的问题(BP算法和长时间依赖造成的). 注意: 这里的梯度消失和BP的不一样,这里主要指由于时间过长而造成记忆值较小的现象. 因此, 就出现了一系列的改进的算法, 这里介绍主要的两种算法: LSTM 和 GRU. LSTM 和 GRU对于梯度消失或者梯度爆炸的问题处理方法主要是:

特征检测

孤街醉人 提交于 2020-01-09 23:03:59
计算机视觉课堂笔记 : 包括边缘检测和特征点检测两个部分 边缘检测部分 what--边缘的定义 why--提取边缘的意义 how--提取边缘的方法 what 边缘是图像中亮度突然变化的区域; 图像灰度构成的曲面上的陡峭区域; 像素灰度存在阶跃变化或屋脊状变化的像素的集合。 分类:有梯状,脊状,条状 why 边缘可以表达物体的特征; 边缘特征对于图像的变化(几何变化,灰度变化,光照方向变化)不敏感; 可以为检测物体提供有用信息; 是对图像进行预处理的过程。 how 1.使用微分滤波器 在一阶中叫梯度算子(prewitt,sobel),二阶微分滤波器叫做LoG算子,LoG=高斯平滑+拉普拉斯二阶微分,相当于先将高斯算子进行求取二阶导数再与图像进行卷积。 补充:关于卷积的一个定理,卷积的偏导数等于偏导数的卷积,即 。 ***2.canny算子 参考:J.Canny, "A Computational Approach to Edge Detection",IEEE Trans. on PAMI, 8(6),1986. 算法主要步骤: 梯度计算==》非极大值抑制==》双阈值提取边缘点 2.1梯度计算: 先做高斯平滑 分别对x,y两个方向求取一阶微分 最后求取幅值和相位角 2.2非极大值抑制 对梯度幅值图像M ,仅保留梯度方向上的极大值点。 解释:对M中的每个点进行逐一排查

深度学习的Tips

☆樱花仙子☆ 提交于 2020-01-07 08:39:26
引言 本文主要讲解了在进行深度学习时一些实用的提示。是 李宏毅 深度学习-Tips for Trainning DNN 的笔记。 深度学习的方法 经过三步骤后得到一个神经网络,接下来判断在训练集上的表现如何?如果结果不好则回头看看三个步骤哪里出了问题;如果在训练集上的正确率很好,则拿训练集来试试,如果此时在测试集上的准确率不好,则说明是过拟合了;如果在训练集和测试集都得到很好的结果话,就说明这个网络是比较nice的。 不要错怪过拟合 在上图右56层的网络的错误率比20层的还要高,不能这样就说是过拟合导致的。从上图左可以看到在训练集上20层的结果本来就比56层的就好,说明这个网络没有训练好。 训练集上的结果不好与测试集上的结果不好是不一样的,有不同的途径可以解决这些问题。比如Dropout可以用于解决由于参数多而样本少导致的过拟合问题。 针对这些问题的解决方法可以有上面几种,比如如果在训练集上的结果不好,我们可以尝试换一个激活函数。 在手写数字识别中,激活函数就从 Sigmoid 换到了 relu 。 激活函数是 Sigmoid 的情况下,当隐藏层的数量到了9,10层的时候,整个准确率就不忍直视了。见 深度学习实例——Keras实现手写数字识别 造成上面这种情况有个原因是 梯度消失问题(Vanishing Gradient Problem) 当网络很深的时候

优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

一个人想着一个人 提交于 2020-01-07 06:52:02
在机器学习、深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论文中给出了常用优化器的比较,今天来学习一下: https://arxiv.org/pdf/1609.04747.pdf 本文将梳理: 每个算法的梯度更新规则和缺点 为了应对这个不足而提出的下一个算法 超参数的一般设定值 几种算法的效果比较 选择哪种算法 0.梯度下降法深入理解 以下为个人总结,如有错误之处,各位前辈请指出。 对于优化算法,优化的目标是网络模型中的参数θ(是一个集合,θ 1 、 θ 2 、 θ 3 ...... )目标函数为损失函数L = 1/N ∑ L i (每个样本损失函数的叠加求均值)。这个损失函数L变量就是θ,其中L中的参数是整个训练集,换句话说,目标函数(损失函数)是通过整个训练集来确定的,训练集全集不同,则损失函数的图像也不同。那么为何在mini-batch中如果遇到鞍点/局部最小值点就无法进行优化了呢?因为在这些点上,L对于θ的梯度为零,换句话说,对θ每个分量求偏导数,带入训练集全集,导数为零。对于SGD/MBGD而言,每次使用的损失函数只是通过这一个小批量的数据确定的,其函数图像与真实全集损失函数有所不同,所以其求解的梯度也含有一定的随机性

深度学习笔记(一)

瘦欲@ 提交于 2020-01-05 22:11:46
一、R-CNN 增加了候选区域选择,先选择几个候选区,然后在候选区中做检测。 二、mini-batch&Batch Normalization 我们已知在梯度下降中需要对所有样本进行处理过后然后走一步,那么如果我们的样本规模的特别大的话效率就会比较低。假如有500万,甚至5000万个样本(在我们的业务场景中,一般有几千万行,有些大数据有10亿行)的话走一轮迭代就会非常的耗时。这个时候的梯度下降叫做full batch。 所以为了提高效率,我们可以把样本分成等量的子集。 例如我们把100万样本分成1000份, 每份1000个样本, 这些子集就称为mini batch。然后我们分别用一个for循环遍历这1000个子集。 针对每一个子集做一次梯度下降。 然后更新参数w和b的值。接着到下一个子集中继续进行梯度下降。 这样在遍历完所有的mini batch之后我们相当于在梯度下降中做了1000次迭代。 我们将遍历一次所有样本的行为叫做一个 epoch,也就是一个世代。 在mini batch下的梯度下降中做的事情其实跟full batch一样,只不过我们训练的数据不再是所有的样本,而是一个个的子集。 这样在mini batch我们在一个epoch中就能进行1000次的梯度下降,而在full batch中只有一次。 这样就大大的提高了我们算法的运行速度。 如上图,左边是full