# 优化算法详解

## 矩阵求导之向量求导

• 对向量求导

$A_{m*n}=\left[ \begin{matrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \cdots & \cdots& \vdots & \cdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{matrix}\right]$

$x=\left[ \begin{matrix} x_1 \\ x_2 \\ \cdots \\ x_n \end{matrix}\right]$

$Ax = \left[ \begin{matrix} a_{11}x_1+a_{12}x_2+\cdots+a_{1n}x_n \\ a_{21}x_1+a_{22}x_2+\cdots+a_{2n}x_n \\ \cdots\\ a_{m1}x_1+a_{m2}x_2+\cdots+a_{mn}x_n \end{matrix} \right]$

$\frac{\partial Ax}{\partial x}=\left[ \begin{matrix} a_{11} & a_{21} & \cdots & a_{m1} \\ a_{12} & a_{22} & \cdots & a_{m2} \\ \cdots \\ a_{1n} & a_{2n} & \cdots & a_{mn} \end{matrix}\right] = A^T$

## 牛顿迭代法

• 多元函数的泰勒展开

$f(x_1+\Delta x_1,x_2+\Delta x_2+,\cdots ,x_n+\Delta x_n)$

$=\sum_{i=0}^{\infin}\frac{1}{i!}\big(\Delta x_1\frac{\partial}{\partial x_1}+ \Delta x_2\frac{\partial}{\partial x_2},\cdots,\Delta x_n\frac{\partial}{\partial x_n} \big)^if(x_1,x_2,\cdots,x_n)$

• 牛顿法求解零点

$x_{n+1}=x_n - f(x_n)/f^\prime(x_n)$

$f(x)=f(x_0)+f^\prime(x_0)(x-x_0)=>x=x_0-f(x_0)/f^\prime(x_0)$

$x_{n+1}=x_n - f(x_n)/f^\prime(x_n)$

• 牛顿法求极值点(一元)

$f(x)=f(x_0)+f^ \prime(x_0)(x-x_0)+\frac{1}{2}f^{\prime\prime}(x_0)(x-x_0)^2$

$x=x_0 - f^ \prime(x_0)/f^{\prime\prime}(x_0)$

• 牛顿法求极值点（多元）

$f(X)=f(X^0)+J^T(X^0)(X-X^0)+\frac{1}{2}(X-X^0)^TH^T(X^0)(X-X^0)$

$\left[ \begin{matrix} \frac{\partial f}{\partial x^0_0} \\ \frac{\partial f}{\partial x^0_1} \\ \frac{\partial f}{\partial x^0_2}\\ \vdots\\ \frac{\partial f}{\partial x^0_n} \end{matrix} \right] \tag{3}$

$\left[ \begin{matrix} \frac{\partial^2 f}{\partial^2 x^0_0}&\frac{\partial^2 f}{\partial x^0_0 \partial x^0_1}&\cdots&\frac{\partial^2 f}{\partial x^0_0\partial x^0_n}\\ \frac{\partial^2 f}{\partial x^0_1\partial x^0_0}&\frac{\partial^2 f}{\partial^2 x^0_1}&\cdots&\frac{\partial^2 f}{\partial x^0_1\partial x^0_n}\\ \frac{\partial^2 f}{\partial x^0_2 \partial x^0_0}&\ddots&&\vdots\\ \vdots&\cdots&\ddots&\vdots\\ \frac{\partial^2 f}{\partial x^0_n \partial x^0_0}&\cdots&\cdots& \frac{\partial^2 f}{\partial^2 x^0_n }& \end{matrix} \right] \tag{3}$

$X = X^0 - H^{-1}(X^0)J(X^0)$

$X^{k+1}=X^{k}-H^{-1}(X^k)J(X^k)$

1. 优点：二阶收敛，收敛速度较快
2. 缺点：牛顿法是一种迭代算法，每一步都需要求目标函数的Hessian矩阵的逆矩阵，计算较为复杂

• 阻尼牛顿迭代法
1. 牛顿迭代法变形

$X^{k+1}=X^{k}-H^{-1}(X^k)J(X^k)$
$X^{k+1}=X^k+d^k$

1. 增加阻尼

$X^{k+1}=X^{k}+\lambda^k d^k$
$\lambda^k = arg\min_{\lambda \in R}f(X^k +\lambda d^k)$

• 拟牛顿迭代法条件
1. 泰勒展开

$f(X) = f(X^{k+1})+J^T(X^{k+1})(X-X^{k+1})+\frac{1}{2}(X-X^{k+1})^TH(X^{k+1})(X-X^{k+1})$

1. 求偏导

$J(X)=J(X^{k+1})+H(X^{k+1})(X-X^{k+1})$

$J(X^k)=J(X^{k+1})+H(X^{k+1})(X^k-X^{k+1})$

1. 参数设计

a.$s^k= X^{k+1}-X^{k}$
b. $y^k=J(X^{k+1})-J(X^k)$
c. $D^{k+1}=(H^{k+1})^{-1}$

$y^k=H^{k+1}s^k$
$s^k=(H^{k+1})^{-1}y_k$
$s^k=D^{k+1}y^k$

• DFP算法
1. 该算法核心为：

$D^{k+1}=D^{k}+\Delta D^k$

1. 假设变化量

$\Delta D^k = \alpha uu^T +\beta vv^T$

1. 代入方程

$s^k=D^{k+1}y^k=(D^k+\Delta D^k)y^k=(D^k+ \alpha uu^T +\beta vv^T)y^k$
$s^k=D^ky_k+\alpha uu^Ty^k +\beta vv^Ty^k = D^ky^k +\alpha u^Ty^ku+\beta v^Ty^k v$

1. 简化方程

$au^Ty^k=1$
$\beta v^Ty^k=-1$

$s^k=D^ky^k +u-v$

$s^k-D^ky^k =u-v$

$u=s^k,v=D^ky^k$

$\alpha = \frac{1}{u^Ty^k}=\frac{1}{s_k^Ty^k}$
KaTeX parse error: Double superscript at position 65: …}=-\frac{1}{y^k^̲TD^ky_k}

