机器学习基本就是把问题转化成某个损失函数,然后求极值。函数的极值分为全局极值和局部极值,两种都满足一个条件f′=0f^{\prime}=0f′=0或∇f=0\nabla f=0∇f=0。
牛顿法:二阶泰勒级数逼近
单元函数
在初始值x0x_0x0附近,将f(x)f(x)f(x)进行二阶泰勒展开,f(x0+△x)=f(x0)+f′(x0)△x+12f′′(x0)△x2+o(△x2)f(x_0+△x)=f(x_0)+f^{\prime}(x_0)△x+{1\over2}f^{\prime\prime}(x_0)△x^2+o(△x^2)f(x0+△x)=f(x0)+f′(x0)△x+21f′′(x0)△x2+o(△x2)
f(x0+△x)=g(△x)+o(△x2)f(x_0+△x)=g(△x)+o(△x^2)f(x0+△x)=g(△x)+o(△x2)
g(△x)g(△x)g(△x)是二次函数,对它进行求导,令导数等于0,即可求导极值点,因为是二次函数,所以不确定是极大还极小。
g(△x)g(△x)g(△x)极值点为−f′(x0)f′′(x0)-{f^{\prime}(x_0)\over {f^{\prime\prime}(x_0)}}−f′′(x0)f′(x0),由于f(x)f(x)f(x)和g(△x)g(△x)g(△x)只相差一个o(△x2)o(△x^2)o(△x2),因此f(x)f(x)f(x)在x0x_0x0附近这一很小很小的局部内的极值点为x=x0−f′(x0)f′′(x0)x=x_0-{f^{\prime}(x_0)\over {f^{\prime\prime}(x_0)}}x=x0−f′′(x0)f′(x0)
通过迭代可得xn=xn−1−f′(xn−1)f′′(xn−1)x_n=x_{n-1}-{f^{\prime}(x_{n-1})\over {f^{\prime\prime}(x_{n-1})}}xn=xn−1−f′′(xn−1)f′(xn−1),通过一步一步迭代,就能够求出在一个较大的局部范围内,f(x)f(x)f(x)的极值点。
多元函数
在实际应用中,往往是解决多元函数的问题。多元函数是用向量和矩阵进行表示运算。
f(x⃗)=f(x0⃗)+gT(x⃗−x0⃗)+12(x⃗−x0⃗)TH(x⃗−x0⃗)+o()f(\vec{x})=f(\vec{x_0})+g^T(\vec{x}-\vec{x_0})+{1\over2}(\vec{x}-\vec{x_0})^TH(\vec{x}-\vec{x_0})+o()f(x)=f(x0)+gT(x−x0)+21(x−x0)TH(x−x0)+o()
其中,gT=[∂f(x)⃗x1,∂f(x)⃗x2,...,∂f(xn)⃗xn]g^T=[{\partial f(\vec{x)}\over{x_1}}
,{\partial f(\vec{x)}\over{x_2}},...,{\partial f(\vec{x_n)}\over{x_n}}]gT=[x1∂f(x),x2∂f(x),...,xn∂f(xn)]
f(x)f(x)f(x)的梯度。HHH为hassion矩阵,函数的二阶偏导数。
H=[∂2f(x⃗)∂x1∂x1∂2f(x⃗)∂x1∂x2⋯∂2f(x⃗)∂x1∂xn∂2f(x⃗)∂x2∂x1∂2f(x⃗)∂x2∂x2⋯∂2f(x⃗)∂x2∂xn⋮⋮⋱⋮∂2f(x⃗)∂xn∂x1∂2f(x⃗)∂xn∂x2⋯∂2f(x⃗)∂xn∂xn]H=\begin{bmatrix}
{{\partial ^2f(\vec{x})} \over {\partial{x_1}{\partial{x_1}}}}&{{\partial ^2f(\vec{x})} \over {\partial{x_1}{\partial{x_2}}}}&{\cdots}&{{\partial ^2f(\vec{x})} \over {\partial{x_1}{\partial{x_n}}}}\\
{{\partial ^2f(\vec{x})} \over {\partial{x_2}{\partial{x_1}}}}&{{\partial ^2f(\vec{x})} \over {\partial{x_2}{\partial{x_2}}}}&{\cdots}&{{\partial ^2f(\vec{x})} \over {\partial{x_2}{\partial{x_n}}}}\\
{\vdots}&{\vdots}&{\ddots}&{\vdots}\\
{{\partial ^2f(\vec{x})} \over {\partial{x_n}{\partial{x_1}}}}&{{\partial ^2f(\vec{x})} \over {\partial{x_n}{\partial{x_2}}}}&{\cdots}&{{\partial ^2f(\vec{x})} \over {\partial{x_n}{\partial{x_n}}}}\\
\end{bmatrix}H=⎣⎢⎢⎢⎢⎢⎡∂x1∂x1∂2f(x)∂x2∂x1∂2f(x)⋮∂xn∂x1∂2f(x)∂x1∂x2∂2f(x)∂x2∂x2∂2f(x)⋮∂xn∂x2∂2f(x)⋯⋯⋱⋯∂x1∂xn∂2f(x)∂x2∂xn∂2f(x)⋮∂xn∂xn∂2f(x)⎦⎥⎥⎥⎥⎥⎤
由单元函数可得,多元函数极值点迭代公式:
xn⃗=xn−1⃗−H(xn−1⃗)g(xn−1⃗)\vec{x_n}=\vec{x_{n-1}}-{{H(\vec{x_{n-1}}) }\over g(\vec{x_{n-1}})}xn=xn−1−g(xn−1)H(xn−1)
梯度下降法:一阶逼近
梯度下降用于多元函数,采用一阶逼近。
f(x⃗)=f(x0⃗)+gT(x⃗−x0⃗)+o(x⃗−x0⃗)f(\vec{x})=f(\vec{x_0})+g^T(\vec{x}-\vec{x_0})+o(\vec{x}-\vec{x_0})f(x)=f(x0)+gT(x−x0)+o(x−x0)
梯度下降法采用是一阶逼近,线性逼近,无法通过求导令导数等于0来获取极值,只能沿着梯度反方向−g-g−g(求最小值)一点点尝试靠近。
xn⃗=xn−1⃗−lxn−1⃗g(xn−1⃗)T\vec{x_n}=\vec{x_{n-1}}-l\vec{x_{n-1}}g(\vec{x_{n-1}})^Txn=xn−1−lxn−1g(xn−1)T
其中lll为学习率,控制着往梯度方向移动的步伐大小,取值过小,移动过慢,收敛速度就慢,但是取值大了,可能跳过极值点,倒是不收敛。
两种特点总结
- 两种都是求局部最优值(因为采用的是局部逼近的方法)。
- 当初值选取得当时,牛顿法收敛快(不止有梯度,还有求导得到极值)。
- 牛顿法需要求二阶导数,对于多元函数,H矩阵计算量很大
- 牛顿法其实是在平衡点收敛,有可能是极大值,也可能是极小值,还有可能是鞍点。梯度下降法是顾明思义就是求极小值,但也可能求鞍点。