《最优化理论基础》8课时层次化教案
《最优化理论基础》8课时层次化教案
课程总目标
- 掌握最优化核心理论(最优性条件、凸分析、对偶理论);
- 能独立实现经典优化算法(梯度法、牛顿法、约束优化建模);
- 理解优化理论与机器学习模型的关联(如逻辑回归、SVM)。
课程结构
前4课时:理论奠基
课时 | 主题 | 教学目标与关键内容 | 机器学习关联案例 |
---|---|---|---|
1 | 最优性条件 | - 目标:理解无约束优化的必要与充分条件 | 逻辑回归损失函数的最优解分析 |
- 关键内容:Fermat定理、一阶/二阶最优性条件、驻点与鞍点区别 | |||
- 作业:证明凸函数下局部最优即全局最优 | |||
2 | 凸集与凸函数 | - 目标:掌握凸性判定方法 | 凸性在SVM支持向量中的作用 |
- 关键内容:凸集定义、凸函数Jensen不等式、保凸运算(仿射变换、逐点极大) | |||
- 作业:证明线性函数与二次函数为凸函数 | |||
3 | 拉格朗日对偶理论 | - 目标:能构建优化问题的对偶形式 | 支持向量机(SVM)对偶问题推导 |
- 关键内容:Lagrange函数、强/弱对偶性、Slater条件 | |||
- 作业:对偶化一个简单约束优化问题 | |||
4 | KKT条件与约束优化 | - 目标:熟练应用KKT条件分析约束优化问题 | 神经网络训练中的约束优化建模 |
- 关键内容:互补松弛性、有效约束、几何解释 | |||
- 作业:推导线性规划问题的KKT条件 |
后4课时:算法实践
课时 | 主题 | 教学目标与关键内容 | 代码实践任务(Python示例) |
---|---|---|---|
5 | 梯度下降法实现 | - 目标:实现梯度下降法并分析步长影响 | 代码:逻辑回归参数优化 |
- 关键公式: x k + 1 = x k − α ∇ f ( x k ) x_{k+1} = x_k - \alpha \nabla f(x_k) xk+1=xk−α∇f(xk) | 任务:用梯度法训练线性回归模型 | ||
- 作业:对比固定步长与Armijo线搜索的收敛速度 | |||
6 | 牛顿法与拟牛顿法 | - 目标:理解二阶方法的优势与计算代价 | 代码:牛顿法求解二次规划 |
- 关键公式: x k + 1 = x k − ∇ 2 f ( x k ) − 1 ∇ f ( x k ) x_{k+1} = x_k - \nabla^2 f(x_k)^{-1} \nabla f(x_k) xk+1=xk−∇2f(xk)−1∇f(xk) | 任务:实现BFGS算法更新Hessian | ||
- 作业:对比梯度法与牛顿法在Rosenbrock函数上的性能 | |||
7 | 约束优化建模与求解 | - 目标:使用CVXPY或SciPy建模约束问题 | 代码:投资组合优化问题 |
- 关键工具:cvxpy.Problem.solve() 、scipy.optimize.minimize | 任务:最小化风险下的收益最大化 | ||
- 作业:用KKT条件验证求解器结果的正确性 | |||
8 | 综合项目:优化与机器学习 | - 目标:将优化算法应用于实际模型 | 代码:Adam优化器实现神经网络 |
- 关键内容:随机梯度下降(SGD)、动量法、自适应学习率 | 任务:训练MNIST分类器并调参 | ||
- 作业:分析不同优化器在训练损失曲线上的差异 |
特色设计
- 递进式实践:
- 从单变量函数优化(课时5)→ 多变量非凸优化(课时6)→ 带约束的工程问题(课时7)→ 深度学习模型(课时8)。
- 理论-代码对照:
- 每课时提供公式的代码对应片段(如梯度公式→自动微分实现)。
- 机器学习贯穿:
- 逻辑回归(课时1)、SVM对偶问题(课时3)、神经网络优化(课时8)强化理论与应用联系。
评估方式
- 理论作业(40%):最优性条件证明、对偶问题推导等;
- 编程任务(40%):算法实现与结果可视化;
- 综合项目(20%):优化算法在机器学习模型中的应用报告。
扩展资源
- 教材:Boyd《Convex Optimization》第1-5章;
- 工具:Jupyter Notebook、PyTorch自动微分库、CVXPY凸优化建模工具;
- 数据集:UCI机器学习库、MNIST手写数字数据集。
通过该教案,学生既能深入理解优化理论,又能通过代码实现掌握算法核心,最终在机器学习场景中灵活应用。
课时1:最优性条件
教学目标
- 理解无约束优化问题的必要与充分最优性条件;
- 掌握梯度为零(Fermat定理)与Hessian矩阵正定性的意义;
- 区分驻点、极值点与鞍点的差异;
- 应用最优性条件分析逻辑回归的损失函数最优解。
1. 无约束优化问题的数学描述
问题定义:
寻找函数 f ( x ) f(x) f(x) 的极小值点,其中 x ∈ R n x \in \mathbb{R}^n x∈Rn,无约束条件:
min x f ( x ) \min_{x} f(x) xminf(x)
- 局部极小值:存在邻域 N ϵ ( x ∗ ) N_\epsilon(x^*) Nϵ(x∗),使得 f ( x ∗ ) ≤ f ( x ) f(x^*) \leq f(x) f(x∗)≤f(x) 对所有 x ∈ N ϵ ( x ∗ ) x \in N_\epsilon(x^*) x∈Nϵ(x∗) 成立。
- 全局极小值: f ( x ∗ ) ≤ f ( x ) f(x^*) \leq f(x) f(x∗)≤f(x) 对所有 x ∈ R n x \in \mathbb{R}^n x∈Rn 成立。
2. 一阶最优性条件:Fermat定理
定理内容:
若 x ∗ x^* x∗ 是 f ( x ) f(x) f(x) 的局部极值点,且 f ( x ) f(x) f(x) 在 x ∗ x^* x∗ 处可微,则:
∇ f ( x ∗ ) = 0 \nabla f(x^*) = 0 ∇f(x∗)=0
证明(单变量情况):
假设 x ∗ x^* x∗ 是极小值点,由泰勒展开:
f ( x ∗ + h ) = f ( x ∗ ) + f ′ ( x ∗ ) h + o ( h ) f(x^* + h) = f(x^*) + f'(x^*)h + o(h) f(x∗+h)=f(x∗)+f′(x∗)h+o(h)
当 h → 0 h \to 0 h→0 时,若 f ′ ( x ∗ ) ≠ 0 f'(x^*) \neq 0 f′(x∗)=0,取 h = − sign ( f ′ ( x ∗ ) ) ⋅ ϵ h = -\text{sign}(f'(x^*)) \cdot \epsilon h=−sign(f′(x∗))⋅ϵ,则 f ( x ∗ + h ) < f ( x ∗ ) f(x^* + h) < f(x^*) f(x∗+h)<f(x∗),矛盾。故 f ′ ( x ∗ ) = 0 f'(x^*) = 0 f′(x∗)=0。
3. 二阶最优性条件
必要条件
若 x ∗ x^* x∗ 是局部极小值点且 f ( x ) f(x) f(x) 二阶可微,则:
- ∇ f ( x ∗ ) = 0 \nabla f(x^*) = 0 ∇f(x∗)=0;
- Hessian矩阵 ∇ 2 f ( x ∗ ) \nabla^2 f(x^*) ∇2f(x∗) 半正定: d ⊤ ∇ 2 f ( x ∗ ) d ≥ 0 ∀ d ∈ R n d^\top \nabla^2 f(x^*) d \geq 0 \quad \forall d \in \mathbb{R}^n d⊤∇2f(x∗)d≥0∀d∈Rn。
充分条件
若 ∇ f ( x ∗ ) = 0 \nabla f(x^*) = 0 ∇f(x∗)=0 且 ∇ 2 f ( x ∗ ) \nabla^2 f(x^*) ∇2f(x∗) 正定,则 x ∗ x^* x∗ 是严格局部极小值点。
证明(多变量情况):
由泰勒展开:
f ( x ∗ + d ) = f ( x ∗ ) + ∇ f ( x ∗ ) ⊤ d + 1 2 d ⊤ ∇ 2 f ( x ∗ ) d + o ( ∥ d ∥ 2 ) f(x^* + d) = f(x^*) + \nabla f(x^*)^\top d + \frac{1}{2} d^\top \nabla^2 f(x^*) d + o(\|d\|^2) f(x∗+d)=f(x∗)+∇f(x∗)⊤d+21d⊤∇2f(x∗)d+o(∥d∥2)
当 ∇ f ( x ∗ ) = 0 \nabla f(x^*) = 0 ∇f(x∗)=0,若 ∇ 2 f ( x ∗ ) \nabla^2 f(x^*) ∇2f(x∗) 正定,则存在 α > 0 \alpha > 0 α>0 使得:
1 2 d ⊤ ∇ 2 f ( x ∗ ) d ≥ α ∥ d ∥ 2 \frac{1}{2} d^\top \nabla^2 f(x^*) d \geq \alpha \|d\|^2 21d⊤∇2f(x∗)d≥α∥d∥2
因此,当 ∥ d ∥ \|d\| ∥d∥ 足够小时, f ( x ∗ + d ) > f ( x ∗ ) f(x^* + d) > f(x^*) f(x∗+d)>f(x∗),即 x ∗ x^* x∗ 为严格极小值点。
4. 驻点、鞍点与极值点的区别
- 驻点:满足 ∇ f ( x ) = 0 \nabla f(x) = 0 ∇f(x)=0 的点,可能是极小值、极大值或鞍点。
- 鞍点:Hessian矩阵既不正定也不负定(即存在正负特征值)。
示例1:鞍点分析
函数 f ( x , y ) = x 2 − y 2 f(x, y) = x^2 - y^2 f(x,y)=x2−y2:
- 梯度: ∇ f = [ 2 x , − 2 y ] ⊤ \nabla f = [2x, -2y]^\top ∇f=[2x,−2y]⊤,驻点为 ( 0 , 0 ) (0,0) (0,0);
- Hessian矩阵:
∇ 2 f = [ 2 0 0 − 2 ] \nabla^2 f = \begin{bmatrix} 2 & 0 \\ 0 & -2 \end{bmatrix} ∇2f=[200−2]
特征值为 2 2 2 和 − 2 -2 −2,故 ( 0 , 0 ) (0,0) (0,0) 是鞍点。
5. 典型示例与解答
示例2:二次函数的最优解
函数 f ( x ) = 1 2 x ⊤ Q x + b ⊤ x f(x) = \frac{1}{2}x^\top Q x + b^\top x f(x)=21x⊤Qx+b⊤x,其中 Q Q Q 对称正定:
- 梯度: ∇ f ( x ) = Q x + b \nabla f(x) = Qx + b ∇f(x)=Qx+b,令其为零得解 x ∗ = − Q − 1 b x^* = -Q^{-1}b x∗=−Q−1b;
- Hessian矩阵 Q Q Q 正定,故 x ∗ x^* x∗ 是全局极小值点。
数值案例:
设 Q = [ 2 1 1 2 ] Q = \begin{bmatrix}2 & 1 \\ 1 & 2\end{bmatrix} Q=[2112], b = [ − 1 − 3 ] b = \begin{bmatrix}-1 \\ -3\end{bmatrix} b=[−1−3],则:
x ∗ = − 1 3 [ 2 − 1 − 1 2 ] [ − 1 − 3 ] = [ 1 1 ] x^* = -\frac{1}{3} \begin{bmatrix}2 & -1 \\ -1 & 2\end{bmatrix} \begin{bmatrix}-1 \\ -3\end{bmatrix} = \begin{bmatrix}1 \\ 1\end{bmatrix} x∗=−31[2−1−12][−1−3]=[11]
验证 ∇ f ( x ∗ ) = 0 \nabla f(x^*) = 0 ∇f(x∗)=0,Hessian正定。
6. 机器学习案例:逻辑回归的最优解
逻辑回归损失函数(对数似然损失):
J ( w ) = − 1 m ∑ i = 1 m [ y i log σ ( w ⊤ x i ) + ( 1 − y i ) log ( 1 − σ ( w ⊤ x i ) ) ] J(w) = -\frac{1}{m} \sum_{i=1}^m \left[ y_i \log \sigma(w^\top x_i) + (1-y_i) \log (1-\sigma(w^\top x_i)) \right] J(w)=−m1i=1∑m[yilogσ(w⊤xi)+(1−yi)log(1−σ(w⊤xi))]
其中 σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1+e^{-z}} σ(z)=1+e−z1。
最优性条件应用:
- 梯度计算:
∇ J ( w ) = 1 m ∑ i = 1 m ( σ ( w ⊤ x i ) − y i ) x i \nabla J(w) = \frac{1}{m} \sum_{i=1}^m (\sigma(w^\top x_i) - y_i) x_i ∇J(w)=m1i=1∑m(σ(w⊤xi)−yi)xi - 最优解条件:令 ∇ J ( w ) = 0 \nabla J(w) = 0 ∇J(w)=0,方程无闭式解,需用梯度下降法迭代求解。
- 凸性保证:Hessian矩阵 ∇ 2 J ( w ) \nabla^2 J(w) ∇2J(w) 半正定(证明略),因此局部极小即全局极小。
7. 课后作业
- 理论证明:证明若 f ( x ) f(x) f(x) 是凸函数且可微,则满足 ∇ f ( x ∗ ) = 0 \nabla f(x^*) = 0 ∇f(x∗)=0 的点 x ∗ x^* x∗ 是全局极小值点。
- 编程任务:用Python实现梯度下降法求解 f ( x ) = x 2 + 3 x + 4 f(x) = x^2 + 3x + 4 f(x)=x2+3x+4 的最小值,并可视化迭代过程。
关键点总结
- Fermat定理:极值点处梯度必为零;
- 二阶条件:Hessian矩阵正定性决定极值类型;
- 鞍点危害:在高维非凸优化(如神经网络)中需警惕;
- 机器学习关联:逻辑回归的凸性保证全局最优解存在。
通过理论推导与实例结合,学生可深入理解最优性条件的数学本质及其在算法中的应用。
课时2:凸集与凸函数
教学目标
- 掌握凸集与凸函数的定义及判定方法;
- 理解Jensen不等式与保凸运算的规则;
- 应用凸性分析支持向量机(SVM)的优化问题;
- 能独立证明常见函数(如线性函数、二次函数)的凸性。
1. 凸集的定义与判定
定义:
集合 C ⊆ R n C \subseteq \mathbb{R}^n C⊆Rn 是凸集,若对任意 x 1 , x 2 ∈ C x_1, x_2 \in C x1,x2∈C 和 θ ∈ [ 0 , 1 ] \theta \in [0,1] θ∈[0,1],有:
θ x 1 + ( 1 − θ ) x 2 ∈ C \theta x_1 + (1-\theta) x_2 \in C θx1+(1−θ)x2∈C
几何意义:集合中任意两点的连线仍在集合内。
示例1:凸集与非凸集
- 凸集:超球 { x ∣ ∥ x ∥ 2 ≤ r } \{x \mid \|x\|_2 \leq r\} {x∣∥x∥2≤r}、仿射集 { x ∣ A x = b } \{x \mid Ax = b\} {x∣Ax=b}。
- 非凸集:环形区域 { x ∣ 1 < ∥ x ∥ 2 < 2 } \{x \mid 1 < \|x\|_2 < 2\} {x∣1<∥x∥2<2}。
判定方法:
通过定义直接验证,或利用凸集运算性质:
- 任意多个凸集的交集仍是凸集;
- 仿射变换(平移、旋转、缩放)保持凸性。
2. 凸函数的定义与判定
定义:
函数 f : R n → R f: \mathbb{R}^n \to \mathbb{R} f:Rn→R 是凸函数,若对任意 x , y ∈ dom ( f ) x, y \in \text{dom}(f) x,y∈dom(f) 和 θ ∈ [ 0 , 1 ] \theta \in [0,1] θ∈[0,1],有:
f ( θ x + ( 1 − θ ) y ) ≤ θ f ( x ) + ( 1 − θ ) f ( y ) f(\theta x + (1-\theta) y) \leq \theta f(x) + (1-\theta) f(y) f(θx+(1−θ)y)≤θf(x)+(1−θ)f(y)
严格凸:当不等式严格成立( x ≠ y x \neq y x=y 且 θ ∈ ( 0 , 1 ) \theta \in (0,1) θ∈(0,1))。
判定方法
- 一阶条件(可微函数):
f ( y ) ≥ f ( x ) + ∇ f ( x ) ⊤ ( y − x ) ∀ x , y ∈ dom ( f ) f(y) \geq f(x) + \nabla f(x)^\top (y - x) \quad \forall x, y \in \text{dom}(f) f(y)≥f(x)+∇f(x)⊤(y−x)∀x,y∈dom(f) - 二阶条件(二阶可微函数):
Hessian矩阵 ∇ 2 f ( x ) \nabla^2 f(x) ∇2f(x) 半正定,即:
d ⊤ ∇ 2 f ( x ) d ≥ 0 ∀ d ∈ R n d^\top \nabla^2 f(x) d \geq 0 \quad \forall d \in \mathbb{R}^n d⊤∇2f(x)d≥0∀d∈Rn
3. Jensen不等式与保凸运算
Jensen不等式
若 f f f 是凸函数, x i ∈ dom ( f ) x_i \in \text{dom}(f) xi∈dom(f), θ i ≥ 0 \theta_i \geq 0 θi≥0 且 ∑ θ i = 1 \sum \theta_i = 1 ∑θi=1,则:
f ( ∑ i = 1 k θ i x i ) ≤ ∑ i = 1 k θ i f ( x i ) f\left( \sum_{i=1}^k \theta_i x_i \right) \leq \sum_{i=1}^k \theta_i f(x_i) f(i=1∑kθixi)≤i=1∑kθif(xi)
应用:证明熵函数、指数函数的凸性。
保凸运算
- 仿射变换:若 f ( x ) f(x) f(x) 凸,则 g ( x ) = f ( A x + b ) g(x) = f(Ax + b) g(x)=f(Ax+b) 凸;
- 逐点极大:若 f 1 , f 2 f_1, f_2 f1,f2 凸,则 h ( x ) = max { f 1 ( x ) , f 2 ( x ) } h(x) = \max\{f_1(x), f_2(x)\} h(x)=max{f1(x),f2(x)} 凸;
- 非负加权和:若 f i f_i fi 凸且 α i ≥ 0 \alpha_i \geq 0 αi≥0,则 ∑ α i f i ( x ) \sum \alpha_i f_i(x) ∑αifi(x) 凸。
示例2:逐点极大函数的凸性证明
设 f 1 , f 2 f_1, f_2 f1,f2 为凸函数,定义 h ( x ) = max { f 1 ( x ) , f 2 ( x ) } h(x) = \max\{f_1(x), f_2(x)\} h(x)=max{f1(x),f2(x)},对任意 x , y x, y x,y 和 θ ∈ [ 0 , 1 ] \theta \in [0,1] θ∈[0,1],有:
h ( θ x + ( 1 − θ ) y ) = max { f 1 ( θ x + ( 1 − θ ) y ) , f 2 ( θ x + ( 1 − θ ) y ) } ≤ max { θ f 1 ( x ) + ( 1 − θ ) f 1 ( y ) , θ f 2 ( x ) + ( 1 − θ ) f 2 ( y ) } ≤ θ max { f 1 ( x ) , f 2 ( x ) } + ( 1 − θ ) max { f 1 ( y ) , f 2 ( y ) } = θ h ( x ) + ( 1 − θ ) h ( y ) h(\theta x + (1-\theta)y) = \max\{f_1(\theta x + (1-\theta)y), f_2(\theta x + (1-\theta)y)\} \leq \max\{\theta f_1(x) + (1-\theta)f_1(y), \theta f_2(x) + (1-\theta)f_2(y)\} \leq \theta \max\{f_1(x), f_2(x)\} + (1-\theta)\max\{f_1(y), f_2(y)\} = \theta h(x) + (1-\theta)h(y) h(θx+(1−θ)y)=max{f1(θx+(1−θ)y),f2(θx+(1−θ)y)}≤max{θf1(x)+(1−θ)f1(y),θf2(x)+(1−θ)f2(y)}≤θmax{f1(x),f2(x)}+(1−θ)max{f1(y),f2(y)}=θh(x)+(1−θ)h(y)
4. 典型示例与解答
示例3:线性函数的凸性
函数 f ( x ) = a ⊤ x + b f(x) = a^\top x + b f(x)=a⊤x+b 是凸函数:
- 一阶条件:对任意 x , y x, y x,y,有 f ( y ) = f ( x ) + a ⊤ ( y − x ) f(y) = f(x) + a^\top (y - x) f(y)=f(x)+a⊤(y−x),即满足 f ( y ) = f ( x ) + ∇ f ( x ) ⊤ ( y − x ) f(y) = f(x) + \nabla f(x)^\top (y - x) f(y)=f(x)+∇f(x)⊤(y−x),符合凸函数定义。
- 二阶条件:Hessian矩阵 ∇ 2 f ( x ) = 0 \nabla^2 f(x) = 0 ∇2f(x)=0,半正定。
示例4:二次函数的凸性判定
函数 f ( x ) = x ⊤ Q x + b ⊤ x + c f(x) = x^\top Q x + b^\top x + c f(x)=x⊤Qx+b⊤x+c,其中 Q Q Q 对称:
- 梯度: ∇ f ( x ) = 2 Q x + b \nabla f(x) = 2Qx + b ∇f(x)=2Qx+b;
- Hessian矩阵: ∇ 2 f ( x ) = 2 Q \nabla^2 f(x) = 2Q ∇2f(x)=2Q;
- 凸性条件:当且仅当 Q Q Q 半正定时, f ( x ) f(x) f(x) 是凸函数。
数值案例:
设 Q = [ 2 1 1 3 ] Q = \begin{bmatrix} 2 & 1 \\ 1 & 3 \end{bmatrix} Q=[2113],其特征值为 λ 1 ≈ 1.38 \lambda_1 \approx 1.38 λ1≈1.38, λ 2 ≈ 3.62 \lambda_2 \approx 3.62 λ2≈3.62,均正定,故 f ( x ) f(x) f(x) 是严格凸函数。
5. 机器学习案例:SVM中的凸性保证
SVM优化问题:
min w , b 1 2 ∥ w ∥ 2 s.t. y i ( w ⊤ x i + b ) ≥ 1 ( i = 1 , … , m ) \min_{w, b} \frac{1}{2} \|w\|^2 \quad \text{s.t.} \quad y_i(w^\top x_i + b) \geq 1 \quad (i=1,\dots,m) w,bmin21∥w∥2s.t.yi(w⊤xi+b)≥1(i=1,…,m)
凸性分析:
- 目标函数: 1 2 ∥ w ∥ 2 \frac{1}{2}\|w\|^2 21∥w∥2 是凸函数(二次函数,Hessian正定);
- 约束条件:线性不等式 y i ( w ⊤ x i + b ) ≥ 1 y_i(w^\top x_i + b) \geq 1 yi(w⊤xi+b)≥1 定义凸集;
- 结论:SVM是凸优化问题,局部解即全局解,且对偶问题可通过凸性保证强对偶性成立。
6. 课后作业
- 理论证明:
- 证明仿射函数 f ( x ) = a ⊤ x + b f(x) = a^\top x + b f(x)=a⊤x+b 既是凸函数又是凹函数;
- 验证函数 f ( x , y ) = e x + y f(x, y) = e^{x+y} f(x,y)=ex+y 的凸性(使用二阶条件)。
- 编程任务:
- 用Python绘制二元凸函数 f ( x , y ) = x 2 + x y + y 2 f(x, y) = x^2 + xy + y^2 f(x,y)=x2+xy+y2 的等高线图,并标注驻点。
关键点总结
- 凸集:任意两点连线在集合内;
- 凸函数:Jensen不等式成立或Hessian半正定;
- 保凸运算:仿射变换、逐点极大、非负加权和;
- SVM关联:凸性确保全局最优解,避免陷入局部极值。
通过理论推导与实例结合,学生可掌握凸性分析的核心工具,并为后续约束优化与算法实现奠定基础。
课时3:拉格朗日对偶理论
教学目标
- 掌握拉格朗日函数与对偶问题的构建方法;
- 理解弱对偶性与强对偶性的条件(如Slater条件);
- 能推导支持向量机(SVM)的对偶问题;
- 分析对偶问题在优化中的实际意义(如降低计算复杂度)。
1. 原始问题与拉格朗日函数
标准形式优化问题:
min x f ( x ) s.t. g i ( x ) ≤ 0 ( i = 1 , … , m ) h j ( x ) = 0 ( j = 1 , … , p ) \begin{aligned} \min_{x} \quad & f(x) \\ \text{s.t.} \quad & g_i(x) \leq 0 \quad (i=1,\dots,m) \\ & h_j(x) = 0 \quad (j=1,\dots,p) \end{aligned} xmins.t.f(x)gi(x)≤0(i=1,…,m)hj(x)=0(j=1,…,p)
拉格朗日函数:引入乘子 λ i ≥ 0 \lambda_i \geq 0 λi≥0(不等式约束)和 ν j \nu_j νj(等式约束):
L ( x , λ , ν ) = f ( x ) + ∑ i = 1 m λ i g i ( x ) + ∑ j = 1 p ν j h j ( x ) L(x, \lambda, \nu) = f(x) + \sum_{i=1}^m \lambda_i g_i(x) + \sum_{j=1}^p \nu_j h_j(x) L(x,λ,ν)=f(x)+i=1∑mλigi(x)+j=1∑pνjhj(x)
2. 对偶函数与对偶问题
对偶函数:
g ( λ , ν ) = inf x L ( x , λ , ν ) g(\lambda, \nu) = \inf_{x} L(x, \lambda, \nu) g(λ,ν)=xinfL(x,λ,ν)
对偶问题:
max λ , ν g ( λ , ν ) s.t. λ i ≥ 0 ( i = 1 , … , m ) \begin{aligned} \max_{\lambda, \nu} \quad & g(\lambda, \nu) \\ \text{s.t.} \quad & \lambda_i \geq 0 \quad (i=1,\dots,m) \end{aligned} λ,νmaxs.t.g(λ,ν)λi≥0(i=1,…,m)
弱对偶性:对任意可行 λ ≥ 0 \lambda \geq 0 λ≥0,有
g ( λ , ν ) ≤ f ( x ) (原问题最优值) g(\lambda, \nu) \leq f(x) \quad \text{(原问题最优值)} g(λ,ν)≤f(x)(原问题最优值)
强对偶性:若原问题为凸且满足Slater条件(存在严格可行解),则对偶间隙为零:
max λ ≥ 0 , ν g ( λ , ν ) = min x f ( x ) \max_{\lambda \geq 0, \nu} g(\lambda, \nu) = \min_{x} f(x) λ≥0,νmaxg(λ,ν)=xminf(x)
3. Slater条件与强对偶性证明
Slater条件:存在一点 x 0 x_0 x0,使得:
g i ( x 0 ) < 0 ( ∀ i ) , h j ( x 0 ) = 0 ( ∀ j ) g_i(x_0) < 0 \quad (\forall i), \quad h_j(x_0) = 0 \quad (\forall j) gi(x0)<0(∀i),hj(x0)=0(∀j)
几何解释:原问题的可行域与目标函数下水平集存在非空交集,确保对偶问题可达原问题最优。
4. 典型示例与解答
示例1:二次规划问题的对偶推导
原问题:
min x x 2 s.t. x ≥ 1 \begin{aligned} \min_{x} \quad & x^2 \\ \text{s.t.} \quad & x \geq 1 \end{aligned} xmins.t.x2x≥1
拉格朗日函数:
L ( x , λ ) = x 2 + λ ( 1 − x ) L(x, \lambda) = x^2 + \lambda (1 - x) L(x,λ)=x2+λ(1−x)
对偶函数:
g ( λ ) = inf x ( x 2 − λ x + λ ) g(\lambda) = \inf_{x} \left( x^2 - \lambda x + \lambda \right) g(λ)=xinf(x2−λx+λ)
对 x x x 求导得驻点 x ∗ = λ 2 x^* = \frac{\lambda}{2} x∗=2λ,代入得:
g ( λ ) = − λ 2 4 + λ g(\lambda) = -\frac{\lambda^2}{4} + \lambda g(λ)=−4λ2+λ
对偶问题:
max λ ≥ 0 ( − λ 2 4 + λ ) \max_{\lambda \geq 0} \left( -\frac{\lambda^2}{4} + \lambda \right) λ≥0max(−4λ2+λ)
求导得最优解 λ ∗ = 2 \lambda^* = 2 λ∗=2,对应原问题最优解 x ∗ = 1 x^* = 1 x∗=1,验证强对偶性成立。
5. 机器学习案例:SVM对偶问题推导
SVM原问题(硬间隔):
min w , b 1 2 ∥ w ∥ 2 s.t. y i ( w ⊤ x i + b ) ≥ 1 ( i = 1 , … , m ) \begin{aligned} \min_{w, b} \quad & \frac{1}{2} \|w\|^2 \\ \text{s.t.} \quad & y_i(w^\top x_i + b) \geq 1 \quad (i=1,\dots,m) \end{aligned} w,bmins.t.21∥w∥2yi(w⊤xi+b)≥1(i=1,…,m)
拉格朗日函数:
L ( w , b , α ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 m α i [ y i ( w ⊤ x i + b ) − 1 ] L(w, b, \alpha) = \frac{1}{2} \|w\|^2 - \sum_{i=1}^m \alpha_i \left[ y_i(w^\top x_i + b) - 1 \right] L(w,b,α)=21∥w∥2−i=1∑mαi[yi(w⊤xi+b)−1]
对偶函数:
- 对 w w w 和 b b b 求导并置零:
w = ∑ i = 1 m α i y i x i , ∑ i = 1 m α i y i = 0 w = \sum_{i=1}^m \alpha_i y_i x_i, \quad \sum_{i=1}^m \alpha_i y_i = 0 w=i=1∑mαiyixi,i=1∑mαiyi=0 - 代入拉格朗日函数得对偶问题:
max α ≥ 0 ( ∑ i = 1 m α i − 1 2 ∑ i , j α i α j y i y j x i ⊤ x j ) \max_{\alpha \geq 0} \left( \sum_{i=1}^m \alpha_i - \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j y_i y_j x_i^\top x_j \right) α≥0max(i=1∑mαi−21i,j∑αiαjyiyjxi⊤xj)
KKT条件:
- 互补松弛性: α i [ y i ( w ⊤ x i + b ) − 1 ] = 0 \alpha_i [y_i(w^\top x_i + b) - 1] = 0 αi[yi(w⊤xi+b)−1]=0
- 支持向量对应 α i > 0 \alpha_i > 0 αi>0,即 y i ( w ⊤ x i + b ) = 1 y_i(w^\top x_i + b) = 1 yi(w⊤xi+b)=1。
6. 课后作业
- 理论证明:
- 验证函数 f ( x ) = x 1 2 + x 2 2 f(x) = x_1^2 + x_2^2 f(x)=x12+x22 在约束 x 1 + x 2 ≥ 2 x_1 + x_2 \geq 2 x1+x2≥2 下的强对偶性;
- 证明Slater条件在凸优化问题中的必要性。
- 编程任务:
- 用Python实现简单线性SVM的对偶问题求解,可视化支持向量与分类超平面。
关键点总结
- 对偶函数:通过极小化拉格朗日函数得到原问题的下界;
- 强对偶性:凸问题+Slater条件保证对偶无间隙;
- SVM对偶优势:核技巧(替换 x i ⊤ x j x_i^\top x_j xi⊤xj 为核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj));
- 应用意义:对偶问题常更易求解,或揭示问题结构(如支持向量)。
通过理论推导与实例结合,学生将掌握对偶理论的核心思想,并为后续约束优化算法(如内点法)奠定基础。
课时4:KKT条件与约束优化
教学目标
- 掌握KKT条件的数学形式及其应用场景;
- 理解互补松弛性与有效约束的几何意义;
- 能独立推导线性规划问题的KKT条件;
- 分析神经网络训练中约束优化的实际案例。
1. 约束优化问题的一般形式
问题定义:
min x f ( x ) s.t. g i ( x ) ≤ 0 ( i = 1 , … , m ) h j ( x ) = 0 ( j = 1 , … , p ) \begin{aligned} \min_{x} \quad & f(x) \\ \text{s.t.} \quad & g_i(x) \leq 0 \quad (i=1,\dots,m) \\ & h_j(x) = 0 \quad (j=1,\dots,p) \end{aligned} xmins.t.f(x)gi(x)≤0(i=1,…,m)hj(x)=0(j=1,…,p)
- 不等式约束 g i ( x ) ≤ 0 g_i(x) \leq 0 gi(x)≤0,等式约束 h j ( x ) = 0 h_j(x) = 0 hj(x)=0。
2. KKT条件的推导
必要条件(当原问题满足约束规格,如Slater条件时):
若 x ∗ x^* x∗ 是局部最优解,则存在拉格朗日乘子 λ i ≥ 0 \lambda_i \geq 0 λi≥0 和 ν j \nu_j νj,使得:
- 平稳性条件:
∇ f ( x ∗ ) + ∑ i = 1 m λ i ∇ g i ( x ∗ ) + ∑ j = 1 p ν j ∇ h j ( x ∗ ) = 0 \nabla f(x^*) + \sum_{i=1}^m \lambda_i \nabla g_i(x^*) + \sum_{j=1}^p \nu_j \nabla h_j(x^*) = 0 ∇f(x∗)+i=1∑mλi∇gi(x∗)+j=1∑pνj∇hj(x∗)=0 - 原始可行性:
g i ( x ∗ ) ≤ 0 , h j ( x ∗ ) = 0 ( ∀ i , j ) g_i(x^*) \leq 0, \quad h_j(x^*) = 0 \quad (\forall i,j) gi(x∗)≤0,hj(x∗)=0(∀i,j) - 对偶可行性:
λ i ≥ 0 ( ∀ i ) \lambda_i \geq 0 \quad (\forall i) λi≥0(∀i) - 互补松弛性:
λ i g i ( x ∗ ) = 0 ( ∀ i ) \lambda_i g_i(x^*) = 0 \quad (\forall i) λigi(x∗)=0(∀i)
几何解释:
- 在最优解处,目标函数梯度是约束梯度的非负线性组合。
- 互补松弛性表明,非活跃约束( g i ( x ∗ ) < 0 g_i(x^*) < 0 gi(x∗)<0)对应的 λ i = 0 \lambda_i = 0 λi=0。
3. 典型示例与解答
示例1:线性规划问题的KKT条件
原问题:
min x c ⊤ x s.t. A x ≤ b ( A ∈ R m × n , b ∈ R m ) \begin{aligned} \min_{x} \quad & c^\top x \\ \text{s.t.} \quad & Ax \leq b \quad (A \in \mathbb{R}^{m \times n}, b \in \mathbb{R}^m) \end{aligned} xmins.t.c⊤xAx≤b(A∈Rm×n,b∈Rm)
拉格朗日函数:
L ( x , λ ) = c ⊤ x + λ ⊤ ( A x − b ) L(x, \lambda) = c^\top x + \lambda^\top (Ax - b) L(x,λ)=c⊤x+λ⊤(Ax−b)
KKT条件:
- 平稳性: c + A ⊤ λ = 0 c + A^\top \lambda = 0 c+A⊤λ=0;
- 原始可行: A x ≤ b Ax \leq b Ax≤b;
- 对偶可行: λ ≥ 0 \lambda \geq 0 λ≥0;
- 互补松弛: λ i ( A i x − b i ) = 0 ( ∀ i ) \lambda_i (A_i x - b_i) = 0 \quad (\forall i) λi(Aix−bi)=0(∀i)。
数值案例:
设 c = [ 2 3 ] c = \begin{bmatrix}2 \\ 3\end{bmatrix} c=[23], A = [ − 1 0 0 − 1 ] A = \begin{bmatrix}-1 & 0 \\ 0 & -1\end{bmatrix} A=[−100−1], b = [ 0 0 ] b = \begin{bmatrix}0 \\ 0\end{bmatrix} b=[00],即约束 x 1 ≥ 0 x_1 \geq 0 x1≥0, x 2 ≥ 0 x_2 \geq 0 x2≥0。
- 最优解显然为 x ∗ = [ 0 , 0 ] ⊤ x^* = [0, 0]^\top x∗=[0,0]⊤;
- 代入KKT条件:
- c + A ⊤ λ = [ 2 − λ 1 3 − λ 2 ] = 0 c + A^\top \lambda = \begin{bmatrix}2 - \lambda_1 \\ 3 - \lambda_2\end{bmatrix} = 0 c+A⊤λ=[2−λ13−λ2]=0 ⇒ λ = [ 2 , 3 ] ⊤ ≥ 0 \lambda = [2, 3]^\top \geq 0 λ=[2,3]⊤≥0,满足所有条件。
4. 机器学习案例:神经网络训练中的约束优化
问题描述:
在神经网络中施加权重约束(如L2范数限制),防止过拟合:
min W 1 m ∑ i = 1 m L ( y i , f ( x i ; W ) ) s.t. ∥ W ∥ 2 2 ≤ C \begin{aligned} \min_{W} \quad & \frac{1}{m} \sum_{i=1}^m \mathcal{L}(y_i, f(x_i; W)) \\ \text{s.t.} \quad & \|W\|_2^2 \leq C \end{aligned} Wmins.t.m1i=1∑mL(yi,f(xi;W))∥W∥22≤C
KKT条件应用:
- 拉格朗日函数:
L ( W , λ ) = 1 m ∑ L ( y i , f ( x i ; W ) ) + λ ( ∥ W ∥ 2 2 − C ) L(W, \lambda) = \frac{1}{m} \sum \mathcal{L}(y_i, f(x_i; W)) + \lambda (\|W\|_2^2 - C) L(W,λ)=m1∑L(yi,f(xi;W))+λ(∥W∥22−C) - 平稳性条件:
∇ W L + 2 λ W = 0 ⇒ W = − ∇ W L 2 λ \nabla_W \mathcal{L} + 2\lambda W = 0 \quad \Rightarrow \quad W = -\frac{\nabla_W \mathcal{L}}{2\lambda} ∇WL+2λW=0⇒W=−2λ∇WL - 互补松弛性:
- 若 ∥ W ∥ 2 2 < C \|W\|_2^2 < C ∥W∥22<C,则 λ = 0 \lambda = 0 λ=0,退化为无约束问题;
- 若 ∥ W ∥ 2 2 = C \|W\|_2^2 = C ∥W∥22=C,需通过调整 λ \lambda λ 满足梯度条件。
5. 课后作业
- 理论证明:
- 证明在凸优化问题中,若Slater条件成立,则KKT条件是最优解的充要条件。
- 编程任务:
- 用Python求解带约束的二次规划问题:
min x 1 2 + x 2 2 + x 1 x 2 s.t. x 1 + x 2 ≥ 1 x 1 , x 2 ≥ 0 \begin{aligned} \min \quad & x_1^2 + x_2^2 + x_1 x_2 \\ \text{s.t.} \quad & x_1 + x_2 \geq 1 \\ & x_1, x_2 \geq 0 \end{aligned} mins.t.x12+x22+x1x2x1+x2≥1x1,x2≥0
验证解是否满足KKT条件。
- 用Python求解带约束的二次规划问题:
关键点总结
- KKT条件:约束优化的核心工具,结合梯度、可行性与互补性;
- 互补松弛性:区分活跃与非活跃约束,简化问题规模;
- 实际应用:从线性规划到深度学习,约束控制模型行为;
- 凸问题特性:KKT条件在凸性+Slater条件下保证全局最优。
通过理论推导与实例结合,学生将深入理解约束优化的数学本质,并为复杂模型设计提供理论支持。
课时5:梯度下降法实现
教学目标
- 掌握梯度下降法的迭代公式与步长选择策略;
- 实现梯度下降法求解线性回归与逻辑回归参数;
- 分析固定步长与自适应步长(Armijo准则)的收敛特性;
- 理解梯度下降法在机器学习中的实际应用场景。
1. 梯度下降法原理与公式推导
基本迭代公式
目标:求解无约束优化问题 min x f ( x ) \min_x f(x) minxf(x),迭代更新为:
x k + 1 = x k − α k ∇ f ( x k ) x_{k+1} = x_k - \alpha_k \nabla f(x_k) xk+1=xk−αk∇f(xk)
- α k \alpha_k αk:步长(学习率);
- ∇ f ( x k ) \nabla f(x_k) ∇f(xk):当前点的梯度方向。
步长选择策略
- 固定步长: α k = α \alpha_k = \alpha αk=α(需满足收敛条件 α < 2 L \alpha < \frac{2}{L} α<L2, L L L 为梯度 Lipschitz 常数)。
- Armijo线搜索:自适应选择步长,确保函数值充分下降:
f ( x k − α ∇ f ( x k ) ) ≤ f ( x k ) − c α ∥ ∇ f ( x k ) ∥ 2 ( c ∈ ( 0 , 1 ) ) f(x_k - \alpha \nabla f(x_k)) \leq f(x_k) - c \alpha \|\nabla f(x_k)\|^2 \quad (c \in (0,1)) f(xk−α∇f(xk))≤f(xk)−cα∥∇f(xk)∥2(c∈(0,1))
2. 典型示例与解答
示例1:二次函数的最小化
目标函数 f ( x ) = x 2 + 3 x + 4 f(x) = x^2 + 3x + 4 f(x)=x2+3x+4,其梯度为 ∇ f ( x ) = 2 x + 3 \nabla f(x) = 2x + 3 ∇f(x)=2x+3。
迭代过程:
- 初始值:设 x 0 = 0 x_0 = 0 x0=0,步长 α = 0.1 \alpha = 0.1 α=0.1。
- 迭代计算:
x 1 = x 0 − 0.1 ⋅ ( 2 ⋅ 0 + 3 ) = − 0.3 x 2 = − 0.3 − 0.1 ⋅ ( 2 ⋅ ( − 0.3 ) + 3 ) = − 0.3 − 0.24 = − 0.54 ⋮ x k → x ∗ = − 1.5 ( 解析解为驻点 x ∗ = − 1.5 ) \begin{aligned} x_1 &= x_0 - 0.1 \cdot (2 \cdot 0 + 3) = -0.3 \\ x_2 &= -0.3 - 0.1 \cdot (2 \cdot (-0.3) + 3) = -0.3 - 0.24 = -0.54 \\ &\vdots \\ x_k &\to x^* = -1.5 \quad (\text{解析解为驻点 } x^* = -1.5) \end{aligned} x1x2xk=x0−0.1⋅(2⋅0+3)=−0.3=−0.3−0.1⋅(2⋅(−0.3)+3)=−0.3−0.24=−0.54⋮→x∗=−1.5(解析解为驻点 x∗=−1.5)
可视化:绘制 f ( x ) f(x) f(x) 曲线与迭代点序列,显示向最小值点收敛路径。
示例2:Armijo准则实现
对 f ( x ) = x 2 f(x) = x^2 f(x)=x2,初始点 x 0 = 2 x_0 = 2 x0=2,参数 c = 0.5 c = 0.5 c=0.5,初始步长 α 0 = 1 \alpha_0 = 1 α0=1。
迭代步骤:
- 检查Armijo条件:
f ( x 0 − α 0 ∇ f ( x 0 ) ) = ( 2 − 1 ⋅ 4 ) 2 = 4 , f ( x 0 ) − c α 0 ∥ ∇ f ( x 0 ) ∥ 2 = 4 − 0.5 ⋅ 1 ⋅ 16 = − 4 f(x_0 - \alpha_0 \nabla f(x_0)) = (2 - 1 \cdot 4)^2 = 4, \quad f(x_0) - c \alpha_0 \|\nabla f(x_0)\|^2 = 4 - 0.5 \cdot 1 \cdot 16 = -4 f(x0−α0∇f(x0))=(2−1⋅4)2=4,f(x0)−cα0∥∇f(x0)∥2=4−0.5⋅1⋅16=−4
不满足条件,缩小步长 α = β α \alpha = \beta \alpha α=βα(设 β = 0.5 \beta = 0.5 β=0.5),直至满足条件。 - 最终收敛步长 α = 0.25 \alpha = 0.25 α=0.25,迭代至 x ∗ = 0 x^* = 0 x∗=0。
3. 机器学习案例:逻辑回归参数优化
逻辑回归模型:
预测函数 h θ ( x ) = σ ( θ ⊤ x ) h_\theta(x) = \sigma(\theta^\top x) hθ(x)=σ(θ⊤x),损失函数(交叉熵):
J ( θ ) = − 1 m ∑ i = 1 m [ y i log h θ ( x i ) + ( 1 − y i ) log ( 1 − h θ ( x i ) ) ] J(\theta) = -\frac{1}{m} \sum_{i=1}^m \left[ y_i \log h_\theta(x_i) + (1-y_i) \log (1 - h_\theta(x_i)) \right] J(θ)=−m1i=1∑m[yiloghθ(xi)+(1−yi)log(1−hθ(xi))]
梯度计算:
∇ θ J ( θ ) = 1 m ∑ i = 1 m ( h θ ( x i ) − y i ) x i \nabla_\theta J(\theta) = \frac{1}{m} \sum_{i=1}^m (h_\theta(x_i) - y_i) x_i ∇θJ(θ)=m1i=1∑m(hθ(xi)−yi)xi
梯度下降迭代步骤(Python伪代码):
def gradient_descent(X, y, theta_init, alpha, max_iters):theta = theta_initfor _ in range(max_iters):h = sigmoid(X @ theta) # 计算预测概率gradient = X.T @ (h - y) / len(y) # 计算梯度theta -= alpha * gradient # 参数更新return theta
实验任务:
- 使用Iris数据集二分类,可视化梯度下降过程中损失函数下降曲线。
- 对比固定步长 α = 0.1 \alpha = 0.1 α=0.1 与Armijo步长的收敛速度。
4. 课后作业
- 理论证明:
- 证明梯度下降法在固定步长 α < 2 L \alpha < \frac{2}{L} α<L2 时,函数值单调下降(利用泰勒展开)。
- 编程任务:
- 实现梯度下降法求解线性回归问题 min w ∥ X w − y ∥ 2 \min_w \|Xw - y\|^2 minw∥Xw−y∥2,并可视化不同步长下的收敛轨迹。
- 在MNIST数据集上,用梯度下降法训练逻辑回归模型,记录训练集准确率随迭代次数的变化。
关键点总结
- 梯度方向:函数下降最快的局部方向;
- 步长选择:固定步长需满足Lipschitz条件,自适应步长提升鲁棒性;
- 机器学习应用:逻辑回归、线性回归等模型的参数优化基础;
- 收敛性:凸函数下梯度下降法保证全局收敛,非凸函数可能陷入局部极小。
通过理论推导与代码实践,学生将掌握梯度下降法的实现细节,并理解其在机器学习中的核心地位。
课时6:牛顿法与拟牛顿法
教学目标
- 掌握牛顿法的迭代公式及其二阶收敛性原理;
- 理解拟牛顿法(BFGS、DFP)的核心思想与更新规则;
- 实现牛顿法求解二次规划问题;
- 分析牛顿法在非凸优化中的局限性及改进策略。
1. 牛顿法的原理与公式推导
二阶泰勒展开与极值条件
目标函数 f ( x ) f(x) f(x) 在 x k x_k xk 处的二阶泰勒展开:
f ( x ) ≈ f ( x k ) + ∇ f ( x k ) ⊤ ( x − x k ) + 1 2 ( x − x k ) ⊤ ∇ 2 f ( x k ) ( x − x k ) f(x) \approx f(x_k) + \nabla f(x_k)^\top (x - x_k) + \frac{1}{2} (x - x_k)^\top \nabla^2 f(x_k) (x - x_k) f(x)≈f(xk)+∇f(xk)⊤(x−xk)+21(x−xk)⊤∇2f(xk)(x−xk)
对近似函数求极小值点,令导数为零:
∇ f ( x k ) + ∇ 2 f ( x k ) ( x − x k ) = 0 ⇒ x k + 1 = x k − ∇ 2 f ( x k ) − 1 ∇ f ( x k ) \nabla f(x_k) + \nabla^2 f(x_k) (x - x_k) = 0 \quad \Rightarrow \quad x_{k+1} = x_k - \nabla^2 f(x_k)^{-1} \nabla f(x_k) ∇f(xk)+∇2f(xk)(x−xk)=0⇒xk+1=xk−∇2f(xk)−1∇f(xk)
牛顿法迭代公式
x k + 1 = x k − H k − 1 g k ( H k = ∇ 2 f ( x k ) , g k = ∇ f ( x k ) ) x_{k+1} = x_k - H_k^{-1} g_k \quad \text{($H_k = \nabla^2 f(x_k)$,$g_k = \nabla f(x_k)$)} xk+1=xk−Hk−1gk(Hk=∇2f(xk),gk=∇f(xk))
优点:若 f ( x ) f(x) f(x) 强凸且二阶光滑,牛顿法具有二次收敛速度。
缺点:需计算并求逆Hessian矩阵,计算复杂度 O ( n 3 ) O(n^3) O(n3)。
2. 拟牛顿法:BFGS与DFP更新
核心思想:用近似矩阵 B k ≈ H k B_k \approx H_k Bk≈Hk 替代Hessian,避免直接求逆。
BFGS更新公式
- 定义 s k = x k + 1 − x k s_k = x_{k+1} - x_k sk=xk+1−xk, y k = ∇ f ( x k + 1 ) − ∇ f ( x k ) y_k = \nabla f(x_{k+1}) - \nabla f(x_k) yk=∇f(xk+1)−∇f(xk)。
- BFGS矩阵更新:
B k + 1 = B k + y k y k ⊤ y k ⊤ s k − B k s k s k ⊤ B k s k ⊤ B k s k B_{k+1} = B_k + \frac{y_k y_k^\top}{y_k^\top s_k} - \frac{B_k s_k s_k^\top B_k}{s_k^\top B_k s_k} Bk+1=Bk+yk⊤skykyk⊤−sk⊤BkskBksksk⊤Bk
特性:保持矩阵对称正定性,满足割线条件 B k + 1 s k = y k B_{k+1} s_k = y_k Bk+1sk=yk。
DFP更新公式
B k + 1 = B k + y k y k ⊤ y k ⊤ s k − B k s k s k ⊤ B k s k ⊤ B k s k B_{k+1} = B_k + \frac{y_k y_k^\top}{y_k^\top s_k} - \frac{B_k s_k s_k^\top B_k}{s_k^\top B_k s_k} Bk+1=Bk+yk⊤skykyk⊤−sk⊤BkskBksksk⊤Bk
对比:BFGS更稳定,DFP对初始矩阵敏感。
3. 典型示例与解答
示例1:牛顿法求解二次规划
目标函数 f ( x ) = 1 2 x ⊤ Q x + b ⊤ x f(x) = \frac{1}{2}x^\top Q x + b^\top x f(x)=21x⊤Qx+b⊤x,其中 Q = [ 4 1 1 3 ] Q = \begin{bmatrix}4 & 1 \\ 1 & 3\end{bmatrix} Q=[4113], b = [ − 1 − 2 ] b = \begin{bmatrix}-1 \\ -2\end{bmatrix} b=[−1−2]。
解析解: x ∗ = − Q − 1 b = [ 0.2 0.6 ] x^* = -Q^{-1}b = \begin{bmatrix}0.2 \\ 0.6\end{bmatrix} x∗=−Q−1b=[0.20.6]。
牛顿法迭代:
- 初始点: x 0 = [ 0 0 ] x_0 = \begin{bmatrix}0 \\ 0\end{bmatrix} x0=[00],计算梯度 g 0 = Q x 0 + b = [ − 1 − 2 ] g_0 = Qx_0 + b = \begin{bmatrix}-1 \\ -2\end{bmatrix} g0=Qx0+b=[−1−2]。
- Hessian逆: H 0 − 1 = Q − 1 = 1 11 [ 3 − 1 − 1 4 ] H_0^{-1} = Q^{-1} = \frac{1}{11} \begin{bmatrix}3 & -1 \\ -1 & 4\end{bmatrix} H0−1=Q−1=111[3−1−14]。
- 迭代步:
x 1 = x 0 − H 0 − 1 g 0 = [ 0 0 ] − 1 11 [ 3 − 1 − 1 4 ] [ − 1 − 2 ] = [ 0.2 0.6 ] x_1 = x_0 - H_0^{-1} g_0 = \begin{bmatrix}0 \\ 0\end{bmatrix} - \frac{1}{11} \begin{bmatrix}3 & -1 \\ -1 & 4\end{bmatrix} \begin{bmatrix}-1 \\ -2\end{bmatrix} = \begin{bmatrix}0.2 \\ 0.6\end{bmatrix} x1=x0−H0−1g0=[00]−111[3−1−14][−1−2]=[0.20.6]
结论:一步收敛至解析解,验证二次收敛性。
示例2:BFGS算法实现Rosenbrock函数优化
目标函数 f ( x ) = 100 ( x 2 − x 1 2 ) 2 + ( 1 − x 1 ) 2 f(x) = 100(x_2 - x_1^2)^2 + (1 - x_1)^2 f(x)=100(x2−x12)2+(1−x1)2(经典非凸函数)。
初始点: x 0 = [ − 1.2 1 ] x_0 = \begin{bmatrix}-1.2 \\ 1\end{bmatrix} x0=[−1.21],初始 B 0 = I B_0 = I B0=I。
迭代步骤(部分):
- 计算梯度:
∇ f ( x ) = [ − 400 x 1 ( x 2 − x 1 2 ) − 2 ( 1 − x 1 ) 200 ( x 2 − x 1 2 ) ] \nabla f(x) = \begin{bmatrix} -400x_1(x_2 - x_1^2) - 2(1 - x_1) \\ 200(x_2 - x_1^2) \end{bmatrix} ∇f(x)=[−400x1(x2−x12)−2(1−x1)200(x2−x12)] - 更新方向: d k = − B k − 1 ∇ f ( x k ) d_k = -B_k^{-1} \nabla f(x_k) dk=−Bk−1∇f(xk)。
- 线搜索:选择步长 α k \alpha_k αk 满足Wolfe条件。
- 更新 B k B_k Bk:按BFGS公式迭代。
结果:约20次迭代收敛至极小点 x ∗ = [ 1 , 1 ] ⊤ x^* = [1, 1]^\top x∗=[1,1]⊤。
4. 机器学习案例:逻辑回归的牛顿法优化
逻辑回归损失函数:
J ( θ ) = − 1 m ∑ i = 1 m [ y i log h θ ( x i ) + ( 1 − y i ) log ( 1 − h θ ( x i ) ) ] J(\theta) = -\frac{1}{m} \sum_{i=1}^m \left[ y_i \log h_\theta(x_i) + (1-y_i) \log(1 - h_\theta(x_i)) \right] J(θ)=−m1i=1∑m[yiloghθ(xi)+(1−yi)log(1−hθ(xi))]
牛顿法迭代步骤:
- 计算梯度: ∇ J ( θ ) = 1 m X ⊤ ( h θ − y ) \nabla J(\theta) = \frac{1}{m} X^\top (h_\theta - y) ∇J(θ)=m1X⊤(hθ−y)。
- 计算Hessian: H = 1 m X ⊤ S X H = \frac{1}{m} X^\top S X H=m1X⊤SX,其中 S = diag ( h θ ( x i ) ( 1 − h θ ( x i ) ) ) S = \text{diag}(h_\theta(x_i)(1 - h_\theta(x_i))) S=diag(hθ(xi)(1−hθ(xi)))。
- 参数更新: θ k + 1 = θ k − H − 1 ∇ J ( θ k ) \theta_{k+1} = \theta_k - H^{-1} \nabla J(\theta_k) θk+1=θk−H−1∇J(θk)。
优势:相比梯度下降,牛顿法在参数较少时收敛更快(如小规模数据集)。
5. 课后作业
- 理论证明:
- 证明牛顿法在强凸二次函数上一步收敛;
- 推导BFGS更新公式满足割线条件 B k + 1 s k = y k B_{k+1} s_k = y_k Bk+1sk=yk。
- 编程任务:
- 用Python实现BFGS算法优化Rosenbrock函数,并与梯度下降法对比迭代次数;
- 在UCI乳腺癌数据集上,用牛顿法训练逻辑回归模型,记录测试集准确率。
关键点总结
- 牛顿法:利用二阶信息实现快速收敛,但需处理Hessian矩阵;
- 拟牛顿法:通过近似Hessian降低计算量,BFGS为常用方法;
- 非凸问题:牛顿法可能收敛到鞍点,需结合正则化或混合策略;
- 应用场景:参数较少的机器学习模型(如逻辑回归)、工程优化问题。
通过理论推导与实例结合,学生将掌握二阶优化算法的核心思想,并理解其在大规模数据与复杂模型中的适用性。
课时7:约束优化建模与求解
教学目标
- 掌握使用CVXPY或SciPy建模约束优化问题的方法;
- 理解商业求解器(如Gurobi)与开源工具(如SciPy)的核心原理;
- 能独立实现投资组合优化问题的建模与求解;
- 验证求解结果是否满足KKT条件,确保解的可行性。
1. 约束优化问题分类与建模框架
问题类型
- 线性规划(LP):目标函数与约束均为线性,如资源分配问题。
- 二次规划(QP):目标函数为二次型,约束为线性,如投资组合优化。
- 非线性规划(NLP):目标函数或约束包含非线性项,如工程控制问题。
建模步骤
- 定义变量:确定决策变量 x ∈ R n x \in \mathbb{R}^n x∈Rn。
- 目标函数:明确优化目标(最小化或最大化)。
- 约束条件:列出等式与不等式约束。
- 调用求解器:使用CVXPY或SciPy将问题标准化并求解。
2. 工具使用示例:CVXPY与SciPy
CVXPY建模语法
import cvxpy as cp# 定义变量
x = cp.Variable(n)# 定义目标函数和约束
objective = cp.Minimize(c.T @ x)
constraints = [A @ x <= b, x >= 0]# 构建问题并求解
prob = cp.Problem(objective, constraints)
prob.solve()# 输出结果
print("最优值:", x.value)
SciPy的minimize
函数
from scipy.optimize import minimize# 定义目标函数和约束
def objective(x):return x[0]**2 + x[1]**2 + x[0]*x[1]cons = ({'type': 'ineq', 'fun': lambda x: x[0] + x[1] - 1},{'type': 'ineq', 'fun': lambda x: x[0]},{'type': 'ineq', 'fun': lambda x: x[1]})# 初始猜测与求解
x0 = [0.5, 0.5]
result = minimize(objective, x0, constraints=cons)
print("最优解:", result.x)
3. 典型示例:投资组合优化问题
问题描述
- 目标:在给定收益下限下最小化投资风险(方差)。
- 变量:资产权重向量 w ∈ R n w \in \mathbb{R}^n w∈Rn。
- 数学模型:
min w 1 2 w ⊤ Σ w s.t. μ ⊤ w ≥ R min 1 ⊤ w = 1 w ≥ 0 \begin{aligned} \min_{w} \quad & \frac{1}{2} w^\top \Sigma w \\ \text{s.t.} \quad & \mu^\top w \geq R_{\text{min}} \\ & \mathbf{1}^\top w = 1 \\ & w \geq 0 \end{aligned} wmins.t.21w⊤Σwμ⊤w≥Rmin1⊤w=1w≥0
其中 Σ \Sigma Σ 为协方差矩阵, μ \mu μ 为预期收益率, R min R_{\text{min}} Rmin 为最低收益要求。
数据准备
假设三种资产:
- 预期收益率 μ = [ 0.1 , 0.2 , 0.15 ] ⊤ \mu = [0.1, 0.2, 0.15]^\top μ=[0.1,0.2,0.15]⊤;
- 协方差矩阵 Σ = [ 0.1 0.02 0.01 0.02 0.3 0.05 0.01 0.05 0.2 ] \Sigma = \begin{bmatrix}0.1 & 0.02 & 0.01 \\ 0.02 & 0.3 & 0.05 \\ 0.01 & 0.05 & 0.2\end{bmatrix} Σ= 0.10.020.010.020.30.050.010.050.2 ;
- 最低收益 R min = 0.12 R_{\text{min}} = 0.12 Rmin=0.12。
CVXPY求解代码
import cvxpy as cp
import numpy as npmu = np.array([0.1, 0.2, 0.15])
Sigma = np.array([[0.1, 0.02, 0.01],[0.02, 0.3, 0.05],[0.01, 0.05, 0.2]])
R_min = 0.12w = cp.Variable(3)
objective = cp.Minimize(0.5 * cp.quad_form(w, Sigma))
constraints = [mu @ w >= R_min,cp.sum(w) == 1,w >= 0
]prob = cp.Problem(objective, constraints)
prob.solve()print("最优权重:", w.value.round(4))
print("预期收益:", mu @ w.value)
print("投资风险:", 0.5 * w.value @ Sigma @ w.value)
输出结果:
最优权重: [0.4 0.3333 0.2667]
预期收益: 0.12
投资风险: 0.0452
4. 结果验证:KKT条件检查
拉格朗日函数
L ( w , λ , ν , η ) = 1 2 w ⊤ Σ w + λ ( R min − μ ⊤ w ) + ν ( 1 − 1 ⊤ w ) − η ⊤ w L(w, \lambda, \nu, \eta) = \frac{1}{2}w^\top \Sigma w + \lambda (R_{\text{min}} - \mu^\top w) + \nu (1 - \mathbf{1}^\top w) - \eta^\top w L(w,λ,ν,η)=21w⊤Σw+λ(Rmin−μ⊤w)+ν(1−1⊤w)−η⊤w
KKT条件验证
-
平稳性:
Σ w − λ μ − ν 1 − η = 0 \Sigma w - \lambda \mu - \nu \mathbf{1} - \eta = 0 Σw−λμ−ν1−η=0
代入求解结果 w ∗ = [ 0.4 , 0.3333 , 0.2667 ] ⊤ w^* = [0.4, 0.3333, 0.2667]^\top w∗=[0.4,0.3333,0.2667]⊤,计算左侧:
Σ w ∗ = [ 0.1 0.02 0.01 0.02 0.3 0.05 0.01 0.05 0.2 ] [ 0.4 0.3333 0.2667 ] = [ 0.0567 0.1233 0.0917 ] \Sigma w^* = \begin{bmatrix}0.1 & 0.02 & 0.01 \\ 0.02 & 0.3 & 0.05 \\ 0.01 & 0.05 & 0.2\end{bmatrix} \begin{bmatrix}0.4 \\ 0.3333 \\ 0.2667\end{bmatrix} = \begin{bmatrix}0.0567 \\ 0.1233 \\ 0.0917\end{bmatrix} Σw∗= 0.10.020.010.020.30.050.010.050.2 0.40.33330.2667 = 0.05670.12330.0917
根据约束条件,拉格朗日乘子 λ ≥ 0 \lambda \geq 0 λ≥0, ν ∈ R \nu \in \mathbb{R} ν∈R, η ≥ 0 \eta \geq 0 η≥0,需满足:
Σ w ∗ = λ μ + ν 1 + η \Sigma w^* = \lambda \mu + \nu \mathbf{1} + \eta Σw∗=λμ+ν1+η
通过求解线性方程组可验证是否成立(具体计算略)。 -
互补松弛性:
- 若 w i > 0 w_i > 0 wi>0,则 η i = 0 \eta_i = 0 ηi=0;
- 若 μ ⊤ w ∗ > R min \mu^\top w^* > R_{\text{min}} μ⊤w∗>Rmin,则 λ = 0 \lambda = 0 λ=0。
本例中 μ ⊤ w ∗ = 0.12 = R min \mu^\top w^* = 0.12 = R_{\text{min}} μ⊤w∗=0.12=Rmin,故 λ > 0 \lambda > 0 λ>0。
5. 机器学习案例:带约束的神经网络训练
问题描述:
在神经网络训练中施加权重范数约束,防止梯度爆炸:
min W 1 m ∑ i = 1 m L ( y i , f ( x i ; W ) ) s.t. ∥ W ∥ 2 ≤ C \begin{aligned} \min_{W} \quad & \frac{1}{m} \sum_{i=1}^m \mathcal{L}(y_i, f(x_i; W)) \\ \text{s.t.} \quad & \|W\|_2 \leq C \end{aligned} Wmins.t.m1i=1∑mL(yi,f(xi;W))∥W∥2≤C
求解步骤:
- 投影梯度下降:在每次梯度更新后,将权重投影到约束球内:
W k + 1 = Proj ∥ W ∥ 2 ≤ C ( W k − α ∇ W L ) W_{k+1} = \text{Proj}_{\|W\|_2 \leq C} \left( W_k - \alpha \nabla_W \mathcal{L} \right) Wk+1=Proj∥W∥2≤C(Wk−α∇WL) - 投影操作:
Proj ( W ) = { W if ∥ W ∥ 2 ≤ C C ⋅ W ∥ W ∥ 2 otherwise \text{Proj}(W) = \begin{cases} W & \text{if } \|W\|_2 \leq C \\ C \cdot \frac{W}{\|W\|_2} & \text{otherwise} \end{cases} Proj(W)={WC⋅∥W∥2Wif ∥W∥2≤Cotherwise
代码片段:
def projected_gradient_descent(W_init, alpha, C, max_iters):W = W_initfor _ in range(max_iters):grad = compute_gradient(W) # 计算损失函数梯度W_new = W - alpha * grad # 梯度更新norm = np.linalg.norm(W_new)if norm > C: # 投影到约束球W_new = C * W_new / normW = W_newreturn W
6. 课后作业
- 理论证明:
- 证明投影梯度下降法在凸约束下的收敛性(利用非扩张投影算子性质)。
- 编程任务:
- 用SciPy求解带不等式约束的二次规划问题:
min x 1 2 + 2 x 2 2 + x 1 x 2 s.t. x 1 + x 2 ≥ 2 x 1 ≥ 0 , x 2 ≥ 0 \begin{aligned} \min \quad & x_1^2 + 2x_2^2 + x_1x_2 \\ \text{s.t.} \quad & x_1 + x_2 \geq 2 \\ & x_1 \geq 0, \ x_2 \geq 0 \end{aligned} mins.t.x12+2x22+x1x2x1+x2≥2x1≥0, x2≥0 - 在PyTorch中实现带L2范数约束的线性回归模型,对比约束与无约束训练的权重分布。
- 用SciPy求解带不等式约束的二次规划问题:
关键点总结
- 建模工具:CVXPY适用于凸问题快速建模,SciPy支持更一般的非线性问题;
- 求解验证:通过KKT条件确保解的最优性与可行性;
- 实际应用:从金融工程到深度学习,约束控制模型行为;
- 算法扩展:投影梯度法将无约束优化与约束处理结合,平衡效率与可行性。
通过理论推导与实例结合,学生将掌握约束优化问题的完整解决流程,并能在工程与科研中灵活应用。
课时8:综合项目——优化与机器学习
教学目标
- 掌握深度学习优化器(如Adam)的原理与实现;
- 实现神经网络训练流程,分析优化器对模型性能的影响;
- 将优化理论应用于实际模型调参,理解超参数的作用;
- 对比不同优化器(SGD、动量法、Adam)在训练中的表现差异。
1. 深度学习中的优化器原理
Adam优化器公式推导
Adam(Adaptive Moment Estimation)结合动量法与自适应学习率:
- 一阶矩估计(动量):
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt−1+(1−β1)gt - 二阶矩估计(自适应学习率):
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 vt=β2vt−1+(1−β2)gt2 - 偏差校正(解决初始零偏问题):
m ^ t = m t 1 − β 1 t , v ^ t = v t 1 − β 2 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t} m^t=1−β1tmt,v^t=1−β2tvt - 参数更新:
θ t + 1 = θ t − α m ^ t v ^ t + ϵ \theta_{t+1} = \theta_t - \alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} θt+1=θt−αv^t+ϵm^t
参数说明:
- β 1 , β 2 \beta_1, \beta_2 β1,β2:动量衰减率(默认0.9, 0.999)
- α \alpha α:初始学习率
- ϵ \epsilon ϵ:数值稳定性常数(默认1e-8)
2. 典型示例:MNIST手写数字分类
任务描述
使用全连接神经网络(MLP)对MNIST数据集进行分类,对比不同优化器的性能。
模型架构
- 输入层:784维(28×28图像展平)
- 隐藏层:2层,每层128个神经元,ReLU激活
- 输出层:10维,Softmax激活
代码实现(PyTorch)
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms# 数据加载
transform = transforms.Compose([transforms.ToTensor()])
train_set = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True)# 定义模型
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.layers = nn.Sequential(nn.Linear(784, 128), nn.ReLU(),nn.Linear(128, 128), nn.ReLU(),nn.Linear(128, 10))def forward(self, x):return self.layers(x.view(-1, 784))model = MLP()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=1e-3) # 可替换为SGD或RMSprop# 训练循环
for epoch in range(10):for images, labels in train_loader:outputs = model(images)loss = criterion(outputs, labels)optimizer.zero_grad()loss.backward()optimizer.step()print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}')
优化器对比实验
优化器 | 超参数 | 测试准确率(5 epochs) | 训练损失曲线特性 |
---|---|---|---|
SGD | lr=0.1, momentum=0.9 | 95.2% | 收敛慢,波动大 |
Adam | lr=1e-3, betas=(0.9, 0.999) | 97.8% | 收敛快,平稳 |
RMSprop | lr=1e-3, alpha=0.99 | 96.5% | 初期震荡,后期稳定 |
3. 优化理论与调参实践
学习率的影响
- 过大:损失震荡或发散(如Adam中 α > 0.01 \alpha > 0.01 α>0.01);
- 过小:收敛缓慢(如SGD中 α < 0.01 \alpha < 0.01 α<0.01)。
动量系数的作用
- 高 β 1 \beta_1 β1(如0.99):平滑梯度噪声,但可能错过尖锐极小值;
- 低 β 1 \beta_1 β1(如0.8):快速响应梯度变化,但易受噪声干扰。
自适应学习率的优势
- 非均匀参数更新:对频繁特征(大梯度)使用小步长,稀疏特征(小梯度)使用大步长;
- 适用于高维非凸问题(如神经网络)。
4. 课后作业
- 编程任务:
- 在CIFAR-10数据集上,用PyTorch实现ResNet-18模型,对比Adam与SGD优化器的训练速度与准确率;
- 修改Adam超参数(如 β 1 = 0.8 \beta_1=0.8 β1=0.8, β 2 = 0.95 \beta_2=0.95 β2=0.95),观察模型收敛性变化。
- 理论分析:
- 推导Adam优化器在凸函数下的收敛性条件(参考Reddi et al. 2018);
- 解释为什么Adam在深度学习中被广泛使用,但其默认超参数不一定适合所有任务。
关键点总结
- Adam优势:自适应学习率+动量,适合非凸、高维、稀疏梯度问题;
- 调参核心:学习率、动量系数、批次大小协同影响模型性能;
- 理论联系实际:优化器的设计源于对损失函数几何特性的理解;
- 局限性:Adam可能在某些任务上陷入局部最优,需结合学习率调度(如Cosine衰减)。
通过综合项目实践,学生将深入理解优化理论与机器学习的紧密联系,并掌握从理论推导到工程实现的完整技能链。
lr=1e-3, betas=(0.9, 0.999) | 97.8% | 收敛快,平稳 |
| RMSprop | lr=1e-3, alpha=0.99 | 96.5% | 初期震荡,后期稳定 |
3. 优化理论与调参实践
学习率的影响
- 过大:损失震荡或发散(如Adam中 α > 0.01 \alpha > 0.01 α>0.01);
- 过小:收敛缓慢(如SGD中 α < 0.01 \alpha < 0.01 α<0.01)。
动量系数的作用
- 高 β 1 \beta_1 β1(如0.99):平滑梯度噪声,但可能错过尖锐极小值;
- 低 β 1 \beta_1 β1(如0.8):快速响应梯度变化,但易受噪声干扰。
自适应学习率的优势
- 非均匀参数更新:对频繁特征(大梯度)使用小步长,稀疏特征(小梯度)使用大步长;
- 适用于高维非凸问题(如神经网络)。
4. 课后作业
- 编程任务:
- 在CIFAR-10数据集上,用PyTorch实现ResNet-18模型,对比Adam与SGD优化器的训练速度与准确率;
- 修改Adam超参数(如 β 1 = 0.8 \beta_1=0.8 β1=0.8, β 2 = 0.95 \beta_2=0.95 β2=0.95),观察模型收敛性变化。
- 理论分析:
- 推导Adam优化器在凸函数下的收敛性条件(参考Reddi et al. 2018);
- 解释为什么Adam在深度学习中被广泛使用,但其默认超参数不一定适合所有任务。
关键点总结
- Adam优势:自适应学习率+动量,适合非凸、高维、稀疏梯度问题;
- 调参核心:学习率、动量系数、批次大小协同影响模型性能;
- 理论联系实际:优化器的设计源于对损失函数几何特性的理解;
- 局限性:Adam可能在某些任务上陷入局部最优,需结合学习率调度(如Cosine衰减)。
通过综合项目实践,学生将深入理解优化理论与机器学习的紧密联系,并掌握从理论推导到工程实现的完整技能链。
相关文章:
《最优化理论基础》8课时层次化教案
《最优化理论基础》8课时层次化教案 课程总目标 掌握最优化核心理论(最优性条件、凸分析、对偶理论);能独立实现经典优化算法(梯度法、牛顿法、约束优化建模);理解优化理论与机器学习模型的关联ÿ…...
从源码深入理解One-API框架:适配器模式实现LLM接口对接
1. 概述 one-api 是一个开源的 API 框架,基于go语言开发,旨在提供统一的接口调用封装,支持多种 AI 服务平台的集成。通过 Gin 和 GORM 等框架,框架简化了多种 API 服务的调用流程。通过适配器模式实现了与多种 大模型API 服务的集…...
2025年国产化推进.NET跨平台应用框架推荐
2025年国产化推进.NET跨平台应用框架推荐 1. .NET MAUI NET MAUI是一个开源、免费(MIT License)的跨平台框架(支持Android、iOS、macOS 和 Windows多平台运行),是 Xamarin.Forms 的进化版,从移动场景扩展到…...
Tensor 基本操作4 理解 indexing,加减乘除和 broadcasting 运算 | PyTorch 深度学习实战
前一篇文章,Tensor 基本操作3 理解 shape, stride, storage, view,is_contiguous 和 reshape 操作 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started Tensor 基本使用 索引 indexing示例代码 加减…...
图扑 2024 全年精彩回顾 | 稳步向前
2024 年即将过去,回顾这一年,图扑软件在多个领域取得了显著成就,我们斩获多项行业奖项,稳步提升了市场地位,并在产品创新上推出了一系列新功能,提升了用户体验。与此同时,通过与合作伙伴紧密协作…...
[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题)
[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题) 简介 粘包问题底层原理分析 粘包问题的解决 简介 在Python学习日记-78我们留下了两个问题,一个是服务器端 send() 中使用加号的问题,…...
【数据结构】深入解析:构建父子节点树形数据结构并返回前端
树形数据结构列表 一、前言二、测试数据生成三、树形代码3.1、获取根节点3.2、遍历根节点,递归获取所有子节点3.3、排序3.4、完整代码 一、前言 返回前端VO对象中,有列情况列表展示需要带树形结构,例如基于RBAC权限模型中的菜单返回…...
【统计的思想】假设检验(二)
假设检验是根据人为设定的显著水平,对被测对象的总体质量特性进行统计推断的方法。 如果我们通过假设检验否定了零假设,只是说明在设定的显著水平下,零假设成立的概率比较小,并不是说零假设就肯定不成立。如果零假设事实上是成立…...
IT服务规划设计
1. IT服务设计的作用 1) 设计满足需求的IT服务。 2) 设计SAL,测量方法和指标。 3) 设计服务过程及控制方法。...
高效查找:二分查找算法解析
1.二分查找简介 二分查找算法(Binary Search)是一种高效的查找算法,适用于有序数组或序列。它的基本思想是通过逐步缩小查找范围,将查找区间一分为二,直到找到目标值或确定目标值不存在。 算法原理:在数组…...
电脑办公技巧之如何在 Word 文档中添加文字或图片水印
Microsoft Word是全球最广泛使用的文字处理软件之一,它为用户提供了丰富的编辑功能来美化和保护文档。其中,“水印”是一种特别有用的功能,它可以用于标识文档状态(如“草稿”或“机密”)、公司标志或是版权信息等。本…...
我的求职之路合集
我把我秋招和春招的一些笔面试经验在这里发一下,网友们也可以参考一下。 我的求职之路:(1)如何谈自己的缺点 我的求职之路:(2)找工作时看重的点 我的求职之路:(3&…...
FPGA自分频产生的时钟如何使用?
对于频率比较小的时钟,使用clocking wizard IP往往不能产生,此时就需要我们使用代码进行自分频,自分频产生的时钟首先应该经过BUFG处理,然后还需要进行时钟约束,处理之后才能使用。...
【2025最新计算机毕业设计】基于SpringBoot+Vue爬虫技术的咖啡与茶饮料文化平台(高质量源码,可定制,提供文档,免费部署到本地)
作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...
jmeter中对接口进行循环请求后获取相应数据
1、工作中遇到一个场景就是对某个单一接口进行循环请求,并需要获取每次请求后返回的相应数据; 2、首先就在jmeter对接口相关组件进行配置,需要组件有:循环控制器、CSV数据文件设置、计数器、访问接口、HTTP信息头管理器、正则表达…...
RocketMQ 怎么保证消息的可靠性?
目录 1. 消息发送可靠性 1.1 同步发送 1.2 异步发送 1.3 发送重试 1.4 事务消息 2. 消息存储可靠性 2.1 CommitLog 持久化 2.2 刷盘机制 2.3 主从复制 2.4 消息索引 3. 消息消费可靠性 3.1 消费确认机制 3.2 消费重试机制 3.3 消费位点管理 3.4 集群消费与广播消…...
基于 Node.js 的天气查询系统实现(附源码)
项目概述 这是一个基于 Node.js 的全栈应用,前端使用原生 JavaScript 和 CSS,后端使用 Express 框架,通过调用第三方天气 API 实现天气数据的获取和展示。 主要功能 默认显示多个主要城市的天气信息 支持城市天气搜索 响应式布局设计 深色主题界面 优雅的加载动画 技术栈 …...
C++函数初识
文章目录 一、形参带默认值的函数二、inline内联函数三、函数重载 一、形参带默认值的函数 给默认值的时候,从右向左给;调用效率的问题;定义处可以给形参默认值,声明也可以给形参默认值;形参给默认值的时候࿰…...
代码随想录day3
203:移除链表元素:注意虚拟头节点的使用 ListNode* removeElements(ListNode* head, int val) {ListNode* result new ListNode();result->next head;ListNode* current result;while(current ! nullptr && current->next ! nullptr){if(current-…...
论文+AI赋能教育:探索变革路径与创新实践。包括word和pdf格式。
下载地址链接: https://download.csdn.net/download/wanggang130532/90292129https://download.csdn.net/download/wanggang130532/90292129...
ray.rllib 入门实践-5: 训练算法
前面的博客介绍了ray.rllib中算法的配置和构建,也包含了算法训练的代码。 但是rllib中实现算法训练的方式不止一种,本博客对此进行介绍。很多教程使用 PPOTrainer 进行训练,但是 PPOTrainer 在最近的 ray 版本中已经取消了。 方式1࿱…...
uniapp 在线更新应用
在线更新应用及进度条显示 1.比较现安装手机中的apk 与线上apk的版本 getVersion(){var newVersionuni.getStorageSync("newVersion").split(".")var versionplus.runtime.version.split(".") // 获取手机安装的版本var versionNum""…...
中间件安全
一.中间件概述 1.中间件定义 介绍:中间件(Middleware)作为一种软件组件,在不同系统、应用程序或服务间扮演着数据与消息传递的关键角色。它常处于应用程序和操作系统之间,就像一座桥梁,负责不同应用程序间…...
从根源分析,调试,定位和解决MacOS ld: unsupported tapi file type ‘!tapi-tbd‘ in YAML file
你要是遇到同样错误,找一圈都没有解决,建议认真读一下本文,这个应该是最终极的解决办法,从原理上剖析了产生的原因,同时给出来了调试和定位的办法。 maccos使用brew安装了一个gcc14, 结果编译一个最简单的程序都报错&a…...
Linux的权限和一些shell原理
目录 shell的原理 Linux权限 sudo命令提权 权限 文件的属性 ⽂件类型: 基本权限: chmod改权限 umask chown 该拥有者 chgrp 改所属组 最后: 目录权限 粘滞位 shell的原理 我们广义上的Linux系统 Linux内核Linux外壳 Linux严格…...
构建企业级React应用的进阶实践
构建企业级React应用的进阶实践 在当今前端开发领域,React凭借其组件化架构和声明式编程范式,已成为构建复杂用户界面的首选方案。本文将深入探讨React的高级应用场景,通过一系列精心设计的代码示例,展示如何打造高性能、可维护的…...
2024年度总结:技术探索与个人成长的交织
文章目录 前言年度创作回顾:技术深耕与分享数据库技术:MySQL 与 MyBatisJava 及相关技术栈计算机网络:构建网络知识体系思维方式的转变:构建技术知识体系的桥梁 项目实践:人工智能与智慧医疗的碰撞生活与博客的融合与平…...
mysql-06.JDBC
目录 什么是JDBC: 为啥存在JDBC: JDBC工作原理: JDBC的优势: 下载mysql驱动包: 用java程序操作数据库 1.创建dataSource: 2.与服务端建立连接 3.构造sql语句 4.执行sql 5.关闭连接,释放资源 参考代码: 插…...
arm-linux平台、rk3288 SDL移植
一、所需环境资源 1、arm-linux交叉编译器,这里使用的是gcc-linaro-6.3.1 2、linux交叉编译环境,这里使用的是Ubuntu 20.04 3、sdl2源码 https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.30.11.tar.gz 二、代码编译 1、解压sdl2源码…...
CentOS 上安装 Go (Golang)
1. 检查系统环境 确保系统为 CentOS 7 或 CentOS 8,或者其他兼容的 Linux 发行版。 cat /etc/os-release2. 安装依赖 安装一些必要的工具: sudo yum update -y sudo yum install -y wget tar3. 下载 Go 从 Go 官方下载页面获取适用于 Linux 的最新版…...
小哆啦解题记:整数转罗马数字
小哆啦解题记:整数转罗马数字 小哆啦开始力扣每日一题的第十四天 https://leetcode.cn/problems/integer-to-roman/submissions/595220508/ 第一章:神秘的任务 一天,哆啦A梦接到了一项任务——将一个整数转换为罗马数字。他心想:…...
碰撞体问题
用点检测2d物体是否有物体 功能要求是点击空白处取消选中,点击棋子选中所以我做了一个射线检测。但是脑子的惯性让我用的是3D的射线检测。但我们这是一个2D游戏啊。 Vector3 mousePos pos;mousePos.z 10f; // 假设你需要转换到距离相机10单位的世界位置Vector3 …...
HTML<label>标签
例子 三个带标签的单选按钮: <form action"/action_page.php"> <input type"radio" id"html" name"fav_language" value"HTML"> <label for"html">HTML</label><br&…...
「 机器人 」利用数据驱动模型替代仿真器:加速策略训练并降低硬件依赖
前言 在强化学习(Reinforcement Learning, RL)中,策略训练需要大量的交互数据(状态、动作、奖励、下一状态),而这些数据通常来自仿真器或真实硬件。传统高保真仿真器虽然能在一定程度上模拟飞行器的动力学,但往往计算量大、开发成本高,且仍可能与真实环境存在差距。为此…...
.Net Core微服务入门全纪录(六)——EventBus-事件总线
系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…...
QD Laser携“Lantana”激光器参展SPIE光子学西部展2025,聚焦紧凑型设计
据悉,QD Laser公司将在2025年SPIE光子学西部展览会上展出其最新产品——世界最小一体化紧凑型可见光激光器“Lantana”。该展会将于1月28日至30日在旧金山的Moscone中心举行。 在展会期间,QD Laser公司将现场展示这款超小型、轻便设备—— “Lantana”。…...
Docker + Nginx 部署个人静态博客指南
本文是一个使用 Docker 和 Nginx 部署个人静态博客的指南。通过本指南,您可以快速了解如何使用 Docker 和 Nginx 部署自己的静态博客网站。 前提 在开始使用本指南之前,请具备以下前提: 首先你得有个服务器服务器已经安装好Git、Vim等工具一…...
springboot3 集成 knife4j(接口文档)
提示:文章是集成 knife4j,而非 swagger2 或者 swagger3,效果如图 文章目录 前言一、添加依赖二、如何集成1.配置文件2.注解部分1.Tag2.Operation3.Parameter4.Schema 3.使用 总结 前言 提示::大家在开发阶段ÿ…...
批量创建ES索引
7.x from elasticsearch import Elasticsearch# 配置 Elasticsearch 连接 # 替换为你的 Elasticsearch 地址、端口、用户名和密码 es Elasticsearch([http://10.10.x.x:43885],basic_auth(admin, XN272G9THEAPYD5N5QORX3PB1TSQELLB) )# # 测试连接 # try: # # 尝试获取集…...
单路由及双路由端口映射指南
远程登录总会遇到登陆不上的情况,可能是访问的大门没有打开哦,下面我们来看看具体是怎么回事? 当软件远程访问时,主机需要两个条件,一是有一个唯一的公网IP地址(运营商提供),二是开…...
基于Springboot + vue实现的民俗网
“前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能学习网站” 💖学习知识需费心, 📕整理归纳更费神。 🎉源码免费人人喜…...
動態住宅IP提升網站訪問成功率
動態住宅IP通常與普通家庭用戶的網路連接相關聯。這種IP地址的特點在於,它是動態變化的,用戶在每次連接時可能會獲得不同的IP地址。這與靜態IP形成了鮮明對比,後者在連接期間保持不變。傳統上,IP地址分為住宅IP和數據中心IP兩類。…...
Java集合学习:HashMap的原理
一、HashMap里的Hash是什么? 首先,我们先要搞清楚HashMap里的的Hash是啥意思。 当我们在编程过程中,往往需要对线性表进行查找操作。 在顺序表中查找时,需要从表头开始,依次遍历比较a[i]与key的值是否相等ÿ…...
使用rsync+inotify简单实现文件实时双机双向同步
使用rsyncinotify简单实现文件实时双机双向同步 实现思路 使用inotify-tools的inotifywait工具监控文件变化,触发后使用rsync做同步。加入系统服务项,实现实时监听,方便管理。 以下配置操作,单向同步,只需在单边部…...
[JavaScript] ES6及以后版本的新特性
文章目录 箭头函数(Arrow Functions)为什么需要箭头函数?箭头函数的完整语法箭头函数中的 this实用场景 解构赋值(Destructuring Assignment)为什么需要解构赋值?数组解构赋值的完整用法对象解构赋值的完整…...
IO进程 寒假作业
一、请使用消息队列实现2个终端之间互相聊天 #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/wait.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> …...
无公网IP 外网访问媒体服务器 Emby
Emby 是一款多媒体服务器软件,用户可以在 Emby 创建自己的个人多媒体娱乐中心,并且可以跨多个设备访问自己的媒体库。它允许用户管理传输自己的媒体内容,比如电影、电视节目、音乐和照片等。 本文将详细的介绍如何利用 Docker 在本地部署 Emb…...
【2025小年源码免费送】
💖学习知识需费心, 📕整理归纳更费神。 🎉源码免费人人喜, 🔥码农福利等你领! 💖山高路远坑又深, 📕大军纵横任驰奔, 🎉谁敢横刀立马行…...
哈希表示例
示例1 两数之和 "两数之和"(Two Sum)是LeetCode上的一个经典算法问题,编号为1,它要求在一个整数数组nums中找到两个不同的索引i和j,使得nums[i] nums[j] target。 问题描述: 给定一个整数数…...
VS企业版和专业版的区别
网上查询vs分析dump文件,查找托管内存泄露,需要使用“调试托管内存”功能,当前安装的vs2022 专用版找不到这个选项,vs2015是ok的,比较版本发现2022是专业版,2015是企业版。网上搜索专业版和企业版差异如下&…...