线搜索weak wolfe条件与Armijo条件

Backtracking/Armijo line search:

迭代: x k + 1 = x k − τ ▽ f ( x k ) 适用性强,收敛速率慢 τ 的选取: 固定步长: τ = c 步长逐渐减小: τ = c / k 精确线搜索: τ = a r g m i n f ( x k + α d ) 非精确线搜索( A r m i j o 条件,较容易满足): τ ∈ { α ∣ f ( x k ) − f ( x k + α d ) ≥ − c . α d T ▽ f ( x k ) } 迭代:x^k+1=x^k-\tau\triangledown f(x^k) \hspace{2cm} 适用性强,收敛速率慢 \\ \tau 的选取: \hspace{50cm}\\ 固定步长:\tau=c \\ 步长逐渐减小:\tau=c/k \\ 精确线搜索:\tau=argminf(x^k+\alpha d) \\ 非精确线搜索(Armijo条件,较容易满足):\tau\in \{\alpha|f(x^k)-f(x^k+\alpha d) \ge -c . \alpha d^T\triangledown f(x^k)\} 迭代:xk+1=xkτf(xk)适用性强,收敛速率慢τ的选取:固定步长:τ=c步长逐渐减小:τ=c/k精确线搜索:τ=argminf(xk+αd)非精确线搜索(Armijo条件,较容易满足):τ{αf(xk)f(xk+αd)c.αdTf(xk)}

Armijo条件

步骤:
1 、选择搜索方向: d = − ▽ f ( x k ) 2 、 w h i l e ( τ ∈ { α ∣ f ( x k ) − f ( x k + α d ) ≥ − c . α d T ▽ f ( x k ) } , τ = τ / 2. 3 、更新迭代: x k + 1 = x k + τ d 4 、结束条件:当梯度值过小 / 次梯度值包括 0 ,终止循环。 1、选择搜索方向:d=- \triangledown f(x^k)\\ 2、while(\tau\in \{\alpha|f(x^k)-f(x^k+\alpha d) \ge -c . \alpha d^T\triangledown f(x^k)\},\tau=\tau/2.\\ 3、更新迭代:x^{k+1}=x^k+\tau d \\ 4、结束条件:当梯度值过小/次梯度值包括0,终止循环。 1、选择搜索方向:d=f(xk)2whileτ{αf(xk)f(xk+αd)c.αdTf(xk)},τ=τ/2.3、更新迭代:xk+1=xk+τd4、结束条件:当梯度值过小/次梯度值包括0,终止循环。

weak wolfe条件:

一个合适的Line search方法,满足正定的要求,即:
▽ g T ▽ x > 0 \triangledown g^T \triangledown x >0 gTx>0
因此需要Wolfe 条件,其中c1保证方向是下降的,c2是保证曲率不会太小(核心在于确保斜率不断增大,抑制振荡):
0 < c 1 < c 2 < 1. 经验值 c 1 = 1 0 − 4 , c 2 = 0.9. f ( x k ) − f ( x k + α d ) ≥ − c 1 . α d T ▽ f ( x k ) 充分下降条件 d T ▽ f ( x k + α d ) ≥ c 2 . d T ▽ f ( x k ) 曲率条件 \\0< c_1<c_2<1.经验值c_1=10^-4,c_2=0.9. \\f(x^k)-f(x^k+\alpha d)\ge-c_1.\alpha d^T\triangledown f(x^k) \qquad 充分下降条件 \\d^T\triangledown f(x^k+\alpha d)\ge c_2.d^T\triangledown f(x^k) \qquad 曲率条件 0<c1<c2<1.经验值c1=104,c2=0.9.f(xk)f(xk+αd)c1.αdTf(xk)充分下降条件dTf(xk+αd)c2.dTf(xk)曲率条件
weak wolfe condition

strong wolfe条件:

与weak wolfe条件的区别就在与曲率设置了绝对值的要求,可以抑制震荡。
0 < c 1 < c 2 < 1. 经验值 c 1 = 1 0 − 4 , c 2 = 0.9. f ( x k ) − f ( x k + α d ) ≥ − c 1 . α d T ▽ f ( x k ) 充分下降条件 d T ▽ f ( x k + α d ) ≥ ∣ c 2 . d T ▽ f ( x k ) ∣ 曲率条件 \\0< c_1<c_2<1.经验值c_1=10^-4,c_2=0.9. \\f(x^k)-f(x^k+\alpha d)\ge-c_1.\alpha d^T\triangledown f(x^k) \qquad 充分下降条件 \\d^T\triangledown f(x^k+\alpha d)\ge \lvert c_2.d^T\triangledown f(x^k) \rvert \qquad 曲率条件 0<c1<c2<1.经验值c1=104,c2=0.9.f(xk)f(xk+αd)c1.αdTf(xk)充分下降条件dTf(xk+αd)c2.dTf(xk)∣曲率条件

A-G条件

见:https://zhuanlan.zhihu.com/p/118443321

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我明白了,你要求将一个弱引用分配给一个变量。在 C++ 中,可以通过使用 `std::weak_ptr` 来实现弱引用。`std::weak_ptr` 是一种智能指针,可以用于跟踪 `std::shared_ptr` 的生命周期。这样,当 `std::shared_ptr` 所管理的对象被销毁时,`std::weak_ptr` 会自动失效。下面是一个简单的示例代码: ```cpp #include <iostream> #include <memory> int main() { std::shared_ptr<int> sharedPtr = std::make_shared<int>(42); std::weak_ptr<int> weakPtr = sharedPtr; // 使用 weakPtr 获取对象的值 if (auto lockedPtr = weakPtr.lock()) { std::cout << "Weak pointer value: " << *lockedPtr << std::endl; } else { std::cout << "Weak pointer expired" << std::endl; } // 销毁 sharedPtr sharedPtr.reset(); // 再次尝试使用 weakPtr 获取对象的值 if (auto lockedPtr = weakPtr.lock()) { std::cout << "Weak pointer value: " << *lockedPtr << std::endl; } else { std::cout << "Weak pointer expired" << std::endl; } return 0; } ``` 在这个示例中,`sharedPtr` 是一个 `std::shared_ptr`,并且我们使用它创建了一个 `std::weak_ptr`,即 `weakPtr`。我们可以通过调用 `lock()` 方法来检查 `weakPtr` 是否有效,如果有效,就可以使用它来获取所管理的对象的值。当 `sharedPtr` 被 `reset()` 销毁后,再次使用 `weakPtr` 时,`lock()` 方法将返回一个空指针,表示弱引用已经失效。 希望这个示例能对你有所帮助!如果你有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值