矩阵求导与神经网络反向传播

矩阵求导

关于矩阵求导,其实严格意义上来说仅仅只是一种求导的矩阵表示形式,其本质还是和普通多元函数求导过程是一致的。将矩阵的各个元素拆分开来,将矩阵运算写成各个元素之间的运算,矩阵变换可以变成多元函数,这样矩阵求导过程就可以与多元函数求导过程联系起来了。要理解矩阵求导运算,最主要的其实是理解矩阵导数的表示,将矩阵导数的拆分形式与多元函数求导联系起来。
本文主要参考《Matrix cookbook》和wiki上面的内容,下面简单介绍一下矩阵求导的相关内容,为后面介绍前馈神经网络FNN的反向传播过程做铺垫。

矩阵求导的表示形式之一:值函数对向量/矩阵变量的导数

下面表达式中, y y 表示一个实值函数, x x 表示一个向量变量,那么他们的矩阵求导含义为:

yx=yx1yx2yxn ∂ y ∂ x = [ ∂ y ∂ x 1 ∂ y ∂ x 2 ⋯ ∂ y ∂ x n ]

y y 表示一个实值函数, X X 表示一个矩阵变量:
yX=yx11yx21yxp1yx12yx22yxp2yx1qyx2qyxpq ∂ y ∂ X = [ ∂ y ∂ x 11 ∂ y ∂ x 12 ⋯ ∂ y ∂ x 1 q ∂ y ∂ x 21 ∂ y ∂ x 22 ⋯ ∂ y ∂ x 2 q ⋯ ⋯ ⋯ ⋯ ∂ y ∂ x p 1 ∂ y ∂ x p 2 ⋯ ∂ y ∂ x p q ]

上面给出了矩阵求导的表示形式的具体含义,很容易理解。下面给出几个例子, a a 是实数, β β x x 是向量, A A B B C C 是与 x x 无关的矩阵:
βTxx=β ∂ β T x ∂ x = β

xTxx=x ∂ x T x ∂ x = x

xTAxx=(A+AT)x ∂ x T A x ∂ x = ( A + A T ) x

如果你能发现这三个式子左边的分子都是一个数,分母都是一个向量,那么你应该很容易理解这几个等式。是在不能理解就自己把左右两边的矩阵运算拆分开来,然后使用多元函数求导的过程将左右两边分别表示出来就行了。以第一个为例:
βTx=i=1nβixi β T x = ∑ i = 1 n β i x i

βTxx=βTxx1βTxx2βTxxn=ni=1βixix1ni=1βixix2ni=1βixixn=β1β2βn=β ∂ β T x ∂ x = [ ∂ β T x ∂ x 1 ∂ β T x ∂ x 2 ⋯ ∂ β T x ∂ x n ] = [ ∂ ∑ i = 1 n β i x i ∂ x 1 ∂ ∑ i = 1 n β i x i ∂ x 2 ⋯ ∂ ∑ i = 1 n β i x i ∂ x n ] = [ β 1 β 2 ⋯ β n ] = β

这样就能很清楚的理解矩阵矩阵求导的表示形式的具体含义了。

矩阵求导的表示形式之二:向量函数对值/向量/矩阵变量的导数

下面表达式中, y y 表示一个向量函数, x x 表示一个值变量,那么他们的矩阵求导含义为:

yx=y1xy2xynx ∂ y ∂ x = [ ∂ y 1 ∂ x ∂ y 2 ∂ x ⋯ ∂ y n ∂ x ]

接下来是向量函数 y y 对向量变量 x x 的导数含义为:
yx=y1x1y2x2ymxny1x2y2x2ymx2y1xny2xnymxn ∂ y ∂ x = [ ∂ y 1 ∂ x 1 ∂ y 1 ∂ x 2 ⋯ ∂ y 1 ∂ x n ∂ y 2 ∂ x 2 ∂ y 2 ∂ x 2 ⋯ ∂ y 2 ∂ x n ⋯ ⋯ ⋯ ⋯ ∂ y m ∂ x n ∂ y m ∂ x 2 ⋯ ∂ y m ∂ x n ]

以一个最为简单的例子为例:
y=Wx y = W x

那么:
yx=W ∂ y ∂ x = W

