梯度

梯度下降在深度学习中的作用

我的未来我决定 提交于 2020-02-01 19:17:12
提及梯度,那就一定要知道导数的作用。 f ( x ) = 3 x 2 + 2 x + 2 f(x)=3x^2+2x+2 f ( x ) = 3 x 2 + 2 x + 2 ,假设有这样的函数,想要求出使得这个函数达到最小值的 x x x 的值。 f ′ ( x ) = 6 x + 2 f'(x)=6x+2 f ′ ( x ) = 6 x + 2 初始值 x 0 = 3 x_0=3 x 0 ​ = 3 x i + 1 = x i + θ f ′ ( x i ) x_{i+1}=x_i+\theta f'(x_i) x i + 1 ​ = x i ​ + θ f ′ ( x i ​ ) 这个式子就是更新迭代的公式, θ \theta θ 就是所说的学习率。注意这里为了简明用的是导数,而实际上要用的是梯度。 假设 θ \theta θ =0.01,沿着导数相反的方向函数值下降最快,那么 x 2 = 3 − 0.01 ∗ 20 = 2.8 x_2=3-0.01*20=2.8 x 2 ​ = 3 − 0 . 0 1 ∗ 2 0 = 2 . 8 。 以此类推直到 x i = − 0.3333333 x_i=-0.3333333 x i ​ = − 0 . 3 3 3 3 3 3 3 时, f ′ ( x i ) = 0 f'(x_i)=0 f ′ ( x i ​ ) = 0 ,此时 x i +

优化算法:AdaGrad | RMSProp | AdaDelta | Adam

时光总嘲笑我的痴心妄想 提交于 2020-02-01 01:18:20
0 - 引入   简单的梯度下降等优化算法存在一个问题:目标函数自变量的每一个元素在相同时间步都使用同一个学习率来迭代,如果存在如下图的情况(不同自变量的梯度值有较大差别时候),存在如下问题: 选择较小的学习率会使得梯度较大的自变量迭代过慢 选择较大的学习率会使得梯度较小的自变量迭代发散   因此,自然而然想到,要解决这一问题,不同自变量应该根据梯度的不同有不同的学习率。本篇介绍的几种优化算法都是基于这个思想的。 1 - AdaGrad算法   使用一个小批量随机梯度$g_t$按元素平方的累加变量$s_t$,在时间步0,AdaGrad将$s_0$中每个元素初始化为0,其更新公式为: $$s_t\leftarrow s_{t-1}+g_t\odot g_t$$ $$x_t\leftarrow x_{t-1}-\frac{\eta}{\sqrt{s_t+\epsilon}}\odot g_t$$   其中$\odot$是按元素相乘,$\eta$是学习率,$\epsilon$是为了维持数值稳定性而添加的常数(如$10^{-6}$)。 2 - RMSProp算法   由于AdaGrad算法的机制,导致每个元素的学习率在迭代过程中只能降低或者不变,因此很可能出现早期迭代到不好的极值点之后,由于学习率太小而无法冲出这个极值点导致最后收敛到的解不优,为了解决这一问题

误差反向传播法版 对MNIST数据集的二层神经网络的学习实现

不打扰是莪最后的温柔 提交于 2020-01-31 21:39:11
# 1.神经网络的学习前提和步骤 前提 神经网络存在合适的权重和偏置。 步骤一(挑选mini-batch) 从训练数据中随机选出一部分数据,这部分数据称为mini-batch。 我们的目标是减少mini-batch这部分数据的损失函数的值。 步骤二(计算梯度) 为了减小mini-batch这部分数据的损失函数的值,需要求出有关各个权重参数的梯度。 步骤三(更新参数) 将权重参数沿梯度方向进行微小更新。 步骤四(重复) 重复步骤1,2,3 # 2.二层神经网络类的实现 同数值微分版的实现不同,这里的二层神经网络类运用上篇博客介绍的各种计算层(下图中的黑色方框)来进行实现。 下面是二层神经网络的计算图 其中利用计算图的正向传播和反向传播高效求梯度的方法,是最为重要的。 下面是二层神经网络类TwoLayerNet的具体实现代码 import sys,os sys.path.append(os.pardir) import numpy as np from layers import * # 导入加权和层类Affine和激活函数层类ReLU from collections import OrderedDict # 导入有序字典类OrderedDict # 应用误差反向传播法的二层神经网络类TwoLayerNet的实现 class TwoLayerNet: def __init__

tf.GradientTape详解