1. 整合

$\Delta D_k = \alpha uu^T + \beta vv^T = \frac{s^k(s^k)^T}{(s^k)^Ty^k}-\frac{D^ky^k(y^k)^T(D^k)^T}{(y^k)^TD^ky^k}$

1. 计算流程

计算流程与牛顿法相同

$g_{k}<\delta$

• 共轭梯度法
1. 二次函数解释

设有二次函数$f(x)=\frac{1}{2}(x-\hat x)^TA(x-\hat x)$
其中A是n*n对称正定矩阵，$\hat x$是一个定点
则函数$f(x)$的等值面$\frac{1}{2}(x-\hat x)^TA(x-\hat x)=c$是以$\hat x$为中心的椭球面

示例：

• 由于$\Delta f(\hat x)=A(\hat x - \hat x)=0$
$\Delta^2f(\hat x)=A$
因为A正定，所以$\Delta^2f(\hat x)=A >0$
因此$\hat x$$f(x)$的极小点

• $x^0$是在某个等值面上的一点，$d^1$$R^n$中的一个方向，$x^0$沿$d^1$以最优步长搜索到点$x^1$,则$d^1$是点$x^1$所在等值面的切向量，该等值面在点$x^1$处的法向量为$\Delta f(x^1)$

• 示例：

• $\Delta f(x^1)=A(x^1-\hat x)$
$d^1$$\Delta f(x^1)$正交，即
$(d^1)^T\Delta f(x^1)=0$

1. 共轭方向

设A是n*n的对称正定矩阵，对于$R^n$中的两个非零向量$d^1$$d^2$，若有$(d^1)^TAd^2=0$，则称$d^1$$d^2$关于A共轭

定理一：

设A是n阶对称正定矩阵，$d^1,d^2,\cdots,d^k$是k个A共轭的非零向量，则这个向量组线性相关

• 定理二：

设有函数$f(x)=\frac{1}{2}x^TAx+b^Tx+c$,其中A是n阶对称正定矩阵。$d^1,d^2,\cdots,d^k$是一组A共轭向量。以任意的$x^1\in R^n$为初始点，依次沿$d^1,d^2,\cdots,d^k$进行搜索，得到$x^1,x^2,\cdots,x^{k+1}$，则$x^{k+1}$是函数$f(x)$$x^1+B_k$上的极小点，其中

$B_k=\{x|x=\sum_{i=1}^k \lambda_i d^i,\lambda_i \in R\}$