最后向量函数 y y 对矩阵变量 W W 的导数是一个张量,具体形状为:
yW=y1W11y1W21y1Wm1y1W12y1W22y1Wm2y1W2ny1W2ny1Wmny2W11y2W21y2Wm1y2W12y2W22y2Wm2y2W2ny2W2ny2WmnykW11ykW21ykWm1ykW12ykW22ykWm2ykW2nykW2nykWmn ∂ y ∂ W = [ ∂ y 1 ∂ W 11 ∂ y 1 ∂ W 12 ⋯ ∂ y 1 ∂ W 2 n ∂ y 1 ∂ W 21 ∂ y 1 ∂ W 22 ⋯ ∂ y 1 ∂ W 2 n ⋯ ⋯ ⋯ ⋯ ∂ y 1 ∂ W m 1 ∂ y 1 ∂ W m 2 ⋯ ∂ y 1 ∂ W m n ] [ ∂ y 2 ∂ W 11 ∂ y 2 ∂ W 12 ⋯ ∂ y 2 ∂ W 2 n ∂ y 2 ∂ W 21 ∂ y 2 ∂ W 22 ⋯ ∂ y 2 ∂ W 2 n ⋯ ⋯ ⋯ ⋯ ∂ y 2 ∂ W m 1 ∂ y 2 ∂ W m 2 ⋯ ∂ y 2 ∂ W m n ] ⋯ [ ∂ y k ∂ W 11 ∂ y k ∂ W 12 ⋯ ∂ y k ∂ W 2 n ∂ y k ∂ W 21 ∂ y k ∂ W 22 ⋯ ∂ y k ∂ W 2 n ⋯ ⋯ ⋯ ⋯ ∂ y k ∂ W m 1 ∂ y k ∂ W m 2 ⋯ ∂ y k ∂ W m n ]

同样举出一个例子说明这个形式的含义: l=f(y) l = f ( y ) 其中, y y m m 维向量,然后 y=Wx y = W x W W mn m ∗ n 的矩阵, x x n n 维向量。然后 ly ∂ l ∂ y m m 维向量, yW ∂ y ∂ W mmn m ∗ m ∗ n 维张量,最后根据链式法则有 lW=lyyW ∂ l ∂ W = ∂ l ∂ y ∂ y ∂ W ,很显然最后的结果 lW ∂ l ∂ W 应该是一个 mn m ∗ n 为的矩阵,而等式另外边为 m m 维向量乘上 mmn m ∗ m ∗ n 维张量,其结果为 mn m ∗ n 维矩阵。将这个过程拆开来看:
yW=yW11yW21yWm1yW12yW22yWm2yW1nyW2nyWmn=mi=1ly1y1W11mi=1ly1y1W21mi=1ly1y1Wm1mi=1ly1y1W12mi=1ly1y1W22mi=1ly1y1Wm2mi=1ly1y1W1nmi=1ly1y1W2nmi=1ly1y1Wmn ∂ y ∂ W = [ ∂ y ∂ W 11 ∂ y ∂ W 12 ⋯ ∂ y ∂ W 1 n ∂ y ∂ W 21 ∂ y ∂ W 22 ⋯ ∂ y ∂ W 2 n ⋯ ⋯ ⋯ ⋯ ∂ y ∂ W m 1 ∂ y ∂ W m 2 ⋯ ∂ y ∂ W m n ] = [ ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W 11 ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W 12 ⋯ ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W 1 n ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W 21 ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W 22 ⋯ ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W 2 n ⋯ ⋯ ⋯ ⋯ ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W m 1 ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W m 2 ⋯ ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W m n ]

矩阵求导的表示形式之三:矩阵函数对值/向量/矩阵变量的导数

首先矩阵函数 Y Y 对值变量 x x 的导数含义为:

Yx=y11xy21xyp1xy12xy22xyp2xy1qxy2qxypqx ∂ Y ∂ x = [ ∂ y 11 ∂ x ∂ y 12 ∂ x ⋯ ∂ y 1 q ∂ x ∂ y 21 ∂ x ∂ y 22 ∂ x ⋯ ∂ y 2 q ∂ x ⋯ ⋯ ⋯ ⋯ ∂ y p 1 ∂ x ∂ y p 2 ∂ x ⋯ ∂ y p q ∂ x ]

