迭代计算

梯度下降法的优化算法

泄露秘密 提交于 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 −

CUDA ---- Branch Divergence and Unrolling Loop

你离开我真会死。 提交于 2020-01-11 21:06:48
Avoiding Branch Divergence 有时,控制流依赖于thread索引。同一个warp中,一个条件分支可能导致很差的性能。通过重新组织数据获取模式可以减少或避免warp divergence( 该问题的解释请查看warp解析篇 )。 The Parallel Reduction Problem 我们现在要计算一个数组N个元素的和。这个过程用CPU编程很容易实现: int sum = 0; for (int i = 0; i < N; i++) sum += array[i]; 那么如果Array的元素非常多呢?应用并行计算可以大大提升这个过程的效率。鉴于加法的交换律等性质,这个求和过程可以以元素的任意顺序来进行: 将输入数组切割成很多小的块。 用thread来计算每个块的和。 对这些块的结果再求和得最终结果。 数组的切割主旨是,用thread求数组中按一定规律配对的的两个元素和,然后将所有结果组合成一个新的数组,然后再次求配对两元素和,多次迭代,直到数组中只有一个结果。 比较直观的两种实现方式是: Neighbored pair:每次迭代都是相邻两个元素求和。 Interleaved pair:按一定跨度配对两个元素。 下图展示了两种方式的求解过程,对于有N个元素的数组,这个过程需要N-1次求和,log(N)步。Interleaved pair的跨度是半个数组长度

迭代器 Iterator

懵懂的女人 提交于 2020-01-10 13:38:33
迭代器 Iterator 凡是可作用于 for 循环的对象都是 Iterable 类型; 凡是可作用于 next() 函数的对象都是 Iterator 类型,它们表示一个惰性计算的序列; 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。 Python的 for 循环本质上就是通过不断调用 next() 函数实现的,例如下面两个完全等价: for x in [1, 2, 3, 4, 5]: pass # 首先获得Iterator对象: it = iter([1, 2, 3, 4, 5]) # 循环: while True: try: # 获得下一个值: x = next(it) except StopIteration: # 遇到StopIteration就退出循环 break 来源: CSDN 作者: zang1206 链接: https://blog.csdn.net/zang1206/article/details/103922651

启发式搜索和迭代深搜两道模板题

孤者浪人 提交于 2020-01-09 00:59:28
以前不会这两种搜索,而且在来长沙之前根本就不知道有这两个东西。 现在终于打过模板题了,知道是什么东西了,好开心。 其实启发式搜索和迭代深搜有一个共同特点就是基本上都需要估价函数,启发式搜索比迭代深搜要难理解一些。 迭代深搜就是限制了深度的搜索,因为深度限制了,所以很多东西处理起来更方便,除了搜索的深度控制住了,很多时候宽度也可以减小。 一般适用于深度无限制,或需要最小深度可行解的问题。而且空间开销小且利于剪枝。 启发式搜索就是一个让我感觉很神奇的东西了。 具体步骤是这样的: 首先,我们定义F = G + H 对于每个点,都有自己的G、H、F。其中G表示从特定的点到起点的距离,H表示从该点到目标的估值,那么F就是经过该点路径的估值。 1、把起点加入到openlist中 2、重复以下步骤   a、从openlist中找出F最小的节点,并把它当做当前的操作节点   b、检查当前点周围的点,如果已经在openlist中看是否能通过当前点得到更小的G,如果能就更新那个点的G,F的值,如果在closelist中或者是障碍物(不可达)则忽略他们   c、把当前点从openlist中移除 ,加入closelist中   d、当目标点加入closelist中时停止 3、保存路径,从目标点出发,按照父节点指针遍历,直到找到起点。 然后是两道模板题还有代码: 启发式搜索:八数码问题 代码: /

标准库中的生成器函数

随声附和 提交于 2020-01-07 19:17:40
这里主要记录流畅的Python书中P349页介绍关于内置itertoos模块中的内置生成器。(19个) 第一组是用于过滤的生成器函数:从输入的可迭代对象中产出元素的子集,而且不修改元素本身。 compress(it, selector_it) In [133]: compress? Init signature: compress(self, /, *args, **kwargs) Docstring: compress(data, selectors) --> iterator over selected data Return data elements corresponding to true selector elements. Forms a shorter iterator from selected data elements using the selectors to choose the data elements. Type: type Subclasses: 并行处理两个可迭代对象;如果selector_it中的元素是真值,产出it中对应的元素。 In [134]: com = compress('123456789',[1,0,1,False,'',True]) In [135]: com Out[135]: <itertools.compress at

优化器算法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而言,每次使用的损失函数只是通过这一个小批量的数据确定的,其函数图像与真实全集损失函数有所不同,所以其求解的梯度也含有一定的随机性

Java入门(三)——集合概讲

