梯度

cs231n笔记:最优化

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

深度学习-最优化笔记

徘徊边缘 提交于 2019-12-27 17:29:29
作者:杜客 链接:https://zhuanlan.zhihu.com/p/21360434 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 译者注:本文 智能单元 首发,译自斯坦福CS231n课程笔记 Optimization Note ,课程教师 Andrej Karpathy 授权翻译。本篇教程由 杜客 翻译完成, 堃堃 和 李艺颖 进行校对修改。译文含公式和代码,建议PC端阅读。 原文如下 内容列表: 简介 损失函数可视化 最优化 策略#1:随机搜索 策略#2:随机局部搜索 策略#3:跟随梯度 译者注:上篇截止处 梯度计算 使用有限差值进行数值计算 微分计算梯度 梯度下降 小结 简介 在上一节中,我们介绍了图像分类任务中的两个关键部分: 基于参数的 评分函数。 该函数将原始图像像素映射为分类评分值(例如:一个线性函数)。 损失函数 。该函数能够根据分类评分和训练集图像数据实际分类的一致性,衡量某个具体参数集的质量好坏。损失函数有多种版本和不同的实现方式(例如:Softmax或SVM)。 上节中,线性函数的形式是 ,而SVM实现的公式是: 对于图像数据 ,如果基于参数集 做出的分类预测与真实情况比较一致,那么计算出来的损失值 就很低。现在介绍第三个,也是最后一个关键部分: 最优化Optimization

cs231n笔记(二) 最优化方法

佐手、 提交于 2019-12-27 17:29:20
回顾上一节中,介绍了图像分类任务中的两个要点: 假设函数。 该函数将原始图像像素映射为分类评分值。 损失函数 。该函数根据分类评分和训练集图像数据实际分类的一致性,衡量某个具体参数集的质量好坏。 现在介绍第三个要点,也是最后一个关键部分: 最优化Optimization 。最优化是寻找能使得损失函数值最小化的参数 W 的过程,一旦理解了这三个部分是如何相互运作的,我们将会回到第一个要点,然后将其拓展为一个远比线性函数复杂的函数:首先是神经网络,然后是卷积神经网络。而损失函数和最优化过程这两个部分将会保持相对稳定。 损失函数可视化 : 本节讨论的损失函数一般都是定义在高维度的空间中(比如,在 CIFAR-10 中一个线性分类器的权重矩阵大小是 $[10 \times 3073]$ ,就有 30730 个参数),这样要将其可视化就很困难。然而办法还是有的,在 1 个维度或者 2 个维度的方向上对高维空间进行切片,就能得到一些直观感受。例如,随机生成一个权重矩阵 W ,将其看做向量,该矩阵就与高维空间中的一个点对应。然后沿着某个维度方向前进的同时记录损失函数值的变化。换句话说,就是生成一个随机的方向 $W_1$ 并且沿着此方向计算损失值,计算方法是根据不同的 $a$ 值来计算 $L(W + aW_1)$ 。这个过程将生成一个图表,其 $x$ 轴是 $a$ 值,$y$ 轴是损失函数值

[小脚本] 可视化图片梯度方向

此生再无相见时 提交于 2019-12-26 10:08:32
大致就是算出梯度, 然后利用直线的变换表示梯度的方向 img = cv . imread ( "tempdir/DoG.png" ) #img = cv.imread("tempdir/robot.jpg") gray_blur = cv2 . cvtColor ( img , cv2 . COLOR_BGR2GRAY ) # 3x3 sobel filters for edge detection sobel_x = np . array ( [ [ - 1 , 0 , 1 ] , [ - 2 , 0 , 2 ] , [ - 1 , 0 , 1 ] ] ) sobel_y = np . array ( [ [ - 1 , - 2 , - 1 ] , [ 0 , 0 , 0 ] , [ 1 , 2 , 1 ] ] ) # Filter the blurred grayscale images using filter2D filtered_blurred_x = cv2 . filter2D ( gray_blur , cv2 . CV_32F , sobel_x ) filtered_blurred_y = cv2 . filter2D ( gray_blur , cv2 . CV_32F , sobel_y ) # Compute the orientation of the

激活函数和损失函数

ぃ、小莉子 提交于 2019-12-26 04:19:58
原文地址 激活函数和损失函数 这一部分来探讨下激活函数和损失函数。在之前的logistic和神经网络中,激活函数是sigmoid, 损失函数是平方函数。但是这并不是固定的。事实上,这两部分都有很多其他不错的选项,下面来一一讨论 激活函数和损失函数 激活函数 关于激活函数,首先要搞清楚的问题是,激活函数是什么,有什么用?不用激活函数可不可以?答案是不可以。激活函数的主要作用是提供网络的非线性建模能力。如果没有激活函数,那么该网络仅能够表达线性映射,此时即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的。因此也可以认为,只有加入了激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。 那么激活函数应该具有什么样的性质呢? 可微性: 当优化方法是基于梯度的时候,这个性质是必须的。 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。 输出值的范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影 响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate 从目前来看,常见的激活函数多是分段线性和具有指数形状的非线性函数 sigmoid f(x)=11+e−xf(x)=\frac{1}{1+e^{−x}} f ( x ) = 1 + e − x 1 ​

optimizer

