Skip to content

内容包括梯度下降基本原理,矩阵求导基础。

前置知识 ​

在推导之前先复习一下一些基础知识。

一阶导数定义 ​

f′(x)=limΔx→0ΔyΔx=f(Δx+x)−f(x)Δx

多元函数偏导数定义 ​

fx1(x1,x2,...)=limΔx→0f(x1+Δx,x2,x3,...)−f(x1,x2,x3,...)Δx

方向导数的定义 ​

偏导数定义只是沿着某个坐标轴方向的导数,多元函数的自变量在某点可以沿无数个方向运动,多元函数沿着某个方向上的变换率称为 ==方向导数== ,它的推导过程如图所示(2个变元的情况)

limt→0+f(x0+tcos⁡α,y0+tsin⁡α)−f(x0,y0)t=limt→0+[f(x0+tcos⁡α,y0+tsin⁡α)−f(x0,y0+tsin⁡α)t+f(x0,y0+tsin⁡α)−f(x0,y0)t]=limt→0[fx(ξx,y0+tsin⁡α)tcos⁡αt+fy(x0,ξy)tsin⁡αt],ξx∈(x0,x0+tcos⁡α),ξy∈(y0,y0+tsin⁡α)=fx(x0,y0)cos⁡α+fy(x0,y0)sin⁡α

梯度的定义 ​

多元函数在某一点的梯度是一个非常特殊的向量,其由多元函数对每个变量的偏导数组成,(这即是为什么求梯度的时候需要对各个变量求偏导的原因),其方向为函数在该点增加最快的方向,大小(向量的模长)为函数在该点的最大变化率。

将上面的方向导数写成两个向量相乘的格式,就得到了:

fx(x0,y0)cos⁡α+fy(x0,y0)sin⁡α=(fx(x0,y0)fy(x0,y0))(cos⁡αsin⁡α)

设有两个变量 g=(fx(x0,y0)fy(x0,y0))和el=(cos⁡αsinα)

g⋅el=|g||el|cosθ=|g|cosθ

θ 为两个向量之间的夹角,所以该向量点乘结果(也就是方向导数)

  • 在θ=0的情况下。此时函数的变化率最大,函数呈上升趋势

  • 在θ=π的情况下函数的变化率最大,函数呈下降趋势

梯度下降原理 ​

因为梯度指示了函数变化率最大的地方,因此只要每次沿着梯度指示方向的反方向更新当前网络的参数并一直迭代,就可以将loss函数优化到最低点。

w=wj−α∇J(Wj)

矩阵求导 ​

由于在机器学习中,我们使用最多的数据一般都是向量或者矩阵形式的,很少有标量的情况,因此我们还需要学习矩阵求导的相关知识。

矩阵求导和函数求导还是不太一样的,具体学习可以参考下面这两个链接。矩阵求导的本质就是 一个函数 function的每一个f对变元中的每个元素逐个求偏导。但是在神经网络中一般涉及到的形式一般是输入一组矩阵或者向量,最后输出的loss值一般为一个标量用于衡量网络的性能。所这里就只考虑f是一个矩阵变元的实值标量函数,我们需要使用梯度下降优化这个函数的参数,使该函数的输出值最小。

这里推荐两篇文章,这里只是对这两篇文章的一些总结,更详细的内容可以直接看原文。

矩阵求导术

矩阵求导

矩阵求导布局 ​

  1. 分子布局:求导的 f 是列向量的形式,分子X是行向量的形式
  2. 分母布局:求导的 f是行向量的形式,分子X是列向量的形式

分子布局和分母布局互为转置。

矩阵求导常用的四个法则以及公式 ​

矩阵求导的四个法则跟一元函数求导的法则是一致的,可以直接借鉴过来

∂C∂X=0∂[c1f(x)+c2g(x)]∂z=c1∂f(x)∂z+c2∂g(x)∂z∂[f(x)g(x)]∂z=∂f(x)∂zg(x)+f(z)∂g(z)∂z∂[f(x)g(x)]∂z=1g2(x)[∂f(x)∂xg(z)−f(z)∂g(x)∂x]