痴心易碎 提交于 2020-01-07 03:05:11
集合(或者叫容器)是Java的核心知识点,它有着很深的深度。我们这里不会设计多深,仅仅作为了解入门,深入了解请移步各种集合源码文章。好的,下面正是开始介绍... Java集合为何而生 我们知道,Java是一门面向对象编程语言,这也就意味着程序中存在着大量的对象。这个时候问题就来了,我们如何很好的存放和操作对象呢?如果你能明白这个问题,那么你就知道了“集合为何而生”这个问题的答案。 总结一句: Java给我们提供了工具(集合)方便我们去存放和操作多个Java对象 Java集合入门学习 Java集合的目的是方便操作多个对象,同时,它提供一系列的API来供我们操作。因此,在初学Java集合的时候我们更多的是 学习这些API的用法 。 对Java集合的API使用有一定了解之后,我们就应该从 面向对象 的角度去理解它。为什么会抽象出多个接口,以及每个接口有什么特征。 我们可以总结出几个常用的实现类,这几个常用的实现类我们必须知道它的数据结构是什么,什么时候使用这个类。 同时,你还需要学习和了解数据结构: 学完上面的内容后,我们基本掌握了常用集合的数据结构,也就知道了如何选择合适的集合容器去存储我们的对象。总之, 学完常见实现类的数据结构之后,对它们的使用场景也有了更加清晰的认识 。 Java集合类简介 Java集合是一个很庞大的知识点,话不多说,上图感受下: Java集合的

python迭代器详解

雨燕双飞 提交于 2020-01-05 07:09:06
迭代器 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 1. 可迭代对象 我们已经知道可以对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫 迭代 。 但是,是否所有的数据类型都可以放到for...in...的语句中,然后让for...in...每次从中取出一条数据供我们使用,即供我们迭代吗? >>> for i in 100:... print(i)...Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'int' object is not iterable>>># int整型不是iterable,即int整型不是可以迭代的​# 我们自定义一个容器MyList用来存放数据,可以通过add方法向其中添加数据>>> class MyList(object):... def __init__(self):... self.container = []... def add(self, item):... self.container.append(item)...>>>

Java入门(三)——集合概讲

不打扰是莪最后的温柔 提交于 2020-01-04 18:24:45
集合(或者叫容器)是Java的核心知识点,它有着很深的深度。我们这里不会设计多深,仅仅作为了解入门,深入了解请移步各种集合源码文章。好的,下面正是开始介绍... Java集合为何而生 我们知道,Java是一门面向对象编程语言,这也就意味着程序中存在着大量的对象。这个时候问题就来了,我们如何很好的存放和操作对象呢?如果你能明白这个问题,那么你就知道了“集合为何而生”这个问题的答案。 总结一句: Java给我们提供了工具(集合)方便我们去存放和操作多个Java对象 Java集合入门学习 Java集合的目的是方便操作多个对象,同时,它提供一系列的API来供我们操作。因此,在初学Java集合的时候我们更多的是 学习这些API的用法 。 对Java集合的API使用有一定了解之后,我们就应该从 面向对象 的角度去理解它。为什么会抽象出多个接口,以及每个接口有什么特征。 我们可以总结出几个常用的实现类,这几个常用的实现类我们必须知道它的数据结构是什么,什么时候使用这个类。 同时,你还需要学习和了解数据结构: 学完上面的内容后,我们基本掌握了常用集合的数据结构,也就知道了如何选择合适的集合容器去存储我们的对象。总之, 学完常见实现类的数据结构之后,对它们的使用场景也有了更加清晰的认识 。 Java集合类简介 Java集合是一个很庞大的知识点,话不多说,上图感受下: Java集合的

Java入门(三)——集合概讲

℡╲_俬逩灬. 提交于 2020-01-04 03:25:24
集合(或者叫容器)是Java的核心知识点,它有着很深的深度。我们这里不会设计多深,仅仅作为了解入门,深入了解请移步各种集合源码文章。好的,下面正是开始介绍... Java集合为何而生 我们知道,Java是一门面向对象编程语言,这也就意味着程序中存在着大量的对象。这个时候问题就来了,我们如何很好的存放和操作对象呢?如果你能明白这个问题,那么你就知道了“集合为何而生”这个问题的答案。 总结一句: Java给我们提供了工具(集合)方便我们去存放和操作多个Java对象 Java集合入门学习 Java集合的目的是方便操作多个对象,同时,它提供一系列的API来供我们操作。因此,在初学Java集合的时候我们更多的是 学习这些API的用法 。 对Java集合的API使用有一定了解之后,我们就应该从 面向对象 的角度去理解它。为什么会抽象出多个接口,以及每个接口有什么特征。 我们可以总结出几个常用的实现类,这几个常用的实现类我们必须知道它的数据结构是什么,什么时候使用这个类。 同时,你还需要学习和了解数据结构: 学完上面的内容后,我们基本掌握了常用集合的数据结构,也就知道了如何选择合适的集合容器去存储我们的对象。总之, 学完常见实现类的数据结构之后,对它们的使用场景也有了更加清晰的认识 。 Java集合类简介 Java集合是一个很庞大的知识点,话不多说,上图感受下: Java集合的