优化算法,亦称优化求解法,是一种启发式求解算法,涵盖遗传算法、蚁群算法、禁忌搜索算法、模拟退火算法、粒子群算法等。通常,针对特定问题量身定制相关算法,理论要求较低,技术要求较高。通常,我们将智能算法与最优化算法进行对比,相比之下,智能算法计算速度更快,应用性更强。
传统优化算法与现代优化算法包括哪些?它们之间有何区别?
1. 传统优化算法通常针对结构化问题,具有明确的问题和条件描述,如线性规划、二次规划、整数规划、混合规划、带约束和不带约束条件等,即具有清晰的结构信息;而智能优化算法通常针对较为普适的问题描述,普遍缺乏结构信息。
2. 传统优化算法大多数属于凸优化范畴,具有唯一明确的全局最优点;而智能优化算法针对的绝大多数是多极值问题,如何防止陷入局部最优并尽可能找到全局最优是采用智能优化算法的根本原因:对于单极值问题,传统算法大部分时候已足够好,而智能算法没有任何优势;对于多极值问题,智能优化算法通过其有效设计可以在跳出局部最优和收敛到一个点之间取得较好的平衡,从而实现找到全局最优点,但有时局部最优也是可接受的,因此传统算法也有很大的应用空间和针对特殊结构的改进可能性。
3. 传统优化算法通常是确定性算法,具有固定的结构和参数,计算复杂度和收敛性可以进行理论分析;而智能优化算法大多属于启发性算法,可以进行定性分析但难以定量证明,且大多数算法基于随机特性,其收敛性通常是概率意义上的,实际性能不可控,往往收敛速度较慢,计算复杂度较高。
最新的优化算法有哪些?
这个范围太广了,列出一份文献综述都难以穷尽。
多目标优化算法中的多目标是什么意思?
多目标优化的本质在于,大多数情况下,某一目标的改善可能引起其他目标性能的降低,同时使多个目标均达到最优是不可能的,只能在各目标之间进行协调权衡和折中处理,使所有目标函数尽可能达到最优,而且问题的最优解由数量众多,甚至无穷大的Pareto最优解组成。
编程中的优化算法问题
1. 算法优化的过程是学习思维的过程。学习数学实质上就是学习思维。也就是说,数学教育的目的不仅仅是要让学生掌握数学知识(包括计算技能),更重要的是要让学生学会数学地思维。算法多样化具有很大的教学价值,学生在探究算法多样化的过程中,培养了思维的灵活性,发展了学生的创造性。在认识算法多样化的教学价值的同时,我们也认识到不同算法的思维价值是不相等的。要充分体现算法多样化的教育价值,教师就应该积极引导学生优化算法,把优化算法的过程看作是又一次发展学生思维、培养学生能力的机会,把优化算法变成学生又一次主动建构的学习活动。让学生在优化算法的过程中,通过对各种算法的比较和分析,进行评价,不仅评价其正确性——这样做对吗?而且评价其合理性——这样做有道理吗?还要评价其科学性——这样做是最好的吗?这样的优化过程,对学生思维品质的提高无疑是十分有用的,学生在讨论、交流和反思的择优过程中逐步学会“多中择优,优中择简”的数学思想方法。教师在引导学生算法优化的过程中,帮助学生梳理思维过程,总结学习方法,养成思维习惯,形成学习能力,长此以往学生的思维品质一定能得到很大的提高。
2. 在算法优化的过程中培养学生算法优化的意识和习惯。意识是行动的向导,有些学生因为思维的惰性而表现出算法单一的状态。明明自己的算法很繁琐,但是却不愿动脑做深入思考,仅仅满足于能算出结果就行。要提高学生的思维水平,我们就应该有意识地激发学生思维和生活的联系,帮助他们去除学生思维的惰性,鼓励他们从多个角度去思考问题,然后择优解决;鼓励他们不能仅仅只关注于自己的算法,还要认真倾听他人的思考、汲取他人的长处;引导他们去感受各种不同方法的之间联系和合理性,引导他们去感受到数学学科本身所特有的简洁性。在算法优化的过程中就是要让学生感受计算方法提炼的过程,体会其中的数学思想方法,更在于让学生思维碰撞,并形成切合学生个人实际的计算方法,从中培养学生的数学意识,使学生能自觉地运用数学思想方法来分析事物,解决问题。这样的过程不仅是对知识技能的一种掌握和巩固,而且可以使学生的思维更开阔、更深刻。
3. 算法优化是学生个体学习、体验感悟、加深理解的过程。算法多样化是每一个学生经过自己独立的思考和探索,各自提出的方法,从而在群体中出现了许多种算法。因此,算法多样化是群体学习能力的表现,是学生集体的一题多解,而不是学生个体的多种算法。而算法的优化是让学生在群体比较的过程中优化,通过交流各自得算法,学生可以互相借鉴,互相吸收,互相补充,在个体感悟的前提下实施优化。因为优化是学生对知识结构的再构建过程,是发自学生内心的行为和自主的活动。但是,在实施算法最优化教学时应给学生留下一定的探索空间,以及一个逐渐感悟的过程。让学生在探索中感悟,在比较中感悟,在选择中感悟。这样,才利于发展学生独立思考能力和创造能力。
4. 优化算法也是学生后继学习的需要。小学数学是整个数学体系的基础,是一个有着严密逻辑关系的子系统。算法教学是小学数学教学的一部分,它不是一个孤立的教学点。从某一教学内容来说,也许没有哪一种算法是最好的、最优的,但从算法教学的整个系统来看,必然有一种方法是最好的、最优的,是学生后继学习所必需掌握的。在算法多样化的过程中,当学生提出各种算法后,教师要及时引导学生进行比较和分析,在比较和分析的过程中感受不同策略的特点,领悟不同方法的算理,分析不同方法的优劣,做出合理的评价,从而选择具有普遍意义的、简捷的、并有利于后继学习的最优方法。
5. 优化也是数学学科发展的动力。数学是一门基础学科,是一门工具学科,它的应用十分广泛。数学之所以有如此广泛的应用......>>
-
算法改进的过程是思维训练的过程。学习数学实际上就是思维训练。也就是说,数学教育的目标不仅仅是让学生掌握数学知识(包括计算技巧),更重要的是让学生学会用数学的思维去思考。算法的多样性具有很高的教学价值,学生在探索算法多样性的过程中,培养了思维的灵活性,激发了学生的创新意识。在认识到算法多样性的教学价值的同时,我们也认识到不同算法的思维价值是不同的。为了充分体现算法多样性的教育价值,教师应该积极引导学生改进算法,将改进算法的过程视为发展学生思维、培养学生能力的机会,将改进算法转化为学生主动建构学习的过程。让学生在改进算法的过程中,通过对各种算法的比较和分析,进行评价,不仅评价其正确性——这样做是否正确?而且评价其合理性——这样做是否有道理?还要评价其科学性——这样做是否最佳?这样的改进过程,无疑对提高学生的思维品质十分有益,学生在讨论、交流和反思的择优过程中逐步学会“从多中选优,从优中选简”的数学思想方法。教师在引导学生改进算法的过程中,帮助学生梳理思维过程,总结学习方法,培养思维习惯,形成学习能力,长期下来,学生的思维品质一定能得到很大提升。
-
在算法改进的过程中,培养学生的算法改进意识和习惯。意识是行动的指南,有些学生由于思维的惰性而表现出算法单一的状态。尽管自己的算法很繁琐,却不愿深入思考,只满足于能算出结果。要提高学生的思维水平,我们就应该有意识地激发学生思维与生活的联系,帮助他们克服思维的惰性,鼓励他们从多个角度思考问题,然后择优解决;鼓励他们不仅要关注自己的算法,还要认真倾听他人的思考、吸取他人的优点;引导他们去感受各种不同方法之间的联系和合理性,引导他们去感受数学学科本身所特有的简洁性。在算法改进的过程中,就是要让学生感受计算方法提炼的过程,体会其中的数学思想方法,更在于让学生思维碰撞,并形成符合学生个人实际的计算方法,从中培养学生的数学意识,使学生能自觉地运用数学思想方法来分析事物,解决问题。这样的过程不仅是对知识技能的一种掌握和巩固,而且可以使学生的思维更加开阔、更加深刻。
-
算法改进是学生个体学习、体验感悟、加深理解的过程。算法的多样性是每个学生经过自己独立的思考和探索,各自提出的方法,从而在群体中出现了许多种算法。因此,算法的多样性是群体学习能力的体现,是学生集体的一题多解,而不是学生个体的多种算法。而算法的改进是让学生在群体比较的过程中改进,通过交流各自的算法,学生可以互相借鉴、互相吸收、互相补充,在个体感悟的前提下实施改进。因为改进是学生对知识结构的再构建过程,是发自学生内心的行为和自主的活动。但是,在实施算法最优化教学时,应给学生留下一定的探索空间,以及一个逐渐感悟的过程。让学生在探索中感悟,在比较中感悟,在选择中感悟。这样,才有利于发展学生独立思考能力和创造能力。
-
改进算法也是学生后续学习的需要。小学数学是整个数学体系的基础,是一个有着严密逻辑关系的子系统。算法教学是小学数学教学的一部分,它不是一个孤立的教学点。从某一教学内容来说,也许没有哪一种算法是最好的、最优的,但从算法教学的整个系统来看,必然有一种方法是最好的、最优的,是学生后续学习所必需掌握的。在算法多样性的过程中,当学生提出各种算法后,教师要及时引导学生进行比较和分析,在比较和分析的过程中感受不同策略的特点,领悟不同方法的算理,分析不同方法的优劣,做出合理的评价,从而选择具有普遍意义、简捷并有利于后续学习的最优方法。
-
改进也是数学学科发展的动力。数学是一门基础学科,是一门工具学科,它的应用十分广泛。数学之所以有如此广泛的应用...
智能优化主要用于寻找最佳解决方案,通过多次循环计算以找到稳定的收敛最佳或近似最佳解决方案,例如解决复杂单模态或多模态函数的最大值或最小值问题。
优化算法
在SGD算法中,一个关键参数是学习速率。先前,我们介绍的SGD采用固定的学习速率。在实际应用中,随着时间推移逐渐降低学习速率是必要的,因此我们将第 k 步迭代的学习速率记作? k。
这是因为SGD中梯度估计引入的噪声源(m个训练样本的随机抽样)并不会在极小值点消失。相对而言,当我们使用批量梯度下降到达极小值点时,整个代价函数的真实梯度会变得很小,之后变为 0,因此批量梯度下降可以使用固定的学习速率。保证SGD收敛的一个充分条件是
如果? 0太大,学习曲线将会剧烈波动,代价函数值通常会明显增加。轻微的波动是良好的,容易在训练随机代价函数(例如使用Dropout的代价函数)时出现。如果学习速率太小,那么学习过程会很缓慢。如果初始学习速率太低,那么学习可能会卡在一个相当高的代价值。通常,就总训练时间和最终代价值而言,最佳初始学习速率会高于大约迭代 100 次后达到最佳效果的学习速率。因此,通常最好是检测最早的几轮迭代,选择一个比在效果上表现最佳的学习速率更大的学习速率,但又不能太大导致严重的波动。
尽管随机梯度下降仍然是非常受欢迎的优化方法,但其学习过程有时会很慢。动量方法(Polyak, 1964)旨在加速学习,特别是处理高曲率、小但一致的梯度,或是带噪声的梯度。动量算法积累了之前梯度指数级衰减的移动平均,并继续沿该方向移动。动量的效果如图8.5所示
受Nesterov加速梯度算法(Nesterov, 1983, 2004)启发,提出了动量算法的一个变种。在这种情况下,更新规则如下:
其中参数α和?发挥了与标准动量方法中类似的作用。Nesterov动量与标准动量之间的区别体现在梯度计算上。Nesterov动量中,梯度计算在施加当前速度之后。因此,Nesterov动量可以解释为在标准动量方法中添加了一个校正因子。完整的Nesterov动量算法如算法3.2所示
初始点能够决定算法是否收敛,有些初始点十分不稳定,使得该算法会遭遇数值困难,并完全失败。当学习收敛时,初始点可以决定学习收敛得多快,以及是否收敛到一个代价高或低的点。此外,几乎代价的点可以具有截然不同的泛化误差,初始点也可以影响泛化。
也许唯一完全确定的特性是初始参数需要在不同单元间“破坏对称性”。如果具有相同激活函数的两个隐藏单元连接到相同的输入,那么这些单元必须具有不同的初始参数。如果它们具有相同的初始参数,那么应用确定性损失和模型的确定性学习算法将一直以相同的方式更新这两个单元。即使模型或训练算法能够使用随机性为不同的单元计算不同的更新(例如使用Dropout的训练),通常来说,最好还是初始化每个单元使其和其他单元计算不同的函数。这或许有助于确保没有输入模式
丢失在前向传播的零空间中,没有梯度模式丢失在反向传播的零空间中。每个单元计算不同函数的目标促使了参数的随机初始化。我们可以明确地搜索一大组彼此互不相同的基函数,但这经常会导致明显的计算代价。例如,如果我们有和输出一样多的输入,我们可以使用Gram-Schmidt正交化于初始的权重矩阵,保证每个单元计算彼此非常不同的函数。在高维空间上使用高熵分布来随机初始化,计算代价小并且不太可能分配单元计算彼此相同的函数。
通常情况下,我们可以为每个单元的偏置设置启发式挑选的常数,仅随机初始化权重。额外的参数(例如用于编码预测条件方差的参数)通常和偏置一样设置为启发式选择的常数。
我们几乎总是初始化模型的权重为高斯或均匀分布中随机抽取的值。高斯或均匀分布的选择似乎不会有很大的差别,但也没有被详尽地研究。然而,初始分布的大小确实对优化过程的结果和网络泛化能力都有很大的影响。
更大的初始权重具有更强的破坏对称性的作用,有助于避免冗余的单元。它们也有助于避免在每层线性成分的前向或反向传播中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。如果初始权重太大,那么会在前向传播或反向传播中产生爆炸的值。在循环网络中,很大的权重也可能导致混沌(chaos)(对于输入中很小的扰动非常敏感,导致确定性前向传播过程表现随机)。在一定程度上,梯度爆炸问题可以通过梯度截断来缓解(执行梯度下降步骤之前设置梯度的阈值)。较大的权重也会产生使得激活函数饱和的值,导致饱和单元的梯度完全丢失。这些竞争因素决定了权重的理想初始大小。
也有助于避免在每层线性成分的前向或反向传播中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。如果初始权重太大,那么会在前向传播或反向传播中产生爆炸的值。在循环网络中,很大的权重也可能导致混沌(chaos)(对于输入中很小的扰动非常敏感,导致确定性前向传播过程表现随机)。在一定程度上,梯度爆炸问题可以通过梯度截断来缓解(执行梯度下降步骤之前设置梯度的阈值)。较大的权重也会产生使得激活函数饱和的值,导致饱和单元的梯度完全丢失。这些竞争因素决定了权重的理想初始大小。
有些启发式方法可用于选择权重的初始大小。一种初始化 m个输入和 n输出的全连接层的权重的启发式方法是从分布 U(?1/√ m,
有些启发式策略可用于确定权重的初始规模。一种用于初始化 m 个输入和 n 个输出的全连接层权重的启发式策略是从分布 U(?1/√ m, 1/√ m) 中抽取权重,而 Glorot 和 Bengio 建议采用标准初始化方法。
后一种启发式策略初始化所有层,在使激活方差和梯度方差保持一致之间寻求平衡。这假设网络是不含非线性的链式矩阵乘法,据此推导得出。现实中的神经网络显然会违反这个假设,但许多设计用于线性模型的策略在其非线性对应中效果也相当不错。
数值范围准则的一个不足之处是,将所有初始权重设置为相同的标准差,例如 1/√ m,会使得层很大时每个单一权重变得非常小。Martens (2010) 提出了一种称为稀疏初始化(sparse initialization)的替代方案,每个单元初始化为恰好有 k 个非零权重。这个想法保持该单元输入的总数量独立于输入数目 m,而不使单一权重元素的大小随 m 缩小。稀疏初始化有助于在初始化时实现单元之间更多的多样性。然而,获得较大取值的权重也同时被赋予了较强的先验。由于梯度下降需要很长时间缩小“不正确”的大值,这个初始化方案可能会导致某些单元出现问题,例如 maxout 单元有几个过滤器,它们之间必须仔细调整。
Delta-bar-delta 算法 (Jacobs, 1988) 是一个早期的在训练过程中适应模型参数各自学习率的启发式方法。该方法基于一个简单的想法,如果损失对于某个给定模型参数的偏导数保持相同的符号,那么学习率应该增加。如果对于该参数的偏导数变化了符号,那么学习率应减小。当然,这种方法只能应用于全批量优化中。
AdaGrad 算法,如算法 8.4 所示,独立地调整所有模型参数的学习率,将每个参数的缩放与所有梯度历史平方值总和的平方根成反比 (Duchi et al., 2011)。具有最大损失偏导数的参数相应地具有较快的下降学习率,而具有较小偏导数的参数在学习率上有较小的下降。这种效果使得在参数空间中更为平缓的倾斜方向能够取得更大的进步。
在凸优化背景下,AdaGrad 算法具有一些令人满意的理论性质。然而,在经验上已经发现,对于训练深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习率过早和过量的减小。AdaGrad 在某些深度学习模型上效果不错,但并非所有。
RMSProp 算法 (Hinton, 2012) 对 AdaGrad 进行了修改,以在非凸设定下效果更好,将梯度积累改为指数加权的移动平均。AdaGrad 旨在应用于凸问题以实现快速收敛。当应用于非凸函数训练神经网络时,学习轨迹可能穿过许多不同的结构,最终到达一个局部是凸碗的区域。AdaGrad 根据平方梯度的整个历史来收缩学习率,可能使得学习率在达到这样的凸结构前就变得太小了。RMSProp 使用指数衰减平均来丢弃遥远过去的历史,使其能够在找到凸碗状结构后快速收敛,它就像一个初始化于该碗状结构的 AdaGrad 算法实例。
RMSProp 的标准形式如算法 8.5 所示,结合 Nesterov 动量的形式如算法 8.6 所示。相比于 AdaGrad,使用移动平均引入了一个新的超参数ρ,用于控制移动平均的长度范围。经验上,RMSProp 已被证明是一种有效且实用的深度神经网络优化算法。目前,它是深度学习从业者经常采用的优化方法之一。
Adam (Kingma and Ba, 2014) 是另一种学习率自适应的优化算法,最好将其视为结合 RMSProp 和具有一些重要区别的动量的变种。首先,在 Adam 中,动量直接并入了梯度一阶矩(指数加权)的估计。将动量应用于缩放后的梯度是结合缩放的动量使用最直观的方法。结合缩放的动量使用没有明确的理论动机。其次,Adam 包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩的估计(算法 8.7)。RMSProp 也采用了(非中心的)二阶矩估计,但缺少修正因子。因此,与 Adam 不同,RMSProp 二阶矩估计可能在训练初期有很高的偏置。Adam 通常被认为对超参数的选择相当鲁棒,尽管有时需要从建议的默认值进行修改。
目前,最流行且广泛使用的优化算法包括 SGD、带动量的 SGD、RMSProp、带动量的 RMSProp、AdaDelta 和 Adam。