Andrew Ng-深度学习-第一门课-week3(**函数和BP)

1.2.2 第一位代表第一门课,第二位代表第几周,第三位代表第几次视频。编号和视频顺序对应,有些章节视频内容较少进行了省略。对内容进行简单的总结,而不是全面的记录视频的每一个细节,详细可见[1]。

1.神经网络和深度学习

1.3 浅层神经网络

1.3.1 神经网络概述

上一周已经学过了逻辑回归,LR可以认为是简单的一层NN。假设我们有一个两层NN:
Andrew Ng-深度学习-第一门课-week3(**函数和BP)
前向传播过程:

  • 第一层NN:
    xW[1]b[1]}    z[1]=W[1]x+b[1]    a[1]=σ(z[1]) \left. \begin{array}{r} {x }\\ {W^{[1]}}\\ {b^{[1]}} \end{array} \right\} \implies{z^{[1]}=W^{[1]}x+b^{[1]}} \implies{a^{[1]} = \sigma(z^{[1]})}
  • 第二层NN:
    a[1]=σ(z[1])W[2]b[2]}    z[2]=W[2]a[1]+b[2]    a[2]=σ(z[2])    L(a[2],y) \left. \begin{array}{r} \text{$a^{[1]} = \sigma(z^{[1]})$}\\ \text{$W^{[2]}$}\\ \text{$b^{[2]}$}\\ \end{array} \right\} \implies{z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}} \implies{a^{[2]} = \sigma(z^{[2]})}\\ \implies{{L}\left(a^{[2]},y \right)}

反向传播过程:
da[1]=dσ(z[1])dW[2]db[2]}    dz[2]=d(W[2]α[1]+b[2])    da[2]=dσ(z[2])    dL(a[2],y) \left. \begin{array}{r} {da^{[1]} = {d}\sigma(z^{[1]})}\\ {dW^{[2]}}\\ {db^{[2]}}\\ \end{array} \right\} \impliedby{{dz}^{[2]}={d}(W^{[2]}\alpha^{[1]}+b^{[2]}}) \impliedby{{{da}^{[2]}} = {d}\sigma(z^{[2]})}\\ \impliedby{{dL}\left(a^{[2]},y \right)}

1.3.2 神经网络的表示

Andrew Ng-深度学习-第一门课-week3(**函数和BP)
我们通过上角标代表第几层神经网络:

  • 输入层:[x1x_1; x2x_2; x3x_3],也可用a[0]a^{[0]}表示,
    a[0]=[a1[0]a2[0]a3[0]a4[0]] a^{[0]} = \left[ \begin{array}{ccc} a^{[0]}_{1}\\ a^{[0]}_{2}\\ a^{[0]}_{3}\\ a^{[0]}_{4}\\ \end{array} \right]

  • 第一层隐藏层:四个隐藏单元
    a[1]=[a1[1]a2[1]a3[1]a4[1]] a^{[1]} = \left[ \begin{array}{ccc} a^{[1]}_{1}\\ a^{[1]}_{2}\\ a^{[1]}_{3}\\ a^{[1]}_{4}\\ \end{array} \right]

  • 输出层:y^=a[2]\hat{y} = a^{[2]}

  • 第一层参数:(W[1]W^{[1]},b[1]b^{[1]}),W[1]R4×3W^{[1]} \in R^{4 \times 3} ,b[1]R4×1b^{[1]} \in R^{4 \times 1}

  • 第二层参数:(W[2]W^{[2]},b[2]b^{[2]}),W[2]R1×4W^{[2]} \in R^{1 \times 4} ,b[2]R1×1b^{[2]} \in R^{1 \times 1}

1.3.3 计算一个神经网络的输出

每一个神经元即可以认为是一个逻辑回归模块。
Andrew Ng-深度学习-第一门课-week3(**函数和BP)
隐藏层的神经元计算过程:
a1[1]=σ(z1[1]),z1[1]=W1[1]Tx+b1[1] a^{[1]}_1 = \sigma(z^{[1]}_1),z^{[1]}_1 = W^{[1]T}_1x + b^{[1]}_1

