机器学习入门课程笔记(一)——deeplearning.ai: Neural Networks and Deep Learning

机器学习入门课程笔记(一)——deeplearning.ai: Neural Networks and Deep Learning,第1张

欢迎前往我的个人博客网站:mathscode.top获取更多学习资源。
所有文本内容会在知乎: MathsCode同步
所有开放资源会在Github: MathsCode开放下载
欢迎关注我的公众号:MathsCode,一同交流。
有问题欢迎大家评论或者私信我!

文章目录
  • 前言
  • Week1 Introduction to Deep Learning
    • 1. 神经网络中的一个巨大突破:从Sigmoid 函数到 Relu函数 的迁移
  • Week2.1 Logistic Regression as a Neural Network
    • 1. Binary Classification
    • 2. Logistic Regression
    • 3. Cost Function and Loss(Error) Function
    • 4. Gradient Descent 梯度下降法
    • 5. Logistic Regression Derivatives 求逻辑回归的导数
    • 6. Logistic Regression Gradient Descent流程
  • Week2.2 Python and Vectorization
    • 1.Vectorizing Logistic Regression
    • 2. Vectorizing Logistic Regression's Gradient Output
  • Week3 Shallow Neural Network
    • 1. Overview
    • 2. Neural Network 详细解析
    • 3. 多样本 向量化(forward propagation)
    • 4. Activation Function 激活函数
    • 5. 神经网络的梯度下降法(back propagation)
      • 5.1 神经网络最后一层的导数计算
      • 5.2 神经网络中间层(1~k-1)的导数计算
      • 5.3 总结
    • 6. 随机初始化
  • Week4 Deep Neural NetWork
    • 1. Notations 符号约定
    • 2. 总结


前言

这是Coursera上的吴恩达老师的DeepLearning.ai课程笔记系列一(Neural Networks and Deep Learning)。
学习视频可在b站上找到:DeepLearning.ai课程视频
作业和证书需要在官网上进行完成、获取。此处需要科学上网
笔记以及代码文件请到Github 仓库进行


写在笔记前面

  • 在此文档中的矩阵书写中,是按照Matlab的代码书写规则而来,逗号(,)代表两边相邻的元素是同一行的,分号(;)代表两边相邻的元素是分行的。
  • 注意上标和下标的区分,上标加圆括号代表的是第几个训练样本的对应数值,上标加方括号代表的是网络不同的层,下标代表的是当前参数的第几个维度。
Week1 Introduction to Deep Learning 1. 神经网络中的一个巨大突破:从Sigmoid 函数到 Relu函数 的迁移
  • sigmoid 函数 在梯度近乎为0的区域学习的进度会非常缓慢,因为使用的是梯度下降法,参数变化的速率非常慢。
  • 当把激活函数换成ReLU(rectified linear unit),对于所有正输入梯度都是1那么梯度就不会慢慢变成 0。 那么梯度就不会慢慢变成 0。 梯度在左边的时候为 0。
  • 结果证明, 简单地把 sigmoid 函数换成 ReLU 函数 使得梯度下降算法的速度 提高很多。
Week2.1 Logistic Regression as a Neural Network 1. Binary Classification
  • m m m : training examples 等价于 m t r a i n m_{train} mtrain
  • m t e s t m_{test} mtest : test examples
  • n x n_x nx : 表示输入的特征个数,即x的维数
  • X = [ x ( 1 ) , x ( 2 ) , x ( 3 ) , . . . . . . x ( m ) ] X = [x^{(1)},x^{(2)},x^{(3)},......x^{(m)}] X=[x(1),x(2),x(3),......x(m)] : 这里的每个 x ( i ) x^{(i)} x(i)都是一个 n x ∗ 1 n_x*1 nx1的列向量为 n x ∗ m n_x * m nxm 维矩阵
  • Y = [ y ( 1 ) , y ( 2 ) , y ( 3 ) , . . . . . . y ( m ) ] Y = [y^{(1)},y^{(2)},y^{(3)},......y^{(m)}] Y=[y(1),y(2),y(3),......y(m)] : 为 1 ∗ m 1*m 1m的矩阵