ぃ、小莉子 提交于 2020-01-31 20:39:20
参考文献:https://blog.csdn.net/guanxs/article/details/102471843 在TensorFlow 1.x静态图时代,我们知道每个静态图都有两部分,一部分是前向图,另一部分是反向图。反向图就是用来计算梯度的,用在整个训练过程中。而TensorFlow 2.0默认是eager模式,每行代码顺序执行,没有了构建图的过程(也取消了control_dependency的用法)。但也不能每行都计算一下梯度吧?计算量太大,也没必要。因此,需要一个 上下文管理器 (context manager)来连接需要 计算梯度 的函数和变量,方便求解同时也提升效率。 举个例子:计算y=x^2在x = 3时的导数: x = tf.constant(3.0) with tf.GradientTape() as g: g.watch(x) y = x * x dy_dx = g.gradient(y, x) # y’ = 2*x = 2*3 = 6 例子中的watch函数把需要计算梯度的变量x加进来了。GradientTape默认只监控由tf.Variable创建的traiable=True属性(默认)的变量。上面例子中的x是constant,因此计算梯度需要增加g.watch(x)函数。当然,也可以设置不自动监控可训练变量,完全由自己指定,设置watch

想了解递归神经网络?这里有一份入门教程

久未见 提交于 2020-01-31 11:04:32
导语:递归网络是一类人工神经网络,用于识别诸如文本、基因组、手写字迹、语音等序列数据的模式,或用于识别传感器、股票市场、政府机构产生的数值型时间序列数据。 递归神经网络入门教程 引言 递归神经网络是一类人工神经网络,可用于识别诸如文本、基因组、手写字迹、语音等序列数据的模式,也可用于识别传感器、股票市场、政府机构产生的数值型时间序列数据。递归网络可以说是最强大的神经网络,甚至可以将图像分解为一系列图像块,作为序列加以处理。由于递归网络拥有一种特定的记忆模式,而记忆也是人类的基本能力之一,所以下文会时常将递归网络与人脑的记忆活动进行类比。 前馈网络回顾 要理解递归网络,首先需要了解前馈网络的基础知识。这两种网络的名字都来自于它们通过一系列网络节点数学运算来传递信息的方式。前馈网络将信息径直向前递送(从不返回已经过的节点),而递归网络则将信息循环传递。 在前馈网络中,样例输入网络后被转换为一项输出;在进行有监督学习时,输出为一个标签。也就是说,前馈网络将原始数据映射到类别,识别出信号的模式,例如一张输入图像应当给予“猫”还是“大象”的标签。 我们用带有标签的图像定型一个前馈网络,直到网络在猜测图像类别时的错误达到最少。将参数,即权重定型后,网络就可以对从未见过的数据进行分类。已定型的前馈网络可以接受任何随机的图片组合,而输入的第一张照片并不会影响网络对第二张照片的分类

cs231n笔记:最优化

对着背影说爱祢 提交于 2020-01-30 23:45:01
本节是cs231n笔记:最优化,并介绍了梯度下降方法,然后应用到逻辑回归中。 引言 在上一节线性分类器中提到,分类方法主要有两部分组成: 1. 基于参数的评分函数 。能够将样本映射到类别的分值。 2. 损失函数 。用来衡量预测标签和真实标签的一致性程度。 这一节介绍第三个重要部分: 最优化(optimization)。 损失函数能够让我们定量的评估得到的权重w的好坏,而最优化的目标就是找到一个w,使得损失函数的值最小。工作流程如下图: (x,y)是给定的数据集,w是权重矩阵,通过初始化得到。向前传递到评分函数中得到类别的评分值并存储在向量f中。损失函数计算评分函数值f与类标签y的差值,正则化损失只是一个关于权重的函数。在梯度下降过程中,我们计算权重的梯度,然后使用梯度更新权重。一旦理解了这三个部分的关系,我们可以使用更加复杂的评分函数来代替线性映射,比如神经网络、甚至卷积神经网络等,而损失函数和优化过程这两部分则相对保持不变。 梯度下降   梯度下降的思想是,要寻找某函数的最值,最好的方法是沿着函数的梯度方向寻找,移动量的大小称为步长。梯度下降的公式如下:   我们常常听说过梯度上升、梯度下降,那么两者的区别又是什么呢?其实这两者是一样的,只是公式中的减法变成加法,因此公式是: 梯度上升是用来求函数的最大值,而梯度下降是用来求最小值。普通的梯度下降版本如下: # 普通的梯度下降

Activation Functions:激活函数

十年热恋 提交于 2020-01-30 19:02:46
1. 激活函数 :激活函数是指在人工神经网络的神经元中,将输入映射到输出端的非线性函数。激活函数通常是非线性的,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,可以应用到非线性模型中。 一般进行线性操作后,就将线性操作的结果放入激活函数中映射。在CNN中,运算顺序通常是卷积 - 池化 - 批量归一化 - 激活函数 常见的激活函数:sigmoid、tanh、ReLU、Maxout、Leaky ReLU、ELU 2. sigmoid :将元素压缩(映射)到0和1之间,当参数过大或过小时,容易造成梯度消失 公式: 图像: 问题: ①梯度消失 ②指数函数e的计算过高 ③函数不以0为中心 梯度消失:当参数过大或过小时,斜率趋向于0,局部梯度为0或者是一个很小很小的值,一直回溯逐步累乘起来,梯度就会趋于0,从而造成梯度消失 4. tanh :将元素映射到-1和1之间,以0为中心,但仍存在梯度消失的问题 公式: 图像: 5. Relu :将元素映射到0和正无穷之间,在大于0的区间上不存在梯度消失的问题。Relu不用计算指数函数,计算效率高、收敛速度快 公式: 图像: 6. Leaky Relu :将元素映射到负无穷到正无穷之间,设置α,选取αx和x中的最大值 公式: 图像:α=0.01 7.ELU :将元素映射到负无穷和正无穷之间, x>=0时,f(x)=x;x<0时

