200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 机器学习入门课程笔记(一)——deeplearning.ai: Neural Networks and Deep Learning

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

时间:2020-03-08 16:06:18

相关推荐

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

欢迎前往我的个人博客网站:mathscode.top获取更多学习资源。

所有文本内容会在知乎: MathsCode同步

所有开放资源会在Github: MathsCode开放下载

欢迎关注我的公众号:MathsCode,一同交流。

有问题欢迎大家评论或者私信我!

文章目录

前言Week1 Introduction to Deep Learning1. 神经网络中的一个巨大突破:从Sigmoid 函数到 Relu函数 的迁移Week2.1 Logistic Regression as a Neural Network1. Binary Classification2. Logistic Regression3. Cost Function and Loss(Error) Function4. Gradient Descent 梯度下降法5. Logistic Regression Derivatives 求逻辑回归的导数6. Logistic Regression Gradient Descent流程Week2.2 Python and Vectorization1.Vectorizing Logistic Regression2. Vectorizing Logistic Regression's Gradient OutputWeek3 Shallow Neural Network1. Overview2. Neural Network 详细解析3. 多样本 向量化(forward propagation)4. Activation Function 激活函数5. 神经网络的梯度下降法(back propagation)5.1 神经网络最后一层的导数计算5.2 神经网络中间层(1~k-1)的导数计算5.3 总结6. 随机初始化Week4 Deep Neural NetWork1. 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

mmm : training examples 等价于mtrainm_{train}mtrain​mtestm_{test}mtest​ : test examplesnxn_xnx​ : 表示输入的特征个数,即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)都是一个nx∗1n_x*1nx​∗1的列向量为nx∗mn_x * mnx​∗m 维矩阵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∗m1*m1∗m的矩阵

2. Logistic Regression

y^=P(y=1∣x)\hat{y} = P(y=1|x)y^​=P(y=1∣x) 表示对真实值的估计,取值应该在0和1之间,理解为是预测值

σ(x)\sigma(x)σ(x) 是 sigmoidsigmoidsigmoid 函数的简写

σ(z)=11+e−z(2.1.2.1)\sigma(z) = \frac{1}{1+e^{-z}} \tag{2.1.2.1} σ(z)=1+e−z1​(2.1.2.1)

y^=σ(wTx+b\hat{y} = \sigma(w^Tx + by^​=σ(wTx+b) www是特征前的系数,bbb是偏置量

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

定义θ=[θ0;θ1;θ2;......θnx]\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),i≥1

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

3. Cost Function and Loss(Error) Function

一种定义Loss

L(y^,y)=12(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)=−(ylog(y^)+(1−y)log(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^​)+(1−y)log(1−y^​))(2.1.3.2)

定义Cost Function

J(w,b)=1m∑i=1mL(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)=m1​i=1∑m​L(y^​(i),y(i))(2.1.3.3)

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

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

4. Gradient Descent 梯度下降法

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

在编程中的代码规范

dFinalOutputdvar\frac{dFinalOutput}{dvar}dvardFinalOutput​ 或者 ∂FinalOutput∂var\frac{\partial FinalOutput}{\partial var}∂var∂FinalOutput​表示最终输出对某一变量的求导,一般代码中写成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)=11+e−z(2.1.5.1)\sigma(z) = \frac{1}{1+e^{-z}} \tag{2.1.5.1} σ(z)=1+e−z1​(2.1.5.1)

z=wTx+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)=−(ylog(y^)+(1−y)log(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^​)+(1−y)log(1−y^​))(2.1.5.4)

J(w,b)=1m∑i=1mL(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)=m1​i=1∑m​L(y^​(i),y(i))(2.1.5.5)

