一 序
本文属于贪心NLP训练营学习笔记系列。视频151 变分推断先跳过。
二 为啥要关注优化
通常有关AI的问题可以分解为:模型+优化
模型就是如何选择模型:逻辑回归、深度学习等,然后进行模型的实例化,例如选择深度学习,有几层,每层的参数等。
实例化完毕之后,我们总是可以找到一个与实例化之后的模型相对应的objective function(目标函数),接下来就进入了优化的阶段。
优化有很多算法,见截图,有了objective function之后,就是要归类,再选择合适的优化算法解决。
公式下面的,认为是条件。
Optimization is the Core of Machine Learning
线性回归(Linear Regression):
逻辑回归(Logistic Regresssion):
SVM(Support Vector Machine):
协同过滤(Collaborative Filtering):矩阵分解
K均值(K-means):
portfolio optimization
老师以股票量化投资为例,介绍优化的重要性
三 关于objective function的分类
从下面几个维度来看:
1、是否smooth(smooth VS non-smooth):
lasso不平滑
2、是否convex:
是有全局最优解,否则局部最优解global optimal VS local optimal
local optimal (深度学习) -> 初始化变得十分重要 -> multiple/better initialization
3、是否连续(discrete VD continuous):
连续可用梯度下降法,离散需要其他方法:discrete optimization (Relaxation)
4、是否有约束:
constrained VS non-constrained
因为日常问题主要关注的是否convex。
四 Convex Optimization: global optimal VS local optimal
因为凸函数有全局最优解,所以正确的思路是把一个non-convex转变成convex。至于优化函数选择可以很多。
判断凸函数
凸集(convex set): 假设对于任意并且任意参数, 有, 则集合为凸集
定义域是凸集(前提条件),从图形上看:集合有两个点,这个两个点的连线上的任意一点也在集合内
- 例子:
- 所有的
- 所有正数集合
- 范数
- Affine set: 线性方程组的所有解
- Halfspace: 不等式的所有解:
- 两个凸集的交集也是凸集
凸函数定义
在定义域是凸集的前提条件下,函数满足
才是凸函数
式子的理解:左侧认为是下图的蓝线,右侧是f(x),f(y)两点之间的连线(绿色)蓝色要《=绿色的值
常见的凸函数例子:
- 线性函数为凸/凹函数
- , -logx, xlogx
- 范数
判别方法: First Order Convexity Condition
假设是可导的, 则f为凸函数, 当且仅当 ,对于任意
理解:就是下图的切线,一直再函数图f(y)的下面
Second Order Convexity Condition
上面的用的不太多,这个二阶导数相对多。
- 假设是两次可导的, 则f为凸函数, 当且仅当
线性函数: 推导是凸函数
假设 要证明的是符合凸函数定义的不等式。
则:
==》 (上面式子展开)
==》 (左右抵消掉相同项)
==》 式子成立
所以f(x)是凸函数
二次方函数:推导是凸函数
对于任意(说明了A是半正定矩阵)
(这里使用了一个矩阵的求导法则:)
因为A是半正定矩阵, 所以f(x)是凸函数
L1 / L2范数
Maximun Flow Problem
最大流问题就是在容量容许的条件下,从源点到汇点所能通过的最大流量。
网上的解法有很多,这里老师是从数学角度来描述这个问题
https://coordinate.wang/index.php/archives/2666/
根据题目,目标函数是,下面都是限制条件,本身管道的取值范围,以及管道的流向(输入=输出)。
接下来是类型判断:线性模型,是凸函数有最优解。确定模型之后,去寻找对应的模型库
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linprog.html
接下来就是要看标准化库所需要的参数的形式,把我们的条件朝着标准库做转换。
我看这个还是一脸懵逼。根据条件,我们都是等式,所以要找的就是第二项等式。以及下面的条件。
已知的条件 求
==>
x看做是个一列12行的矩阵。
再表达矩阵的时候,把上面约束条件等式变为 这种表达式
A,b都已经表达出来了,b是一列全是0
接下来就是每个变量的范围
from scipy.optimize import linprog
c = [-1,-1,-1,0,0,0,0,0,0,0,0,0]
A = [[1,0,0,-1,-1,0,0,0,0,0,0,0],
[0,1,0,0,0,-1,-1,-1,0,0,0,0],
[0,0,1,0,0,0,0,0,-1,0,0,0],
[0,0,0,1,0,1,0,0,0,-1,0,0],
[0,0,0,0,1,0,1,0,1,0,-1,0],
[0,0,0,0,0,0,0,1,0,0,0,-1]]
b = [0,0,0,0,0,0]
x0_bounds = (0, 3)
x1_bounds = (0, 2)
x2_bounds = (0, 2)
x3_bounds = (0, 5)
x4_bounds = (0, 1)
x5_bounds = (0, 1)
x6_bounds = (0, 3)
x7_bounds = (0, 1)
x8_bounds = (0, 1)
x9_bounds = (0, 4)
x10_bounds = (0, 2)
x11_bounds = (0, 4)
res = linprog(c, A_eq=A, b_eq=b, bounds=(x0_bounds, x1_bounds, x2_bounds, x3_bounds,
x4_bounds, x5_bounds, x6_bounds, x7_bounds,
x8_bounds, x9_bounds, x10_bounds, x11_bounds))
print(res)
最后求解结果:-6. 不知道怎么都变成这种格式了。
非凸函数的例子:Set Cover Problem
假设有个全集U(Universal Set), 以及m个子集合S1,S2,…,Sm, 目标是要寻找最少个数的集合, 使得集合union等U
例子: U = {1,2,3,4,5}, S:{S1={1,2,3}.S2={2,4},S3={1,3},S4={4},S5={3,4},S6={4,5}}, 最少的集合为{1,2,3},{4,5}, 集合个数为2
Approach 1:Exhaustive Search枚举法
- 列举所有可能的集合, 时间复杂度高, 但可以找到全局最优解(枚举法,最笨的方法。)
Approach 2:Greedy Search 贪心算法
每个时刻都找一个冗余集合并去掉,直到没有冗余集合为止。可以看到不能保证全局最优解
我们可以做限定,每次去掉个数最少的冗余集合。最大优势:时间高效
Approach 3:Optimization
用优化的方法来做。可以看到每一个集合都有两个状态,选择或不选择。
1设计什么样的变量?
用数学来表示就是: 当 不选择 ,当时,选择。
2. 目标函数:
约束条件:
意思是U里面任意一个元素,可以属于多个S,这些S至少要有一个被选中。老师举例是元素3,
接下来判断这个问题是不是凸函数。
1定义域不是convex set
对于任意,必须要在集合内,这个公式的集合是直线,由于x只能是0或者1,所以这个不满足。所以不是凸函数。
不是凸函数,所以难找到最优解,问题难解决,只能想办法吧条件放宽一点,如果把第三个条件变成线性条件,整个问题就变成线性问题。
就是下面截图的Relaxation.目标函数不变,只是把第三个条件取值范围从离散的0,1变成了连续的(由discrete转到continuous)。就符合线性条件,可以求解,
求解的结果x不会是0和1两个整数。我们可以自定义规则, 则认为是0.大于则认为是1.
如果你数学功底好想办法证明即可。也就是想办法找出放宽后的解和真实的解有多大差距
小结