运筹学状态转移方程例子_强化学习第4期:H-J-B方程

1b16957740a45ceddc5c1ea82dabea8d.png

在上一篇文章中,我们介绍了一种最简单的MDP——s与a都是有限的MDP的求解方法。其中,我们用到了动态规划的思想,并且推出了“策略迭代”、“值迭代”这样的方法。今天,我们要来讲更加一般的最优控制问题——t、a与s都是连续的问题。我们仍然假定我们已经清清楚楚知道环境与目标。我们将介绍求解的方法,并引出Hamilton-Jacobi-Bellman方程(简称H-J-B方程)。其中,H-J-B方程是一个t连续定义下的方程,它的离散t的版本被称作Bellman方程。这在强化学习中是极其重要的。

最优控制问题

在最优控制中,我们一般用x来代表状态,用u来代表“控制”,即可以人为输入的东西,和MDP中的动作a是同一个概念。另外,在最优控制中,我们一般不是尝试“极大化奖励”,而是尝试“极小化损失”,也就是说,我们的目标往往是用一个求极小化的形式表现出来(只要加上一个负号就可以实现二者的转化)。除此之外,最优控制与MDP最大的不同在于其t是连续的。在进行了概念的对应之后,最优控制的逻辑和MDP都是一样的。

按理说,s与a是连续的时候,也可以将动作、状态的转移建立为一个概率方程。例如给出在

采取
之后,下一个状态
的连续概率分布。但是在最优控制中,t是一个连续的变量,状态转移一般采用微分方程
的形式来表示。为简单起见,我们本章中只讨论没有随机性的情况。

一般的最优控制问题有如下几部分组成(用x记状态、用u记控制/动作)。首先是给定初始与终止的时间

(有些情况下终止时间不是给定的)、初始的状态
,然后,给出状态的转移关系:

如果问题是time-invariant的,则可以去掉t变量,即变成

。函数a记录了状态x与u之间的转移关系,常常被称为“动力系统”(Dynamic),和MDP中的“环境”相对应,不过没有随机性。这也就是说,对于确定的初始状态
,只要控制的路径
是确定的,则整个过程中的
都是确定的。

问题的目标是极小化损失函数:

同理,对于time-invariant的问题,f中的t变量可以省略。作为目标的损失函数分成两个部分,一个是在路径上累积损失,用f记录,另一个是最终状态对应的损失,用H记录。路径上的累积损失意思是在时间微元

之间,损失为
记录。最终状态对应的损失则描述最终状态的好坏。我们相信,最终状态是重要的,所以不能只用一个微元来描述,而是要单独用H来衡量。

很多问题可以转化为最优控制问题。例如对于一个在平地上开汽车的问题,限定一定时间内(截止为

)从出发点到终点。状态可以是当前位置、当前速度,以及当前加速度的三维向量。而控制可以是油门与刹车的二维向量。问题的Dynamic为位置、速度、加速度瞬时之间的转移关系,可以用一个微分方程表示出来。而损失则考虑的是耗油量与耗费的时间——在路上的每一个瞬间,汽车的耗油量都与当前速度与加速度有关,总的耗油量由积分得出;另外,我们希望越早到达越好,越晚则损失越大。这个量是值得重视的,所以不能将其作为一个最终时刻
附近微元
内的损失,而应该将其特别拿出来专门讨论。综合以上,我们可以得到一个基本的最优控制问题:

7db44839510df96c26fa46689ac5dc66.png

有了最优控制问题之后,我们当然可以开始对其进行求解。这里的t、a与s都是连续的,而对于状态转移方程函数

以及表示损失的函数f与H,我们可能对其进行简单的建模,例如认为位移、速度与加速度之间就是线性的关系。但是,我们也可以考虑更复杂的现实因素,例如汽车受到的阻力与速度有关、在各个速度档位油门性能不一样等等,继而将问题建模为很复杂、高度非线性的、time-varing的模型。对于这样的问题,我们恐怕根本无法求出其解析解,只能将x与u离散化,以求其数值解。