a2[1]=σ(z2[1]),z2[1]=W2[1]Tx+b2[1]a^{[1]}_2 = \sigma(z^{[1]}_2),z^{[1]}_2 = W^{[1]T}_2x + b^{[1]}_2

a3[1]=σ(z3[1]),z3[1]=W3[1]Tx+b3[1]a^{[1]}_3 = \sigma(z^{[1]}_3),z^{[1]}_3 = W^{[1]T}_3x + b^{[1]}_3

a4[1]=σ(z4[1]),z4[1]=W4[1]Tx+b4[1]a^{[1]}_4 = \sigma(z^{[1]}_4),z^{[1]}_4 = W^{[1]T}_4x + b^{[1]}_4

计算过程向量化:
a[n]=σ(z[n])z[n]=W[n]x+b[n]a^{[n]}=\sigma(z^{[n]}),z^{[n]} = W^{[n]}x + b^{[n]}

详细计算过程:
a[1]=[a1[1]a2[1]a3[1]a4[1]]=σ(z[1]) a^{[1]} = \left[ \begin{array}{c} a^{[1]}_{1}\\ a^{[1]}_{2}\\ a^{[1]}_{3}\\ a^{[1]}_{4} \end{array} \right] = \sigma(z^{[1]})

[z1[1]z2[1]z3[1]z4[1]]=[...W1[1]T......W2[1]T......W3[1]T......W4[1]T...]W[1][x1x2x3]input+[b1[1]b2[1]b3[1]b4[1]]b[1] \left[ \begin{array}{c} z^{[1]}_{1}\\ z^{[1]}_{2}\\ z^{[1]}_{3}\\ z^{[1]}_{4}\\ \end{array} \right] = \overbrace{ \left[ \begin{array}{c} ...W^{[1]T}_{1}...\\ ...W^{[1]T}_{2}...\\ ...W^{[1]T}_{3}...\\ ...W^{[1]T}_{4}... \end{array} \right] }^{W^{[1]}} * \overbrace{ \left[ \begin{array}{c} x_1\\ x_2\\ x_3\\ \end{array} \right] }^{input} + \overbrace{ \left[ \begin{array}{c} b^{[1]}_1\\ b^{[1]}_2\\ b^{[1]}_3\\ b^{[1]}_4\\ \end{array} \right] }^{b^{[1]}}

1.3.4 多样本向量化

重复上述单样本的计算过程即可,可通过循环实现,当然向量化才是最佳操作。

  • 设输入为XX,有m个样本,上角标(i)(i)代表第ii个样本:
    X=[x(1)x(2)x(m)] X = \left[ \begin{array}{c} \vdots & \vdots & \vdots & \vdots\\ x^{(1)} & x^{(2)} & \cdots & x^{(m)}\\ \vdots & \vdots & \vdots & \vdots\\ \end{array} \right]
  • 中间变量Z[1]Z^{[1]}
    Z[1]=[z[1](1)z[1](2)z[1](m)] Z^{[1]} = \left[ \begin{array}{c} \vdots & \vdots & \vdots & \vdots\\ z^{[1](1)} & z^{[1](2)} & \cdots & z^{[1](m)}\\ \vdots & \vdots & \vdots & \vdots\\ \end{array} \right]
  • 隐藏层A[1]A^{[1]}
    A[1]=[α[1](1)α[1](2)α[1](m)] A^{[1]} = \left[ \begin{array}{c} \vdots & \vdots & \vdots & \vdots\\ \alpha^{[1](1)} & \alpha^{[1](2)} & \cdots & \alpha^{[1](m)}\\ \vdots & \vdots & \vdots & \vdots\\ \end{array} \right]
  • 前向传播公式
    z[1](i)=W[1](i)x(i)+b[1]α[1](i)=σ(z[1](i))z[2](i)=W[2](i)α[1](i)+b[2]α[2](i)=σ(z[2](i))}    {Z[1]=W[1]X+bA[1]=σ(Z[1])z[2]=W[2]A[1]+b[2]A[2]=σ(z[2]) \left. \begin{array}{r} \text{$z^{[1](i)} = W^{[1](i)}x^{(i)} + b^{[1]}$}\\ \text{$\alpha^{[1](i)} = \sigma(z^{[1](i)})$}\\ \text{$z^{[2](i)} = W^{[2](i)}\alpha^{[1](i)} + b^{[2]}$}\\ \text{$\alpha^{[2](i)} = \sigma(z^{[2](i)})$}\\ \end{array} \right\} \implies \begin{cases} \text{$Z^{[1]} = W^{[1]}X+b$}\\ \text{$A^{[1]} = \sigma(Z^{[1]})$}\\ \text{$z^{[2]} = W^{[2]}A^{[1]} + b^{[2]}$}\\ \text{$A^{[2]} = \sigma(z^{[2]})$}\\ \end{cases}

