1. 向量 y 对标量 x 求导#
设 y=f(x),其中 y=(y1,⋯,ym)T,那么
dxdy=dxdy1⋮dxdym
即,y 的每个分量各自对 x 求导。
举例:
y=f(x)=[x23x]
那么
dxdy=[2x3]
2. 标量 y 对向量 x 求导#
设 y=f(x),其中 x=(x1,⋯,xn)T,那么
∂x∂y=∂x∂f=∇f=∂x1∂y⋮∂xn∂y
该向量称为梯度,其每个分量表示多元数量值函数 f 在该方向上的变化速率,而梯度向量的方向就是 f 数值变化最快的方向。
注意,为了保持微分的“线性近似”意义,有些地方将 ∂x∂y 定义为行向量(即上述向量的转置),以便支持 dy=∂x∂ydx 的乘法(行向量乘列向量得到一个数);但是,在机器学习中,求梯度更多是为了梯度下降,此时更适合保持梯度向量与原向量形状一致,即都定义为列向量。
两种定义只差了一个转置,其余没有区别。
梯度还可以用来求方向导数(f 在某一个方向上的变化速率)。比如,取方向 u ( ∣∣u∣∣=1 ),那么 f 在点 x 附近,沿着方向 u 的变化速率为 Duf(x)=∇f(x)Tu,这可以通过 h→0limhf(x+hu)−f(x) 结合偏导的线性近似意义得到。
举例:
f(x1,x2)=x12+3x2
那么
∇f=[2x13]
常用公式汇总#
其中 a 不是 x 的函数,0 和 1 是向量,⟨u,v⟩ 表示内积。
y∂x∂ya0Taua∂x∂usum(x)1T∣∣x∣∣22xTu+v∂x∂u+∂x∂vuv∂x∂uv+∂x∂vu⟨u,v⟩uT∂x∂v+vT∂x∂u
3. 向量 y 对向量 x 求导#
设 y=f(x),其中 y=(y1,⋯,ym)T,x=(x1,⋯,xn)T。
此时求导结果是一个 m×n 的矩阵,称为 Jacobian 矩阵。
J=∂x∂y=∂x1∂y1⋮∂x1∂ym⋯⋱⋯∂xn∂y1⋮∂xn∂ym
它表示在 x 点附近,f 的线性近似:
f(x+Δx)≈f(x)+JΔx
不难看出,Jacobian 矩阵是对梯度的推广。其采用了梯度的行向量形式以符合乘法,只不过将标量 y 换为了向量 y,然后再通过 1. 的方法展开 ∂xi∂y 成一列即可。
常用公式汇总#
x∈Rn,y∈Rm,∂x∂y∈Rn×m.
a,a,A 都不是 x 的函数。
y∂x∂yaOxIAxAxTAATaua∂x∂uAuA∂x∂uu+v∂x∂u+∂x∂v