【神经网络】正向传播和反向传播(结合具体例子)

神经网络

【神经网络】正向传播和反向传播(结合具体例子)_第1张图片
例子神经网络结构如上,由三个层构成分别是输入层X,隐藏层H,输出层O。X到H层权值矩阵为 W 5 ∗ 3 ( 1 ) W^{(1)}_{5*3} W53(1),偏置矩阵为 β 5 ∗ 1 ( 1 ) \beta^{(1)}_{5*1} β51(1),使用relu激活函数;H到O层权值矩阵为 W 2 ∗ 5 ( 2 ) W^{(2)}_{2*5} W25(2),偏置矩阵为 β 2 ∗ 1 ( 2 ) \beta^{(2)}_{2*1} β21(2)【这个矩阵形状非常重要,本文中对于出现的每个向量(或者矩阵),都有下标表示它的形状,若为常量则直接表示,或者采用索引,如 w 11 ( 1 ) w_{11}^{(1)} w11(1) W 5 ∗ 3 ( 1 ) W^{(1)}_{5*3} W53(1)第一行第一列的元素, β 1 ( 1 ) \beta_{1}^{(1)} β1(1) β 5 ∗ 1 ( 1 ) \beta^{(1)}_{5*1} β51(1)第一列的元素】,使用sigma激活函数。
损失函数采用交叉熵。
relu函数如下:
r e l u = m a x ( x , 0 ) r e l u ′ = { 0 , x < 0 a , a ∈ [ 0 , 1 ] x = 0 1 , x > 0 relu = max(x,0)\\ relu' = \left\{ \begin{array}{lr} 0, & x <0 \\ a, & a\in[0,1] x = 0\\ 1,& x > 0 \\ \end{array} \right. relu=max(x,0)relu=0,a,1,x<0a[0,1]x=0x>0
x = 0处虽然不可导,但是可采用亚导数 [ 1 ] ^{[1]} [1]
s i g m a = 1 1 + e − x s i g m a ′ = s i g m a ∗ ( 1 − s i g m a ) = e − x ( 1 + e − x ) 2 sigma = \frac{1}{1+e^{-x}}\\ sigma' = sigma*(1-sigma)\\ = \frac{e^{-x}}{(1+e^{-x})^2} sigma=1+ex1sigma=sigma(1sigma)=(1+ex)2ex
损失函数如下
l o s s = − ∑ i = 1 2 y i log ⁡ ( o i ) loss = -\sum_{i=1}^{2}y_i\log(o_i) loss=i=12yilog(oi)

前向传播

一上来写矩阵形式可能不太适合理解。我先针对单个神经元来写。

X->H

那么就是
h 1 = r e l u ( w 11 ( 1 ) x 1 + w 12 ( 1 ) x 2 + w 13 ( 1 ) x 3 + β 1 ( 1 ) ) h 2 = r e l u ( w 21 ( 1 ) x 1 + w 22 ( 1 ) x 2 + w 23 ( 1 ) x 3 + β 2 ( 1 ) ) . . . h 5 = r e l u ( w 51 ( 1 ) x 1 + w 52 ( 1 ) x 2 + w 53 ( 1 ) x 3 + β 5 ( 1 ) ) h_1 = relu(w^{(1)}_{11}x_1+w^{(1)}_{12}x_2+w^{(1)}_{13}x_3+\beta^{(1)}_1)\\ h_2 = relu(w^{(1)}_{21}x_1+w^{(1)}_{22}x_2+w^{(1)}_{23}x_3+\beta^{(1)}_2)\\ ...\\ h_5 = relu(w^{(1)}_{51}x_1+w^{(1)}_{52}x_2+w^{(1)}_{53}x_3+\beta^{(1)}_5) h1=relu(w11(1)x1+w12(1)x2+w13(1)x3+β1(1))h2=relu(w21(1)x1+w22(1)x2+w23(1)x3+β2(1))...h5=relu(w51(1)x1+w52(1)x2+w53(1)x3+β5(1))
此时再将其转为矩阵形式
H 5 ∗ 1 = r e l u ( W 5 ∗ 3 ( 1 ) X 3 ∗ 1 + β 5 ∗ 1 ( 1 ) ) H_{5*1} = relu(W^{(1)}_{5*3}X_{3*1}+\beta^{(1)}_{5*1}) H51=relu(W53(1)X31+β51(1))

H->O

同上可得
o 1 = s i g m a ( w 11 ( 2 ) h 1 + w 12 ( 2 ) h 2 + w 13 ( 2 ) h 3 + w 14 ( 2 ) h 4 + w 15 ( 2 ) h 5 + β 1 ( 2 ) ) 【 式 一 】 o 2 = s i g m a ( w 21 ( 2 ) h 1 + w 22 ( 2 ) h 2 + w 23 ( 2 ) h 3 + w 24 ( 2 ) h 4 + w 25 ( 2 ) h 5 + β 2 ( 2 ) ) o_1 = sigma(w^{(2)}_{11}h_1+w^{(2)}_{12}h_2+w^{(2)}_{13}h_3+w^{(2)}_{14}h_4+w^{(2)}_{15}h_5+\beta^{(2)}_1) 【式一】\\ o_2 = sigma(w^{(2)}_{21}h_1+w^{(2)}_{22}h_2+w^{(2)}_{23}h_3+w^{(2)}_{24}h_4+w^{(2)}_{25}h_5+\beta^{(2)}_2) o1=sigma(w11(2)h1+w12(2)h2+w13(2)h3+w14(2)h4+w15(2)h5+β1(2))o2=sigma(w21(2)h1+w22(2)h2+w23(2)h3+w24(2)h4+w25(2)h5+β2(2))
矩阵形式如下
O 2 ∗ 1 = s i g m a ( W 2 ∗ 5 ( 2 ) H 5 ∗ 1 + β 2 ∗ 1 ( 2 ) ) O_{2*1} = sigma(W^{(2)}_{2*5}H_{5*1}+\beta^{(2)}_{2*1}) O21=sigma(W25(2)H51+β21(2))
从输入层X即可得到模型输出O。前向传播结束。

反向传播

此时计算损失函数
l o s s = − ∑ i = 1 2 y i log ⁡ ( o i ) loss = -\sum_{i=1}^{2}y_i\log(o_i) loss=i=12yilog(oi)
然后,再根据损失函数反向传递回去,这个过程曾经困扰了我很长时间,到底是怎样传播的呢?
这里其实是根据了数学求导的一个链式法则。
∂ y ∂ x = ∂ y ∂ t ∗ ∂ t ∂ x \frac{\partial y}{\partial x}=\frac{\partial y}{\partial t}*\frac{\partial t}{\partial x} xy=tyxt
然后根据这个法则,一步步从损失函数到输入层。
这个时候还要拿出一件法器——计算图,有了这个便可清楚明白的进行反向传播了,和上面的图略有不同(反向的)。
【神经网络】正向传播和反向传播(结合具体例子)_第2张图片
反向传播的实质是计算各个参数对loss的梯度,然后根据梯度进行更新参数的过程。在我们的模型中,参数为 W 5 ∗ 3 ( 1 ) W^{(1)}_{5*3} W53(1) β 5 ∗ 1 ( 1 ) \beta^{(1)}_{5*1} β51(1) W 2 ∗ 5 ( 2 ) W^{(2)}_{2*5} W25(2) β 2 ∗ 1 ( 2 ) \beta^{(2)}_{2*1} β21(2)

首先第一步,可以根据之前损失函数公式计算出 ∂ l o s s ∂ o 1 = − y 1 / o 1 \dfrac{\partial loss}{\partial o_1}=-y_1/o_1 o1loss=y1/o1 ∂ l o s s ∂ o 2 = − y 2 / o 2 \dfrac{\partial loss}{\partial o_2}=-y_2/o_2 o2loss=y2/o2,并保存下来,y为标签已知,o在正向传播的时候已经被计算出来了,若求导公式右部出现w, β \beta β等,则为上一步的w, β \beta β
【神经网络】正向传播和反向传播(结合具体例子)_第3张图片

然后再向后传递。 ∂ l o s s ∂ β 1 ( 2 ) = ∂ l o s s ∂ o 1 ∗ ∂ o 1 ∂ β 1 ( 2 ) = 已 知 量 ∗ ∂ o 1 ∂ β 1 ( 2 ) \dfrac{\partial loss}{\partial \beta^{(2)}_1}=\dfrac{\partial loss}{\partial o_1}*\dfrac{\partial o_1}{\partial \beta^{(2)}_1} = 已知量*\dfrac{\partial o_1}{\partial \beta^{(2)}_1} β1(2)loss=o1lossβ1(2)o1=β1(2)o1,o对 β \beta β的导数可通过式一来求,同时也可计算出 ∂ o 1 ∂ w 11 ( 2 ) \dfrac{\partial o_1}{\partial w^{(2)}_{11}} w11(2)o1(进而求得 ∂ l o s s ∂ w 11 ( 2 ) \dfrac{\partial loss}{\partial w^{(2)}_{11}} w11(2)loss)、 ∂ o 1 ∂ h 1 \dfrac{\partial o_1}{\partial h_1} h1o1(进而求得 ∂ l o s s ∂ h 1 \dfrac{\partial loss}{\partial h_1} h1loss)。
【神经网络】正向传播和反向传播(结合具体例子)_第4张图片同理,所有的导数都可以被求出来了。然后再进行梯度更新等等。
【神经网络】正向传播和反向传播(结合具体例子)_第5张图片
容易看出单层之间的运算是可以进行并行操作的,计算量约为正向传播的两倍正向只需计算h和o,反向传播需要计算h,o,w, β \beta β的导数。以上是针对batch_size = 1的情况,batch_size = m可类比推导。
此时损失函数变为
l o s s = − 1 m ∑ j = 1 m ∑ i = 1 2 y i j log ⁡ ( o i j ) loss = -\frac{1}{m}\sum_{j=1}^{m}\sum_{i=1}^{2}y_i^j\log(o_i^j) loss=m1j=1mi=12yijlog(oij)
求导数也对应发生一些变化,如
∂ l o s s ∂ β 1 ( 2 ) = 1 m ∑ j = 1 m ∂ l o s s ∂ o 1 j ∗ ∂ o 1 j ∂ β 1 ( 2 ) \dfrac{\partial loss}{\partial \beta^{(2)}_1} = \frac{1}{m}\sum_{j=1}^{m}\frac{\partial loss}{\partial o^j_1}*\frac{\partial o^j_1}{\partial \beta_1^{(2)}} β1(2)loss=m1j=1mo1jlossβ1(2)o1j
即为对m个样本的导数求平均。
此时每个参数拿到导数就可以进行梯度更新啦,可采用简单点采用SDG随机梯度下降,对应batch_size = 1的情况;梯度下降batch_size = N(样本总数);小批量梯度下降batch_size=m等。
也可采用高级一点的算法进行,比如Momentum、AdaGrad、RMSProp、AdaDelta、Adam算法等等。这里就不详细展开了。

【1】跟李沐学AI 动手学深度学习v2[1-10某一节吧]

你可能感兴趣的:(NLP,深度学习)