根据[4.Gradient Descent 梯度下降法](#4. Gradient Descent 梯度下降法)中提到的代码规范,先以LossFunctionLoss FunctionLossFunction 为FinalOutputFinalOutputFinalOutput求各级变量的导数

根据公式2.1.5.42.1.5.42.1.5.4,其中yyy是给定label,是已知的常数,而y^\hat yy^​是受到变量参数θ\thetaθ 影响的变量。

dLdy^=−yy^+1−y1−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​+1−y^​1−y​(2.1.5.6)

注意:公式2.1.5.42.1.5.42.1.5.4中的logloglog 是以自然常数eee为底

d(logax)dx=lim⁡Δx→0loga(x+Δx)−logaxΔx=lim⁡Δx→01Δxloga(x+Δxx)=lim⁡Δx→01Δxloga(1+Δxx)=lim⁡Δx→0loga(1+Δxx)1Δx=lim⁡Δx→0loga(1+Δxx)xΔx∗1x=lim⁡Δx→0logae1x=lim⁡Δx→0lne1xlna=1xlna\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(loga​x)​=Δx→0lim​Δxloga​(x+Δx)−loga​x​=Δx→0lim​Δx1​loga​(xx+Δx​)=Δx→0lim​Δx1​loga​(1+xΔx​)=Δx→0lim​loga​(1+xΔx​)Δx1​=Δx→0lim​loga​(1+xΔx​)Δxx​∗x1​=Δx→0lim​loga​ex1​=Δx→0lim​lnalnex1​​=xlna1​

根据公式2.1.5.32.1.5.32.1.5.3,求dLdz\frac{dL}{dz}dzdL​ 即dz

dLdz=dLdy^dy^dzdy^dz=e−z1+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^​dL​dzdy^​​dzdy^​​=1+e−ze−z​

dLdz=(−yy^+1−y1−y^)∗e−z1+e−z=(y^−yy^(1−y^))∗e−z1+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​+1−y^​1−y​)∗1+e−ze−z​=(y^​(1−y^​)y^​−y​)∗1+e−ze−z​=y^​−y(2.1.5.7)

根据2.1.5.22.1.5.22.1.5.2 求 ∂L∂wi\frac{\partial L}{\partial w_i}∂wi​∂L​,即dwi

∂L∂wi=xi∗dLdz(2.1.5.8)\frac{\partial L}{\partial w_i} = x_i*\frac{dL}{dz}\tag{2.1.5.8} ∂wi​∂L​=xi​∗dzdL​(2.1.5.8)

因为b=w0,x0=1b = w_0,x_0 = 1b=w0​,x0​=1

dLdb=dLdz(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θ和输入XXX构建单个样本的损失函数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对mmm个训练examples进行做同样的操作,每一个dwidw_idwi​,这里的wiw_iwi​是θ\thetaθ 的每个维度,也是每一个example的多个参数,所以对于一个确定的iii,会有mmm个dwidw_idwi​,然后对dwidw_idwi​ 求和取平均更新对应的参数wi = wi - alpha*dwi;b = b-alpha*db

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

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

Week2.2 Python and Vectorization

1.Vectorizing Logistic Regression

不采取显式循环,仅使用向量运算实现

根据显式循环的做法

z(i)=wTx(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)都是nx∗1n_x*1nx​∗1的向量,组成的XXX 矩阵是 nx∗mn_x*mnx​∗m的矩阵

www是nx∗1n_x * 1nx​∗1 的列向量

由公式2.2.1.12.2.1.12.2.1.1 对公式进行向量化

Z=wTX+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.22.2.1.22.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)+bA = sigmoid(Z)

2. Vectorizing Logistic Regression’s Gradient Output

根据[1.Vectorizing Logistic Regression ](1.Vectorizing Logistic Regression )利用向量化对m个训练数据进行计算梯度

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

一个样例有一个yyy,计算出一个aaa,计算出一个dzdzdz,但有多个wiw_iwi​

根据单数据梯度[5. Logistic Regression Derivatives 求逻辑回归的导数](#5. Logistic Regression Derivatives 求逻辑回归的导数)中公式2.1.5.72.1.5.72.1.5.7和[4.Gradient Descent 梯度下降法](#4. Gradient Descent 梯度下降法)中提到的代码规范,可得

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)}\\\\ dz(1)=a(1)−y(1)dz(2)=a(2)−y(2)......dz(i)=a(i)−y(i)

对其进行向量化

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)}]\\ dZ=[dz(1),dz(2),.....dz(m)]A=[a(1),a(2),.....a(m)],Y=[y(1),y(2),.....y(m)]

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

根据公式2.1.5.82.1.5.82.1.5.8进行向量化,对于一个example可以把所有的dw_i构成一个向量

dw(i)=[∂L∂w1,∂L∂w2,.....∂L∂wnx]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)=[∂w1​∂L​,∂w2​∂L​,.....∂wnx​​∂L​]T(2.2.2.2)