• 是由$d^1,d^2,\cdots,d^k$生成的子空间。特别地，当k=n时，$x^{n+1}$$f(x)$$R^n$上的唯一极小点。

1. 将给定的一组向量$r^1,r^2,\cdots,r^n$正交化

$d^1=r^1$
$d^n = r^n - k_1d^1-k_2d^2\cdots-k_{n-1}d^{n-1}$
因为 d之间关于A共轭，因此可得：
$k_{n-1}=\frac{d^{n-1}Ar^n}{d^{n-1}Ad^{n-1}}$
带入公式即可正则化为：$d^1,d^2,\cdots,d^n$

2. 求各点以及步长：

$v_1=x_1$
$v_2=x_1+k_1d^1,\cdots,v_{l+1}=x_1+k_1d_1+\cdots+k_ld_l$
因为有：(令$r=x_1 - \hat x$)
$(d^1)^TA(v_2-\hat x) =0$
$=>k_1=-\frac{(d^1)^TAr}{(d^1)^TAd^1}$
同理
$k_l = -\frac{(d^l)^TAr}{(d^l)^TAd^l}$
通过递推可以得到各个步长及其对应的点

## 动量法

$y$表示动力项
$v_t = \eta v_{t-1}+\gamma\Delta J(W)$
$W=W-v_t$

## NAG

$v_t = \eta v_{t-1}+\gamma \Delta J(W-\eta v_{t-1})$
$W = W -v_t$

NAG在TF中跟Momentum合并在同一个函数中tf.train.MomentumOptimizer中，可以通过参数配置启用。在Momentum中小球会盲目地跟从下坡的梯度，容易发生错误，所以我们需要一个更聪明的小球，这个小球提前知到要去哪里，它还要知道走到坡底的时候速度慢下来而不是冲上另一个坡，$\eta v_{t-1}$会用来修改W的值，计算$W-\eta v_{t-1}$可以表示小球下一个位置大概在哪里，从而我们可以提前计算下一个位置的梯度，然后使用到当前位置。

• 基本定义

$\Delta_\theta \sum_i (f(x^i;\theta),y^i)$

• 步骤：
1. 计算梯度

$g = \frac{1}{m}\Delta_\theta \sum_i L(f(x^i;\theta),y^i)$

1. 累计平方梯度

$r = r+ g*g$

1. 计算更新梯度

$\Delta \theta_t = -\frac{\epsilon}{\delta + \sqrt r}*g$

1. 应用更新

$\theta_{t+1} = \theta_t + \Delta \theta_{t}$

## RMSprop(Root Mean Square)

• 基本定义

$\Delta_\theta \sum_i (f(x^i;\theta),y^i)$

• 步骤：
1. 计算梯度

$g = \frac{1}{m}\Delta_\theta \sum_i L(f(x^i;\theta),y^i)$

1. 累计平方梯度

$r = \rho r+ (1-\rho)g*g$

1. 计算更新梯度

$\Delta \theta_t = -\frac{\epsilon}{ \sqrt{\delta +r} }*g$

1. 应用更新

$\theta_{t+1} = \theta_t + \Delta \theta_t$

1. 计算梯度

$g = \frac{1}{m}\Delta_\theta \sum_i L(f(x^i;\theta),y^i)$

1. 累计梯度

$r = \beta r + (1-\beta) g*g$

1. 计算参数更新方向

$\Delta \theta_t = -\frac{\eta}{\sqrt{r+\delta}}g$

1. 累计更新方向的值

$k = a k +(1-a)\Delta \theta_{t-1} *\Delta \theta_{t-1}$

1. 使用累计更新方向代替$\eta$

$\Delta \theta_t = -\frac{\sqrt{k+\tau}}{\sqrt{r+\delta}}g$

1. 应用

$\theta_{t+1}=\theta_{t}+\Delta \theta_t$

1. 当前速度

$v_t = \beta_1 v_{t-1} + (1- \beta_1)g_t$

1. 更新速度

$r_t = \beta_2 r_{t-1} +(1-\beta_2)g^2_t$

1. 修正

$v^{\prime}_t = \frac{v_t}{1-\beta^t_1}$
$r^{\prime}_t = \frac{r_t}{1-\beta^t_2}$

1. 参数更新

$\theta_{t+1}=\theta_t - \frac{a}{\sqrt{r^{\prime}_t+\delta}}v_t$