作为最优控制的例子,我们可以先考虑一种最简单的、可以求出解析解的最优控制问题。那么,怎么才算是“最简单”呢?
首先,我们希望Dynamic
是线性的,并且问题是time-invariant的。即Dynamic是
。某种意义上,如果让Dynamic“稍微复杂一些”,比如是一个二次函数,问题就很可能求不出解析解。因为这会对应于一个ode理论中经典的里卡蒂方程(Ricatti Equation),有很大概率没有解的解析式。所以,我们只能将Dynamic设定为线性的。

然后考虑损失函数

。由于这是我们要极小化的目标,如果它是线性的,就会存在没有最小值的情况,所以说“不能太简单了”。我们只能设定其为“次简单”的正定二次函数的形式,并当然希望它也是time-invariant的。即
,其中
是正定矩阵。一种更加简单,也很常见的情况是忽略状态与控制的交错项
。此外,我们一般将最终状态的损失函数设定为x的正定二次函数。

这种Dynamic是线性(Linear),而损失函数是二次函数(Quadratic)的情况是最简单的一类最优控制问题,我们将其称作LQR(Linear-Quadratic Regulator)。一个time-invariant的,并且没有状态与控制的交错项的LQR,就是我们所找寻的“最简单的”问题:

623f3d9cb299cb55d02fd5f906f562f4.png


上述的LQR是最优控制中最简单,同时也是最经典的一类问题,常常被作为最优控制教材的“入门问题”出现。对于这类问题,我们可以不对x与u进行离散化,而直接精确地求出其最优解的表达式。

针对不同的最优控制问题,或简单,或复杂,我们同样利用动态规划的思想,可以有几种不同的解法。其中最主要的问题是,我们是否要对连续的t进行离散化。如果对t进行离散化之后,对于简单的LQR问题,我们有比较简单的方法求出解析解(不用对x与u离散化)。而对于非线性的系统,我们则只能对x与u进一步离散化,求近似的数值解;如果我们选择不对t进行离散化,则可以将问题转化为一个偏微分方程,也就是我们今天的主题Bellman方程。(有许多非线性pde求不出解析解,同样只能求数值解,但这又是另一个问题了)。这几种情况中,核心的思想都是动态规划。

234cb6fe685a852985a2a3263e7ec264.png

下面,我们就来一一介绍这些方法。

离散化t求数值解

面对t连续的问题,尤其是非线性的、复杂的问题,我们无法求出精确的解析解。所以,将t离散化不失为一种明智之举。

将t离散化之后,关于t的连续函数

变成了状态序列
与决策序列
。一般的最优控制问题化为了如下形式:

bc4004f2bf8aedcb8aa9e40c2d8c07c8.png

我们首先来讲LQR问题的求解方法。这个过程中要利用到我们上一章动态规划的思想,以及对于“价值”的定义。我们不妨设t是从0到100的:
首先,我们已知在最终状态下,状态

的价值是

然后,我们考虑t=99的时候,已知状态
处采取控制
,则
故而会得到最终状态的损失为
。在t=99的瞬间,我们还得到了瞬间的损失
。这就意味着,如果我们在
采取
,接下来我们一共会获得
的损失——这是一个关于
的正定二次函数。在
固定的情况下,我们求
应该取值多少才能使其最小。易知这可以求得
关于
的一个线性表达式,我们将其记为。其中
是一个矩阵。将这个表达式代入
,则可以将
化为一个关于
的正定二次函数,我们将其记为
。总的来说,我们在这一步中得到了两个东西,一个是在
应该采取何种控制,表达式为
。另一个是
处的“价值”,或者说从
出发,其后面最小能够获得的惩罚是多少。其表达式为

接着,我们考虑t=98的时候,

处采取
,则会让
。所以,
处采取
会导致
的立即损失,以及
的后续损失。我们同样可以仿照上面的方法,求出最佳控制
关于
的表达式
,以及t=98时候,
的“价值”
。与t=99时候一样,最佳控制关于状态是一个线性表达式,而“价值”关于状态则是一个正定二次函数。