一些补充公式

∂(xTa)∂x=∂(aTx)∂x=a∂(xTx)∂z=2x∂(xTAx)∂x=Ax+ATx

矩阵求导的进阶技巧 ​

上面写都是矩阵求导的基本法则,类似于使用定义法求一元函数的导数,使用的场合不多,更为常用的方法是使用迹技巧去求解。

首先来看迹的定义:

tr(A)=a11+a22+⋯+ann=∑i=1nai

一些常见的迹的公式

tr(c)=ctr(c1A+c2B)=c1tr(A)+c2tr(B)tr(A)=tr(AT)tr(ABC)=tr(CAB)=tr(BCA)―,Am×n,Bn×p,Cp×mtr(ABT)=tr(BTA)=tr(ATB)=tr(BAT)tr(|A|)=|A|tr(A−1dA)=tr(|A|A−1dA)tr(AT(B⊙C))=tr((A⊙B)TC)

注意上面画横线的那个公式的意思是两个矩阵相乘的迹,可以将后 一个的矩阵提到前面去,结果不改变。

矩阵乘积的迹,(注意这里迹的表示,这对理解为什么可以利用迹来求导至关重要)

设有两个矩阵,A2×3和B3×2

A=(a11a12a13a21a22a23)B=(b11b12b21b22b31b32)AB=(a11b11+a12b21+a13b31a11b12+a12b22+a13b32a21b11+a22b21+a23b31a21b12+a22b22+a23b32)tr(AB)=a11b11+a12b21+a13b31+a21b12+a22b22+a23b32

如果有A=BT,则两个矩阵相乘的迹等于对应位置的元素相乘并相加,可以理解为向量的点积在矩阵上的推广。

设有标量函数 f(X),Xm×n,求df(X)

df(X)=∂f∂x11 dx11+∂f∂x12 dx12+⋯+∂f∂x1n dx1n+∂f∂x21 dx21+∂f∂x22 dx22+⋯+∂f∂x2n dx2n+⋯+∂f∂xm1 dxm1+∂f∂xm2 dxm2+⋯+∂f∂xmn dxmn

可以发现,df(X)的结果其实就是两个矩阵(∂f∂Xij)i=1,j=1m,n和(dXij)i=1,j=1m,n对应位置相乘并相加,所以该式就可以写为迹的形式:

df(X)=∂f∂x11 dx11+∂f∂x12 dx12+⋯+∂f∂x1n dx1n+∂f∂x21 dx21+∂f∂x22 dx22+⋯+∂f∂x2n dx2n+⋯+∂f∂xm1 dxm1+∂f∂xm2 dxm2+⋯+∂f∂xmn dxmn=tr([∂f∂x11∂f∂x21⋯∂f∂xm1∂f∂x12∂f∂x22⋯∂f∂xm2⋮⋮⋮⋮∂f∂x1n∂f∂x2n⋯∂f∂xmn]n×m[dx11 dx12⋯dx1n dx21 dx22⋯dx2n⋮⋮⋮⋮dxm1 dxm2⋯dxmn]m×n)

所以就可以得出结论:df(X)=tr(∂f(X)∂XTdX)

如何使用矩阵微分求导 ​

对于实值标量函数f(X),tr(f(X))=f(X), df(X)=tr(df(X)) ,所以有

df(X)=d(tr(f(X)))=tr(df(X))

上面的公式表明,迹和求微分是可以交换的

下面计算一个简单的例题:证明正面下面结论。

∂tr(XTX)∂X=2X⇒d(tr(XTX))=tr(dXTX)=tr(dXTX+XTdX)=tr(dXTX)+tr(XTdX)=tr(XdXT)+tr(XTdX)=tr(XTdX)+tr(XTdX)=tr(2XTdX)⇒∂tr(XTX)∂X=2X⇒∂tr(XTX)∂XT=2XT

最新更新: