人工智能:从搜索角度来谈谈优化

人工智能:从搜索角度来谈谈优化

我们先对优化问题进行描述,定义一个优化问题为:

m i n   f ( x ) s . t .     h ( x ) 0

其中 f ( x ) 是目标函数, h ( x ) 0 是约束条件,对x的取值范围进行限制。当然一个优化问题也可以没有约束条件,也可以有多个约束条件,甚至是多目标的优化。

我们知道搜索问题的解决策略提供了一个通用的框架来求解我们遇到的各种各样的问题,比如我们熟悉的八皇后问题,就是一个典型的搜索问题。那么优化问题是否可以建模为搜索问题呢?当然可以!

可能大家不太懂这个搜索模型到底是什么?所以这里我们先来回顾下搜索的定义。一个搜索问题由五个元素构成:

  • 状态(状态空间);
  • 初始状态;
  • 后继函数;
  • 目标测试;
  • 路径耗散;

我们以一个简单的例子来说明这些概念。以八皇后问题为例:在8 × 8 的国际象棋棋盘上,寻找放置8个相互不能攻击到的皇后。皇后的攻击路线是直线和45度斜线。
我们来形式化这个问题,假设开始时我们随机地将八个皇后放在棋盘上,然后每次可以移动一个皇后到相邻的格子中,直到得到一个满足八皇后互不攻击的状态。

  • 状态(状态空间):棋盘上这八个皇后的任意摆放都可以看作是一个状态,所有可能的状态构成状态空间;
  • 初始状态:随机地在棋盘上放置这八个皇后;
  • 后继函数:任意一个皇后移动到相邻的格子;
  • 目标测试:判断是否满足终态,即满足八皇后互不攻击;
  • 路径耗散:一次移动皇后到相邻格子,代价为1;

OK,回到我们前面所说的优化问题,考虑如何将优化问题形式化(建模)为搜索问题。很简单,我们只需要定义前面这五个元素就好了。我们有两种形式化的方法:

(1). 形式化方法1:
- 状态(状态空间):一个解当成一个状态,解集构成状态空间;
- 初始状态:任意指定;
- 后继函数:某优化算法等(依赖于具体问题);
- 目标测试:由目标函数的形式化约束(最小值/最大值),即我们想要的解,即是否到达终态;
- 路径耗散:计算目标函数一次,代价为1;

(2). 形式化方法2:
- 状态(状态空间):解由多个部分构成时,一个部分解或完整解是一个状态;
- 初始状态:任意指定;
- 后继函数:某优化算法等(依赖于具体问题);
- 目标测试:由目标函数的形式化约束(最小值/最大值),即我们想要的解,即是否到达终态(完整态);
- 路径耗散:计算目标函数一次,代价为1;

我们来总结下将优化问题建模为搜索问题的特点:

  • 优化搜索问题的解,不需要返回从初态开始的路径,返回终态即可(初态不唯一);这降低了对解的要求;
  • 后继函数在搜索问题中可以在问题建模时,考虑求解算法的便利和性能而特别设计;

为了便于理解,我们对于前面两种形式化的方法各给出一个例子。

(1). 形式化方法1示例:
一个数值优化问题:

m i n   f ( x ) = a x 2 + b x + c ,   a > 0

- 状态:用x来标识,任意一个解代表一个状态,可以实数编码或二进制编码x;
- 后继函数:若采用爬山法来求解问题,邻域就是后继函数;若用梯度下降法来求解问题,任意x的后继由其梯度信息和步长参数确定;
- 目标测试:x的取值使得目标函数f取最小值;即解为使得f最小的x;
- 初态:任意指定;
- 路径耗散:每评估/计算一个状态的目标状态值,路径耗散为1。

(2). 形式化方法2示例:
组合优化问题MaxSAT:
n个布尔变量X,m个定义在X上的布尔表达式,求X的一个赋值,使得能让m个布尔表达式尽可能多地被满足(为真)。
- 状态:任何一种0个或 k n 个布尔变量被赋值的情况为一个状态;
- 后继函数:如采用爬山法,定义两个解的n个布尔变量中只有一个布尔变量赋值不一样时,二者互为后继;
- 目标测试:满足让最多布尔表达式为真的赋值方法;
- 初态:任意指定;
- 路径耗散:每评估一次所有的布尔表达式,代价为1.

实际上我们比较关注这个后继函数,对应了我们的搜索策略。在讨论这里的搜索算法之前,我们先来看下一幅图:
这里写图片描述
估计大家都见过类似的图示,这里我们进行形式化的说明。此图称之为优化问题的地貌图(Landscape):

L = ( S , f , N )

其中:
- 状态空间:S;
- 目标函数:f;
- 邻居算子:N,搜索中的后继函数;

Landscape图是怎么画出来的呢?首先给定一个所有的状态构成的集合S,S中的元素之间是无序的;设计一个邻居算子/后继函数,在状态之间建立关系,形成状态图,如上图的横坐标系统,是一个“状态图”;在状态图形成的空间基础上,增加一维对每个状态赋予一个目标函数值f,这样就得到了Landscape。

Ok,回到我们前面所说的搜索算法。针对这里的问题,我们的搜索算法分为两大类:
这里写图片描述

对于局部搜索算法:后继状态是状态空间的子集状态图不是完全图,边权值为概率,表示状态间转移概率;对于全局搜索算法:后继状态为整个状态空间状态图为完全图,边权值为1。可以看出,对于局部搜索,实际上依赖于对局部空间进行按邻域搜索。接下来我们来一起看下一些经典的搜索算法。

  1. 梯度下降法
    梯度的概念:n元实值函数g(x)在n维空间中变化速度最快的方向:

    x g = ( g x 1 , g x 2 , . . . , g x n ) T

    即:站在山上,各个方向中,有个方向是最陡峭的方向。
    算法思想:
    想象一个人被随机扔在群山中,现在他想最快地下山到最低的山谷;群山很大,视线范围无法覆盖所有区域;假设下山有各个方向都可以选;如何最快下山?找最陡峭的方向(负梯度方向)!(梯度方向上山最快)。你下山时,步幅迈多大?如果你是巨人,一步最大可以跨越两座山头?合适恰当的步幅设置很重要(学习率)!梯度下降也称最速下降法。
    算法过程:
    第一步:初始化,设置相关参数/超参数,如迭代次数T,当算法执行T次时,算法终止;步长(学习率) λ λ = [ λ 1 , λ 2 , . . . , λ T ] ,该序列一般为递减序列或者值都相同;
    第二步:初始化,设置初态 X 0 ,可以设置为某个特殊值,也可以使用随机值;
    第三步:循环迭代:
    f o r   s = 1 , 2 , . . . , T X s + 1 = X s λ s x g ( X s ) e n d   f o r

    评价:
    不能确保获得全局最小解:该优化问题面临的是“群山”,梯度下降可能落入一个不是最低的山谷,获得一个极小值/局部最优解,无法确保获得全局最小解若将视线范围视为“领域”,局部最小值是指领域内最小,也即是视线范围内没有更低的山谷存在;算法停止条件和步长序列的设置需要人工经验。

  2. 梯度下降法的改进
    直线搜索:因为不知道如何设置步长,就用各种步长来尝试。不知道步长 的如何取值时,妥协的做法:

    λ = a r g λ m i n ( X λ v )

    其中v是梯度的方向 x g = ( g x 1 , g x 2 , . . . , g x n ) T 或其它方向。 λ 的取值范围一般设置为一个集合 { . . . , 2 c , c , c , 2 c , . . . }

  3. 牛顿法
    这里写图片描述
    寻找函数g(X)的根 X ,使得 g ( X ) = 0

    • 找g(X)在 X n 处的切线,以切线和X轴的交点为新点 X n + 1 ;
    • g ( X n ) = g ( X n 0 ) X n + 1 X n X n + 1 = X n g ( X n ) g ( X n )

猜你喜欢

转载自blog.csdn.net/cassiePython/article/details/80621853