接下来,我们可以不断地重复这个过程。由于LQR的定义——Dynamic是线性,而惩罚函数是二次的这个性质,最佳控制

都是一个线性表达式
,而
的价值也都是定二次函数
。要注意的是,迭代的每个步骤中,我们只有
以及“价值”关于
的表达式,而没有
的具体值,所以我们也不知道$u_i$的具体值。我们必须将所有中间的表达式,
保留下来,才能重复向前迭代。

我们一直重复这个迭代过程,直到初始状态

。而由于
是给定的,所以我们可以计算出
。然后同理可以依次计算出
,继而将整个路径与决策序列计算出来。由于每一步中,我们所求的都是让后续损失最小的控制,所以我们求出的决策路径正是最佳的。

8201fd7e102f6f65ce76dac2cc1bbd52.png

对于非线性的问题,我们也想要仿照上述的方法。但是,如果将过程中每一步的最佳控制与价值表达为状态的解析表达式,可能会得到极其复杂的表达式。例如,如果将LQR中的Dynamic从线性的形式改为二次的形式,则我们会发现迭代了几步之后就无法再迭代下去了。对于这样的情况,我们无法求解析解,只能考虑通过离散化x与u来求数值解。

例如,我们将x、u离散化为10段得到一个状态有共10种,控制有

共10种的问题(这里,我们
表示第8种状态,而不表示t=8时候的状态)。这样,我们就可以将其化作上一节我们所说的s、a有限的MDP求解。要注意的是,这种情况事实上比上一节讨论的问题要简单。在上一节中,我们的模型是——如果在s采取a,就会“以一定的概率”进入下一个状态。而在本节中,我们所讨论的模型都是有确定性的。但是,对于高度非线性的复杂系统,离散化之后得到的模型同样会十分复杂。例如Dynamic可能在x与u离散化之后变为一堆“在t=48时,
采取
会进入
”,或者是“在t=36时,
采取
会进入
”形式的规则,而惩罚函数也会同样变得十分复杂。下面,我们说明求数值解的解法:

首先,考虑所有最终状态对应的价值:

。这些价值代表的是,当t=100的时候,从
出发,还能获得多少的奖励。事实上,t=100时候,问题已经终止了,所以就只能获得一个“最终状态损失”。

然后,计算t=99的时候从所有状态出发时能够获得的价值。我们应该遍历能够采取的控制u,来计算每个状态的价值。例如对于状态$x_1$,采取$u_1$控制会让其进入$x_8$的状态,那么它就能在t=99到t=100的瞬间内获得$f(x_1,u_1,t)$的“累积损失”,并且获得$H(x_8)$的“最终状态损失”。我们对状态$x_1$计算每一个$u_i$带来的“累积损失”与“最终损失”之和,挑出其中最小的(注意最优控制问题的目的是要让损失最小)。我们可以得到一个这样的结论:在t=99的时候,对于状态$x_1$,采取$u_3$是最好的,它可以让后面发生的损失低至48.4。此时,我们就将48.4记作$x_1$的“价值”。

接着,计算t=98时候所有状态x的价值,以及其对应的最佳控制u。这个过程要用到上一个步骤的数据,例如t=98时,在$x_1$采取$u_1$,除了会立即获得一个“累积损失”之外,还会在t=99的时候就会进入$x_6$。而t=99的时候$x_6$到底好不好,我们就要参考上一个步骤计算出的各个$x_i$在t=99时候的价值。这个步骤结束后,我们可以得到形如这样的结论:t=98时,对于状态$x_1$,采取$u_2$是最好的。它可以让后面发生的损失低至84.8。然后,我们就将84.8记作$x_1$的“价值”。
接下来,不断向前迭代上述步骤。要注意的是,迭代的每个步骤中必须将所有的中间结果保留下来。例如在t=84的时候$x_1$的价值很大,也就是说t=84时候进入$x_1$后面会面临很大的损失,所以不是一个好的选择。但是你不能因此就将这条数据丢掉,因为说不定你的前半程可以只用很小的损失来到这个状态。我们不断向前迭代算法直到t=1的时刻。当我们算出t=1的时刻,各个状态x对应的最优控制u与价值的时候,我们就可以考虑在t=0的初始状态