这些数据,每一列代表不同的样本,每一行代表NN中的不同结点。

1.3.6 **函数

1.sigmoid:
σ(z)=11+ez\sigma(z) = \frac{1}{{1 + e}^{- z}}
缺点:

  • 梯度消失,即饱和问题;
  • 非均值,输出不是以0为中心
  • 解析式还有幂运算

优点:

  • 值域是[0,1]

导数:
ddzg(z)=11+ez(111+ez)=g(z)(1g(z))\frac{d}{dz}g(z) = {\frac{1}{1 + e^{-z}} (1-\frac{1}{1 + e^{-z}})}=g(z)(1-g(z))

  • zz = 10或z=10z= -10 ; ddzg(z)0\frac{d}{dz}g(z)\approx0
  • zz= 0 , ddzg(z)=g(z)(1-g(z))=1/4\frac{d}{dz}g(z)\text{=g(z)(1-g(z))=}{1}/{4}
  • 神经网络中a=g(z)a= g(z); g(z)=ddzg(z)=a(1a)g{{(z)}^{'}}=\frac{d}{dz}g(z)=a(1-a)

2.tanh:
tanh(z)=ezezez+eztanh(z) = \frac{e^{z} - e^{- z}}{e^{z} + e^{- z}}

缺点:

  • 梯度消失;
  • 幂运算

优点:

  • 值域是[-1,1],解决0均值问题;

导数:
ddzg(z)=1(tanh(z))2\frac{d}{{d}z}g(z) = 1 - (tanh(z))^{2}

  • zz = 10或z=10z= -10 ddzg(z)0\frac{d}{dz}g(z)\approx0
  • zz = 0, ddzg(z)=1-(0)=1\frac{d}{dz}g(z)\text{=1-(0)=}1
  • 在神经网络中:a=g(z)a= g(z); g(z)=ddzg(z)=(1a2)g{{(z)}^{'}}=\frac{d}{dz}g(z)=(1-a^2)

3.Relu:f(z)=max(0,z)f(z) = max(0,z)

优点:

  • 仅需一个阈值,复杂度低;
  • 单侧抑制,网络稀疏表达,控制过拟合
  • 非饱和性,有效解决梯度消失问题

缺点:

  • 非0均值(zero-centered)
  • 负神经元梯度死亡-导致参数梯度无法更新

导数:
g(z)={0if z < 01if z > 0undefinedif z = 0 g(z)^{'}= \begin{cases} 0& \text{if z < 0}\\ 1& \text{if z > 0}\\ undefined& \text{if z = 0} \end{cases}

4.Leaky Relu:f(z)=max(αz,z)f(z) = max(\alpha z, z)

优点:

  • 解决神经元死亡问题
  • 复杂度低,单侧抑制,非饱和性

导数:
g(z)={αif z < 01if z > 0undefinedif z = 0 g(z)^{'}= \begin{cases} \alpha & \text{if z < 0}\\ 1& \text{if z > 0}\\ undefined& \text{if z = 0} \end{cases}

5.Softmax:
σ(zj)=ezjk=1Kezk \sigma(z_{j})=\frac{e^{z_{j}}}{\sum_{k=1}^{K} e^{z_{k}}}
和sigmoid相似,只是多分类输出的时候使用。sigmoid用于二分类输出概率。

1.3.10 直观理解反向传播

回顾逻辑回归公式:
xwb}dw=dzx,db=dz    z=wTx+bdz=dag(z),g(z)=σ(z),dLdz=dLdadadz,ddzg(z)=g(z)    a=σ(z)    L(a,y)da=ddaL(a,y)=(ylogα(1y)log(1a))=ya+1y1a \underbrace{ \left. \begin{array}{l} {x }\\ {w }\\ {b } \end{array} \right\} }_{dw={dz}\cdot x, db =dz} \impliedby\underbrace{{z={w}^Tx+b}}_{dz=da\cdot g^{'}(z), g(z)=\sigma(z), {\frac{{dL}}{dz}}={\frac{{dL}}{da}}\cdot{\frac{da}{dz}}, {\frac{d}{ dz}}g(z)=g^{'}(z)} \impliedby\underbrace{{a = \sigma(z)} \impliedby{L(a,y)}}_{da={\frac{{d}}{da}}{L}\left(a,y \right)=(-y\log{\alpha} - (1 - y)\log(1 - a))^{'}={-\frac{y}{a}} + {\frac{1 - y}{1 - a}{}} }
神经网络可以认为是多层的LR:
公式3.44:
L=1minL(y^,y)dZ[2]=A[2]Y  L = {\frac{1}{m}}\sum_i^n{L(\hat{y},y)},dZ^{[2]}=A^{[2]}-Y\;,

dW[2]=1mdZ[2]A[1]Tdb[2]=1mnp.sum(dZ[2],axis=1,keepdims=True)dW^{[2]}={\frac{1}{m}}dZ^{[2]}{A^{[1]}}^{T},db^{[2]} = {\frac{1}{m}}np.sum(dZ^{[2]},axis=1,keepdims=True)

dZ[1](n[1],m)=W[2]TdZ[2](n[1],m)g[1](Z[1])(n[1],m)\underbrace{dZ^{[1]}}_{(n^{[1]}, m)} = \underbrace{W^{[2]T}dZ^{[2]}}_{(n^{[1]}, m)}*\underbrace{g[1]^{'}(Z^{[1]})}_{(n^{[1]}, m)}

dW[1]=1mdZ[1]xTdW^{[1]} = {\frac{1}{m}}dZ^{[1]}x^{T}

db[1]=1mnp.sum(dZ[1],axis=1,keepdims=True)db^{[1]} = {\frac{1}{m}}np.sum(dZ^{[1]},axis=1,keepdims=True)

1.3.11 随机初始化

如果你把权重或者参数都初始化为0,那么梯度下降将不会起作用。将会使得每一层的权重都是相等的,同步更新没有其他变化。
Andrew Ng-深度学习-第一门课-week3(**函数和BP)

  • WW进行随机初始化,有效避免这个问题,bb不需要初始化;
  • WW一般初始化为很小的随机数,bb不需要初始化;eg.eg.
    W[1]=np.random.randn(2,2)    0.01  ,  b[1]=np.zeros((2,1))W^{[1]} = np.random.randn(2,2)\;*\;0.01\;,\;b^{[1]} = np.zeros((2,1))
    W[2]=np.random.randn(2,2)    0.01  ,  b[2]=0W^{[2]} = np.random.randn(2,2)\;*\;0.01\;,\;b^{[2]} = 0
  • 初始化为较小的数是因为,sigmoid/tanhsigmoid/tanh在参数很大时,梯度很小甚至消失;