《吴恩达深度学习》01神经网络和深度学习(第3周浅层神经网络)

01. 神经网络和深度学习

第三周 浅层神经网络

3.1 神经网络概览

  1. z[i]z^{[i]}表示第i层

3.2 神经网络表示

  1. 神经网络的各部分名称
    《吴恩达深度学习》01神经网络和深度学习(第3周浅层神经网络)
    输入层,隐藏层,输出层
  2. 在计算神经网络层数时,仅计算隐藏层和输出层,不计算输入层。

3.3 计算神经网络的输出

  1. 隐藏层某个节点示意图
    《吴恩达深度学习》01神经网络和深度学习(第3周浅层神经网络)
    z1[1]=w1[1]Tx+b1[1]z^{[1]}_1 = w^{[1]T}_1x+b^{[1]}_1
    a1[1]=σ(z1[1])a^{[1]}_1 = \sigma(z^{[1]}_1)
  2. 向量化计算
    z[1]=w[1]Tx+b[1]z^{[1]} = w^{[1]T}x+b^{[1]}
    a[1]=σ(z[1])a^{[1]} = \sigma(z^{[1]})

3.4 多个例子中的向量化

  1. a[i](j)a^{[i](j)}表示第i层第j个样本
  2. X=[x(1),x(2),,x(m)]X=[x^{(1)}, x^{(2)}, \cdots, x^{(m)}],则向量化的计算公式为:
    z[1]=w[1]X+b[1]z^{[1]} = w^{[1]}X+b^{[1]}
    A[1]=σ(z[1])A^{[1]}=\sigma(z^{[1]})
    z[2]=w[2]A[1]+b[2]z^{[2]}=w^{[2]}A^{[1]}+b^{[2]}
    A[2]=σ(z[2])A^{[2]}=\sigma(z^{[2]})

3.5 向量化实现的解释

  1. Z[1]=w[1]XZ^{[1]}=w^{[1]}X的示意图
    《吴恩达深度学习》01神经网络和深度学习(第3周浅层神经网络)
  2. 非向量化代码和向量化代码对比总结
    《吴恩达深度学习》01神经网络和深度学习(第3周浅层神经网络)

3.6 **函数

  1. **函数g(z[i])g(z^{[i]})
    (1) tanh(z)=ezezez+eztanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}几乎总是比sigmoid函数好(除了输出层)
    《吴恩达深度学习》01神经网络和深度学习(第3周浅层神经网络)
    缺点:当zz很大或很小时,tanh和sigmoid斜率会很小,导致梯度下降法不好使
    (2) ReLu函数max(0,z)max(0,z)
    《吴恩达深度学习》01神经网络和深度学习(第3周浅层神经网络)
    缺点:当zz为负数时,导数为0 \rightarrow 带有泄露的ReLu
  2. 总结对比
    《吴恩达深度学习》01神经网络和深度学习(第3周浅层神经网络)

3.7 为什么需要非线性**函数

  1. 如果是线性**函数(或称为恒等**函数),则输出值为输入值的线性组合。
  2. 只有在压缩的相关应用中会在隐藏层使用线性**函数。

3.8 **函数的导数

  1. sigmoid函数
    dg(z)dz=g(z)(1g(z))\frac{d g(z)}{dz}=g(z)(1-g(z))
    优势:如果已经计算出了函数值,即可快速得到导数值
  2. tanh函数
    dg(z)dz=1(g(z))2\frac{d g(z)}{dz}=1-(g(z))^2
    优势:如果已经计算出了函数值,即可快速得到导数值
  3. ReLU函数
    dg(z)dz=0,z<0\frac{d g(z)}{dz}=0, z<0
    dg(z)dz=1,z0\frac{d g(z)}{dz}=1, z\geq0z=0z=0处自行定义)
  4. 带有泄露的ReLU函数(max(0.01z,z)max(0.01z,z)
    dg(z)dz=0.01,z<0\frac{d g(z)}{dz}=0.01, z<0
    dg(z)dz=1,z0\frac{d g(z)}{dz}=1, z\geq0z=0z=0处自行定义)

3.9 神经网络的梯度下降法

  1. 正向传播
    z[1]=w[1]X+b[1]z^{[1]}=w^{[1]}X+b^{[1]}
    A[1]=g[1](z[1])A^{[1]}=g^{[1]}(z^{[1]})
    $z^{[2]} = $
  2. 反向传播
    dz[2]=A[2]Ydz^{[2]}=A^{[2]}-Y
    dw[2]=1mdz[2]A[1]Tdw^{[2]}=\frac{1}{m}dz^{[2]}A^{[1]T}
    db[2]=1mnp.sum(dz[2],axis=1,keepdims=True)db^{[2]}=\frac{1}{m}np.sum(dz^{[2]}, axis=1, keepdims =True) (最后一项为保证输出维度为(n,1),如果没有最后一项,则输出为(n,))
    dz[1]=w[2]Tdz[2]g[1](z[1])dz^{[1]}=w^{[2]T}dz^{[2]}*g^{[1]'}(z^{[1]})
    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)

3.11 随机初始化

  1. 若零初始化,则意味着节点完全相同,且对输出单元影响完全一样,则更新后,隐藏单元仍然相同,这样的隐藏单元没有意义。
  2. 通常意义下的初始化:
    w[1]=np.random.randn((2,2))0.01w^{[1]}=np.random.randn((2,2))*0.01
    b[1]=np.zeros((2,1))b^{[1]}=np.zeros((2,1))
  3. 常数需要设置较小,因为若是sigmoid或tanh函数,则太大的时候会梯度小,收敛慢。