这个也很容易理解,然后矩阵函数对向量变量的导数是形式上是一个张量,矩阵函数对矩阵变量的导数是一个四阶张量。
这些导数的形式很少用到,但实际上本质还是一样的: 矩阵求导本质上是多元函数求导的矩阵表示形式,其函数由矩阵运算定义,其导数形式是为了同样满足矩阵运算而定义的。还是那句话,如果不理解矩阵求导过程,直接把矩阵运算转化成基本的多元函数运算,用多元函数求导方法写出其形式就很容易理解了。

当然,上面几个仅仅是非常简单的矩阵求导,更复杂的涉及到求迹(对角线上元素的和) tr(A) t r ( A ) 、行列式 det(A) d e t ( A ) 等就需要去参照《Matrix Cookbook》中的内容自行理解了。了解到上面的内容已经足够让我们来理解神经网络的反向传播了。

神经网络反向传播

讲到神经网络的反向传播首先不得不提一下求导的链式法则:实际上神经网络本质上可以说是一堆向量操作加上激活函数,也可以说是一堆线性函数操作加上激活函数,整个过程最终都可以展开成一个无比大的函数。为了比较好表述神经网络的每一层的正向计算以及反向传播,才表述为矩阵计算与链式法则计算梯度,其本质还是非常简单的多元函数求导。

链式法则

链式法则是多元函数求导基本,通常意义上的链式法则表述如下:

z=f(x,y)x=g(u,v)y=h(u,v) z = f ( x , y ) x = g ( u , v ) y = h ( u , v )

那么就有:
zu=zxxu+zyyuzv=zxxv+zyyv ∂ z ∂ u = ∂ z ∂ x ∂ x ∂ u + ∂ z ∂ y ∂ y ∂ u ∂ z ∂ v = ∂ z ∂ x ∂ x ∂ v + ∂ z ∂ y ∂ y ∂ v

这个看起来是不是很简单,理解偏导和梯度的含义就应该很容易理解这个过程。那么接下来,重头戏来了:上面过程中 y y 可以是 x x 的函数,甚至可以是 x x 。来我们先举一个简单的例子来看:
z=xxx=u+v z = x x x = u + v

对于这样一个例子,我们先把上面式子中指数项的 x x 记做 y y ,那么上面的式子就转化为:
z=xyx=u+vy=u+v z = x y x = u + v y = u + v

接下来我们来根据链式法则来求导:
zu=zxxu+zyyu=yxy1xu+xyln(x)yu=(u+v)u+v+(u+v)u+vln(u+v) ∂ z ∂ u = ∂ z ∂ x ∂ x ∂ u + ∂ z ∂ y ∂ y ∂ u = y x y − 1 ∂ x ∂ u + x y l n ( x ) ∂ y ∂ u = ( u + v ) u + v + ( u + v ) u + v l n ( u + v )

zv=zxxv+zyyv=yxy1xv+xyln(x)yv=(u+v)u+v+(u+v)u+vln(u+v) ∂ z ∂ v = ∂ z ∂ x ∂ x ∂ v + ∂ z ∂ y ∂ y ∂ v = y x y − 1 ∂ x ∂ v + x y l n ( x ) ∂ y ∂ v = ( u + v ) u + v + ( u + v ) u + v l n ( u + v )

额,是不是很神奇: dxxdx=xx+xxln(x) d x x d x = x x + x x l n ( x ) 这个式子也可以通过将两个 x x 看做不同的 x x 分别求偏导然后求全微分而得到其导数,当且仅当原函数可微时才能这样做。
好吧,上面这些内容其实是一些题外话,我们真正需要了解的是:在矩阵操作中,我们可以把例如 y=Wx+b y = W x + b 这样的矩阵操作看做是多元函数

全连接层的反向传播

一层全连接层的神经网络的本质是一个 output=f(input) o u t p u t = f ( i n p u t ) 的多元函数,例如一般来说一层全连接以 x x 表示输入向量, y y 表示输出向量,那么一层全连接神经网络可数学表示为:

y=σ(Wx+b) y = σ ( W x + b )

其中 W W b b 是参数,前者是映射矩阵,后者是偏置向量, σ σ 表示激活函数,这是一个数值函数,也就是对矩阵/向量中的每一个值做这样一个函数映射,常用的激活函数有如下几种:
sigmoid激活函数:
y=11+ex y = 1 1 + e − x

