反向求导

1.2 神经网络的反向求导

在上一节中, 我们大致对神经网络的梯度更新有了了解,其中最核心的部分就是求出损失函数对权重 𝑤𝑙𝑖𝑗wijl 的导数。由于网上大多数资料都是生搬硬套,因此我们以计算 𝑊1W1 的导数为例,对整个反向求导过程进行细致的剖析。如下图所示:

其中,𝑤𝑙𝑗𝑘wjkl 表示从第 𝑙l 层的第 𝑗j 个节点到第 𝑙+1l+1 层中的第 𝑘k 个节点的权重,根据前向传播的计算我们可以得到:

 

𝑦𝑜𝑢𝑡∼(𝑤311𝑤211+𝑤321𝑤212)𝑤111𝑥1,∂𝑦𝑜𝑢𝑡∂𝑤111=(𝑤311𝑤211+𝑤321𝑤212)𝑥1;𝑦𝑜𝑢𝑡∼(𝑤311𝑤211+𝑤321𝑤212)𝑤121𝑥2,∂𝑦𝑜𝑢𝑡∂𝑤121=(𝑤311𝑤211+𝑤321𝑤212)𝑥2𝑦𝑜𝑢𝑡∼(𝑤311𝑤221+𝑤321𝑤222)𝑤112𝑥1,∂𝑦𝑜𝑢𝑡∂𝑤112=(𝑤311𝑤221+𝑤321𝑤222)𝑥1;𝑦𝑜𝑢𝑡∼(𝑤311𝑤221+𝑤321𝑤222)𝑤122𝑥1,∂𝑦𝑜𝑢𝑡∂𝑤122=(𝑤311𝑤221+𝑤321𝑤222)𝑥2𝑦𝑜𝑢𝑡∼(𝑤311𝑤231+𝑤321𝑤232)𝑤113𝑥1,∂𝑦𝑜𝑢𝑡∂𝑤113=(𝑤311𝑤231+𝑤321𝑤232)𝑥1;𝑦𝑜𝑢𝑡∼(𝑤311𝑤231+𝑤321𝑤232)𝑤123𝑥2,∂𝑦𝑜𝑢𝑡∂𝑤123=(𝑤311𝑤231+𝑤321𝑤232)𝑥2yout∼(w113w112+w213w122)w111x1,∂yout∂w111=(w113w112+w213w122)x1;yout∼(w113w112+w213w122)w211x2,∂yout∂w211=(w113w112+w213w122)x2yout∼(w113w212+w213w222)w121x1,∂yout∂w121=(w113w212+w213w222)x1;yout∼(w113w212+w213w222)w221x1,∂yout∂w221=(w113w212+w213w222)x2yout∼(w113w312+w213w322)w131x1,∂yout∂w131=(w113w312+w213w322)x1;yout∼(w113w312+w213w322)w231x2,∂yout∂w231=(w113w312+w213w322)x2

 

用矩阵表示为:

 

∂𝐿∂𝑊1=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂𝑦𝑜𝑢𝑡∂𝑤111∂𝑦𝑜𝑢𝑡∂𝑤112∂𝑦𝑜𝑢𝑡∂𝑤113∂𝑦𝑜𝑢𝑡∂𝑤121∂𝑦𝑜𝑢𝑡∂𝑤122∂𝑦𝑜𝑢𝑡∂𝑤123⎤⎦⎥⎥⎥⎥⎥⎥⎥=([𝑤311𝑤211+𝑤321𝑤212𝑤311𝑤221+𝑤321𝑤222𝑤311𝑤221+𝑤321𝑤232]⊙[𝑥1𝑥2])𝑇=(𝑊3𝑊2⊙𝑋)𝑇∂L∂W1=[∂yout∂w111∂yout∂w211∂yout∂w121∂yout∂w221∂yout∂w131∂yout∂w231]=([w113w112+w213w122w113w212+w213w222w113w212+w213w322]⊙[x1x2])T=(W3W2⊙X)T

 

因此,整个反向传播的过程如下:

首先计算:∂𝐿∂𝑊3=∂𝐿∂𝑦𝑜𝑢𝑡⊙(∂𝑦𝑜𝑢𝑡∂𝑊3)𝑇=∂𝐿∂𝑦𝑜𝑢𝑡⊙[∂𝑦𝑜𝑢𝑡∂𝑤311,∂𝑦𝑜𝑢𝑡∂𝑤312]𝑇=∂𝐿∂𝑦𝑜𝑢𝑡⊙(𝑍2)𝑇∂L∂W3=∂L∂yout⊙(∂yout∂W3)T=∂L∂yout⊙[∂yout∂w113,∂yout∂w123]T=∂L∂yout⊙(Z2)T

然后计算:∂𝐿∂𝑊2=∂𝐿∂𝑦𝑜𝑢𝑡(∂𝑦𝑜𝑢𝑡∂𝑍2⊙∂𝑍2∂𝑊2)𝑇=∂𝐿∂𝑦𝑜𝑢𝑡(∂𝑦𝑜𝑢𝑡∂𝑍2⊙𝑍1)𝑇=∂𝐿∂𝑦𝑜𝑢𝑡(𝑊3⊙𝑍1)𝑇∂L∂W2=∂L∂yout(∂yout∂Z2⊙∂Z2∂W2)T=∂L∂yout(∂yout∂Z2⊙Z1)T=∂L∂yout(W3⊙Z1)T

最后计算:∂𝐿∂𝑊1=∂𝐿∂𝑦𝑜𝑢𝑡(∂𝑦𝑜𝑢𝑡∂𝑍2∂𝑍2∂𝑍1⊙∂𝑍1∂𝑊1)𝑇=∂𝐿∂𝑊1(𝑊3𝑊2⊙𝑋)𝑇∂L∂W1=∂L∂yout(∂yout∂Z2∂Z2∂Z1⊙∂Z1∂W1)T=∂L∂W1(W3W2⊙X)T

为了方便计算,反向传播通过使用计算图的形式在 Tensorflow,PyTorch 等深度学习框架中实现,将上述过程绘制成计算图如下:

根据计算图,可以轻而易举地计算出损失函数对每个变量的导数。

posted @ 2021-08-30 19:46  薛定谔的小冰  阅读(706)  评论(0)    收藏  举报