中,该采取什么控制u,才能在t=1时候进入价值最小(最优控制中价值是越小越好)的x。然后,可以根据迭代过程中每一个步骤记录的数据,将一路上各个时间点处于什么x、应该采取什么u都给反推出来,以找到最优的控制序列,兑现最小的价值。整个过程如下图所示:

93c0f16703bd503c013979333810a78c.png

对于原本的问题,由于有100个回合,每个回合都有10种控制,所以有

种情况。但是我们的迭代方法中,由于利用了“价值”来保存并传递中间结果,每一步只需要计算10种x与10种u对应的情况,共计算100次。即使重复100步,一共也只需要10000次的计算量,将指数复杂度变成了线性复杂度。

细心的读者可能发现了,我们上面讲到的两种迭代本质上是一样的,都是要向前求出“最佳控制”与“价值”关于当前状态的表达式。在LQR中,由于表达式是线性的,或者是二次的,所以我们可以真真切切地把解析表达式求出来。而在复杂的非线性问题中,由于我们求不出解析式,所以我们只能用离散化的方法,用一张表格的形式记录状态与“最佳控制”以及“价值之间”的对应关系。可以想象,如果将表格记录的内容可视化,我们会看到一个高度非线性、无法求出表达式的函数图像。

9c89b218278f911653b0792f81757474.png

上面所说的方法和我们上一章讲的“井字过三关”的思路其实是一样的,都是对状态建立“价值”,然后向前迭代求解。并且,因为我们的模型是确定性的,所以每次计算价值的时候不用计算期望,所以计算过程事实上还要简单很多(在“井字过三关”中,我们由于利用了画图求解的直觉,以及对称性,所以省略了很多步骤。如果将其严谨写出来会很繁琐)。

对于LQR问题来说,我们采用解析式迭代的方法可以求出比较精确的解。但是对于非线性的问题来说,离散化的时候我们会面临计算复杂度与精度的权衡取舍。因为在离散化的时候,我们可以人为地选择将x分成10个不同的状态,也可以分成100个不同的段。如果我们选择将x与u均分为更多的段,这意味着结果的精度更高,但同时也意味着计算的时间复杂度会更多;如果将x与u只分成较少的段,计算的时间复杂度会降低,但是计算的精度却会下降。并且由于算法是迭代的,这种误差传递到后面可能会变得很大。如何权衡取舍这两者得到综合最佳?这并不是一个简单的问题,需要视具体情况而定。

H-J-B方程

在上面一节中,我们首先对t进行了离散化,然后再针对问题简单与复杂的情况,分别介绍了求解析解以及离散化求数值的方法,它们都是通过迭代而实现的。那么,我们现在的问题是,能不能不要对t进行离散化,而是把t作为连续变量来直接求解析解呢?答案是肯定,并且,这正是我们本节主题——H-J-B方程的内容。

事实上,推出H-J-B方程可以说和我们上一节思路是完全一样的,只不过是将时间的差分

变得无限小,使之变成了微分。

定义一个价值函数
。这里的“价值”
代表的也是从指定时间t、指定状态x出发,后续最小惩罚的表达式。这和我们上面所定义的“价值”——LQR问题中迭代到
时候的
,非线性情况中迭代到
时候生成的x与V之间的表格——在逻辑上是一样的,只是t变成了连续变量而已。

在最佳$u(t)$作用下,我们能够获得的总价值为

,即从初始时
开始算起的价值;另外,我们还有恒等式
。这条恒等式和我们上节迭代算法中第一步用到的初始条件——LQR问题中
,以及非线性问题中最初
时候的表格——在逻辑上是一样的。

根据

的定义,有公式:

进行泰勒展开,得:

将上面两个式子相减,再除以$dt$,并且让$dt$趋于0,得到以下方程:

这个过程可以类比于上一节中我们从后向前迭代推出V表达式的过程。本质上,V是一个关于x与t的二元函数。上一节中,我们迭代中将V拆分成了