sigmoid激活函数的导数:
y=(11+ex)=ex(1+ex)2=1+ex1(1+ex)2=11+ex(111+ex)=y(1y) y ′ = ( 1 1 + e − x ) ′ = e − x ( 1 + e − x ) 2 = 1 + e − x − 1 ( 1 + e − x ) 2 = 1 1 + e − x ( 1 − 1 1 + e − x ) = y ( 1 − y )

tanh激活函数:
y=exexex+ex y = e x − e − x e x + e − x

tanh激活函数的导数:
y=(exexex+ex)=(ex+ex)2(exex)2(ex+ex)2=1(exex)2(ex+ex)2=1y2 y ′ = ( e x − e − x e x + e − x ) ′ = ( e x + e − x ) 2 − ( e x − e − x ) 2 ( e x + e − x ) 2 = 1 − ( e x − e − x ) 2 ( e x + e − x ) 2 = 1 − y 2

relu激活函数:
y={x,0,x>0x<=0 y = { x , x > 0 0 , x <= 0

relu激活函数的导数:
y={1,0,x>0x<=0 y ′ = { 1 , x > 0 0 , x <= 0

从上面这三种常用激活函数的导数可以看出,激活函数反向求导都非常简单直接。然后,我们将从两种角度来给出全连接层反向传播的导数:矩阵形式和多元函数形式。

全连接层的反向传播的矩阵形式

神经网络反向传播时,我们已知的是 ly ∂ l ∂ y ,也就是前面层传过来的 loss l o s s 对于当前层输出的梯度,然后一方面我们需要知道 loss l o s s 对于参数的梯度 lW ∂ l ∂ W lb ∂ l ∂ b ,而另一方面我们也需要知道 loss l o s s 对于输入的梯度 lx ∂ l ∂ x ,以便于参数向前面层传播,更新前面层的参数。假设我们以 sigmoid s i g m o i d 函数作为激活函数:

y=σ(Wx+b) y = σ ( W x + b )

利用链式法则我们有:
lW=lyy(Wx+b)(Wx+b)W=ly(y(1y))xT ∂ l ∂ W = ∂ l ∂ y ∂ y ∂ ( W x + b ) ∂ ( W x + b ) ∂ W = ∂ l ∂ y ∘ ( y ∘ ( 1 − y ) ) x T

lb=lyy(Wx+b)(Wx+b)b=ly(y(1y)) ∂ l ∂ b = ∂ l ∂ y ∂ y ∂ ( W x + b ) ∂ ( W x + b ) ∂ b = ∂ l ∂ y ∘ ( y ∘ ( 1 − y ) )

lx=lyy(Wx+b)(Wx+b)x=ly(y(1y))W ∂ l ∂ x = ∂ l ∂ y ∂ y ∂ ( W x + b ) ∂ ( W x + b ) ∂ x = ∂ l ∂ y ∘ ( y ∘ ( 1 − y ) ) W

其中 表示矩阵对应值相乘。

全连接层的反向传播的多元函数形式

接下来给出全连接层的多元函数形式:

y=σ(Wx+b) y = σ ( W x + b )

y=y1y2ym y = [ y 1 y 2 ⋯ y m ]

则有:
yi=σ(j=1nWijxj+bi),i=1,2,...,m y i = σ ( ∑ j = 1 n W i j x j + b i ) , i = 1 , 2 , . . . , m

那么有:( Wij W i j 只影响 yi y i bi b i 只影响 yi y i 。)
lWij=lyiyi(1yi)xj,i=1,2,...,m,j=1,2,...n ∂ l ∂ W i j = ∂ l ∂ y i y i ( 1 − y i ) x j , i = 1 , 2 , . . . , m , j = 1 , 2 , . . . n

lbi=lyiyi(1yi),i=1,2,...,m ∂ l ∂ b i = ∂ l ∂ y i y i ( 1 − y i ) , i = 1 , 2 , . . . , m

( xj x j 影响 y1,y2,...,ym y 1 , y 2 , . . . , y m )
lxj=i=1mlyiyi(1yi)Wij,j=1,2,...,n ∂ l ∂ x j = ∑ i = 1 m ∂ l ∂ y i y i ( 1 − y i ) W i j , j = 1 , 2 , . . . , n

把上面的东西写进矩阵里面就有:
lW=ly1y1(1y1)x1ly2y2(1y2)x1lymym(1ym)x1ly1y1(1y1)x2ly2y

你可能感兴趣的:(神经网络)