离场定高转弯DF与CF的对比

社会主义新天地 提交于 2020-01-30 14:47:45
也许是刚学会CAD的缘故,配合风螺旋插件,画图的感觉真是蛮爽的,忍不住画了一张又一张。 接着昨天的离场保护区,我们来聊一下PBN指定高度转弯保护区的画法。指定高度转弯的计算本身没有太多复杂的地方,真正复杂的是DF(直飞定位点)与CF(沿航迹飞至定位点)飞行方式上的差别。规范里有这样两张图例: 图III-2-2-9 定高转弯接DF航段 图III-2-2-8 定高转弯接CF航段 先画起来,再来分析。 一、基础参数计算: 使用昨天的转弯最晚点距DER(起飞跑道末端) 13km左右的图为底图,离场转弯高度900米,按照3.3%离场梯度反推机场DER标高是450米(作练习的顺序和正常工作顺序相反)。转弯参数如下: 标称航迹的参数计算: 为了得到与实际飞行轨迹较为相近的离场航迹,在计算时,可以按照平均离场航迹的参数进行计算,离场梯度为7%,跑道之上450米转弯,查表可知转弯坡度可以按20°计算,转弯半径为4075米,转弯点距DER 6358米。 二、定高转弯接DF航段的保护区绘制 指定高度转弯衔接DF航段 离场程序直线段最远点,按照规定的离场梯度(默认3.3%)再加上6秒钟的C容差计算得到。风螺旋从最晚点主区的内侧及外侧分别进行绘制,两条风螺旋的初始位置及参数相同,因此,二者公切线对应的sita角度值为90°+DA(这个角度值与速度、高度的大小无关)。 从风螺旋的最远边界来看,转弯角度在90

Tensorflow梯度下降优化案例

六月ゝ 毕业季﹏ 提交于 2020-01-29 18:41:23
安装tensorflow之后,先用命令查看一下相关版本及路径,然后再开始完成第一个梯度下降优化的小案例。 import tensorflow as tf tf . __version__ '1.3.0' import sys print ( sys . version ) 3.5 .2 | Anaconda 4.2 .0 ( 64 - bit ) | ( default , Jul 2 2016 , 17 : 53 : 06 ) [ GCC 4.4 .7 20120313 ( Red Hat 4.4 .7 - 1 ) ] tf . __path__ [ '/root/anaconda3/lib/python3.5/site-packages/tensorflow' ] import numpy as np x_data = np . random . rand ( 100 ) . astype ( np . float32 ) #tensorflow中大部分数据是float32格式 y_data = x_data * 0.1 + 0.3 #weight接近0.1(一维),bias接近0.3 ## create tensorflow structure start #Weights参数变量初始值由随机数列生成[1]一维,范围(-1.0,1.0) Weights = tf .

深度学习调参技巧

眉间皱痕 提交于 2020-01-29 03:35:18
调参技巧 网络设计 下采样在网络的前几层密度大一些 尽可能用微弱的精度损失来换取速度提升 使用小卷积核 有利于网络走向更深 并且有更好的识别鲁棒性 能用可分离卷积替代的一定要替代 可分离卷积的参数和计算量都是线性增长的 拟合 欠拟合 训练集,测试集准确率都很低 增加层数 减小dropout 减小L2正则值 增加节点数 模型超参数 一般在小数据集上合适的参数,在大数据集上效果也不会太差。因此可以尝试对数据进行精简,以提高速度 学习率 学习率一般就比正则值,dropout值重要,最先确定,在对数尺度上进行超参数搜索 从1-0.001 dropout 一般设置成0.5 BatchSize 优化器 SGD Momentum 一个已经完成的梯度+步长的组合不会立刻消失,只是会以一定的形式衰减 改进自SGD算法,让每一次的参数更新方向不仅仅取决于当前位置的梯度,还 受到上一次参数更新方向 的影响 多更新一部分上一次迭代的更新量,来 平滑 这一次迭代的梯度[为了抑制SGD的震荡] 物理的角度上解释,就像是一个小球滚落的时候会受到自身历史动量的影响,所以才叫动量(Momentum)算法 NAG 通俗解释 动量走了一步,那个时候的下降方向(能够让算法提前看到前方的地形梯度,如果前面的梯度比当前位置的梯度大,那我就可以把步子迈得比原来大一些,如果前面的梯度比现在的梯度小,那我就可以把步子迈得小一些)