时分别关于x的表达式。t相同时候,x不同对V的影响体现出了
。而按照时间顺序迭代的过程体现的是
。所以说,这条微分方程事实上和上一节中,我们向前迭代的算法是相对应的。

将环境
代入,则得到最终的方程:

这个方程就是大名鼎鼎的H-J-B方程。我们将

称作是一个“哈密顿量”(Hamiltonian),记作H。由于动力系统
与惩罚
的表达式已知,而
中不含
,所以我们可以哈密顿量关于
的梯度,继而求出能够最小化哈密顿量的
,得到它关于
的表达式。这个步骤和上一节迭代算法中求出
,或者求出u与x的对应表格那个步骤相对应。

关于
的表达式代入方程之后,待求解的
是一个二元函数,并且方程中同时出现了它对于两个变元x与t的偏导数。此外,我们还有边界条件
,所以这是一个非常典型的偏微分方程。

这里贴一个公开课上H-J-B方程的截图。要注意其使用的符号可能与我们有所出入:

a39975247c6912ff13af1adb9648afd7.png

下面,我们来看一个求解H-J-B方程的简单的例子:

环境方程为


惩罚函数为

首先,我们有哈密顿量

它关于u的导数为:

解出H关于u的一个驻点为

然后,我们发现

,故而驻点
确实是H的全局极小点。

这也就意味着,

我们将

简记为
,把
简记为
,列出以下的H-J-B方程:

方程:

边界条件:

这就是一个典型的关于二元函数

的pde。由于这个问题本身也是一个LQR问题,所以我们可以猜测其解具有
的形式(解pde时,我们常常会利用这种连蒙带猜的方法)。将其带回方程中进行化简,可以得到:

这便是我们所求的最优控制问题的解析解。

细心的读者可能想到,我们举的这个例子其实也是一个“最简单”的LQR问题。如果这不是一个LQR问题,而是一个更加复杂的非线性问题,我们还能这样求解吗?实话实说,我们只能保证可以按照H-J-B方程的定义将pde列出来,但是却不能保证求出解析解,因为有许多pde是没有办法求解析解。对于这样的pde,唯一的方法仍是求数值解。而一旦我们考虑求数值解,那又要离散化t。这也意味着,求H-J-B方程数值解的过程,事实上和上一节讲的离散化t求迭代算法是完全等价的。所以说,离散与连续之间可以相互转化——离散问题的极限情况有助于我们理解连续的方程是怎么推导出来的,而连续方程有时候又要借助离散化来求近似的数值解。

总的来说,只有在问题比较简单,例如LQR问题的情况下,我们可以离散化t以求迭代的解析式,也可以不离散化t,直接求解H-J-B方程的解析解;而在问题比较复杂的问题中,我们只能求数值解。哪怕是列出了H-J-B方程,还是只能求方程的数值解。

这两期的总结

最优控制中有两大类算法,一类是动态规划与H-J-B方程,另一类是变分法与庞特里亚金原理。在上一章与本章中,我们着重讲了动态规划与H-J-B方程。它有一个基本的思想,即把全局最优的解的每一个部分单独挑出来也是最优解。根据这个原理,就可以将一个整体的问题给拆分成局部的小问题,依次求解,大大地节省计算量(从指数复杂度降低到线性复杂度)。用来连接“大问题”与“小问题”的量就是“价值”V。我们讲到的所有算法都围绕着“价值”的计算和极大化而展开。

在这两章中,我们讲的问题给人一种感觉——只有比较简单的几类的最优控制问题可以解决。第一类是s与a(或者x与u)都是离散的,它们之间具有确定性的转移关系的。我们可以用本文中第二节的迭代方法解决;第二类是s与a都是离散的,它们之间具有随机转移关系的。这类方法和第一类差别并不大,只要加一个期望就行了。由于我们讨论的是完全已知模型的情形,所以期望公式可以直接得到;第三类是s与a是连续的,但是其中的转移关系是比较简单的,比如LQR。其他的问题,例如s与a是连续的,并且转移关系很复杂的情况,是没有办法求解的,只能通过离散化使之成为第一类来求近似的数值解。

