Neural network最基础的反向传播矩阵形式推导
1 符号定义
这里的符号定义采用与吴恩达 deeplearing.ai 课程的定义相同,具体定义如下:
1.1 Data和Label的定义
Data矩阵形式:一般行放特征,列放样本。即每一列是一个样本,每一行是这个样本的一个特征。如果每个样本有
n
x
n^x
nx个特征,
m
m
m个样本,那么Data矩阵的维度应该是
(
n
x
×
m
)
(n^x \times m)
(nx×m)。
Label矩阵形式:与Data相同。二分类时,是
(
1
×
m
)
(1 \times m)
(1×m);多分类时,如果有
n
y
n^y
ny个输出(类别),是
(
n
y
×
m
)
(n^y \times m)
(ny×m)。
1.2 Weights和Activation的定义
Weights矩阵形式:一般行数与下一层的特征数目相等,列数与上一层的特征数目相等。一般以
n
[
l
]
n^{[l]}
n[l]表示第
l
l
l层的特征数量。其中输入层算作第0层,即
n
x
=
n
[
0
]
n^x=n^{[0]}
nx=n[0]。那么若把
(
l
−
1
)
(l-1)
(l−1)层与
l
l
l层之间的权重矩阵记为
W
[
l
]
W^{[l]}
W[l],则
W
[
l
]
W^{[l]}
W[l]的矩阵维度是
(
n
[
l
]
×
n
[
l
−
1
]
)
(n^{[l]} \times n^{[l-1]})
(n[l]×n[l−1])。
Activation矩阵形式:以从输入层到第一层为例。首先进行神经网络内部的计算,即
Z
[
1
]
=
W
[
1
]
×
X
Z^{[1]}=W^{[1]} \times X
Z[1]=W[1]×X。通过Data(这里的
X
X
X就是Data)矩阵的维度
(
n
[
0
]
×
m
)
(n^{[0]} \times m)
(n[0]×m)和Weights矩阵的维度
(
n
[
1
]
×
n
[
0
]
)
(n^{[1]} \times n^{[0]})
(n[1]×n[0]),我们可以计算出
Z
[
1
]
Z^{[1]}
Z[1]矩阵的维度是
(
n
[
1
]
×
m
)
(n^{[1]} \times m)
(n[1]×m)。那么若把
l
l
l层的Activation矩阵记为
A
[
l
]
=
g
[
l
]
(
Z
[
l
]
)
A^{[l]}=g^{[l]}(Z^{[l]})
A[l]=g[l](Z[l]),则
A
[
l
]
A^{[l]}
A[l]的维度永远和
Z
[
l
]
Z^{[l]}
Z[l]保持一致,即
A
[
1
]
A^{[1]}
A[1]的维度是
(
n
[
1
]
×
m
)
(n^{[1]} \times m)
(n[1]×m)。
1.3 导数符号定义
一般导数采用简写形式。例:以 J J J代表总的 l o s s loss loss,那么 d Z [ l ] dZ^{[l]} dZ[l]就表示 Z [ l ] Z^{[l]} Z[l]对 J J J求导,用公式表示就是 d J d Z [ l ] = d Z [ l ] \frac{dJ}{dZ^{[l]}}=dZ^{[l]} dZ[l]dJ=dZ[l]。
2 正向传播-矩阵表示
这里以隐藏层只有一层的神经网络为例,网络结构大致如上图所示。
2.1 输入层【0】
这一层的每个unit直接就是输入样本,所以有: A [ 0 ] = X A^{[0]}=X A[0]=X。
2.2 隐藏层【1】
这一层的每个unit经过权重和激活函数的双重处理:
权重处理:
Z
[
1
]
=
W
[
1
]
×
A
[
0
]
Z^{[1]}=W^{[1]} \times A^{[0]}
Z[1]=W[1]×A[0],激活函数处理:
A
[
1
]
=
g
[
1
]
(
Z
[
1
]
)
A^{[1]}=g^{[1]}(Z^{[1]})
A[1]=g[1](Z[1])。这当中,
g
[
1
]
g^{[1]}
g[1]表示层1的激活函数。
2.3 输出层【2】
输出层和隐藏层类似。权重处理: Z [ 2 ] = W [ 2 ] × A [ 1 ] Z^{[2]}=W^{[2]} \times A^{[1]} Z[2]=W[2]×A[1],激活函数处理: A [ 2 ] = g [ 2 ] ( Z [ 2 ] ) A^{[2]}=g^{[2]}(Z^{[2]}) A[2]=g[2](Z[2])。这当中, g [ 2 ] g^{[2]} g[2]表示层2(输出层)的激活函数。
2.4 误差函数
若以J表示网络总的误差函数,以交叉熵为例,则有:
J
=
1
m
∑
i
=
1
i
=
m
[
−
y
(
i
)
∗
log
(
a
[
2
]
(
i
)
)
−
(
1
−
y
(
i
)
)
∗
log
(
1
−
a
[
2
]
(
i
)
)
]
J = \frac{1}{m} \sum_{i=1}^{i=m}{[-y^{(i)}*\log(a^{[2](i)})-(1-y^{(i)})*\log(1-a^{[2](i)})]}
J=m1∑i=1i=m[−y(i)∗log(a[2](i))−(1−y(i))∗log(1−a[2](i))]。
3 反向传播-矩阵表示
3.1 输出层—>隐藏层
首先应该计算的是总的误差函数对输出结果的偏导。
d
J
d
a
[
2
]
(
i
)
=
1
m
∗
(
a
[
2
]
(
i
)
−
y
(
i
)
a
[
2
]
(
i
)
∗
(
1
−
a
[
2
]
(
i
)
)
)
=
1
m
∗
d
a
[
2
]
(
i
)
\frac{dJ}{da^{[2](i)}}=\frac{1}{m}*(\frac{a^{[2](i)}-y^{(i)}}{a^{[2](i)}*(1-a^{[2](i)})})=\frac{1}{m} * da^{[2](i)}
da[2](i)dJ=m1∗(a[2](i)∗(1−a[2](i))a[2](i)−y(i))=m1∗da[2](i)。
而误差对激活前的
Z
[
2
]
Z^{[2]}
Z[2]值求导为:
d
J
d
z
[
2
]
(
i
)
=
d
z
[
2
]
(
i
)
=
d
a
[
2
]
(
i
)
∗
a
[
2
]
(
i
)
(
1
−
a
[
2
]
(
i
)
)
=
1
m
(
a
[
2
]
(
i
)
−
y
(
i
)
)
\frac{dJ}{dz^{[2](i)}}=dz^{[2](i)}=da^{[2](i)}*a^{[2](i)}(1-a^{[2](i)})=\frac{1}{m}(a^{[2](i)}-y^{(i)})
dz[2](i)dJ=dz[2](i)=da[2](i)∗a[2](i)(1−a[2](i))=m1(a[2](i)−y(i))。
显然,化成矩阵的表达式就是:
d
Z
[
2
]
=
1
m
∗
(
A
[
2
]
−
Y
)
dZ^{[2]}=\frac{1}{m}*(A^{[2]}-Y)
dZ[2]=m1∗(A[2]−Y)。
下面算误差对层2权重的求导:
我们以有括号表示列,以没有括号表示行。
那么从正向上来看,矩阵
Z
[
2
]
Z^{[2]}
Z[2]的每个元素可以表示为:
Z
[
2
]
(
α
,
β
)
=
W
[
2
]
α
×
A
[
1
]
(
β
)
Z^{[2]}(\alpha,\beta)=W^{[2]\alpha}\times A^{[1](\beta)}
Z[2](α,β)=W[2]α×A[1](β),
Z
[
2
]
(
i
)
=
Z
[
2
]
(
:
,
i
)
=
(
Z
[
2
]
(
1
,
i
)
Z
[
2
]
(
2
,
i
)
.
.
.
Z
[
2
]
(
α
,
i
)
)
=
(
W
[
2
]
1
×
A
[
1
]
(
i
)
W
[
2
]
2
×
A
[
1
]
(
i
)
.
.
.
W
[
2
]
α
×
A
[
1
]
(
i
)
)
Z^{[2](i)}=Z^{[2]}(:,i)=\begin{pmatrix} Z^{[2]}(1,i) \\ Z^{[2]}(2,i) \\ ... \\ Z^{[2]}(\alpha,i) \\ \end{pmatrix}=\begin{pmatrix} W^{[2]1}\times A^{[1](i)} \\ W^{[2]2}\times A^{[1](i)} \\ ... \\ W^{[2]\alpha}\times A^{[1](i)} \\ \end{pmatrix}
Z[2](i)=Z[2](:,i)=⎝⎜⎜⎛Z[2](1,i)Z[2](2,i)...Z[2](α,i)⎠⎟⎟⎞=⎝⎜⎜⎛W[2]1×A[1](i)W[2]2×A[1](i)...W[2]α×A[1](i)⎠⎟⎟⎞,
Z
[
2
]
i
=
Z
[
2
]
(
i
,
:
)
=
(
Z
[
2
]
(
i
,
1
)
Z
[
2
]
(
i
,
2
)
.
.
.
Z
[
2
]
(
i
,
β
)
)
=
(
W
[
2
]
i
×
A
[
1
]
(
1
)
W
[
2
]
i
×
A
[
1
]
(
2
)
.
.
.
W
[
2
]
i
×
A
[
1
]
(
β
)
)
Z^{[2]i}=Z^{[2]}(i,:)=\begin{pmatrix} Z^{[2]}(i,1) & Z^{[2]}(i,2)&...&Z^{[2]}(i,\beta) \\ \end{pmatrix}=\begin{pmatrix}W^{[2]i}\times A^{[1](1)} & W^{[2]i}\times A^{[1](2)}&...&W^{[2]i}\times A^{[1](\beta)}\\ \end{pmatrix}
Z[2]i=Z[2](i,:)=(Z[2](i,1)Z[2](i,2)...Z[2](i,β))=(W[2]i×A[1](1)W[2]i×A[1](2)...W[2]i×A[1](β))。
从反向看,权重和
A
[
1
]
A^{[1]}
A[1]的导数:
d
J
d
W
[
2
]
i
=
d
W
[
2
]
i
=
d
Z
[
2
]
i
∗
d
Z
[
2
]
i
d
W
[
2
]
i
=
d
Z
[
2
]
i
×
(
A
[
1
]
(
1
)
A
[
1
]
(
2
)
.
.
.
A
[
1
]
(
β
)
)
T
=
d
Z
[
2
]
i
×
A
[
1
]
T
\frac{dJ}{dW^{[2]i}}=dW^{[2]i}=dZ^{[2]i}*\frac{dZ^{[2]i}}{dW^{[2]i}}=dZ^{[2]i}\times\begin{pmatrix} A^{[1](1)} & A^{[1](2)}&...&A^{[1](\beta)}\\ \end{pmatrix} ^{T}=dZ^{[2]i}\times A^{[1]T}
dW[2]idJ=dW[2]i=dZ[2]i∗dW[2]idZ[2]i=dZ[2]i×(A[1](1)A[1](2)...A[1](β))T=dZ[2]i×A[1]T(没括号是行,要放前面; Z还原W要乘以矩阵的逆),
d
J
d
A
[
1
]
(
i
)
=
d
A
[
1
]
(
i
)
=
d
Z
[
2
]
(
i
)
∗
d
Z
[
2
]
(
i
)
d
A
[
2
]
(
i
)
=
(
W
[
2
]
1
W
[
2
]
2
.
.
.
W
[
2
]
α
)
T
×
d
Z
[
2
]
(
i
)
=
W
[
2
]
T
×
d
Z
[
2
]
(
i
)
\frac{dJ}{dA^{[1](i)}}=dA^{[1](i)}=dZ^{[2](i)}*\frac{dZ^{[2](i)}}{dA^{[2](i)}}=\begin{pmatrix} W^{[2]1}\\ W^{[2]2}\\ ... \\ W^{[2]\alpha} \\ \end{pmatrix}^T\times dZ^{[2](i)}=W^{[2]T} \times dZ^{[2](i)}
dA[1](i)dJ=dA[1](i)=dZ[2](i)∗dA[2](i)dZ[2](i)=⎝⎜⎜⎛W[2]1W[2]2...W[2]α⎠⎟⎟⎞T×dZ[2](i)=W[2]T×dZ[2](i)(有括号是列,要放后面; Z还原A要乘以矩阵的逆),
所以显而易见,有矩阵形式为:
d
J
d
W
[
2
]
=
d
W
[
2
]
=
∑
i
d
W
[
2
]
i
=
d
Z
[
2
]
×
A
[
1
]
T
\frac{dJ}{dW^{[2]}}=dW^{[2]}=\sum_{i}dW^{[2]i}=dZ^{[2]}\times A^{[1]T}
dW[2]dJ=dW[2]=∑idW[2]i=dZ[2]×A[1]T,
d
J
d
A
[
1
]
=
d
A
[
1
]
=
∑
i
d
A
[
1
]
i
=
W
[
2
]
T
×
d
Z
[
2
]
\frac{dJ}{dA^{[1]}}=dA^{[1]}=\sum_{i}dA^{[1]i}=W^{[2]T}\times dZ^{[2]}
dA[1]dJ=dA[1]=∑idA[1]i=W[2]T×dZ[2]
3.2 隐藏层—>输入层
首先计算误差对激活前的
Z
[
1
]
Z^{[1]}
Z[1]求导:
d
J
d
Z
[
1
]
=
d
Z
[
1
]
=
d
A
[
1
]
∗
d
A
[
1
]
d
Z
[
1
]
\frac{dJ}{dZ^{[1]}}=dZ^{[1]}=dA^{[1]}*\frac{dA^{[1]}}{dZ^{[1]}}
dZ[1]dJ=dZ[1]=dA[1]∗dZ[1]dA[1](由于
g
[
1
]
g^{[1]}
g[1]是对矩阵元素操作,所以导数也应该是矩阵元素相乘!!!
∗
*
∗应该表示矩阵元素相乘。)。
根据3.1,误差对层1权重的求导有矩阵形式为:
d
J
d
W
[
1
]
=
d
W
[
1
]
=
d
Z
[
1
]
×
A
[
0
]
T
\frac{dJ}{dW^{[1]}}=dW^{[1]}=dZ^{[1]}\times A^{[0]T}
dW[1]dJ=dW[1]=dZ[1]×A[0]T。