机器学习或强化学习的很多算法直接或间接地使用了最优化(Optimization)算法(如回溯线搜索、信赖域等)。例如,强化学习中引入信赖域方法产生了TPRO(Trust Region Policy Optimization)算法、在训练机器学习模型的过程中,求最小化损失函数时应用了线搜索的方法。为了更好的理解这些知识,本文主要对梯度下降和线搜索进行总结。
在最优化问题中,找函数f(x)的一个局部最小值 x ∗ x^{*} x∗ 有两种基本迭代方法:线搜索和信赖域。本质上它们的作用都是在优化迭代过程中从当前点找寻下一点。它们的最大区别是先确定步长还是先确定方向。线搜索(Line search)方法先确定方向再确定步长,而信赖域(Trust region)方法则先把搜索范围缩小到一个小的范围,小到能够用另一个函数(Model function)去近似目标函数(Objective function),然后通过优化这个model function来得到参数更新的方向及步长。
本文从凸优化问题中的无约束最小化问题引出线搜索。在凸优化问题中,无约束最小化问题(unconstrained minimization problem),数学描述为
m i n i m i z e f ( x ) minimize \;f(x) minimizef(x)
其中函数f(x)是凸的,且二阶连续可微。
如果是只想了解线搜索、回溯线搜索,可以跳过下面的下降方法部分。
所有的无约束最小化算法都会生成一个最小化序列 x 1 , x 2 , . . . , x n x^{1},x^{2},...,x^{n} x1,x2,...,xn,其中,
x ( k + 1 ) = x ( k ) + t ( k ) Δ x ( k ) x^{(k+1)} = x^{(k)} +t^{(k)} \Delta x^{(k)} x(k+1)=x(k)+t(k)Δx(k)
且 t ( k ) > 0 t^{(k)} > 0 t(k)>0 (除了当 x ( k ) x^{(k)} x(k) 是最优时)。其中, Δ x ( k ) \Delta x^{(k)} Δx(k) 称为搜索方向或下降方向;k=0,1,2,…表示迭代次数。标量 t ( k ) > 0 t^{(k)} > 0 t(k)>0 称为第k次迭代的步长(step size),上式称为下降更新。
注: 上述所谓最小化序列 x 1 , x 2 , . . . , x n x^{1},x^{2},...,x^{n} x1,x2,...,xn 是指使f(x) 最小化的x的离散点。
所有的下降方法都有,
f ( x ( k + 1 ) ) < f ( x ( k ) ) f(x^{(k+1)}) < f(x^{(k)} ) f(x(k+1))<f(x(k))
除了当 x ( k ) x^{(k)} x(k) 是最优时(最优时 Δ x ( k ) = 0 , x ( k + 1 ) = x ( k ) \Delta x^{(k)} =0, x^{(k+1)} =x^{(k)} Δx(k)=0,x(k+1)=x(k))。
从凸函数性质可得,
∇ f ( x ( k ) ) Δ x ( k ) < 0 \nabla f(x^{(k)}) \Delta x^{(k)} < 0 ∇f(x(k))Δx(k)<0
上式表明两者方向相反 Δ x ( k ) = − ∇ f ( x ( k ) ) \Delta x^{(k)} = -\nabla f(x^{(k)}) Δx(k)=−∇f(x(k)) ,个人理解,如果梯度( ∇ f ( x ( k ) ) \nabla f(x^(k)) ∇f(x(k)))小于0,搜索方向沿增加x方向(即 Δ x ( k ) > 0 \Delta x^{(k)} >0 Δx(k)>0 ),反之亦然。如下图所示,
Δ x ( k ) \Delta x^(k) Δx(k) 的方向和 ∇ f ( x ( k ) ) \nabla f(x^{(k)}) ∇f(x(k)) 的方向相反如下图所示, Δ x ( k ) \Delta x^(k) Δx(k) 和 − ∇ f ( x ( k ) ) -\nabla f(x^(k)) −∇f(x(k)) (梯度反方向) 构成锐角。我们把这个方向称为下降方向(descent direction)
一般下降方法算法如下:
上述算法很简单,第一步,找到下降方向,根据 ∇ f ( x ( k ) Δ x ( k ) < 0 \nabla f(x^{(k)} \Delta x^{(k)} < 0 ∇f(x(k)Δx(k)<0 这个条件来确定方向(其中 Δ x ( k ) = − ∇ f ( x ( k ) ) \Delta x^{(k)}=-\nabla f(x^{(k)}) Δx(k)=−∇f(x(k))是可选的方向之一,这就是梯度下降的方向);第二步,用线搜索(line search)找一个步长;第三步更新最小化序列。
若在上述算法中的第一步,下降方向选择 Δ x ( k ) = − ∇ f ( x ( k ) ) \Delta x^{(k)}=-\nabla f(x^{(k)}) Δx(k)=−∇f(x(k)) ,即梯度方向,就成了梯度下降算法。可见梯度下降算法是一般下降算法的特殊情况,一般下降包括了梯度下降。 梯度下降方法算法如下:
上述两个算法采用线搜索或回溯线搜索(Backtracking line search)来选择搜索的步长。
线搜索方法先找一个下降方向(沿此下降方向时目标函数f(x)的值减小),然后计算步长来决定x沿着下降方向移动多远。其中,下降方向有各种各样的计算方法,如梯度下降、牛顿法、或拟牛顿法(Quasi-Newton Methods)。
线搜索分为精确线搜索(Exact line search)和不精确线搜索(inexact line search)。精确线搜索,顾名思义,每次迭代的目标都是找到使目标函数f(x)取得精确的最小值的点。不精确线搜索,就是不需要找到精确最小值,而是使目标函数满足了某个条件即可(如目标函数值下降了多少),其中常见的条件有Wolfe条件(Wolfe conditions)和Goldstein条件( Goldstein conditions)。线搜索有广泛的应用,如机器学习,博弈论及其他领域。
注:下面的内容主要来自Stephen Boyd&Lieven Vandenberghe的《Convex optimization》和Jorge Nocedal&Stephen J. Wright的《numerical optimization》。两本书在表示符号上存在差异:主要是步长和方向表示不一致,
x k + a k p k x_{k}+a_{k}p_{k} xk+akpk
x + t Δ x x +t \Delta x x+tΔx
上面两个式子都表示迭代更新, a k 或 t a_{k}或t ak或t 表示步长, p k 或 Δ x p_{k} 或\Delta x pk或Δx 表示方向。下文中会混合使用两种符号。
2.1 精确线搜索(Exact line search)
广义的说,线搜索法是一种迭代方法,用于使用多维非线性函数的梯度来找到该函数的局部最小值。一般地线搜索算法如下:
其中,第三步找到一个步长 a k > 0 a_{k} >0 ak>0, 使得 f ( x k + a k p k ) < f ( x k ) f(x_{k}+a_{k}p_{k})
在精确线搜索时,沿着射线{ x k + a k p k x_{k}+a_{k}p_{k} xk+akpk | a k > 0 a_{k} >0 ak>0 } 找步长 a k a_{k} ak 使f(x)最小化,即 f ( x k + a k p k ) < f ( x k ) f(x_{k}+a_{k}p_{k})
a k = a r g m i n a k > 0 f ( x k + a k p k ) (2.1) a_{k} = \underset {a_{k} >0} {argmin} f(x_{k}+a_{k}p_{k}) \tag{2.1} ak=ak>0argminf(xk+akpk)(2.1)
在梯度下降算法中,上式中的下降方向就是梯度的反方向(具体见第一部分),即 p k = − ∇ f ( x ) p_{k} = -\nabla f(x) pk=−∇f(x) ,为了与第一部分保持符号统一,上式中的步长 a k a_{k} ak ,用t替换,得到梯度下降算法中的精确线搜索在每次迭代中沿梯度方向的步长t,
t = a r g m i n t > 0 f ( x − t ∇ f ( x ) ) (2.2) t = \underset {t >0} {argmin} f(x-t \nabla f(x)) \tag{2.2} t=t>0argminf(x−t∇f(x))(2.2)
梯度下降算法中的精确线搜索如下图所示,
精确线搜索实际用得比较少
设 g ( t ) = f ( x − t ∇ f ( x ) ) g(t)=f(x-t \nabla f(x)) g(t)=f(x−t∇f(x)) (即当方向确定时,变成了关于步长t的函数),上式就是求g(t)的关于t的最小值。在梯度下降算法求f(x)的最小值过程中用到了精确线搜索来计算步长,而精确线搜索需要求g(t)的最小值。所以只有当单变量的最小化问题的计算成本比计算搜索方向的成本低时,才使用精确线搜索。因此,在实际应用中,用得比较多的是回溯线搜索。
2.2 回溯线搜索(Backtracking line search,BLS)
在介绍回溯线搜索之前,先介绍Wolfe conditions和 Goldstein conditions。
2.2.1 步长约束条件
在计算步长 a k a_{k} ak 时,我们面临一个权衡:我们既想选择一个 a k a_{k} ak 使得目标函数f大幅减小,但同时我们又不想花太多时间来选择 a k a_{k} ak 。通俗的说就是存在一个矛盾:既想通过选择更多的 a k a_{k} ak 来找到一个 a k a_{k} ak使得目标函数f大幅减小,但是选择的次数太多又会影响效率。一个理想的选择是全局最小化单变量函数 ϕ ( . ) \phi(.) ϕ(.) ,其定义如下:
ϕ ( a ) = f ( x k + a p k ) , a > 0 , (2.3) \phi(a) = f(x_{k}+a p_{k}), \quad a>0, \tag{2.3} ϕ(a)=f(xk+apk),a>0,(2.3)
但是,求式2.3的全局最小耗费的计算成本太高。更实际的做法是使用不精确线搜索来确定一个步长使得目标函数以最小的代价取得足够的减小。
我们可以对 a k a_{k} ak 加一个简单的条件,即要求f减小: f ( x k + a k p k ) < f ( x k ) f(x_{k}+a_{k} p_{k}) < f(x_{k}) f(xk+akpk)<f(xk)。但这个条件并不足够使函数收敛。因此,我们需要一个足够减小(sufficient decrease condition)的条件。
根据泰勒展开,
f ( x k + a k p k ) = f ( x k ) + a k p k T ∇ f ( x k + t a k p k ) (2.4) f(x_{k}+a_{k} p_{k}) = f(x_{k}) + a_{k} p_{k}^{T} \nabla f(x_{k} +t a_{k} p_{k}) \tag{2.4} f(xk+akpk)=f(xk)+akpkT∇f(xk+takpk)(2.4)
从 x k x_{k} xk 到下一个迭代 x k + 1 : = x k + a k p k x_{k+1}:=x_{k}+a_{k} p_{k} xk+1:=xk+akpk ,f减少得足够多。也就是式2.4中的 a k p k T ∇ f ( x k + t a k p k ) a_{k} p_{k}^{T} \nabla f(x_{k} +t a_{k} p_{k}) akpkT∇f(xk+takpk) 项是足够大的负数。观察易知, a k p k T ∇ f ( x k + t a k p k ) a_{k} p_{k}^{T} \nabla f(x_{k} +t a_{k} p_{k}) akpkT∇f(xk+takpk) 正比于 a k a_{k} ak 和 p k T ∇ f ( x k + t a k p k ) p_{k}^{T} \nabla f(x_{k} +t a_{k} p_{k}) pkT∇f(xk+takpk) 。同时,我们希望 p k T ∇ f ( x k + t a k p k ) p_{k}^{T} \nabla f(x_{k} +t a_{k} p_{k}) pkT∇f(xk+takpk) 与 p k T ∇ f ( x k ) p_{k}^{T} \nabla f(x_{k}) pkT∇f(xk) 相差不大,但我们又不能保证这点。因此,我们通过一个较小的参数 0 < c 1 < 1 0
p k T ∇ f ( x k + t a k p k ) ≤ c 1 p k T ∇ f ( x k ) (2.5) p_{k}^{T} \nabla f(x_{k} +t a_{k} p_{k}) \leq c_{1} p_{k}^{T} \nabla f(x_{k})\tag{2.5} pkT∇f(xk+takpk)≤c1pkT∇f(xk)(2.5)
也就是说,目标函数f减少的幅度至少是 p k T ∇ f ( x k ) p_{k}^{T} \nabla f(x_{k}) pkT∇f(xk) 的一部分,根据下降方向假设, p k T ∇ f ( x k ) p_{k}^{T} \nabla f(x_{k}) pkT∇f(xk) 是负的。
2.2.2 Armijo condition
结合式2.4和式2.5,步长 a k a_{k} ak 要使目标函数f足够减小,可通过下面不等式衡量:
f ( x k + a p k ) ≤ f ( x k ) + c 1 a ∇ f k T p k (2.6) f(x_{k}+a p_{k}) \leq f(x_{k}) +c_{1} a \nabla f_{k}^{T} p_{k} \tag{2.6} f(xk+apk)≤f(xk)+c1a∇fkTpk(2.6)
其中, c 1 ∈ ( 0 , 1 ) c_{1} \in (0,1) c1∈(0,1) 。换而言之,f的减少应该同时正比于步长 a a a 和方向导数 ∇ f k T p k \nabla f_{k}^{T} p_{k} ∇fkTpk 。式2.6称为Armijo condition。式2.6的左边就是 ϕ ( a ) = f ( x k + a p k ) \phi(a) = f(x_{k}+a p_{k}) ϕ(a)=f(xk+apk) ,右边记作 l ( a ) = f ( x k ) + c 1 a ∇ f k T p k l(a) =f(x_{k}) +c_{1} a \nabla f_{k}^{T} p_{k} l(a)=f(xk)+c1a∇fkTpk 。足够减小的条件如下图所示,
上图中, l ( a ) l(a) l(a) 的斜率是负数 c 1 ∇ f k T p k c_{1} \nabla f_{k}^{T} p_{k} c1∇fkTpk ,但是因为 c 1 ∈ ( 0 , 1 ) c_{1} \in (0,1) c1∈(0,1) ,所以 l ( a ) l(a) l(a) 是略微向下倾斜但比较平缓的直线,对于比较小的正数 a a a来说,虚线 l ( a ) l(a) l(a) 在实线 ϕ ( a ) \phi(a) ϕ(a)之上。显然高于虚线 l ( a ) l(a) l(a)的部分不存在极小值。根据 l ( a ) l(a) l(a) 和 ϕ ( a ) \phi(a) ϕ(a) 的大小,把 a a a 分为可接受部分和不可接受部分。足够减小条件表明:当且仅当 l ( a ) ≥ ϕ ( a ) l(a) \geq\phi(a) l(a)≥ϕ(a) 时,a是可接受的。在实际应用中, c 1 c_{1} c1 通常选得比较小, c 1 = 1 0 − 4 c_{1}= 10^{-4} c1=10−4 ,即 l ( a ) l(a) l(a) 比较平缓。
2.2.3 curvature condition
Armijo condition约束太简单了,以至于任意小的步长 a a a都可以满足该条件。如果只是约束了f下降了足够多,我每次都移动很小的步长,这不可能得到最优解。为了排除不可接受的比较短的步长,我们进一步引入曲率条件(curvature condition)。
f ( x k + a p k ) f(x_{k}+a p_{k}) f(xk+apk)与 f ( x k ) f(x_{k}) f(xk)之间的减少量:
f ( x k + a p k ) − f ( x k ) = a p k T ∇ f ( x k + t a p k ) (2.7) f(x_{k}+a p_{k})-f(x_{k}) =a p_{k}^{T} \nabla f(x_{k} +t a p_{k}) \tag{2.7} f(xk+apk)−f(xk)=apkT∇f(xk+tapk)(2.7)
如果步长 a a a 比较小,则 p k T ∇ f ( x k + a p k ) p_{k}^{T} \nabla f(x_{k} +a p_{k}) pkT∇f(xk+apk) 与 p k T ∇ f ( x k ) p_{k}^{T} \nabla f(x_{k}) pkT∇f(xk) 比较接近,同理, p k T ∇ f ( x k + t a p k ) p_{k}^{T} \nabla f(x_{k} +ta p_{k}) pkT∇f(xk+tapk) 也会接近 p k T ∇ f ( x k ) p_{k}^{T} \nabla f(x_{k}) pkT∇f(xk) 。这不是我们想要的,因此我们设置 c 1 < c 2 < 1 c_{1} < c_{2} <1 c1<c2<1 (通常 c 2 = 0.9 c_{2} =0.9 c2=0.9) ,满足:
p k T ∇ f ( x k + a p k ) ≥ c 2 p k T ∇ f ( x k ) (2.8) p_{k}^{T} \nabla f(x_{k} +a p_{k}) \geq c_{2} p_{k}^{T} \nabla f(x_{k}) \tag{2.8} pkT∇f(xk+apk)≥c2pkT∇f(xk)(2.8)
上式表示 p k T ∇ f ( x k + a p k ) p_{k}^{T} \nabla f(x_{k} +a p_{k}) pkT∇f(xk+apk) 与 p k T ∇ f ( x k ) p_{k}^{T} \nabla f(x_{k}) pkT∇f(xk) 之间存在一个固定部分的差异。满足上式约束的条件称为曲率条件。
对于 c 2 ∈ ( c 1 , 1 ) c_{2} \in (c_{1},1) c2∈(c1,1) ,其中 c 1 c_{1} c1 来自式2.6。式2.8左边是 ϕ ( a k ) \phi(a_{k}) ϕ(ak) 的导数,即切线斜率,所以曲率条件确保 ϕ \phi ϕ 在 a k a_{k} ak 处的斜率大于 c 2 c_{2} c2 乘以起始点斜率 ϕ ′ ( 0 ) \phi^{'}(0) ϕ′(0) 。这是说得通的,因为如果 ϕ ′ ( α ) \phi^{'}(\alpha) ϕ′(α) 的斜率是负的且较陡,表明沿着所选方向继续移动,f能够大幅减小,在这里停止就错失了快速收敛的机会。相反,如果 ϕ ′ ( α k ) \phi^{'}(\alpha_{k}) ϕ′(αk) 仅仅是微小的负斜率或者甚至是正斜率,即下降比较平缓或出现开始增大附近,出现极小值的概率增大,表明在这个方向f不可能有更多的减小,因此终止搜索是合理的。曲率条件如下图所示,
其中, c 2 c_{2} c2 一般取0.9(对于牛顿法和拟牛顿法)或0.1(对于非线性共轭梯度法)。从上图可以看出,desired slope比tangent要小一些,即没那么陡,这是因为desired slope= c 2 c_{2} c2 *tangent;而desired slope比Armijo condition中的 l ( a ) l(a) l(a) 要陡一些,因为 l ( a ) l(a) l(a) 的斜率等于 c 1 c_{1} c1 *tangent,而 c 2 c_{2} c2 *tangent > c 1 c_{1} c1 *tangent。
2.2.4 Wolfe conditions
把足够减小条件(Armijo condition)和曲率条件两个条件结合起来就是Wolfe conditions。把上面两个条件结合如下:
f ( x k + a p k ) ≤ f ( x k ) + c 1 a ∇ f k T p k (2.9a) f(x_{k}+a p_{k}) \leq f(x_{k}) +c_{1} a \nabla f_{k}^{T} p_{k} \tag{2.9a} f(xk+apk)≤f(xk)+c1a∇fkTpk(2.9a)
p k T ∇ f ( x k + a p k ) ≥ c 2 p k T ∇ f ( x k ) (2.9b) p_{k}^{T} \nabla f(x_{k} +a p_{k}) \geq c_{2} p_{k}^{T} \nabla f(x_{k}) \tag{2.9b} pkT∇f(xk+apk)≥c2pkT∇f(xk)(2.9b)
其中, 0 < c 1 < c 2 < 1 0
Wolfe conditions如下图所示:
从上图可以看出,Wolfe条件既保证了步长 a a a使函数f取得足够的减少,又确保步长不会太短。
不难证明,对于平滑且有下界的任何函数f,总存在步长满足Wolfe conditions,具体参考《numerical optimization》Lemma3.1的证明。Wolfe conditions可被用于大部分的线搜索方法中,特别是在实现拟牛顿法时。
2.2.5 Goldstein conditions
类似Wolfe 条件,Goldstein 条件既确保步长 a a a使函数f取得足够的减少但又不会太短。Goldstein条件同样使用一对不等式来表示,
f ( x k ) + ( 1 − c ) a k ∇ f k T p k ≤ f ( x k + a k p k ) ≤ f ( x k ) + c a k ∇ f k T p k (2.10) f(x_{k})+(1-c) a_{k} \nabla f_{k}^{T} p_{k}\leq f(x_{k}+a_{k} p_{k}) \leq f(x_{k}) +c a_{k} \nabla f_{k}^{T} p_{k} \tag{2.10} f(xk)+(1−c)ak∇fkTpk≤f(xk+akpk)≤f(xk)+cak∇fkTpk(2.10)
其中, 0 < c < 1 / 2 0
从上图中可以看出,同Wolfe 条件相比,Goldstein 条件的一个缺点是式3.10的第一个等式可能避开了所有的最小值。然而Goldstein conditions和Wolfe conditions有很多的共同之处,及两者的收敛理论也很相似。Goldstein通常用于牛顿型方法,而不太适合拟牛顿方法。
2.2.6 回溯线搜索
回溯线搜索属于不精确线搜索,迭代过程中目标函数满足Armijo-Goldstein条件即可,Armijo-Goldstein条件是用来找一个合适的步长,使得目标函数 f ( x k ) f(x_{k}) f(xk) 减少得足够多。Armijo-Goldstein条件如下:
f ( x + t Δ x ) > f ( x ) + α t ∇ f ( x ) T Δ x f(x +t \Delta x) >f(x) + \alpha t \nabla f(x)^{T} \Delta x f(x+tΔx)>f(x)+αt∇f(x)TΔx
其中,更新步长 t = β t t = \beta t t=βt ,参数 0 < α \alpha α <0.5, 0 < β \beta β <1 。步长t从t=1开始更新,然后通过 β \beta β 来减小t直到满足停止条件 f ( x + t Δ x ) ≤ f ( x ) + α t ∇ f ( x ) T Δ x f(x +t \Delta x) \leq f(x) + \alpha t \nabla f(x)^{T} \Delta x f(x+tΔx)≤f(x)+αt∇f(x)TΔx ,因此称为回溯。因为 Δ x \Delta x Δx 是下降方向,我们有 ∇ f ( x ) T Δ x < 0 \nabla f(x)^{T} \Delta x <0 ∇f(x)TΔx<0 ,因此,对于t足够小时,有,
f ( x + t Δ x ) ≈ f ( x ) + t ∇ f ( x ) T Δ x < f ( x ) + α t ∇ f ( x ) T Δ x f(x +t \Delta x) \approx f(x) + t\nabla f(x)^{T} \Delta x
上式表明回溯线搜索最终会停止搜索。回溯的条件如下图所示,
从图中可以看出,当t在区间(0, t 0 t_{0} t0 ]时,回溯退出,不等式 f ( x + t Δ x ) ≤ f ( x ) + α t ∇ f ( x ) T Δ x f(x +t \Delta x) \leq f(x) + \alpha t \nabla f(x)^{T} \Delta x f(x+tΔx)≤f(x)+αt∇f(x)TΔx 成立,即 t ≤ t 0 t \leq t_{0} t≤t0 时,停止回溯。回溯线搜索会终止,当步长t满足:
t = 1 , o r t ∈ ( β t 0 , t 0 ] t=1, \quad or \quad t \in (\beta t_{0}, t_{0}] t=1,ort∈(βt0,t0]
当步长t=1满足回溯条件时,如 1 ≤ t 0 1 \leq t_{0} 1≤t0 ,上述第一种情况会发生。特别地,我们可以通过回溯线搜索获得步长,当满足,
t ≥ m i n { 1 , β t 0 } t \geq min\{1, \beta t_{0} \} t≥min{1,βt0}
一般情况下,参数 α \alpha α 的取值范围在0.01到0.3之间,表示我们接受目标函数减少的预测范围在1%到30%之间。参数 β \beta β 取值范围在0.1到0.8之间。0.1对应非常粗略的搜索,0.8对应没那么粗略的搜索。
总之,回溯线搜索通过$t = \beta t $自适应地更新步长,从步长t=1开始, t = β t = \beta t=β , t = β 2 t = {\beta}^{2} t=β2 ,…从大到小不断地缩小搜索步长,直到 t ≤ t 0 t \leq t_{0} t≤t0 ,停止回溯。
本文到此就结束了,本人水平有限,难免有纰漏,欢迎指出。一个比较大的瑕疵就是:本文符号使用没有统一,增加了阅读苦难。
最后挖个坑,后面有时间整理信赖域(Trust Region)相关内容。
Reference:
1.Stephen Boyd&Lieven Vandenberghe《Convex optimization》
2.Jorge Nocedal&Stephen J. Wright《numerical optimization》
3.https://www.cs.cmu.edu/~ggordon/10725-F12/slides/05-gd-revisited.pdf
4.https://people.cs.umass.edu/~barna/2015-BigData/conv2.pdf
5.https://web.stanford.edu/class/ee364a/lectures/unconstrained.pdf
6.https://en.wikipedia.org/wiki/Line_search
7.https://en.wikipedia.org/wiki/Backtracking_line_search
2/slides/05-gd-revisited.pdf
4.https://people.cs.umass.edu/~barna/2015-BigData/conv2.pdf
5.https://web.stanford.edu/class/ee364a/lectures/unconstrained.pdf
6.https://en.wikipedia.org/wiki/Line_search
7.https://en.wikipedia.org/wiki/Backtracking_line_search
8.https://optimization.cbe.cornell.edu/index.php?title=Line_search_methods