Cousera ▶ Deep Learning ▶ 课程笔记 ▶ Week 3

Week 3

神经网络表示 NN Representation

  • 输入层,输入单元x

  • 隐藏层,进行神经网络内部的数据处理

  • 输出层,用于输出估计值y^\hat{y}

  • “隐藏”的含义:这一层的节点的真实值并没有被观察,数据集中也没有相关表示

  • 输入可以看作时原始(第0层)的**输出,一次可以表示成a[0]=Xa^{[0]}=X

  • 隐藏层则是a[1]a^{[1]},隐藏层的每一个节点输出记为ai[1]a^{[1]}_i

  • 输出层是a[2]a^{[2]},并有了y^=a[2]\hat y = a ^ {[2]}

  • 约定上述网络是一个两层网络(不计入输入层)

神经网络的计算输出 NN Output

  • 实质上很像是对逻辑回归的多次重复

  • 隐藏层节点输出ai[l]a_i^{[l]},即l层的第i个节点的输出

  • 对于给出的输入xx

    • 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]})

多训练实例向量化 Vectorizing

  • 对于多个实例,**输出表示为a[l](i)a^{[l](i)},即第i个实例在第l层的**输出

  • 对于多实例,将实例按列排列,即每行为一种特征,每列为一个实例

  • 每一层的计算过程的向量化表示:

    • Z[l]=W[l]X+b[l]Z^{[l]}=W^{[l]}X+b^{[l]},对于具有n个特征m个实例,对当前第i层,有s个节点,W是一个s×ns \times n的矩阵,X是一个n×mn \times m的矩阵,b是一个1×m1 \times m的矩阵(利用python的广播机制扩展),Z是一个s×ms \times m的矩阵,对应各个节点的结果
    • A[l]=σ(Z[l])A^{[l]}=\sigma(Z^{[l]}),元素级操作,不改变维度11
  • 对于上面提到的两层网络计算逻辑,改写为(同时完成上面提到的逻辑的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]})

**函数 Activation Functions

  • 对隐藏层使用怎样的**函数是建立一个NN模型的一个必要选择

  • 对一个NN模型,隐藏层和输出层均需要使用**函数

  • 在计算逻辑中,可以改写为A[l]=g(Z[l])A^{[l]}=g(Z^{[l]}),函数g是一个非线性函数

  • 双曲正切函数,即tanh函数

    • 函数值范围在-1到1之间

    • a=tanh(z)=ezezez+eza=\tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}

    • 数学上是sigmoid函数的一个移位表示

    • 由于输出值的均值趋近于0,因此需要中心化数据时,应当使用tanh

    • 大多数情况下,tanh严格优于sigmoid函数

Cousera ▶ Deep Learning ▶ 课程笔记 ▶ Week 3
Cousera ▶ Deep Learning ▶ 课程笔记 ▶ Week 3

  • 面对二元分类的情况是,仍然应该使用sigmoid函数(此时注意模型中区分g)

  • sigmoid和tanh都有一个缺点,即在z取值非常大或者非常小时,其梯度变得非常小,会导致梯度下降变得十分缓慢

  • 线性整流函数,Rectified Linear Unit(ReLU)

    • a=max(0,z)a=\max(0,z)
    • z为正,导数恒为1;z为负,导数恒为0;z为0时,导数不存在(实现时会得到一个极小值)
    • 一个更被广泛使用的函数
    • 优点:在z的广泛取值内,各点的梯度距离0比较远,梯度下降收敛相对更快
  • Leaky ReLU

    • 与ReLU基本相似,但是在z为负时,有一个极小的大于零的斜率
    • a=max(0.01z,z)a=\max(0.01z,z)

Cousera ▶ Deep Learning ▶ 课程笔记 ▶ Week 3

**函数的导数

  • sigmoid函数
    • ddzg(z)=11+e(z)(111+e(z))=g(z)(1g(z))=a(1a)\frac{d}{dz}g(z)=\frac{1}{1+e^{(-z)}}(1-\frac{1}{1+e^{(-z)}})=g(z)(1-g(z))=a(1-a)
  • tanh函数
    • ddzg(z)=1(tanh(z))2=1a2\frac{d}{dz}g(z)=1-(tanh(z))^2=1-a^2
  • ReLU函数
    • KaTeX parse error: No such environment: equation at position 25: …dz}g(z)= \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \left\{ …
  • Leaky ReLU函数
    • KaTeX parse error: No such environment: equation at position 25: …dz}g(z)= \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \left\{ …

神经网络的梯度下降 GD for NN

  • 以两层网络为例
  • 对各层节点表示为n[0],  n[1],  n[2]=1n^{[0]}, \; n^{[1]}, \; n^{[2]}=1
  • 有参数W[1],  b[1],  W[2],  b[2]W^{[1]}, \; b^{[1]}, \; W^{[2]}, \; b^{[2]},维数分别为n[1]×n[0],  n[1]×1,  n[2]×n[1],  n[2]×1n^{[1]} \times n^{[0]}, \; n^{[1]} \times 1, \; n^{[2]} \times n^{[1]}, \; n^{[2]} \times 1
  • 代价函数J(W[1],b[1],W[2],b[2])=1mi=1mL(y^,y)J(W^{[1]}, b^{[1]}, W^{[2]}, b^{[2]})=\frac{1}{m}\sum\limits_{i=1}^{m}L(\hat y, y)
  • 在使用梯度下降时,将参数随即在全0附近十分重要
  • 对梯度下降,需要计算dW[1],  db[1],  dW[2],  db[2]dW^{[1]}, \; db^{[1]}, \; dW^{[2]}, \; db^{[2]},并更新各个参数
  • 反向传播公式:
    • dZ[2]=A[2]Y,  Y=[y(1)y(2)y(m)]dZ^{[2]}=A^{[2]}-Y,\;Y=\begin{bmatrix}y^{(1)}&y^{(2)}&\ldots&y^{(m)}\end{bmatrix}
    • dW[2]=1mdZ[2]A[1]TdW^{[2]}=\frac{1}{m}dZ^{[2]}A^{[1]T}
    • db[2]=1mnp.sum(dZ[2])db^{[2]}=\frac{1}{m}np.sum(dZ^{[2]})
    • dZ[1]=W[2]TdZ[2]g[1](Z[1])dZ^{[1]}=W^{[2]T}dZ^{[2]} * g^{[1]\prime}(Z^{[1]})
    • dW[1]=1mdZ[1]XTdW^{[1]}=\frac{1}{m}dZ^{[1]}X^{T}
    • db[1]=1mnp.sum(dZ[1])db^{[1]}=\frac{1}{m}np.sum(dZ^{[1]})

随机初始化 Random Initialization

  • 如果在神经网络中将所有的权重都初始化成0,那么从最开始的迭代开始,每一个神经元因为参数对称而实现相同的功能,这一情况不会因为多次迭代而改变(对称失效)
  • np.random.randn((2,2)) * 0.01
  • 初始化值不宜过大,因为在使用sigmoid或tanh这样的函数时,过大的参数会造成结果过大,从而时GD变得非常缓慢