2. Logistic Regression
  • y ^ = P ( y = 1 ∣ x ) \hat{y} = P(y=1|x) y^=P(y=1x) 表示对真实值的估计,取值应该在0和1之间,理解为是预测值

  • σ ( x ) \sigma(x) σ(x) s i g m o i d sigmoid sigmoid 函数的简写
    σ ( z ) = 1 1 + e − z (2.1.2.1) \sigma(z) = \frac{1}{1+e^{-z}} \tag{2.1.2.1} σ(z)=1+ez1(2.1.2.1)

  • y ^ = σ ( w T x + b \hat{y} = \sigma(w^Tx + b y^=σ(wTx+b) w w w是特征前的系数, b b b是偏置量

  • 定义 x 0 = 1 x_0 = 1 x0=1,则 x ( i ) x^{(i)} x(i) ( n x + 1 ) ∗ 1 (n_x + 1)*1 (nx+1)1维度

  • 定义 θ = [ θ 0 ; θ 1 ; θ 2 ; . . . . . . θ n x ] \theta = [\theta^0;\theta^1;\theta^2;......\theta^{n_x}] θ=[θ0;θ1;θ2;......θnx] 其中 θ 0 = b , θ ( i ) = w ( i ) , i ≥ 1 \theta^0 = b,\theta^{(i)} = w^{(i)}, i≥1 θ0=b,θ(i)=w(i),i1

  • 那么 y ^ = σ ( θ T x ) \hat{y} = \sigma(\theta^Tx) y^=σ(θTx)

3. Cost Function and Loss(Error) Function
  • 一种定义Loss
    L ( y ^ , y ) = 1 2 ( y ^ − y ) 2 (2.1.3.1) L(\hat{y},y) = \frac{1}{2}(\hat{y}-y)^2\tag{2.1.3.1} L(y^,y)=21(y^y)2(2.1.3.1)

    这种定义方法在后期的优化问题中会变成非凸的(non-convex),会得到许多局部最优解,而不是全局最优解吗,梯度下降法就不能用了

  • 另一种定义Loss,对于Logistic Regression 而言
    L ( y ^ , y ) = − ( y l o g ( y ^ ) + ( 1 − y ) l o g ( 1 − y ^ ) ) (2.1.3.2) L(\hat{y},y) = -(ylog(\hat{y})+(1-y)log(1-\hat{y}))\tag{2.1.3.2} L(y^,y)=(ylog(y^)+(1y)log(1y^))(2.1.3.2)

  • 定义Cost Function
    J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) (2.1.3.3) J(w,b) = \frac{1}{m} \sum_{i=1}^{m} L(\hat{y}^{(i)},y^{(i)})\tag{2.1.3.3} J(w,b)=m1i=1mL(y^(i),y(i))(2.1.3.3)

Loss Function 是针对单个训练示例定义的损失函数,衡量的是在单个训练示例中Hypothesis的表现。

Cost Function 是针对整个训练集定义的成本函数,衡量的是在整个训练集的中Hypothesis的表现

4. Gradient Descent 梯度下降法

梯度下降法会使函数向最优解的方向前进

在编程中的代码规范

  • d F i n a l O u t p u t d v a r \frac{dFinalOutput}{dvar} dvardFinalOutput 或者 ∂ F i n a l O u t p u t ∂ v a r \frac{\partial FinalOutput}{\partial var} varFinalOutput表示最终输出对某一变量的求导,一般代码中写成dvar即代表。
5. Logistic Regression Derivatives 求逻辑回归的导数
  • 由[2. Logistic Regression](#2. Logistic Regression)和[3. Cost Function and Loss(Error) Function](#3. Cost Function and Loss(Error) Function)得到如下公式:
    σ ( z ) = 1 1 + e − z (2.1.5.1) \sigma(z) = \frac{1}{1+e^{-z}} \tag{2.1.5.1} σ(z)=1+ez1(2.1.5.1)

    z = w T x + b (2.1.5.2) z = w^Tx+b \tag{2.1.5.2} z=wTx+b(2.1.5.2)

    y ^ = σ ( z ) (2.1.5.3) \hat{y} = \sigma(z)\tag{2.1.5.3} y^=σ(z)(2.1.5.3)

    L ( y ^ , y ) = − ( y l o g ( y ^ ) + ( 1 − y ) l o g ( 1 − y ^ ) ) (2.1.5.4) L(\hat{y},y) = -(ylog(\hat{y})+(1-y)log(1-\hat{y}))\tag{2.1.5.4} L(y^,y)=(ylog(y^)+(1y)log(1y^))(2.1.5.4)

    J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) (2.1.5.5) J(w,b) = \frac{1}{m} \sum_{i=1}^{m} L(\hat{y}^{(i)},y^{(i)})\tag{2.1.5.5} J(w,b)=m1i=1mL(y^(i),y(i))(2.1.5.5)

  • 根据[4.Gradient Descent 梯度下降法](#4. Gradient Descent 梯度下降法)中提到的代码规范,先以 L o s s F u n c t i o n Loss Function LossFunction F i n a l O u t p u t FinalOutput FinalOutput求各级变量的导数

    • 根据公式 2.1.5.4 2.1.5.4 2.1.5.4,其中 y y y是给定label,是已知的常数,而 y ^ \hat y y^是受到变量参数 θ \theta θ 影响的变量。
      d L d y ^ = − y y ^ + 1 − y 1 − y ^ (2.1.5.6) \frac{dL}{d\hat y} = -\frac{y}{\hat y} + \frac{1-y}{1-\hat y} \tag{2.1.5.6} dy^dL=y^y+1y^1y(2.1.5.6)
      注意:公式 2.1.5.4 2.1.5.4 2.1.5.4中的 l o g log log 是以自然常数 e e e为底
      d ( l o g a x ) d x = lim ⁡ Δ x → 0 l o g a ( x + Δ x ) − l o g a x Δ x = lim ⁡ Δ x → 0 1 Δ x l o g a ( x + Δ x x ) = lim ⁡ Δ x → 0 1 Δ x l o g a ( 1 + Δ x x ) = lim ⁡ Δ x → 0 l o g a ( 1 + Δ x x ) 1 Δ x = lim ⁡ Δ x → 0 l o g a ( 1 + Δ x x ) x Δ x ∗ 1 x = lim ⁡ Δ x → 0 l o g a e 1 x = lim ⁡ Δ x → 0 l n e 1 x l n a = 1 x l n a \frac{d(log_ax)}{dx} = \lim_{\Delta{x} \to 0} \frac{log_a(x+\Delta x)-log_ax}{\Delta x} \\= \lim_{\Delta{x} \to 0}\frac{1}{\Delta x} log_a(\frac{x+\Delta x}{x})\\ = \lim_{\Delta{x} \to 0}\frac{1}{\Delta x} log_a(1+\frac{\Delta x}{x})\\ = \lim_{\Delta{x} \to 0}log_a(1+\frac{\Delta x}{x})^\frac{1}{\Delta x}\\ = \lim_{\Delta{x} \to 0}log_a(1+\frac{\Delta x}{x})^{\frac{x}{\Delta x}*\frac{1}{x}}\\ = \lim_{\Delta{x} \to 0} log_ae^\frac{1}{x}\\ = \lim_{\Delta{x} \to 0} \frac{ln e^\frac{1}{x}}{lna}\\ = \frac{1}{xlna} dxd(logax)=Δx0limΔxloga(x+Δx)logax=Δx0limΔx1loga(xx+Δx)=Δx0limΔx1loga(1+xΔx)=Δx0limloga(1+xΔx)Δx1=Δx0limloga(1+xΔx)Δxxx1=Δx0limlogaex1=Δx0limlnalnex1=xlna1

    • 根据公式 2.1.5.3 2.1.5.3 2.1.5.3,求 d L d z \frac{dL}{dz} dzdLdz
      d L d z = d L d y ^ d y ^ d z d y ^ d z = e − z 1 + e − z \frac{dL}{dz} = \frac{dL}{d\hat y}\frac{d\hat y}{dz}\ \frac{d\hat y}{dz} = \frac{e^{-z}}{1+e^{-z}}\ dzdL=dy^dLdzdy^dzdy^=1+ezez

      d L d z = ( − y y ^ + 1 − y 1 − y ^ ) ∗ e − z 1 + e − z = ( y ^ − y y ^ ( 1 − y ^ ) ) ∗ e − z 1 + e − z = y ^ − y (2.1.5.7) \frac{dL}{dz} = (-\frac{y}{\hat y} + \frac{1-y}{1-\hat y})*\frac{e^{-z}}{1+e^{-z}}\\ = (\frac{\hat y - y}{\hat y (1-\hat y)})*\frac{e^{-z}}{1+e^{-z}}\\ = \hat{y}-y \tag{2.1.5.7} dzdL=(y^y+1y^1y)1+ezez=(y^(1y^)y^y)1+ezez=y^y(2.1.5.7)

    • 根据 2.1.5.2 2.1.5.2 2.1.5.2 ∂ L ∂ w i \frac{\partial L}{\partial w_i} wiL,即dwi
      ∂ L ∂ w i = x i ∗ d L d z (2.1.5.8) \frac{\partial L}{\partial w_i} = x_i*\frac{dL}{dz}\tag{2.1.5.8} wiL=xidzdL(2.1.5.8)

    • 因为 b = w 0 , x 0 = 1 b = w_0,x_0 = 1 b=w0,x0=1
      d L d b = d L d z (2.1.5.9) \frac{dL}{db} = \frac{dL}{dz}\tag{2.1.5.9} dbdL=dzdL(2.1.5.9)

6. Logistic Regression Gradient Descent流程
  • 根据参数 θ \theta θ和输入 X X X构建单个样本的损失函数 L ( y ^ , y ) L(\hat y,y) L(y^,y),这个过程叫做前向传播步骤(before propagation steps)
  • 接下来就是要利用Gradient Descent 进行对参数 θ \theta θ 进行调整从而使 L ( y ^ , y ) L(\hat y, y) L(y^,y) 降到最低
  • 由生成的单样本损失函数计算 θ \theta θ 每个维度的值的偏导数,这个叫做后向传播(backwards propagation steps)
  • 根据代码规范,求出对应的dwi,db
  • m m m个训练examples进行做同样的 *** 作,每一个 d w i dw_i dwi,这里的 w i w_i wi θ \theta θ 的每个维度,也是每一个example的多个参数,所以对于一个确定的 i i i,会有 m m m d w i dw_i dwi,然后对 d w i dw_i dwi 求和取平均
  • 更新对应的参数wi = wi - alpha*dwi;b = b-alpha*db

显然在上述步骤会用到至少两个For 循环,其中一个是对 m m m个example 进行遍历计算,同时对于任一个example都会要对其中的所有 d w i dw_i dwi进行计算,所以这个可以拜托显式的For 循环,采取向量进行加速运算。

深度学习中应用向量化有助于在大数据集进行简化运算。

Week2.2 Python and Vectorization 1.Vectorizing Logistic Regression
  • 不采取显式循环,仅使用向量运算实现

  • 根据显式循环的做法
    z ( i ) = w T x ( i ) + b (2.2.1.1) z^{(i)} = w^Tx^{(i)}+b \tag{2.2.1.1} z(i)=wTx(i)+b(2.2.1.1)

    a ( i ) = y ^ ( i ) = σ ( z ( i ) ) (2.2.1.2) a^{(i)} =\hat y^{(i)} = \sigma{(z^{(i)})} \tag{2.2.1.2} a(i)=y^(i)=σ(z(i))(2.2.1.2)

    其中 a ( i ) a^{(i)} a(i)​ 也就是上文提到的 y ^ ( i ) \hat{y}^{(i)} y^(i)

  • 在第一部分[Binary Classification](#1. Binary Classification) 中提到的 X = [ x ( 1 ) , x ( 2 ) , x ( 3 ) , . . . . . . x ( m ) ] X = [x^{(1)},x^{(2)},x^{(3)},......x^{(m)}] X=[x(1),x(2),x(3),......x(m)] 这里的 x ( i ) x^{(i)} x(i)都是 n x ∗ 1 n_x*1 nx1的向量,组成的 X X X 矩阵是 n x ∗ m n_x*m nxm的矩阵

  • w w w n x ∗ 1 n_x * 1 nx1 的列向量

  • 由公式 2.2.1.1 2.2.1.1 2.2.1.1 对公式进行向量化
    Z = w T X + b (2.2.1.3) Z = w^TX+b \tag{2.2.1.3} Z=wTX+b(2.2.1.3)
    其中 Z = [ z ( 1 ) , z ( 2 ) , z ( 3 ) , z ( 4 ) , . . . . . . z ( m ) ] Z = [z^{(1)},z^{(2)},z^{(3)},z^{(4)},......z^{(m)}] Z=[z(1),z(2),z(3),z(4),......z(m)]

  • 由公式 2.2.1.2 2.2.1.2 2.2.1.2对公式进行向量化
    A = σ ( Z ) (2.2.1.4) A = \sigma(Z) \tag{2.2.1.4} A=σ(Z)(2.2.1.4)
    其中 A = [ a ( 1 ) , a ( 2 ) , a ( 3 ) , a ( 4 ) , . . . . . . a ( m ) ] A = [a^{(1)},a^{(2)},a^{(3)},a^{(4)},......a^{(m)}] A=[a(1),a(2),a(3),a(4),......a(m)]

Z = np.dot(w.T,x)+b
A = sigmoid(Z)
2. Vectorizing Logistic Regression’s Gradient Output
  • 根据[1.Vectorizing Logistic Regression ](1.Vectorizing Logistic Regression )利用向量化对m个训练数据进行计算梯度

    注意上标和下标的区分,上标代表的是第几个example的对应数值,下标代表的是当前参数的第几个维度。

    一个样例有一个 y y y,计算出一个 a a a,计算出一个 d z dz dz,但有多个 w i w_i wi

  • 根据单数据梯度[5. Logistic Regression Derivatives 求逻辑回归的导数](#5. Logistic Regression Derivatives 求逻辑回归的导数)中公式 2.1.5.7 2.1.5.7 2.1.5.7和[4.Gradient Descent 梯度下降法](#4. Gradient Descent 梯度下降法)中提到的代码规范,可得
    d z ( 1 ) = a ( 1 ) − y ( 1 ) d z ( 2 ) = a ( 2 ) − y ( 2 ) . . . . . . d z ( i ) = a ( i ) − y ( i ) dz^{(1)} = a^{(1)} - y^{(1)}\\ dz^{(2)} = a^{(2)} - y^{(2)}\\......\\ dz^{(i)} = a^{(i)} - y^{(i)}\\ dz(1)=a(1)y(1)dz(2)=a(2)y(2)......dz(i)=a(i)y(i)
    对其进行向量化
    d Z = [ d z ( 1 ) , d z ( 2 ) , . . . . . d z ( m ) ] A = [ a ( 1 ) , a ( 2 ) , . . . . . a ( m ) ] , Y = [ y ( 1 ) , y ( 2 ) , . . . . . y ( m ) ] dZ = [dz^{(1)},dz^{(2)},.....dz^{(m)}]\\ A = [a^{(1)},a^{(2)},.....a^{(m)}],Y = [y^{(1)},y^{(2)},.....y^{(m)}]\ dZ=[dz(1),dz(2),.....dz(m)]A=[a(1),a(2),.....a(m)],Y=[y(1),y(2),.....y(m)]

    d Z = A − Y (2.2.2.1) dZ = A-Y \tag{2.2.2.1} dZ=AY(2.2.2.1)

  • 根据公式 2.1.5.8 2.1.5.8 2.1.5.8进行向量化,对于一个example可以把所有的dw_i构成一个向量
    d w ( i ) = [ ∂ L ∂ w 1 , ∂ L ∂ w 2 , . . . . . ∂ L ∂ w n x ] T (2.2.2.2) dw^{(i)} = [\frac{\partial L}{\partial w_1},\frac{\partial L}{\partial w_2},.....\frac{\partial L}{\partial w_{n_x}}]^T \tag{2.2.2.2} dw(i)=[w1L,w2L,.....wnxL]T(2.2.2.2)
    而对于m个example
    d w = 1 m ∑ i = 1 m d w ( i ) (2.2.2.3) dw =\frac{1}{m} \sum_{i = 1}^{m} dw^{(i)}\tag{2.2.2.3} dw=m1i=1mdw(i)(2.2.2.3)
    最终所需要的就是dw

  • 根据公式 2.1.5.8 2.1.5.8 2.1.5.8 2.2.2.1 2.2.2.1 2.2.2.1 2.2.2.3 2.2.2.3 2.2.2.3可以推出dw的求法

    • 首先 d w dw dw 是一个 n x ∗ 1 n_x * 1 nx1的向量,根据公式 2.2.2.3 2.2.2.3 2.2.2.3可得
      d w i = 1 m ∑ j = 1 m d w i ( j ) (2.2.2.4) dw_i =\frac{1}{m} \sum_{j=1}^{m} dw_i^{(j)} \tag{2.2.2.4} dwi=m1j=1mdwi(j)(2.2.2.4)
      根据公式 2.1.5.8 2.1.5.8 2.1.5.8可得
      d w i ( j ) = x i ( j ) ∗ d z ( j ) (2.2.2.5) dw_i^{(j)} =x_i^{(j)}*dz^{(j)}\tag{2.2.2.5} dwi(j)=xi(j)dz(j)(2.2.2.5)

      一个example 对应一个 d z dz dz,而一个example对应的输入 x x x是一个 n x ∗ 1 n_x*1 nx1的向量

      可以看出 x i ( j ) x_i^{(j)} xi(j) d z ( j ) dz^{(j)} dz(j)中都含有 j j j,所以在对 j j j from 1 to m 时两者都是变量。所以只有当 x i ( j ) x_i^{(j)} xi(j) 构成行向量, d z ( j ) dz^{(j)} dz(j) 构成列向量时进行运算才可以实现这样的结果。即:
      x i = [ x i ( 1 ) , x i ( 2 ) , x i ( 3 ) , . . . . . , x i ( m ) ] (2.2.2.6) x_i = [x_i^{(1)},x_i^{(2)},x_i^{(3)},.....,x_i^{(m)}]\tag{2.2.2.6} xi=[xi(1),xi(2),xi(3),.....,xi(m)](2.2.2.6)

      d z = [ d z ( 1 ) , d z ( 2 ) , d z ( 3 ) , . . . . . . d z ( m ) ] T (2.2.2.7) dz = [dz^{(1)},dz^{(2)},dz^{(3)},......dz^{(m)}]^T\tag{2.2.2.7} dz=[dz(1),dz(2),dz(3),......dz(m)]T(2.2.2.7)

      d w i = 1 m x i d z (2.2.2.8) dw_i =\frac{1}{m} x_idz\tag{2.2.2.8} dwi=m1xidz(2.2.2.8)

    • 因为 d w dw dw n x ∗ 1 n_x*1 nx1的列向量,所以 d w i dw_i dwi独占一行。
      d w = [ d w 1 ; d w 2 ; d w 3 ; . . . . . . d w n x ] (2.2.2.9) dw = [dw_1;dw2;dw3;......dw_{n_x}]\tag{2.2.2.9} dw=[dw1;dw2;dw3;......dwnx](2.2.2.9)
      由公式 2.2.2.8 2.2.2.8 2.2.2.8 发现只有 x i x_i xi i i i 有关,根据公式 ( 2.2.2.6 ) (2.2.2.6) (2.2.2.6)可知 x i x_i xi是一个行向量,所以令每一个 x i x_i xi占一行。
      x = [ x 1 ; x 2 ; x 3 ; . . . . . . x m ] (2.2.2.10) x = [x_1;x_2;x_3;......x_m] \tag{2.2.2.10} x=[x1;x2;x3;......xm](2.2.2.10)

    • 根据公式 2.2.2.8 , 2.2.2.9 , 2.2.2.10 2.2.2.8,2.2.2.9,2.2.2.10 2.2.2.8,2.2.2.9,2.2.2.10 ,每一个 d w i dw_i dwi组成最终的 d w dw dw,可得
      d w = 1 m x d z dw = \frac{1}{m}xdz dw=m1xdz
      而会发现
      d z = d Z T x = X dz = dZ^T\ x = X dz=dZTx=X
      所以综上

    d w = 1 m X d Z T (2.2.2.11) dw =\frac{1}{m}XdZ^T \tag{2.2.2.11} dw=m1XdZT(2.2.2.11)

  • 根据公式 2.1.5.9 2.1.5.9 2.1.5.9可得m个example的db和
    d b = 1 m ∑ i = 1 m d z ( i ) (2.2.2.12) db = \frac{1}{m}\sum_{i=1}^{m} dz^{(i)}\tag{2.2.2.12} db=m1i=1mdz(i)(2.2.2.12)

    db = np.sum(dZ)/m
    
  • python代码实现

    Z = np.dot(w.T,X)+b
    A = sigmoid(Z)
    dZ = A-Y
    dw = np.dot(X,dZ.T)/m
    db = np.sum(dZ)/m
    # 更新迭代参数
    w = w - alpha*dw
    b = b - alpha*db
    
Week3 Shallow Neural Network 1. Overview

  • 神经网络中每一个节点都代表的是一个基于上层输入( X X X),在当前层的参数( w , b   o r   θ w,b \ or \ \theta w,b or θ)下,经过激活函数的运算(可能是sigmoid( σ ( z ) \sigma(z) σ(z))也可能是ReLU)后的一个Logistics Regression,所以遵循上文中提到的Logistics Regression中的前向传播和后向传播运算。

  • 输入层(Input Layer):开始的输入( x 1 , x 2 , x 3 . . . . . . x_1,x_2,x_3...... x1,x2,x3......)列

  • 输出层(Output Layer):最后只有一个节点的层

  • 隐藏层(Hidden Layer):除去输入层和输出层后的中间的若干层

    在训练过程中的训练集中,我们只知道输入和输出的数值,并不会知道内部隐藏层每一层的具体的数值。

  • a [ i ] a^{[i]} a[i]来表示第 i i i层所有数值组成的列向量
    a [ i ] = [ a 1 [ i ] , a 2 [ i ] , a 3 [ i ] , a 4 [ i ] , . . . . . . ] T (3.1.1) a^{[i]} = [a^{[i]}_1,a^{[i]}_2,a^{[i]}_3,a^{[i]}_4,......]^T \tag{3.1.1} a[i]=[a1[i],a2[i],a3[i],a4[i],......]T(3.1.1)

    a [ 0 ] = x (3.1.2) a^{[0]} = x \tag{3.1.2} a[0]=x(3.1.2)

  • 所以按照第一点的步骤,当前层 a [ i ] a^{[i]} a[i]是基于 a [ i − 1 ] a^{[i-1]} a[i1]经过激活函数的计算得到的

2. Neural Network 详细解析

  • 如上图,每一个节点内部可以细化成两个计算部分(以sigmoid函数为激活函数),总结如下
    z j [ i ] = ( w j [ i ] ) T a [ i − 1 ] + b j [ i ] (3.2.1) z^{[i]}_j = (w^{[i]}_j)^Ta^{[i-1]} + b^{[i]}_j \tag{3.2.1} zj[i]=(wj[i])Ta[i1]+bj[i](3.2.1)

    a j [ i ] = σ ( z j [ i ] ) (3.2.2) a^{[i]}_j = \sigma(z^{[i]}_j) \tag{3.2.2} aj[i]=σ(zj[i])(3.2.2)

    a [ i ] = [ a 1 [ i ] , a 2 [ i ] , a 3 [ i ] , . . . . . ] T (3.2.3) a^{[i]} = [a^{[i]}_1,a^{[i]}_2,a^{[i]}_3,.....]^T \tag{3.2.3} a[i]=[a1[i],a2[i],a3[i],.....]T(3.2.3)

    每一层的每一个计算单元都有一个 w j [ i ] w^{[i]}_j wj[i] b j [ i ] b^{[i]}_j bj[i] 组成这个计算单元,也可以认为是每个计算单元的属性值。

  • 公式矩阵化

    • ( w j [ i ] ) T (w^{[i]}_j)^T (wj[i])T 1 ∗ l e n ( a [ i − 1 ] ) 1*len(a^{[i-1]}) 1len(a[i1])的行向量, a [ i − 1 ] a^{[i-1]} a[i1] l e n ( a [ i − 1 ] ) ∗ 1 len(a^{[i-1]})*1 len(a[i1])1的列向量,其中 l e n ( a [ i ] ) len(a^{[i]}) len(a[i])表示第 i i i层的节点个数。

    • 因为结果 a [ i ] a^{[i]} a[i] l e n ( a [ i ] ) ∗ 1 len(a^{[i]})*1 len(a[i])1的列向量,对应的 z [ i ] z^{[i]} z[i]也是 l e n ( a [ i ] ) ∗ 1 len(a^{[i]})*1 len(a[i])1的列向量,所以根据公式 ( 3.2.1 ) (3.2.1) (3.2.1)可以得出以下内容。

    • 因为 1 ≤ j ≤ l e n ( a [ i ] ) 1 \leq j \leq len(a^{[i]}) 1jlen(a[i]),将 ( w j [ i ] ) T (w^{[i]}_j)^T (wj[i])T 作为 W [ i ] W^{[i]} W[i]的每一行,将 b j [ i ] b^{[i]}_j bj[i]作为 b [ i ] b^{[i]} b[i]的每一个行。
      W [ i ] = [ ( w 1 [ i ] ) T ; ( w 2 [ i ] ) T ; ( w 3 [ i ] ) T ; . . . . . . ] W^{[i]} = [(w^{[i]}_1)^T;(w^{[i]}_2)^T;(w^{[i]}_3)^T;......] W[i]=[(w1[i])T;(w2[i])T;(w3[i])T;......]

      b [ i ] = [ b 1 [ i ] , b 2 [ i ] , b 3 [ i ] , . . . . . . ] b^{[i]} = [b^{[i]}_1,b^{[i]}_2,b^{[i]}_3,......] b[i]=[b1[i],b2[i],b3[i],......]

      所以 W [ i ] W^{[i]} W[i] l e n ( a [ i ] ) ∗ l e n ( a [ i − 1 ] ) len(a^{[i]})*len(a^{[i-1]}) len(a[i])len(a[i1])​的, b [ i ] b^{[i]} b[i] l e n ( a [ i ] ∗ 1 ) len(a^{[i]}*1) len(a[i]1)的列向量。

      因为 a [ i − 1 ] a^{[i-1]} a[i1] l e n ( a [ i − 1 ] ) ∗ 1 len(a^{[i-1]})*1 len(a[i1])1的,根据矩阵相乘,得到的结果 z [ i ] z^{[i]} z[i] 就是 l e n ( a [ i ] ) ∗ 1 len(a^{[i]})*1 len(a[i])1的。

    • 综上:
      z [ i ] = W [ i ] a [ i − 1 ] + b [ i ] (3.2.4) z^{[i]} = W^{[i]}a^{[i-1]} + b^{[i]} \tag{3.2.4} z[i]=W[i]a[i1]+b[i](3.2.4)

      a [ i ] = σ ( z [ i ] ) (3.2.5) a^{[i]} = \sigma(z^{[i]}) \tag{3.2.5} a[i]=σ(z[i])(3.2.5)

3. 多样本 向量化(forward propagation)

当存在 m m m个样本时,朴素的方法是通过循环进行对每个样本进行计算,但这不是最好的方法。

  • 对于第 j j j个样本,在网络的第 i i i层时的计算公式为:
    z [ i ] ( j ) = W [ i ] a [ i − 1 ] ( j ) + b [ i ] (3.3.1) z^{[i](j)} = W^{[i]}a^{[i-1](j)} + b^{[i]} \tag{3.3.1} z[i](j)=W[i]a[i1](j)+b[i](3.3.1)

    a [ i ] ( j ) = σ ( z [ i ] ( j ) ) (3.3.2) a^{[i](j)} = \sigma(z^{[i](j)}) \tag{3.3.2} a[i](j)=σ(z[i](j))(3.3.2)

    注意这里的圆括号和方括号的区别,圆括号代表的是第几个样本,方括号代表的是该样本计算在网络中的第几层。

    同时注意因为 W [ i ] W^{[i]} W[i] b [ i ] b^{[i]} b[i]是每个网络的每一层专有的属性值,不会随训练样本的变化而变化,所以上标没有必要加 ( j ) (j) (j)

  • 回顾[Binary Classification](# 1. Binary Classification)可以得到

    • X X X n x ∗ m n_x*m nxm的矩阵,也就是 l e n ( a [ 0 ] ) ∗ m len(a^{[0]})*m len(a[0])m么,每一列代表着是一个训练样本的数据。

    • W [ 1 ] W^{[1]} W[1] l e n ( a [ 1 ] ) ∗ l e n ( a [ 0 ] ) len(a^{[1]})*len(a^{[0]}) len(a[1])len(a[0])的矩阵,每一行都是第一层的对应节点的参数

    • 所以参数和数据要对应相乘,即行*列,所以 W [ 1 ] X W^{[1]}X W[1]X,结果为 l e n ( a [ 1 ] ) ∗ m len(a^{[1]})*m len(a[1])m,再加上 b [ 1 ] b^{[1]} b[1],这里要利用python广播的原理,每一列是对应的是某一数据的在第一层计算结果,每一行代表的是所有数据经过了第一层中某一节点的计算结果。

    • A [ i ] A^{[i]} A[i] Z [ i ] Z^{[i]} Z[i]都是 l e n ( a [ i ] ) ∗ m len(a^{[i]})*m len(a[i])m的。

    • 所以综上:
      Z [ 1 ] = W [ 1 ] X + b [ 1 ] Z^{[1]} = W^{[1]}X+b^{[1]} Z[1]=W[1]X+b[1]

      A [ 1 ] = σ ( Z [ 1 ] ) A^{[1]} = \sigma(Z^{[1]}) A[1]=σ(Z[1])

      扩展到一般化

    Z [ i ] = W [ i ] A [ i − 1 ] + b [ i ] (3.3.3) Z^{[i]} = W^{[i]}A^{[i-1]}+b^{[i]} \tag{3.3.3} Z[i]=W[i]A[i1]+b[i](3.3.3)

    A [ i ] = σ ( Z [ i ] ) (3.3.4) A^{[i]} = \sigma(Z^{[i]})\tag{3.3.4} A[i]=σ(Z[i])(3.3.4)

    A [ 0 ] = X (3.3.5) A^{[0]} = X \tag{3.3.5} A[0]=X(3.3.5)

4. Activation Function 激活函数
  • 双曲函数

    • 双曲正弦
      s i n h x = e x − e − x 2 sinhx = \frac{e^x-e^{-x}}{2} sinhx=2exex

    • 双曲余弦
      c o s h x = e x + e − x 2 coshx = \frac{e^x+e^{-x}}{2} coshx=2ex+ex

    • 双曲正切
      t a n h x = s i n h x c o s h x = e x − e − x e x + e − x (3.4.1) tanhx = \frac{sinhx}{coshx}=\frac{e^x-e^{-x}}{e^x+e^{-x}} \tag{3.4.1} tanhx=coshxsinhx=ex+exexex(3.4.1)

    • 双曲余切
      c o t h x = 1 t a n h x = e x + e − x e x − e − x cothx = \frac{1}{tanhx}=\frac{e^x+e^{-x}}{e^x-e^{-x}} cothx=tanhx1=exexex+ex

    • 双曲正割
      s e c h x = 1 c o s h x = 2 e x + e − x sechx = \frac{1}{coshx} = \frac{2}{e^x+e^{-x}} sechx=coshx1=ex+ex2

    • 双曲余割
      c s c h x = 1 s i n h x = 2 e x − e − x cschx = \frac{1}{sinhx} =\frac{2}{e^x-e^{-x}} cschx=sinhx1=exex2

    • 目前基本不用 σ ( ) \sigma() σ()作为激活函数了,相对于 σ ( ) \sigma() σ()而言, t a n h ( ) tanh() tanh()更加优越,因为激活函数的平均值更接近0,有助于数据中心化。

    • 但对于二元分类的情况下,希望输出值是0和1,这个时候一般在输出层会使用 σ ( ) \sigma() σ()作为激活函数。

    • 所以对于一个网络,不同层之间的激活函数是是可以不一样的,可以再激活函数上加上方括号角标以作区分。

    • d ( t a n h x ) d x = 1 − ( t a n h x ) 2 (3.4.2) \frac{d(tanhx)}{dx} = 1-(tanhx)^2 \tag{3.4.2} dxd(tanhx)=1(tanhx)2(3.4.2)

  • ReLU(rectified linear unit)
    a = m a x ( 0 , z ) a = max(0,z) a=max(0,z)
    通常使用ReLU,会使神经网络学习速度快很多

  • 隐藏单元不能使用线性的激活函数,必须使用ReLU 或tanh

5. 神经网络的梯度下降法(back propagation)

这里依旧是二分类算法,所以根据前文的内容可以总结出一下公式

  • [forward propagation](#3. 多样本 向量化(forward propagation))的公式

Z [ i ] = W [ i ] A [ i − 1 ] + b [ i ] (3.3.3) Z^{[i]} = W^{[i]}A^{[i-1]}+b^{[i]} \tag{3.3.3} Z[i]=W[i]A[i1]+b[i](3.3.3)

A [ i ] = σ ( Z [ i ] ) (3.3.4) A^{[i]} = \sigma(Z^{[i]})\tag{3.3.4} A[i]=σ(Z[i])(3.3.4)

A [ 0 ] = X (3.3.5) A^{[0]} = X \tag{3.3.5} A[0]=X(3.3.5)

  • 设各层网络的单元数为 n [ i ] n^{[i]} n[i],即
    l e n ( a [ i ] ) = n [ i ] (3.5.0.1) len(a^{[i]}) = n^{[i]} \tag{3.5.0.1} len(a[i])=n[i](3.5.0.1)

    n [ 0 ] = n x n^{[0]} = n_x n[0]=nx

  • 根据[3. Cost Function and Loss(Error) Function](#3. Cost Function and Loss(Error) Function),得到公式 ( 2.1.3.2 ) , ( 2.1.3.3 ) (2.1.3.2),(2.1.3.3) (2.1.3.2),(2.1.3.3)
    L ( y ^ , y ) = − ( y l o g ( y ^ ) + ( 1 − y ) l o g ( 1 − y ^ ) ) (2.1.3.2) L(\hat{y},y) = -(ylog(\hat{y})+(1-y)log(1-\hat{y}))\tag{2.1.3.2} L(y^,y)=(ylog(y^)+(1y)log(1y^))(2.1.3.2)

    J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) (2.1.3.3) J(w,b) = \frac{1}{m} \sum_{i=1}^{m} L(\hat{y}^{(i)},y^{(i)})\tag{2.1.3.3} J(w,b)=m1i=1mL(y^(i),y(i))(2.1.3.3)

  • 神经网络的参数为 w [ i ] , b [ i ] w^{[i]},b^{[i]} w[i],b[i]

  • 根据[2. Vectorizing Logistic Regression’s Gradient Output](# 2. Vectorizing Logistic Regression’s Gradient Output),得到单神经节点的输入输出的导数公式
    d Z = A − Y (2.2.2.1) dZ = A-Y \tag{2.2.2.1} dZ=AY(2.2.2.1)

    d w = 1 m X d Z T (2.2.2.11) dw =\frac{1}{m}XdZ^T \tag{2.2.2.11} dw=m1XdZT(2.2.2.11)

    d b = 1 m ∑ i = 1 m d z ( i ) (2.2.2.12) db = \frac{1}{m}\sum_{i=1}^{m} dz^{(i)}\tag{2.2.2.12} db=m1i=1mdz(i)(2.2.2.12)

    分析:

    对于单节点(单元)的公式,其中A是一个 1 ∗ m 1*m 1m的行向量,每一个值都代表着某一个样本经过该神经元后的结果。

    而在神经网络中的 A [ i ] A^{[i]} A[i],因为每一层有多个神经元, A [ i ] A^{[i]} A[i]中的每一行都代表着一个神经元,即上文中提到的每一列是对应的是某一个数据样本的在该层计算结果,每一行代表的是所有的数据样本经过了该层中某一节点的计算结果。

    前一层的神经单元数目 n [ i − 1 ] n^{[i-1]} n[i1] 就是下一层每个神经元的输入列向量的维数(元素个数)。

5.1 神经网络最后一层的导数计算
  • 在此基础上结合公式 ( 3.3.3 ) , ( 3.3.4 ) , ( 3.3.5 ) (3.3.3),(3.3.4),(3.3.5) (3.3.3),(3.3.4),(3.3.5)得到Back Propagation。假设网络的总共有 k k k层,最后一层只有一个神经单元,所以 A [ k ] A^{[k]} A[k]只有一行,符合数据label: Y Y Y也是一行的要求。
    d Z [ k ] = A [ k ] − Y (3.5.1.2) dZ^{[k]} = A^{[k]}-Y \tag{3.5.1.2} dZ[k]=A[k]Y(3.5.1.2)

    值得注意的是这里和上文中的计算不一样,按照 ( 2.2.2.11 ) (2.2.2.11) (2.2.2.11)的格式应该如下:
    d w [ k ] = 1 m A [ k − 1 ] ( d Z [ k ] ) T (3.5.1.3) dw^{[k]} =\frac{1}{m}A^{[k-1]}(dZ^{[k]})^T \tag{3.5.1.3} dw[k]=m1A[k1](dZ[k])T(3.5.1.3)

    但是我们来验证一下是否正确

    首先看一下原公式 ( 2.2.2.11 ) (2.2.2.11) (2.2.2.11)
    d w = 1 m X d Z T (2.2.2.11) dw =\frac{1}{m}XdZ^T \tag{2.2.2.11} dw=m1XdZT(2.2.2.11)
    当只有一个神经单元时, d w dw dw是一个 n x ∗ 1 n_x*1 nx1的列向量, X X X是一个 n x ∗ m n_x*m nxm的矩阵(其中每一列代表的是一个数据样本,共有 m m m列) d Z dZ dZ是一个由 d z dz dz组成的 1 ∗ m 1*m 1m的行向量(每一个测试样本都对应的一个 d z dz dz),转置之后就是 m ∗ 1 m*1 m1的列向量。

    其次我们关注一下公式 ( 2.2.2.6 ) , ( 2.2.2.7 ) , ( 2.2.2.8 ) (2.2.2.6),(2.2.2.7),(2.2.2.8) (2.2.2.6),(2.2.2.7),(2.2.2.8)

    x i = [ x i ( 1 ) , x i ( 2 ) , x i ( 3 ) , . . . . . , x i ( m ) ] (2.2.2.6) x_i = [x_i^{(1)},x_i^{(2)},x_i^{(3)},.....,x_i^{(m)}]\tag{2.2.2.6} xi=[xi(1),xi(2),xi(3),.....,xi(m)](2.2.2.6)

    d z = [ d z ( 1 ) , d z ( 2 ) , d z ( 3 ) , . . . . . . d z ( m ) ] T (2.2.2.7) dz = [dz^{(1)},dz^{(2)},dz^{(3)},......dz^{(m)}]^T\tag{2.2.2.7} dz=[dz(1),dz(2),dz(3),......dz(m)]T(2.2.2.7)

    d w i = 1 m x i d z (2.2.2.8) dw_i =\frac{1}{m} x_idz\tag{2.2.2.8} dwi=m1xidz(2.2.2.8)

    这了跟 d z dz dz依次相乘的是每一个样本列向量的同一个位置(维度)组成的行向量。

    所以我们再看公式 ( 3.5.1.3 ) (3.5.1.3) (3.5.1.3)是怎么构成的

    • A [ k − 1 ] A^{[k-1]} A[k1]代表的是第 k − 1 k-1 k1层(倒数第二层)的计算结果,是一个 n [ k − 1 ] ∗ m n^{[k-1]}*m n[k1]m的矩阵(每一列代表着一个训练样本经过前 k − 1 k-1 k1层网络得出的结果,其中的每一行的数代表经过第 k − 1 k-1 k1层的某一个节点后的结果)

    • ( d Z [ k ] ) T (dZ^{[k]})^T (dZ[k])T由公式 ( 3.5.1.2 ) (3.5.1.2) (3.5.1.2)可知,是一个 m ∗ 1 m*1 m1的列向量

    • 但是看一下两者相乘的意义:相乘得到应该是一个 n [ k − 1 ] ∗ 1 n^{[k-1]}*1 n[k1]1的列向量,列向量的每一行的值都是由“每一个训练样本经过 k − 1 k-1 k1层中的某一个节点后的值”和“每一个训练样本对应的 d z dz dz”分别相乘再相加的结果,再取均值,那么说明这个结果就是这个节点的 d w dw dw

    • 但是在后面的 W [ k ] W^{[k]} W[k]参数更新时,要实现公式
      W [ k ] = W [ k ] − α d w (3.5.1.4) W^{[k]} = W^{[k]}-\alpha dw \tag{3.5.1.4} W[k]=W[k]αdw(3.5.1.4)
      这里的 W [ k ] W^{[k]} W[k]的每一行对应的是第 k k k层的一个节点的参数,因为你第 k k k层只有一个节点,所以这里的 W [ k ] W^{[k]} W[k]是一个 1 ∗ n [ k − 1 ] 1*n^{[k-1]} 1n[k1]的行向量,刚好和 d w dw dw的转置维度相等。所以其实这里需要的是这个 d w [ k ] dw^{[k]} dw[k]的转置,所以真正的 d w [ k ] dw^{[k]} dw[k]应该如下:
      d w [ k ] = 1 m d Z [ k ] ( A [ k − 1 ] ) T (3.5.1.5) dw^{[k]} =\frac{1}{m}dZ^{[k]}(A^{[k-1]})^T \tag{3.5.1.5} dw[k]=m1dZ[k](A[k1])T(3.5.1.5)

  • 根据公式 ( 2.2.2.12 ) (2.2.2.12) (2.2.2.12)应该可以得出
    d b [ k ] = 1 m ∑ i = 1 m d Z i [ k ] (3.5.1.6) db^{[k]}= \frac{1}{m}\sum_{i=1}^{m} dZ^{[k]}_i\tag{3.5.1.6} db[k]=m1i=1mdZi[k](3.5.1.6)

  • 总结一下:

    神经网络的最后一层(总共 k k k层)的导数计算公式:
    d Z [ k ] = A [ k ] − Y (3.5.1.2) dZ^{[k]} = A^{[k]}-Y \tag{3.5.1.2} dZ[k]=A[k]Y(3.5.1.2)

    d w [ k ] = 1 m d Z [ k ] ( A [ k − 1 ] ) T (3.5.1.5) dw^{[k]} =\frac{1}{m}dZ^{[k]}(A^{[k-1]})^T \tag{3.5.1.5} dw[k]=m1dZ[k](A[k1])T(3.5.1.5)

    d b [ k ] = 1 m ∑ i = 1 m d Z i [ k ] (3.5.1.6) db^{[k]}= \frac{1}{m}\sum_{i=1}^{m} dZ^{[k]}_i\tag{3.5.1.6} db[k]=m1i=1mdZi[k](3.5.1.6)

    参数更新
    W [ k ] = W [ k ] − α d w (3.5.1.4) W^{[k]} = W^{[k]}-\alpha dw \tag{3.5.1.4} W[k]=W[k]αdw(3.5.1.4)

    b [ k ] = b [ k ] − α d b [ k ] (3.5.1.7) b^{[k]} = b^{[k]}-\alpha db^{[k]} \tag{3.5.1.7} b[k]=b[k]αdb[k](3.5.1.7)

    单节点的导数计算公式:

    d Z = A − Y (2.2.2.1) dZ = A-Y \tag{2.2.2.1} dZ=AY(2.2.2.1)

    d w = 1 m X d Z T (2.2.2.11) dw =\frac{1}{m}XdZ^T \tag{2.2.2.11} dw=m1XdZT(2.2.2.11)

    d b = 1 m ∑ i = 1 m d z ( i ) (2.2.2.12) db = \frac{1}{m}\sum_{i=1}^{m} dz^{(i)}\tag{2.2.2.12} db=m1i=1mdz(i)(2.2.2.12)

    关于 ( 2.2.2.11 ) (2.2.2.11) (2.2.2.11) ( 3.5.5 ) (3.5.5) (3.5.5)区别原因:

    主要是因为单节点中的 w w w是一个列向量,后期更新也是在列的方向上进行更新,而神经网络中的 W W W是由各个节点的 w T w^T wT行向量进行组成的矩阵,后期参数更新是在行方向上进行更新。

5.2 神经网络中间层(1~k-1)的导数计算
  • 已知第 i i i层的相关信息

    • 神经节点数 n [ k − 1 ] n^{[k-1]} n[k1]

    • 因为计算导数是back propagation,所以计算第 i i i层导数信息要基于第 i + 1 i+1 i+1层的相关结果(所以是要假设第 i + 1 i+1 i+1层的计算结果均已知)

      i + 1 i+1 i+1层前向计算公式:

    Z [ i + 1 ] = W [ i + 1 ] A [ i ] + b [ i + 1 ] = W [ i + 1 ] g [ i ] ( Z [ i ] ) + b [ i + 1 ] (3.5.2.1) Z^{[i+1]} = W^{[i+1]}A^{[i]}+b^{[i+1]}\\ = W^{[i+1]}g^{[i]}(Z^{[i]})+b^{[i+1]} \tag{3.5.2.1} Z[i+1]=W[i+1]A[i]+b[i+1]=W[i+1]g[i](Z[i])+b[i+1](3.5.2.1)

    ​ 这里的 g [ i ] ( Z [ i ] ) g^{[i]}(Z{[i]}) g[i](Z[i])表示的是第 i i i层所采取的激活函数

  • 已知第 i + 1 i+1 i+1的计算结果 d Z [ i + 1 ] , d w [ i + 1 ] , d b [ i + 1 ] dZ^{[i+1]},dw^{[i+1]},db^{[i+1]} dZ[i+1],dw[i+1],db[i+1],待计算的参数有 d Z [ i ] , d w [ i ] , d b [ i ] dZ^{[i]},dw^{[i]},db^{[i]} dZ[i],dw[i],db[i]
    d Z [ i ] = d F i n a l O u t p u t d Z [ i ] = d F i n a l O u t p u t d Z [ i + 1 ] ∗ d Z [ i + 1 ] d Z [ i ] = d Z [ i + 1 ] ( 已 知 ) ∗ d Z [ i + 1 ] d Z [ i ] (3.5.2.2) dZ^{[i]}= \frac{dFinalOutput}{dZ^{[i]}}\ \\ = \frac{dFinalOutput}{dZ^{[i+1]}}*\frac{dZ^{[i+1]}}{dZ^{[i]}}\ \ \ = dZ^{[i+1]}(已知)*\frac{dZ^{[i+1]}}{dZ^{[i]}} \tag{3.5.2.2} dZ[i]=dZ[i]dFinalOutput=dZ[i+1]dFinalOutputdZ[i]dZ[i+1]=dZ[i+1]()dZ[i]dZ[i+1](3.5.2.2)

    这里的表述有些问题,因为这里的 d Z dZ dZ都是矩阵,不可以这样来表示导数,但是可以用来描述一下计算思路。

    所以只需要求出 d Z [ i + 1 ] d Z [ i ] \frac{dZ^{[i+1]}}{dZ^{[i]}} dZ[i]dZ[i+1]即可,已知公式 ( 3.5.2.1 ) (3.5.2.1) (3.5.2.1)建立了 Z [ i + 1 ] Z^{[i+1]} Z[i+1] Z [ i ] Z^{[i]} Z[i]的关系,所以利用该公式即可计算,但是因为是矩阵,需要对每一个元素进行分析。

    • i i i层神经节点数是 n [ i ] n^{[i]} n[i]个,对应的 Z [ i ] Z^{[i]} Z[i] A [ i ] A^{[i]} A[i]均是一个 n [ i ] ∗ m n^{[i]}*m n[i]m的矩阵(行代表节点、列代表样本)

    • W [ i ] W^{[i]} W[i]的每一行的值为该层的某个节点的 w T w^T wT

    • 对于第 i + 1 i+1 i+1层中的第 j j j个节点的参数向量为 w j [ i + 1 ] w^{[i+1]}_j wj[i+1],是一个 n [ i ] ∗ 1 n^{[i]}*1 n[i]1的列向量;还有常数 b j [ i + 1 ] b^{[i+1]}_j bj[i+1]

    • 在第 l l l个样本数据输入下,第 i i i层得到的结果为 A ( : , l ) [ i ] A^{[i]}_{(:,l)} A(:,l)[i],这是一个 n [ i ] ∗ 1 n^{[i]}*1 n[i]1的列向量,作为第 i + 1 i+1 i+1层的输入。

    Z ( j , l ) [ i + 1 ] = ( w j [ i + 1 ] ) T A ( : , l ) [ i ] + b j [ i + 1 ] = ( w j [ i + 1 ] ) T g [ i ] ( Z ( : , l ) [ i ] ) + b j [ i + 1 ] (3.5.2.3) Z^{[i+1]}_{(j,l)} = (w^{[i+1]}_j)^TA^{[i]}_{(:,l)}+b^{[i+1]}_j \ = (w^{[i+1]}_j)^Tg^{[i]}(Z^{[i]}_{(:,l)})+b^{[i+1]}_j\tag{3.5.2.3} Z(j,l)[i+1]=(wj[i+1])TA(:,l)[i]+bj[i+1]=(wj[i+1])Tg[i](Z(:,l)[i])+bj[i+1](3.5.2.3)

    • 对于 Z ( : , l ) [ i ] Z^{[i]}_{(:,l)} Z(:,l)[i]而言是一个 n [ i ] ∗ 1 n^{[i]}*1 n[i]1的列向量,所以要采取偏导形式,计算出 Z ( j , l ) [ i + 1 ] Z^{[i+1]}_{(j,l)} Z(j,l)[i+1]对列向量中每个元素 Z ( p , l ) [ i ] Z^{[i]}_{(p,l)} Z(p,l)[i]的偏导值。
      ∂ Z ( j , l ) [ i + 1 ] ∂ Z ( p , l ) [ i ] = ( w j [ i + 1 ] ) p ∗ [ g [ i ] ( Z ( p , l ) [ i ] ) ] ′ (3.5.2.4) \frac{\partial Z^{[i+1]}_{(j,l)}}{\partial Z^{[i]}_{(p,l)}} = (w^{[i+1]}_j)_p*[g^{[i]}(Z^{[i]}_{(p,l)})]^{'} \tag{3.5.2.4} Z(p,l)[i]Z(j,l)[i+1]=(wj[i+1])p[g[i](Z(p,l)[i])](3.5.2.4)

    • 根据公式 ( 3.5.1.2 ) (3.5.1.2) (3.5.1.2)可知, d Z [ i + 1 ] dZ^{[i+1]} dZ[i+1]应是一个 n [ i + 1 ] ∗ m n^{[i+1]}*m n[i+1]m的矩阵,其中第 p p p行,第 q q q列的元素代表着最后输出结果对第 i + 1 i+1 i+1层中第 p p p个节点在第 q q q个训练样本的输入后的结果 Z ( p , q ) [ i + 1 ] Z^{[i+1]}_{(p,q)} Z(p,q)[i+1]求偏导的导数值。

      所以,对公式 ( 3.5.2.2 ) (3.5.2.2) (3.5.2.2) ( 3.5.2.4 ) (3.5.2.4) (3.5.2.4)进行结合,要得到最后输出结果对第 i i i层中第 p p p个节点在第 l l l个训练样本的输入后的结果 Z ( t , l ) [ i ] Z^{[i]}_{(t,l)} Z(t,l)[i]求偏导的导数值
      ∂ F i n a l O u t p u t ∂ Z ( p , l ) [ i ] = ∂ F i n a l O u t p u t ∂ Z ( j , l ) [ i + 1 ] ∗ ∂ Z ( j , l ) [ i + 1 ] ∂ Z ( p , l ) [ i ] = d Z ( j , l ) [ i + 1 ] ∗ ∂ Z ( j , l ) [ i + 1 ] ∂ Z ( p , l ) [ i ] = d Z ( j , l ) [ i + 1 ] ∗ ( w j [ i + 1 ] ) p ∗ [ g [ i ] ( Z ( p , l ) [ i ] ) ] ′ (3.5.2.5) \frac{ \partial FinalOutput}{\partial Z^{[i]}_{(p,l)}} = \frac{ \partial FinalOutput}{\partial Z^{[i+1]}_{(j,l)}}*\frac{ \partial Z^{[i+1]}_{(j,l)}}{\partial Z^{[i]}_{(p,l)}} \\ = dZ^{[i+1]}_{(j,l)}*\frac{ \partial Z^{[i+1]}_{(j,l)}}{\partial Z^{[i]}_{(p,l)}}\\ = dZ^{[i+1]}_{(j,l)}*(w^{[i+1]}_j)_p*[g^{[i]}(Z^{[i]}_{(p,l)})]^{'} \tag{3.5.2.5} Z(p,l)[i]FinalOutput=Z(j,l)[i+1]FinalOutputZ(p,l)[i]Z(j,l)[i+1]=dZ(j,l)[i+1]Z(p,l)[i]Z(j,l)[i+1]=dZ(j,l)[i+1](wj[i+1])p[g[i](Z(p,l)[i])](3.5.2.5)

    • 对于所有的偏导值进行组合做到向量化,根据公式 ( 3.5.2.5 ) (3.5.2.5) (3.5.2.5)发现 p p p变化时,后两个乘数均变化但是没有求和,说明是对应元素相乘即可,是矩阵的点乘。

      p p p变化时(节点变化,多节点向量计算)的向量化结果为:
      ∂ F i n a l O u t p u t ∂ Z ( : , l ) [ i ] = [ ∂ F i n a l O u t p u t ∂ Z ( 1 , l ) [ i ] , ∂ F i n a l O u t p u t ∂ Z ( 2 , l ) [ i ] , ∂ F i n a l O u t p u t ∂ Z ( 3 , l ) [ i ] . . . . . ] T (3.5.2.6) \frac{\partial FinalOutput}{\partial Z^{[i]}_{(:,l)}} = [\frac{\partial FinalOutput}{\partial Z^{[i]}_{(1,l)}},\frac{\partial FinalOutput}{\partial Z^{[i]}_{(2,l)}},\frac{\partial FinalOutput}{\partial Z^{[i]}_{(3,l)}}.....]^T \tag{3.5.2.6} Z(:,l)[i]FinalOutput=[Z(1,l)[i]FinalOutput,Z(2,l)[i]FinalOutput,Z(3,l)[i]FinalOutput.....]T(3.5.2.6)

      ∂ F i n a l O u t p u t ∂ Z ( : , l ) [ i ] = d Z ( j , l ) [ i + 1 ] ∗ w j [ i + 1 ] ∗ [ g [ i ] ( Z ( : , l ) [ i ] ) ] ′ (3.5.2.7) \frac{\partial FinalOutput}{\partial Z^{[i]}_{(:,l)}} =dZ^{[i+1]}_{(j,l)}* w^{[i+1]}_j*[g^{[i]}(Z^{[i]}_{(:,l)})]^{'} \tag{3.5.2.7} Z(:,l)[i]FinalOutput=dZ(j,l)[i+1]wj[i+1][g[i](Z(:,l)[i])](3.5.2.7)

      因为p变化改变的是第 i i i层的节点输出结果值,不会影响到结果输入到第 i + 1 i+1 i+1的具体节点( j j j)

      所以 d Z ( j , l ) [ i + 1 ] dZ^{[i+1]}_{(j,l)} dZ(j,l)[i+1]并不会发生变化。

      后面两个都是 n [ i + 1 ] ∗ 1 n^{[i+1]}*1 n[i+1]1列向量,元素对应相乘,再乘上一个对应的 d Z ( j , l ) [ i + 1 ] dZ^{[i+1]}_{(j,l)} dZ(j,l)[i+1]系数。

      这里可以看成是一个数乘一个列向量。

      j j j变化时的向量化结果(固定样本,所有节点):前面两个乘数发生变化,每一列由 ( 3.5.2.4 ) (3.5.2.4) (3.5.2.4)的列向量组成
      ∂ F i n a l O u t p u t ∂ Z ( : , l ) [ i ] = [ ∂ F i n a l O u t p u t ∂ Z ( : , l ) [ i ] , ∂ F i n a l O u t p u t ∂ Z ( : , l ) [ i ] , ∂ F i n a l O u t p u t ∂ Z ( : , l ) [ i ] . . . . . ] (3.5.2.8) \frac{\partial FinalOutput}{\partial Z^{[i]}_{(:,l)}} =[\frac{\partial FinalOutput}{\partial Z^{[i]}_{(:,l)}},\frac{\partial FinalOutput}{\partial Z^{[i]}_{(:,l)}},\frac{\partial FinalOutput}{\partial Z^{[i]}_{(:,l)}}.....]\tag{3.5.2.8} Z(:,l)[i]FinalOutput=[Z(:,l)[i]FinalOutput,Z(:,l)[i]FinalOutput,Z(:,l)[i]FinalOutput.....](3.5.2.8)

      ∂ F i n a l O u t p u t ∂ Z ( : , l ) [ i ] = ( W [ i + 1 ] ) T d Z ( : , l ) [ i + 1 ] ∗ [ g [ i ] ( Z ( : , l ) [ i ] ) ] ′ (3.5.2.9) \frac{\partial FinalOutput}{\partial Z^{[i]}_{(:,l)}} = (W^{[i+1]})^TdZ^{[i+1]}_{(:,l)}*[g^{[i]}(Z^{[i]}_{(:,l)})]^{'} \tag{3.5.2.9} Z(:,l)[i]FinalOutput=(W[i+1])TdZ(:,l)[i+1][g[i](Z(:,l)[i])](3.5.2.9)

      因为 W [ i + 1 ] W^{[i+1]} W[i+1]是由 w T w^T wT构成每一行的,但是这里需要 w w w作为每一列,所以这里需要用转置。

      这里的 ( W [ i + 1 ] ) T (W^{[i+1]})^T (W[i+1])T n [ i ] ∗ n [ i + 1 ] n^{[i]}*n^{[i+1]} n[i]n[i+1],每个节点有 n [ i ] n^{[i]} n[i] w w w参数,总共有 n [ i + 1 ] n^{[i+1]} n[i+1]个节点, d Z ( : , l ) [ i + 1 ] dZ^{[i+1]}_{(:,l)} dZ(:,l)[i+1] n [ i + 1 ] ∗ 1 n^{[i+1]}*1 n[i+1]1的列向量。

      根据公式 ( 3.5.2.7 ) (3.5.2.7) (3.5.2.7)是一个数乘一个列向量, j j j发生改变产生多个数和多个列向量,根据线性代数中所学,对其向量化,列向量组合成矩阵( W [ i + 1 ] T W^{[i+1]T} W[i+1]T),数组合成列向量 d Z ( : , l ) [ i + 1 ] dZ^{[i+1]}_{(:,l)} dZ(:,l)[i+1],但是注意的是这里列向量和矩阵相乘时,列向量应该在矩阵之后,这里用矩阵乘法即可理解。

      得到的结果矩阵是 n [ i ] ∗ 1 n^{[i]}*1 n[i]1的,其中第 p p p行的元素代表着最后结果在以第 l l l个样本为输入时对第 i i i层中第 p p p个节点的结果 Z p [ i ] Z^{[i]}_p Zp[i]求偏导的导数值。

      l l l变化时的向量化结果:
      ∂ F i n a l O u t p u t ∂ Z [ i ] = ( W [ i + 1 ] ) T d Z [ i + 1 ] ∗ [ g [ i ] ( Z [ i ] ) ] ′ (3.5.2.10) \frac{\partial FinalOutput}{\partial Z^{[i]}} = (W^{[i+1]})^TdZ^{[i+1]}*[g^{[i]}(Z^{[i]})]^{'} \tag{3.5.2.10} Z[i]FinalOutput=(W[i+1])TdZ[i+1][g[i](Z[i])](3.5.2.10)

  • 根据公式 ( 3.5.1.5 ) , ( 3.5.1.6 ) (3.5.1.5),(3.5.1.6) (3.5.1.5),(3.5.1.6)得到所有的导数计算公式

    d Z [ i ] = ( W [ i + 1 ] ) T d Z [ i + 1 ] ∗ [ g [ i ] ( Z [ i ] ) ] ′ (3.5.2.11) dZ^{[i]} = (W^{[i+1]})^TdZ^{[i+1]}*[g^{[i]}(Z^{[i]})]^{'} \tag{3.5.2.11} dZ[i]=(W[i+1])TdZ[i+1][g[i](Z[i])](3.5.2.11)

    d w [ i ] = 1 m d Z [ i ] ( A [ i − 1 ] ) T (3.5.2.12) dw^{[i]} =\frac{1}{m}dZ^{[i]}(A^{[i-1]})^T \tag{3.5.2.12} dw[i]=m1dZ[i](A[i1])T(3.5.2.12)

    d b [ i ] = 1 m ∑ i = 1 m d Z i [ i ] (3.5.2.13) db^{[i]}= \frac{1}{m}\sum_{i=1}^{m} dZ^{[i]}_i\tag{3.5.2.13} db[i]=m1i=1mdZi[i](3.5.2.13)

5.3 总结

对于神经网络的最后一层导数计算公式

d Z [ k ] = A [ k ] − Y (3.5.1.2) dZ^{[k]} = A^{[k]}-Y \tag{3.5.1.2} dZ[k]=A[k]Y(3.5.1.2)

d w [ k ] = 1 m d Z [ k ] ( A [ k − 1 ] ) T (3.5.1.5) dw^{[k]} =\frac{1}{m}dZ^{[k]}(A^{[k-1]})^T \tag{3.5.1.5} dw[k]=m1dZ[k](A[k1])T(3.5.1.5)

d b [ k ] = 1 m ∑ i = 1 m d Z i [ k ] (3.5.1.6) db^{[k]}= \frac{1}{m}\sum_{i=1}^{m} dZ^{[k]}_i\tag{3.5.1.6} db[k]=m1i=1mdZi[k](3.5.1.6)

对于神经网络中间层的导数计算公式

d Z [ i ] = ( W [ i + 1 ] ) T d Z [ i + 1 ] ∗ [ g [ i ] ( Z [ i ] ) ] ′ (3.5.2.11) dZ^{[i]} = (W^{[i+1]})^TdZ^{[i+1]}*[g^{[i]}(Z^{[i]})]^{'} \tag{3.5.2.11} dZ[i]=(W[i+1])TdZ[i+1][g[i](Z[i])](3.5.2.11)

d w [ i ] = 1 m d Z [ i ] ( A [ i − 1 ] ) T (3.5.2.12) dw^{[i]} =\frac{1}{m}dZ^{[i]}(A^{[i-1]})^T \tag{3.5.2.12} dw[i]=m1dZ[i](A[i1])T(3.5.2.12)

d b [ i ] = 1 m ∑ i = 1 m d Z i [ i ] (3.5.2.13) db^{[i]}= \frac{1}{m}\sum_{i=1}^{m} dZ^{[i]}_i\tag{3.5.2.13} db[i]=m1i=1mdZi[i](3.5.2.13)

d A [ i ] = ( W [ i + 1 ] ) T d Z [ i + 1 ] (3.5.2.12) dA^{[i]} = (W^{[i+1]})^TdZ^{[i+1]} \tag{3.5.2.12} dA[i]=(W[i+1])TdZ[i+1](3.5.2.12)

6. 随机初始化
  • 对于权重矩阵 W W W要对其进行随机初始化。

    W = np.random.randn()*0.01

  • 通常对于权重矩阵初始化成很小的数值,这样就不会出现梯度很小,迭代很慢的情况。

Week4 Deep Neural NetWork 1. Notations 符号约定
  • L L L 总层数
  • n [ i ] n^{[i]} n[i] i i i层的神经单元数
  • a [ i ] = g [ i ] ( Z [ i ] ) a^{[i]} = g^{[i]}(Z^{[i]}) a[i]=g[i](Z[i]) i i i层的激活函数的结果
  • W [ i ] W^{[i]} W[i] 是第 i i i层的权重矩阵
2. 总结

第四周的主要要内容就是第三周中的公式推导,认真将第三周的公式推出即可。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/722506.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存