在强化学习中,有两种解决问题的思路,一种是基于价值的方法,另一种是基于policy的方法。其中,基于价值的方法正是从最优控制问题中动态规划方法发展而来,它同样也是通过拟合“价值”来求解最佳策略。不过,强化学习还将动态规划的思路结合了深度学习的方法。在最优控制中,我们认为只有s与a之间关系是简单的线性关系时才能求解析式,而当它们关系是复杂的非线性关系时,就只能先离散化s与a,再用一个表格的形式去记录s与a的对应关系。但是,当我们有了神经网络这个工具后,我们就可以尝试去拟合任意复杂的非线性函数,无论是s与a之间或是s与V之间的关系。这也使得我们不必拘泥于上面三种简单的情况,而可以考虑更加复杂的情况。

另一方面,强化学习也有十分困难的地方。例如在这两章中,我们都假定完全已知模型。这才导致s与a之间的转移关系具有随机性的时候不会显著增加问题的难度——因为我们已知转移概率,可以直接列出期望的表达式。但是,当我们未知模型的时候,如何能够准确地近似出V?如何减小估算的偏差与方差?如何避免局部收敛?这就涉及到探索-利用(explore-exploit),同策略-异策略(on-policy)之间的取舍,大大地增加了问题的复杂度。这些我们接下来都会慢慢讲到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python之celery的简介与使用

celery的简介 celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它的执行单元为任务(task),利用多线程,如Eventlet,gevent等,它们能被并发地执行…

不使用比较运算符如何比较两个数的大小

分享一波:程序员赚外快-必看的巅峰干货 前言 今天在水群的过程中看到有位群员谈论到这个话题,是他找工作过程中某家公司的面试题(到底是哪家公司才会出这种没营养的题目刁难别人),有点兴趣,就开始写了。 开搞 想了一…

java占位符填充_Java使用freemark生成word

1、制作模板先用office word做一个模板word文档,${usrName}、${nowDate}占位符 可以使用 office 或者 wps 先创建一个模板表格 (替换$部分可以在 模板格式改变之后 在替换xml 格式改了后有些原本的字符会分开)2、用office word将模板word另存…

Java中如何使用非阻塞异步编程——CompletableFuture

分享一波:程序员赚外快-必看的巅峰干货 对于Node开发者来说,非阻塞异步编程是他们引以为傲的地方。而在JDK8中,也引入了非阻塞异步编程的概念。所谓非阻塞异步编程,就是一种不需要等待返回结果的多线程的回调方法的封装。使用非阻塞异步编程…

城市运行一网统管_【宣传活动】持续开展城市运行“一网统管”建设宣传活动...

为进一步推进本镇城市运行“一网统管”建设工作,提高城市治理能力和治理水平,提升社会各界的知晓度和参与度,激发职能部门人员、党员、群众参与“一网统管”工作的热情。9月10日,镇网格中心于福泉居委会议室开展“推进城市运行‘一…

Java如何只使用位运算实现加减乘除

分享一波:程序员赚外快-必看的巅峰干货 前言 接前面一篇博客,这又是某个公司的奇葩面试题(都说了到底是哪家公司才会出这种没营养的面试题)。不过吐槽归吐槽,这个题目还是有点学问的,比前面那个 不使用比较运算符如何…

Netweaver里某个software component和C4C的版本

有同事问如何通过代码的方式获得Netweaver里某个Software component的版本信息,以及Cloud for Customer(C4C)的版本信息。 Netweaver 点了Detail按钮后: 这些版本信息存在表CVERS里: C4C C4C的版本号在Help->About …

pmc订单表格_复工了,读一则“如何提升订单准交率和生产效率”的真实故事

故事发生在中国南方小镇上一个做办公家具的公司……家具公司创建于1995年,是一家集研发、生产、销售、服务为一体的现代办公家具、酒店家具制造企业。主要产品有实木班台系列、会议台系列、职员桌系列、屏风系列、沙发系列、办公座椅、酒店家具系列。在省外还有两个…

