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) (l1)层与 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[l1])
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 正向传播-矩阵表示

图1
这里以隐藏层只有一层的神经网络为例,网络结构大致如上图所示。

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=m1i=1i=m[y(i)log(a[2](i))(1y(i))log(1a[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)(1a[2](i))a[2](i)y(i))=m1da[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)(1a[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]idW[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

关于偏差 b b b,大家可自行推导; 也可以把 b b b换成一行1放到A中,不单独计算b。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卷积神经网络(Convolutional Neural Network,CNN)是一种常用于图像处理和计算机视觉任务的深度学习模型。卷积层是CNN中的核心组件之一,它通过卷积操作提取输入数据的特征。 在卷积层的反向传播推导中,我们需要计算损失函数对于卷积层输入、权重和偏置的梯度。下面是卷积层反向传播推导的步骤: 1. 计算损失函数对于卷积层输出的梯度: 首先,根据损失函数的定义,计算损失函数对于卷积层输出的梯度。这个梯度可以通过使用链式法则从后一层传播过来的梯度计算得到。 2. 计算损失函数对于卷积层权重的梯度: 使用卷积操作的性质,将损失函数对于卷积层输出的梯度与输入数据进行卷积操作,得到损失函数对于卷积层权重的梯度。 3. 计算损失函数对于卷积层输入的梯度: 使用卷积操作的性质,将损失函数对于卷积层输出的梯度与卷积层权重进行卷积操作,得到损失函数对于卷积层输入的梯度。 4. 计算损失函数对于卷积层偏置的梯度: 将损失函数对于卷积层输出的梯度按照通道求和,得到每个通道的梯度,即损失函数对于卷积层偏置的梯度。 以上是卷积层反向传播推导的基本步骤。在实际应用中,还需要考虑批量处理、激活函数等因素。如果你对某个具体的CNN模型或者反向传播的细节有更具体的问题,可以告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值