反向传播

如何确定梯度爆炸和解决梯度爆炸

走远了吗. 提交于 2020-05-05 01:14:49
github博客传送门 csdn博客传送门 如何确定是否出现梯度爆炸? 训练过程中出现梯度爆炸会伴随一些 细微的信号 ,如: 模型无法从训练数据中获得更新(如低损失)。 模型不稳定,导致更新过程中的损失出现显著变化。 训练过程中,模型损失变成 NaN。 如果你发现这些问题,那么你需要仔细查看是否出现梯度爆炸问题。 以下是一些稍微 明显一点的信号 ,有助于确认是否出现梯度爆炸问题。 训练过程中模型梯度快速变大。 训练过程中模型权重变成 NaN 值。 训练过程中,每个节点和层的误差梯度值持续超过 1.0。 解决办法: 重新设计网络模型 在深度神经网络中,梯度爆炸可以通过重新设计层数更少的网络来解决。 使用更小的批尺寸对网络训练也有好处。 在循环神经网络中,训练过程中在更少的先前时间步上进行更新(沿时间的截断反向传播,truncated Backpropagation through time)可以缓解梯度爆炸问题。 使用 ReLU 激活函数 在深度多层感知机神经网络中,梯度爆炸的发生可能是因为激活函数,如之前很流行的 Sigmoid 和 Tanh 函数。 使用 ReLU 激活函数可以减少梯度爆炸。 使用长短期记忆网络 在循环神经网络中,梯度爆炸的发生可能是因为某种网络的训练本身就存在不稳定性,如随时间的反向传播本质上将循环网络转换成深度多层感知机神经网络。 使用长短期记忆(LSTM

基于图像的单目三维网格重建

我们两清 提交于 2020-05-04 14:28:23
点击上方“ 3D视觉工坊 ”,选择“星标” 干货第一时间送达 代码地址:https://github.com/ShichenLiu/SoftRas 论文题目:Soft Rasterizer: A Differentiable Renderer for Image-based 3DReasoning(CVPR2019) 概述 渲染通过模拟图像形成的物理过程来缩小二维视觉和三维场景之间的差距,通过反转这种渲染器,人们可以得到一种从二维图像中推断三维信息的学习方法。然而,光栅化阻止了渲染过程变成一个可微操作。 与目前最先进的可微渲染器不同,作者提出了一种真正可微的渲染框架,它可以直接使用可微函数渲染着色网格,并将有效的监督信号从不同的图像表示形式(包括轮廓、阴影和彩色图像)反向传播到网格顶点及其属性。 该框架的关键是一个新的公式,它将渲染视为一个聚合函数,将所有网格三角形关于渲染像素的概率贡献融合在一起并且使得框架能够将梯度流到被遮挡的和远距离的顶点,这是以前的技术所无法实现的。结果表明,利用该渲染器可以在质量和数量上对三维无监督单视图重建进行显著的改进。 简介 从二维图像中理解和重建三维场景和结构是计算机视觉的基本目标之一。基于图像的三维推理关键在于找到从像素到三维属性的足够监督。为了获得图像到三维的相关性,先验方法主要依赖于基于二维关键点 / 轮廓或形状 / 外观的匹配损失

理论结合实际:如何调试神经网络并检查梯度

三世轮回 提交于 2020-05-04 13:45:24
当我们实现神经网络时,反向传播的过程中更容易出错。 因此,如果我们能够实现一些使我们能够轻松调试神经网络的工具,那将是多么酷。 在这里,我们将看到“梯度检查”的方法。 简而言之,该方法使用数值方法近似梯度。 如果实际的梯度接近计算得出的梯度,则可以正确实施反向传播。 还有很多其他方法,让我们一起看看。 有时,可以看到网络在几个epoch内陷入僵局,然后继续快速收敛。 我们还将看到如何解决这个问题。 让我们开始吧! 梯度的数值近似法 为了使我们能够构建“梯度检查”函数,我们首先需要了解如何在数值上近似梯度。 我发现用一个例子很容易解释此方法,所以让我们采用一个函数f(θ)=θ³。 让我们看一下这个函数的图像。 您可能已经猜到了。 让我们像往常一样从θ的某个值开始,现在我们说θ=1。我们要做的是不仅将θ推到右边以获得(θ+ ϵ),还将θ推到左边而得到(θ-ϵ)。 出于示例的目的,我们仅表示ϵ = 0.01。现在我们将其可视化。忽略该图中的比例。 现在我们说(θ-ϵ)的点称为B,而(θ+ ϵ)的点称为C。在此图中,我们之前使用的是三角形DEF,并计算出其梯度。在这种情况下是EF / DE。 事实证明,如果您使用(θ+ ϵ)和(θ-ϵ)中的一个较大的三角形,则可以得到更好的梯度估计,我的意思是用下图中的红色表示此处的三角形。

你的厨房被水淹了!别担心,这只是3D深度估计做出的特效

拜拜、爱过 提交于 2020-05-04 10:50:24
还记得那个用论文外观判断论文质量的 研究 吗?在那份研究中,身为顶会领域主席的作者 Jia-Bin Huang 被自己开发的系统拒了稿,引来了大批社区成员的围观。最近,他和合作者提出了一项新的计算机视觉方法,可以让厨房「水漫金山」,让天空下起「彩球雨」…… 选自arXiv,作者:罗璇、Jia-Bin Huang等,机器之心编译,参与:魔王、张倩。 不止如此,想要猫主子不嫌弃自己拍的丑丑视频,这个方法也能拯救你! 这项研究由来自华盛顿大学、弗吉尼亚理工学院和 Facebook 的研究者合作完成。 其中第一作者罗璇现为华盛顿大学现实实验室博士,她本科毕业于上海交通大学,导师为卢宏涛教授,研究方向为立体匹配,曾在新加坡国立大学跟随颜水成钻研深度学习。 第二作者 Jia-Bin Huang 为弗吉尼亚理工学院助理教授,研究方向为计算机视觉、计算机图形学和机器学习。曾担任 WACV 2018、CVPR 2019、ICCV 2019、BMVC 2019 和 BMVC 2020 会议的领域主席。 这项研究主要探究了如何生成准确度和几何一致性更高的视频重建结果,目前该论文已被计算机图形学顶级会议 SIGGRAPH 2020 接收,代码也将在未来开源。 论文地址: https:// arxiv.org/pdf/2004.1502 1.pdf 项目网站: https:// roxanneluo

机器学习基础---神经网络(属于逻辑回归)(构建训练集以及参数学习)

社会主义新天地 提交于 2020-05-04 07:29:35
一:代价函数---为神经网络拟合参数 (一)神经网络字母概念 主要讲解神经网络在分类问题中的应用 假设我们有一个和下图类似的神经网络结构: 并且有一个像下面这样的训练集:其中有m组训练样本(x^i,y^i) 并且用大写字母L表示神经网络结构的总层数: 用sl表示第L层的单元数,也就是神经元的数量(不包含该层的偏差单元) 其中S_L表示输出层的单元数 (二)二分类和多分类 K表示输出层单元数(也是h(x)维数)。注意:二分类的K为1,多分类的K>=3(因为=2就是二分类) (三)定义代价函数 我们在神经网络里,使用的代价函数,是逻辑回归里使用的代价函数的一般化形式:(含正则项) 对于逻辑回归而言,我们通常使代价函数 J(θ)最小化。 对于一个神经网络来说,我们的代价函数是这个式子的一般化形式。 这里不再是仅有一个逻辑回归输出单元,取而代之的是K个,所以下面的是我们的代价函数: 神经网络现在输出了属于R^K的向量: 并用h(x)_i来表示第i个输出,也就是说h(x)是一个K维向量。下标 i 表示选择了神经网络输出向量的第i个元素。 神经网络的代价函数 J(θ) 将成为下面这样的形式: 这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出K 个预测,基本上我们可以利用循环

神经网络之父Hinton再审视34年前的奠基性成果,欲在大脑中搜寻AI方法的“存在”

瘦欲@ 提交于 2020-05-02 10:13:30
  直到现在,几乎你听说过的每一个关于人工智能的进步,仍基于 30 年前的一篇阐述多层神经网络训练方法的论文演变而来。   那就是 Geoffrey Hinton 在 1986 年写下的《Learning representations by back-propagation errors》。   这篇论文具有重要的意义,可以说是 代表着反向传播算法(Backpropagation algorithm)首次被引入到多层神经网络训练,为后来该算法的推广埋下伏笔 ,尤其是为人工智能在最近 10 年的发展奠定了基础,但要保持这种进步,还得清醒地面对人工智能的局限性。      而作为反向传播的提出者,现已 72 岁的 Geoffrey Hinton ,仍然站在反思(甚至质疑)反向传播的第一线。在 2017 年时,他还曾明确表示,“我们需要放弃掉反向传播算法,重新开辟一条新的路径。”   从 Hinton 本人的实践看来,解谜人的大脑将被包含在这种路径之中,近年来,这位 “人工神经网络之父” 频频表现出了其对脑科学研究的浓厚兴趣,并发表了一定数量的有关脑神经科学的论文。   最近,Geoffrey Hinton 撰写了一篇名为 Backpropagation and the brain 的文章,论文发表在 Nature Reviews Neuroscience

论文笔记(2):A fast learning algorithm for deep belief nets.

↘锁芯ラ 提交于 2020-05-02 03:11:37
论文笔记(2):A fast learning algorithm for deep belief nets. 这几天继续学习一篇论文,Hinton的A Fast Learning Algorithm for Deep Belief Nets。这篇论文一开始读起来是相当费劲的,学习了好几天才了解了相关的背景,慢慢的思路也开始清晰起来。DBN算法就是Wake-Sleep算法+RBM,但是论文对Wake-Sleep算法解释特别少。可能还要学习Wake-Sleep和RBM相关的的知识才能慢慢理解,今天先说说A Fast Learning Algorithm for Deep Belief Nets这篇论文。 原文摘要: 1,我们展示了如何使用 “ 互补的先验 ” 来消除解释的影响,这使得在紧密连接的置信网络中很难有许多隐藏的层。 2,利用互补的先验知识,我们推导出一种快速、贪婪的算法,可以学习深入的、有向的置信网络一层一层,提供了最上层的两层,形成一个无定向的联想记忆。 3,快速、贪婪算法用于初始化一个较慢的学习过程,该过程用一个对比版本的 wake-sleep 算法对权重进行微调。 4,经过微调后,一个带有三个隐藏层的网络形成了一个非常好的生成模型,它是手写数字图像和它们的标签的联合分布。 5,这种生成模型给出的数字分类比最好的鉴别学习算法更好。 6,这些数字所在的低维度的流形

自己动手实现深度学习框架-5 使用学习率优化器加快模型训练速度

折月煮酒 提交于 2020-04-28 16:15:33
代码仓库: https://github.com/brandonlyg/cute-dl (转载请注明出处!) 目标 增加学习率优化器, 加快模型在小学习率下模型的训练速度。 使用MNIST数据集比较同一个模型使用不同学习率优化器的表现。 常见的学习率优化算法 在上个阶段,我们使用固定学习率优化器训练识别MNIST手写数字模型。在后面的示例中将会看到: 如果学习习设置太大,模型将无法收敛; 如果设置学习率太小模型大概率会收敛速度会非常缓慢。因此必须要要给学习率设置一个合适的值,这个合适的值到底是什么需要反复试验。 训练模型的本质是,在由损失函数定义的高纬超平面中尽可能地找到最低点。由于高纬超平面十分复杂,找到全局最低点往往不现实,因此找到一个尽量接近全局最低点的局部最低点也是可以的。 由于模型参数是随机初始化的,在训练的初始阶段, 可能远离最低点,也可能距最低点较较近。为了使模型能够收敛,较小的学习率比较大的学习率更有可能达到目地, 至少不会使模型发散。 理想的状态下,我们希望,学习率是动态的: 在远离最低点的时候有较大的学习率,在靠近最低点的时候有较小的学习率。 学习率算法在训练过程中动态调整学习率,试图使学习率接近理想状态。常见的学习率优化算法有: 动量算法。 Adagrad算法。 RMSProp算法。 Adadelta算法。 Adam算法。

自己动手实现深度学习框架-5 使用学习率优化器加快模型训练速度

巧了我就是萌 提交于 2020-04-28 16:09:03
代码仓库: https://github.com/brandonlyg/cute-dl (转载请注明出处!) 目标 增加学习率优化器, 加快模型在小学习率下模型的训练速度。 使用MNIST数据集比较同一个模型使用不同学习率优化器的表现。 常见的学习率优化算法 在上个阶段,我们使用固定学习率优化器训练识别MNIST手写数字模型。在后面的示例中将会看到: 如果学习习设置太大,模型将无法收敛; 如果设置学习率太小模型大概率会收敛速度会非常缓慢。因此必须要要给学习率设置一个合适的值,这个合适的值到底是什么需要反复试验。 训练模型的本质是,在由损失函数定义的高纬超平面中尽可能地找到最低点。由于高纬超平面十分复杂,找到全局最低点往往不现实,因此找到一个尽量接近全局最低点的局部最低点也是可以的。 由于模型参数是随机初始化的,在训练的初始阶段, 可能远离最低点,也可能距最低点较较近。为了使模型能够收敛,较小的学习率比较大的学习率更有可能达到目地, 至少不会使模型发散。 理想的状态下,我们希望,学习率是动态的: 在远离最低点的时候有较大的学习率,在靠近最低点的时候有较小的学习率。 学习率算法在训练过程中动态调整学习率,试图使学习率接近理想状态。常见的学习率优化算法有: 动量算法。 Adagrad算法。 RMSProp算法。 Adadelta算法。 Adam算法。

PyTorch自动微分基本原理

拥有回忆 提交于 2020-04-28 02:06:12
序言:在训练一个神经网络时,梯度的计算是一个关键的步骤,它为神经网络的优化提供了关键数据。但是在面临复杂神经网络的时候导数的计算就成为一个难题,要求人们解出复杂、高维的方程是不现实的。这就是自动微分出现的原因,当前最流行的深度学习框架如PyTorch、Tensorflow等都提供了自动微分的支持,让人们只需要很少的工作就能神奇般地自动计算出复杂函数的梯度。 PyTorch的autograd简介 Tensor 是PyTorch实现多维数组计算和自动微分的关键数据结构。一方面,它类似于numpy的ndarray,用户可以对 Tensor 进行各种数学运算;另一方面,当设置 .requires_grad = True 之后,在其上进行的各种操作就会被记录下来,用于后续的梯度计算,其内部实现机制被成为 动态计算图(dynamic computation graph) 。 Variable 变量:在PyTorch早期版本中, Tensor 只负责多维数组的运算,自动微分的职责是 Variable 完成的,因此经常可以看到因而产生的包装代码。而在0.4.0版本之后,二者的功能进行了合并,使得自动微分的使用更加简单了。 autograd机制能够记录作用于 Tensor 上的所有操作,生成一个动态计算图。图的叶子节点是输入的数据,根节点是输出的结果。当在根节点调用 .backward()