而对于m个example

dw=1m∑i=1mdw(i)(2.2.2.3)dw =\frac{1}{m} \sum_{i = 1}^{m} dw^{(i)}\tag{2.2.2.3} dw=m1​i=1∑m​dw(i)(2.2.2.3)

最终所需要的就是dw

根据公式2.1.5.82.1.5.82.1.5.8、2.2.2.12.2.2.12.2.2.1、2.2.2.32.2.2.32.2.2.3可以推出dw的求法

首先dwdwdw 是一个nx∗1n_x * 1nx​∗1的向量,根据公式2.2.2.32.2.2.32.2.2.3可得

dwi=1m∑j=1mdwi(j)(2.2.2.4)dw_i =\frac{1}{m} \sum_{j=1}^{m} dw_i^{(j)} \tag{2.2.2.4} dwi​=m1​j=1∑m​dwi(j)​(2.2.2.4)

根据公式2.1.5.82.1.5.82.1.5.8可得

dwi(j)=xi(j)∗dz(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 对应一个dzdzdz,而一个example对应的输入xxx是一个nx∗1n_x*1nx​∗1的向量

可以看出xi(j)x_i^{(j)}xi(j)​和dz(j)dz^{(j)}dz(j)中都含有jjj,所以在对jjj from 1 to m 时两者都是变量。所以只有当xi(j)x_i^{(j)}xi(j)​ 构成行向量,dz(j)dz^{(j)}dz(j) 构成列向量时进行运算才可以实现这样的结果。即:

xi=[xi(1),xi(2),xi(3),.....,xi(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)

dz=[dz(1),dz(2),dz(3),......dz(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)

dwi=1mxidz(2.2.2.8)dw_i =\frac{1}{m} x_idz\tag{2.2.2.8} dwi​=m1​xi​dz(2.2.2.8)

因为dwdwdw是nx∗1n_x*1nx​∗1的列向量,所以dwidw_idwi​独占一行。

dw=[dw1;dw2;dw3;......dwnx](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.82.2.2.82.2.2.8 发现只有xix_ixi​和iii 有关,根据公式(2.2.2.6)(2.2.2.6)(2.2.2.6)可知xix_ixi​是一个行向量,所以令每一个xix_ixi​占一行。

x=[x1;x2;x3;......xm](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.102.2.2.8,2.2.2.9,2.2.2.102.2.2.8,2.2.2.9,2.2.2.10 ,每一个dwidw_idwi​组成最终的dwdwdw,可得

dw=1mxdzdw = \frac{1}{m}xdz dw=m1​xdz

而会发现

dz=dZTx=Xdz = dZ^T\\ x = X dz=dZTx=X

所以综上

dw=1mXdZT(2.2.2.11)dw =\frac{1}{m}XdZ^T \tag{2.2.2.11} dw=m1​XdZT(2.2.2.11)

根据公式2.1.5.92.1.5.92.1.5.9可得m个example的db和

db=1m∑i=1mdz(i)(2.2.2.12)db = \frac{1}{m}\sum_{i=1}^{m} dz^{(i)}\tag{2.2.2.12} db=m1​i=1∑m​dz(i)(2.2.2.12)

db = np.sum(dZ)/m

python代码实现

Z = np.dot(w.T,X)+bA = sigmoid(Z)dZ = A-Ydw = np.dot(X,dZ.T)/mdb = np.sum(dZ)/m# 更新迭代参数w = w - alpha*dwb = b - alpha*db

Week3 Shallow Neural Network

1. Overview

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

输入层(Input Layer):开始的输入(x1,x2,x3......x_1,x_2,x_3......x1​,x2​,x3​......)列

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

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

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

用a[i]a^{[i]}a[i]来表示第iii层所有数值组成的列向量

a[i]=[a1[i],a2[i],a3[i],a4[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[i−1]经过激活函数的计算得到的

2. Neural Network 详细解析

如上图,每一个节点内部可以细化成两个计算部分(以sigmoid函数为激活函数),总结如下

zj[i]=(wj[i])Ta[i−1]+bj[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[i−1]+bj[i]​(3.2.1)

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

a[i]=[a1[i],a2[i],a3[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)

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

公式矩阵化

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

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

因为1≤j≤len(a[i])1 \leq j \leq len(a^{[i]})1≤j≤len(a[i]),将(wj[i])T(w^{[i]}_j)^T(wj[i]​)T 作为W[i]W^{[i]}W[i]的每一行,将bj[i]b^{[i]}_jbj[i]​作为b[i]b^{[i]}b[i]的每一个行。

W[i]=[(w1[i])T;(w2[i])T;(w3[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]=[b1[i],b2[i],b3[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]是len(a[i])∗len(a[i−1])len(a^{[i]})*len(a^{[i-1]})len(a[i])∗len(a[i−1])​的,b[i]b^{[i]}b[i]是len(a[i]∗1)len(a^{[i]}*1)len(a[i]∗1)的列向量。

因为a[i−1]a^{[i-1]}a[i−1]是len(a[i−1])∗1len(a^{[i-1]})*1len(a[i−1])∗1的,根据矩阵相乘,得到的结果z[i]z^{[i]}z[i] 就是len(a[i])∗1len(a^{[i]})*1len(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[i−1]+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)

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

对于第jjj个样本,在网络的第iii层时的计算公式为:

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[i−1](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)可以得到

XXX是nx∗mn_x*mnx​∗m的矩阵,也就是len(a[0])∗mlen(a^{[0]})*mlen(a[0])∗m么,每一列代表着是一个训练样本的数据。

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

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

A[i]A^{[i]}A[i]和Z[i]Z^{[i]}Z[i]都是len(a[i])∗mlen(a^{[i]})*mlen(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[i−1]+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 激活函数

双曲函数

双曲正弦

sinhx=ex−e−x2sinhx = \frac{e^x-e^{-x}}{2} sinhx=2ex−e−x​

双曲余弦

coshx=ex+e−x2coshx = \frac{e^x+e^{-x}}{2} coshx=2ex+e−x​

双曲正切

tanhx=sinhxcoshx=ex−e−xex+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+e−xex−e−x​(3.4.1)

双曲余切

cothx=1tanhx=ex+e−xex−e−xcothx = \frac{1}{tanhx}=\frac{e^x+e^{-x}}{e^x-e^{-x}} cothx=tanhx1​=ex−e−xex+e−x​

双曲正割

sechx=1coshx=2ex+e−xsechx = \frac{1}{coshx} = \frac{2}{e^x+e^{-x}} sechx=coshx1​=ex+e−x2​

双曲余割

cschx=1sinhx=2ex−e−xcschx = \frac{1}{sinhx} =\frac{2}{e^x-e^{-x}} cschx=sinhx1​=ex−e−x2​

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

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

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

d(tanhx)dx=1−(tanhx)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=max(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[i−1]+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],即

len(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]=nxn^{[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)=−(ylog(y^)+(1−y)log(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^​)+(1−y)log(1−y^​))(2.1.3.2)

J(w,b)=1m∑i=1mL(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)=m1​i=1∑m​L(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),得到单神经节点的输入输出的导数公式

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

dw=1mXdZT(2.2.2.11)dw =\frac{1}{m}XdZ^T \tag{2.2.2.11} dw=m1​XdZT(2.2.2.11)

db=1m∑i=1mdz(i)(2.2.2.12)db = \frac{1}{m}\sum_{i=1}^{m} dz^{(i)}\tag{2.2.2.12} db=m1​i=1∑m​dz(i)(2.2.2.12)

分析:

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

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

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

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。假设网络的总共有kkk层,最后一层只有一个神经单元,所以A[k]A^{[k]}A[k]只有一行,符合数据label:YYY也是一行的要求。

dZ[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)的格式应该如下:

dw[k]=1mA[k−1](dZ[k])T(3.5.1.3)dw^{[k]} =\frac{1}{m}A^{[k-1]}(dZ^{[k]})^T \tag{3.5.1.3} dw[k]=m1​A[k−1](dZ[k])T(3.5.1.3)

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

首先看一下原公式(2.2.2.11)(2.2.2.11)(2.2.2.11)

dw=1mXdZT(2.2.2.11)dw =\frac{1}{m}XdZ^T \tag{2.2.2.11} dw=m1​XdZT(2.2.2.11)

当只有一个神经单元时,dwdwdw是一个nx∗1n_x*1nx​∗1的列向量,XXX是一个nx∗mn_x*mnx​∗m的矩阵(其中每一列代表的是一个数据样本,共有mmm列)dZdZdZ是一个由dzdzdz组成的1∗m1*m1∗m的行向量(每一个测试样本都对应的一个dzdzdz),转置之后就是m∗1m*1m∗1的列向量。

其次我们关注一下公式(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)

xi=[xi(1),xi(2),xi(3),.....,xi(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)

dz=[dz(1),dz(2),dz(3),......dz(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)

dwi=1mxidz(2.2.2.8)dw_i =\frac{1}{m} x_idz\tag{2.2.2.8} dwi​=m1​xi​dz(2.2.2.8)

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

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

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

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

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

但是在后面的W[k]W^{[k]}W[k]参数更新时,要实现公式

W[k]=W[k]−αdw(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]的每一行对应的是第kkk层的一个节点的参数,因为你第kkk层只有一个节点,所以这里的W[k]W^{[k]}W[k]是一个1∗n[k−1]1*n^{[k-1]}1∗n[k−1]的行向量,刚好和dwdwdw的转置维度相等。所以其实这里需要的是这个dw[k]dw^{[k]}dw[k]的转置,所以真正的dw[k]dw^{[k]}dw[k]应该如下:

dw[k]=1mdZ[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]=m1​dZ[k](A[k−1])T(3.5.1.5)

根据公式(2.2.2.12)(2.2.2.12)(2.2.2.12)应该可以得出

db[k]=1m∑i=1mdZi[k](3.5.1.6)db^{[k]}= \frac{1}{m}\sum_{i=1}^{m} dZ^{[k]}_i\tag{3.5.1.6} db[k]=m1​i=1∑m​dZi[k]​(3.5.1.6)

总结一下:

神经网络的最后一层(总共kkk层)的导数计算公式:

dZ[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)

dw[k]=1mdZ[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]=m1​dZ[k](A[k−1])T(3.5.1.5)

db[k]=1m∑i=1mdZi[k](3.5.1.6)db^{[k]}= \frac{1}{m}\sum_{i=1}^{m} dZ^{[k]}_i\tag{3.5.1.6} db[k]=m1​i=1∑m​dZi[k]​(3.5.1.6)

参数更新

W[k]=W[k]−αdw(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]−αdb[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)

单节点的导数计算公式:

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

dw=1mXdZT(2.2.2.11)dw =\frac{1}{m}XdZ^T \tag{2.2.2.11} dw=m1​XdZT(2.2.2.11)

db=1m∑i=1mdz(i)(2.2.2.12)db = \frac{1}{m}\sum_{i=1}^{m} dz^{(i)}\tag{2.2.2.12} db=m1​i=1∑m​dz(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)区别原因:

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

5.2 神经网络中间层(1~k-1)的导数计算

已知第iii层的相关信息

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

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

第i+1i+1i+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])表示的是第iii层所采取的激活函数

已知第i+1i+1i+1的计算结果dZ[i+1],dw[i+1],db[i+1]dZ^{[i+1]},dw^{[i+1]},db^{[i+1]}dZ[i+1],dw[i+1],db[i+1],待计算的参数有dZ[i],dw[i],db[i]dZ^{[i]},dw^{[i]},db^{[i]}dZ[i],dw[i],db[i]

dZ[i]=dFinalOutputdZ[i]=dFinalOutputdZ[i+1]∗dZ[i+1]dZ[i]=dZ[i+1](已知)∗dZ[i+1]dZ[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]dFinalOutput​∗dZ[i]dZ[i+1]​=dZ[i+1](已知)∗dZ[i]dZ[i+1]​(3.5.2.2)

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

所以只需要求出dZ[i+1]dZ[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]的关系,所以利用该公式即可计算,但是因为是矩阵,需要对每一个元素进行分析。

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

W[i]W^{[i]}W[i]的每一行的值为该层的某个节点的wTw^TwT

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

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

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^{[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]∗1n^{[i]}*1n[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]=(wj[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)可知,dZ[i+1]dZ^{[i+1]}dZ[i+1]应是一个n[i+1]∗mn^{[i+1]}*mn[i+1]∗m的矩阵,其中第ppp行,第qqq列的元素代表着最后输出结果对第i+1i+1i+1层中第ppp个节点在第qqq个训练样本的输入后的结果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)进行结合,要得到最后输出结果对第iii层中第ppp个节点在第lll个训练样本的输入后的结果Z(t,l)[i]Z^{[i]}_{(t,l)}Z(t,l)[i]​求偏导的导数值

∂FinalOutput∂Z(p,l)[i]=∂FinalOutput∂Z(j,l)[i+1]∗∂Z(j,l)[i+1]∂Z(p,l)[i]=dZ(j,l)[i+1]∗∂Z(j,l)[i+1]∂Z(p,l)[i]=dZ(j,l)[i+1]∗(wj[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]​∂FinalOutput​∗∂Z(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)发现ppp变化时,后两个乘数均变化但是没有求和,说明是对应元素相乘即可,是矩阵的点乘

ppp变化时(节点变化,多节点向量计算)的向量化结果为:

∂FinalOutput∂Z(:,l)[i]=[∂FinalOutput∂Z(1,l)[i],∂FinalOutput∂Z(2,l)[i],∂FinalOutput∂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)

∂FinalOutput∂Z(:,l)[i]=dZ(j,l)[i+1]∗wj[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变化改变的是第iii层的节点输出结果值,不会影响到结果输入到第i+1i+1i+1的具体节点(jjj)

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

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

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

jjj变化时的向量化结果(固定样本,所有节点):前面两个乘数发生变化,每一列由(3.5.2.4)(3.5.2.4)(3.5.2.4)的列向量组成

∂FinalOutput∂Z(:,l)[i]=[∂FinalOutput∂Z(:,l)[i],∂FinalOutput∂Z(:,l)[i],∂FinalOutput∂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)

∂FinalOutput∂Z(:,l)[i]=(W[i+1])TdZ(:,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]是由wTw^TwT构成每一行的,但是这里需要www作为每一列,所以这里需要用转置。

这里的(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]的www参数,总共有n[i+1]n^{[i+1]}n[i+1]个节点,dZ(:,l)[i+1]dZ^{[i+1]}_{(:,l)}dZ(:,l)[i+1]​是n[i+1]∗1n^{[i+1]}*1n[i+1]∗1的列向量。

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

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

lll变化时的向量化结果:

∂FinalOutput∂Z[i]=(W[i+1])TdZ[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)得到所有的导数计算公式

dZ[i]=(W[i+1])TdZ[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)

dw[i]=1mdZ[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]=m1​dZ[i](A[i−1])T(3.5.2.12)

db[i]=1m∑i=1mdZi[i](3.5.2.13)db^{[i]}= \frac{1}{m}\sum_{i=1}^{m} dZ^{[i]}_i\tag{3.5.2.13} db[i]=m1​i=1∑m​dZi[i]​(3.5.2.13)

5.3 总结

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

dZ[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)

dw[k]=1mdZ[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]=m1​dZ[k](A[k−1])T(3.5.1.5)

db[k]=1m∑i=1mdZi[k](3.5.1.6)db^{[k]}= \frac{1}{m}\sum_{i=1}^{m} dZ^{[k]}_i\tag{3.5.1.6} db[k]=m1​i=1∑m​dZi[k]​(3.5.1.6)

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

dZ[i]=(W[i+1])TdZ[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)

dw[i]=1mdZ[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]=m1​dZ[i](A[i−1])T(3.5.2.12)

db[i]=1m∑i=1mdZi[i](3.5.2.13)db^{[i]}= \frac{1}{m}\sum_{i=1}^{m} dZ^{[i]}_i\tag{3.5.2.13} db[i]=m1​i=1∑m​dZi[i]​(3.5.2.13)

dA[i]=(W[i+1])TdZ[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. 随机初始化

对于权重矩阵WWW要对其进行随机初始化。

W = np.random.randn()*0.01

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

Week4 Deep Neural NetWork

1. Notations 符号约定

LLL 总层数n[i]n^{[i]}n[i]第iii层的神经单元数a[i]=g[i](Z[i])a^{[i]} = g^{[i]}(Z^{[i]})a[i]=g[i](Z[i]) 第iii层的激活函数的结果W[i]W^{[i]}W[i] 是第iii层的权重矩阵

2. 总结

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。