…衆ロ難τιáo~ 提交于 2019-12-25 13:09:36
在很多机器学习和深度学习的应用中,我们发现用的最多的优化器是 Adam,为什么呢? 下面是 TensorFlow 中的优化器, https://www.tensorflow.org/api_guides/python/train 在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等: https://keras.io/optimizers/ 我们可以发现除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论文中给出了常用优化器的比较,今天来学习一下: https://arxiv.org/pdf/1609.04747.pdf 本文将梳理: 每个算法的梯度更新规则和缺点 为了应对这个不足而提出的下一个算法 超参数的一般设定值 几种算法的效果比较 选择哪种算法 优化器算法简述? 首先来看一下梯度下降最常见的三种变形 BGD,SGD,MBGD, 这三种形式的区别就是取决于我们用多少数据来计算目标函数的梯度, 这样的话自然就涉及到一个 trade-off,即参数更新的准确率和运行时间。 1. Batch gradient descent 1 2 梯度更新规则 : BGD 采用整个训练集的数据来计算 cost function 对参数的梯度:

如何选择优化器 optimizer

雨燕双飞 提交于 2019-12-25 13:09:20
转载自http://www.jianshu.com/p/d99b83f4c1a6 在很多机器学习和深度学习的应用中,我们发现用的最多的优化器是 Adam,为什么呢? 下面是 TensorFlow 中的优化器, https://www.tensorflow.org/api_guides/python/train 在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等: https://keras.io/optimizers/ 我们可以发现除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论文中给出了常用优化器的比较,今天来学习一下: https://arxiv.org/pdf/1609.04747.pdf 本文将梳理: 每个算法的梯度更新规则和缺点 为了应对这个不足而提出的下一个算法 超参数的一般设定值 几种算法的效果比较 选择哪种算法 优化器算法简述? 首先来看一下梯度下降最常见的三种变形 BGD,SGD,MBGD, 这三种形式的区别就是取决于我们用多少数据来计算目标函数的梯度, 这样的话自然就涉及到一个 trade-off,即参数更新的准确率和运行时间。 Batch gradient descent 梯度更新规则: BGD

batch normalization

前提是你 提交于 2019-12-25 05:10:48
作者:魏秀参 链接:https://www.zhihu.com/question/38102762/answer/85238569 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 1. What is BN? 规范化! 即在每次SGD时,通过mini-batch来对相应的activation做规范化操作,使得结果(输出信号各个维度)的均值为0,方差为 1. 而最后的“scale and shift”操作则是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入(即当 ),从而保证整个network的capacity。(有关capacity的解释:实际上BN可以看作是在原模型上加入的“新操作”,这个新操作很大可能会改变某层原来的输入。当然也可能不改变,不改变的时候就是“还原原来输入”。如此一来,既可以改变同时也可以保持原输入,那么模型的容纳能力(capacity)就提升了。) 关于DNN中的normalization,大家都知道白化(whitening),只是在模型训练过程中进行白化操作会带来过高的计算代价和运算时间。因此本文提出两种简化方式:1)直接对输入信号的每个维度做规范化(“normalize each scalar feature independently”);2)在每个mini-batch中计算得到mini-batch

关于梯度爆炸和梯度消失的详解(转载)

会有一股神秘感。 提交于 2019-12-24 04:02:06
转载链接: https://www.jianshu.com/p/3f35e555d5ba 1.为什么使用梯度下降来优化神经网络参数? 反向传播(用于优化神网参数) :根据损失函数计算的误差通过反向传播的方式,指导深度网络参数的更新优化。 采取反向传播的原因:首先,深层网络由许多线性层和非线性层堆叠而来,每一层非线性层都可以视为是一个非线性函数 (非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数。 我们最终的目的是希望这个非线性函数很好的完成输入到输出之间的映射,也就是找到让损失函数取得极小值。所以最终的问题就变成了一个寻找函数最小值的问题,在数学上,很自然的就会想到使用梯度下降来解决。 2.梯度消失、爆炸会带来哪些影响 举个例子,对于一个含有三层隐藏层的简单神经网络来说, 当梯度消失发生时,接近于输出层的隐藏层由于其梯度相对正常,所以权值更新时也就相对正常,但是当越靠近输入层时,由于梯度消失现象,会导致靠近输入层的隐藏层权值更新缓慢或者更新停滞。这就导致在训练时,只等价于后面几层的浅层网络的学习。 3.产生的原因 以最简单的网络结构为例,假如有三个隐藏层,每层的神经元个数都是1,且对应的非线性函数为 (其中 为某个激活函数)如下图: 现在假设我们需要更新参数 ,那么我们就要求出损失函数对参数 的导数 而对于激活函数,之前一直使用Sigmoid函数

tensorflow(五)

て烟熏妆下的殇ゞ 提交于 2019-12-24 03:08:23
一、单机编程框架 单机程序是指启动和运行都在一台机器的一个进程中完成,因为没有网络开销,非常适合参数不多、计算量小的模型。 步骤,创建单机数据流图,创建并运行单机会话。 saver = tf.train.Saver() sess = tf.InteractiveSession() tf.global_variables_initializer().run() for i in range(1000): batch_xs,batch_ys = mnist.train.next_batch(100) sess.run(train_step,feed_dict={x:batch_xs,y_=batch_ys}) if i%100 = 0: saver.save(sess,'mnist.ckpt') correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) sess.run(accuracy,feed_dict={x:mnist.test.images,y_:mnist.test.labels}) 如果想指定机器上的设备如cpu,gpu 可以使用 with tf.device('/cpu:0')