GET和POST请求到底有什么区别?

分享一波:程序员赚外快-必看的巅峰干货 看到这个标题,想必大部分人都已经想关掉这篇博客了。先别急,你真的知道这两个的区别吗? 做过WEB开发的朋友可能很熟悉,看到这个问题能立马脱口而出二者的区别。 GET在浏览器回退时是无害的…

有赞电商云应用框架设计

背景 有赞是 SaaS 公司,向商家提供了全方位的软件服务,支撑商家进行采购、店铺、商品、营销、订单、物流等等管理服务。 在这个软件服务里,能够满足大部分的商家,为商家保驾护航。 但是很多大商家往往会有自己的特殊需求&#xff…

vivado 如何创建工程模式_基于Vivado的FPGA高性能开发研修班2019年8月30日上海举行...

一、课程介绍:从7系列FPGA开始,Xilinx提出了Vivado Design Suite设计软件,提供全新构建的SoC 增强型、以 IP 和系统为中心的下一代开发环境,以解决系统级集成和实现的生产力瓶颈。同时,Xilinx专门针对Vivado推出了Ultr…

程序员的自我修养——远离“外包思维”

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 在我们做开发的日子里,不免会进行跳槽,跳来跳去公司无非就分成两大类——互联网公司、外包公司。当然我们本次讨论的并…

英特尔为 Kubernetes 推出分布式深度学习平台:Nauta

2019独角兽企业重金招聘Python工程师标准>>> 随着人工智能的发展,深度学习的价值不断增长,但实现它可能是一个复杂耗时的过程。英特尔(Intel)正寻求通过其在 Kubernetes 进行分布式深度学习的新开源平台来改变这一状况,该深度学习…

pytorch梯度下降函数_Pytorch中常用的四种优化器SGD、Momentum、RMSProp、Adam

来源:AINLPer微信公众号编辑: ShuYini校稿: ShuYini时间: 2019-8-16 引言很多人在使用pytorch的时候都会遇到优化器选择的问题,今天就给大家介绍对比一下pytorch中常用的四种优化器。SGD、Momentum、RMSProp、Adam。随机梯度下降法(SGD&#…

2019/02/11-分布式数据库概述

分布式数据库类型(1)同构同质型:各场地都是同一种类型的数据库,如都是关系型数据库,且都是同一型号的数据库管理系统(2)同构异质型:各场地是同一种类型的数据库,但是数据…

python计算无穷级数求和常用公式_傅里叶变换(二) 从傅里叶级数到傅里叶变换...

在上一部分当中,得到了利用三角函数表示周期函数的方法,但是对于非周期函数就...凉了。所以有什么办法吗?没办法(划掉)。这时候我们就需要拿出来我们的黑科技——傅里叶变换。一、傅里叶级数的推广当然这东西肯定不是凭…

中鸣投篮机器人怎么组装_1000余人参加洛阳市青少年机器人竞赛

机器人智能识别地面上的黑色线条,并沿着线条来到指定位置,放下“快递包裹”;无人机在空中飞舞,时而钻过圆环,时而来个空翻,犹如跳芭蕾般在空中划过一道优美曲线;橘红色乒乓球从筒道中送出&#…

Exchange队列优先级介绍和配置

一、场景 在日常办公环境中所有邮件都会存在重要与非重要的情况,并且不同的邮箱的使用人的级别也不一样,不一样的职位级别要求不一样的运维等级,以及发送邮件要求的速度也不一样。这就导致了邮件需要按照重要性进行分类,重要的邮件…

Mybatis源码阅读(一):Mybatis初始化1.3 —— 解析sql片段和sql节点

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

IBM研究院计画5年改变人类生活创新预测

IBM研究院近日发布未来5年将会改变人类生活方式的5项创新预测(IBM 5 in 5),包含透过数字分身(Digital Twin)农业将用更少的资源供给不断增长的人口、区块链能防范更多的食物浪费、用微生物基因组群保护人类受到有害细菌…