从porgo和optimtool的使用来解释
在多模态问题中,多数全局优化算法是通过设置跳跃局部最优点的比率来完成全局最优的搜索,这类算法需要利用到一阶梯度的局部信息,以至于演进方向的分叉导致了算法的执行复杂度按照搜索次数倍增。首先,超线性的优化算法是采用一阶梯度、二阶海瑟,非精确解等方式来完成连续介质信息的演进,所以机器学习训练问题中,常用初始分布作为优化求解的起点,深度学习框架具备连续正态分布、伯努利离散分布等,大多数现实数据是从独立随机观测量中采样得到,因此适用默认的分布。
在所有机器学习优化问题中,优化求解器是优先配置且只适应编码层的序列值域,求解器接收的必选参数是拟合函数、微分参量(类与对象设计中常先存储)、初始点(深度学习框架常默认标准正态分布)。porgo和optimtool的调用训练算法接收的第一个必选参数是拟合函数,不同的是optimtool采用先序符号微分的办法减小整体运行时的复杂度,porgo使用时间累积的随机性来更新当前解值(从上一次演进后的数值组合启发)。
相同点是需要规定数值范围,不同点是全局优化从数值范围内搜索,目标优化算法从单组值开始启发全局的搜索,例如从初始化的分布开始拟合更精确的系数,所以复杂的拟合函数更适用于多模态和自然语言处理问题,其系数的个数和组合影响程度更高。目标优化算法的执行目的更多,相比于全局优化是搜索全局最优点,目标优化算法是受学习率直接影响的,研究复杂函数是第一步收敛,后几步受控制因子和时序(步序)信息调节来完成局部的跳跃,所以多数机器学习优化问题常采用目标优化算法,源于初启动内存的稳定和可控,密集过程的超线性收敛及全局收敛性。
数学中常用的梯度( d k d_k dk),人工智能中用 g r a d \mathrm{grad} grad;初始点用LaTex标记为 x 0 x_0 x0,人工智能常用 p a r a m s \mathrm{params} params;学习率在目标步序研究中记为 a l p h a \mathrm{alpha} alpha,人工智能中常用lr、learning_rate。所有的计算步都是一样,例如有zip打包数据更新,和循环步更新偏差( a l p h a ∗ d k \mathrm{alpha} * d_k alpha∗dk 或 l r ∗ g r a d \mathrm{lr * grad} lr∗grad)是类似的,但是资源要共享可引,不可引则深复制在更新函数中做步。
import porgo
import optimtool.unconstrain as ou
from optimtool.base import np, sp, plt
objective_function_lambda = lambda x: (-13 + x[0] + ((5 - x[1])*x[1] - 2)*x[1])**2 + (-29 + x[0] + ((x[1] + 1)*x[1] - 14)*x[1])**2 + (-13 + x[2] + ((5 - x[3])*x[3] - 2)*x[3])**2 + (-29 + x[2] + ((x[3] + 1)*x[3] - 14)*x[3])**2
x = sp.symbols("x1:5")
objective_function = (-13 + x[0] + ((5 - x[1])*x[1] - 2)*x[1])**2 + (-29 + x[0] + ((x[1] + 1)*x[1] - 14)*x[1])**2 + (-13 + x[2] + ((5 - x[3])*x[3] - 2)*x[3])**2 + (-29 + x[2] + ((x[3] + 1)*x[3] - 14)*x[3])**2
bounds = [(-10, 10)] * 4 # [[-10, 10]] * 4objective = porgo.glos(objective_function_lambda, bounds) # mutation=0.5, recombination=0.9
objective.rand_pop(100) # init population
for i in range(3): # if need to execute 3 timesobjective.train_gen(1000)objective.result() # must be executedprint('porgo search global result: {}(times), {}, {}'.format(i, objective.mini, objective.fit_mini)) # the best converged result
x_0 = (4.5, 3.5, 4.5, 3.5)
print('optimtool search nearest result: {}'.format(ou.newton_quasi.bfgs(objective_function, x, x_0)))