浅层神经网络
笔记前言:这一周的课程思路也和上周的课程思路一样,首先是讲单样本的神经网络,接着是多样本的神经网络,本周课程所讲的神经网络模型是单隐层的神经网络。此外课程还讲了关于**函数和随机初始化的相关内容。
前向传播-单样本神经网络的输出
第一层的传播过程如下:
![吴恩达深度学习笔记(一)week3 浅层神经网络 吴恩达深度学习笔记(一)week3 浅层神经网络](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk0Ni85NDI5YWY1NDQwOWNiNzdlZTc4NjA0NmU1MGIzMGU3YS5wbmc=)
第二层的传播过程如下:
![吴恩达深度学习笔记(一)week3 浅层神经网络 吴恩达深度学习笔记(一)week3 浅层神经网络](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY5L2Y1ODZlODA1Zjc2MjE2ZDAwY2M5ZmI1OTY4N2FjM2JkLnBuZw==)
对其向量化:
x(3,1):3个特征,一个样本,为一个列向量。
W[1](4,3):根据输入的行维度确定W的列维度,本层神经元的个数确定行维度(任意层W的维度都是以此方法确定)。
b[1](4,1):根据本层神经元个数的个数确定行维度,列维度始终为1(任意层b的维度都是以此方法确定)
z[1],a[1]的维度都为(4,1)
W[2](1,4)
b[2](1,1)
a[2]为一个标量,也可理解为(1,1)
注:上面关于向量维度的说明是基于传播过程出发的,当然也可以从矩阵乘法去理解
前向传播-多样本神经网络的输出
假设输入样本有m个,多样本的向量化过程如下图所示 ,其过程是对单样本中的输入向量做了“列扩展”,即把每个样本作为一列放入输入矩阵中,由此我们很容易得到W[1],b[1],W[2],b[2]的维度都不变(这一点在上面关于维度的说明已有解释),第一层的输出(这里我们用A[1]表示)的维度变成了(4,m),每一列即为每个样本产生的输出;第二层的输出(这里我们用A[2]表示)的维度变成了(1,m),每一列即为每个样本产生的输出。
![吴恩达深度学习笔记(一)week3 浅层神经网络 吴恩达深度学习笔记(一)week3 浅层神经网络](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgyMC84N2E2MzJhYTk3YWQ2YmIzY2UxZmI5MjU1YzMxN2ZmYy5wbmc=)
下面是关于m个样本前向传播的for循环形式和向量化形式。
![吴恩达深度学习笔记(一)week3 浅层神经网络 吴恩达深度学习笔记(一)week3 浅层神经网络](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzIzNS83NzVjZjY0YjUwYTYzMzZkYmU2ZDIwYTU0YTU1YjMwMy5wbmc=)
反向传播-神经网络的梯度下降
注:此部分推导是个难点,查阅相关资料也讲得不多,之后。。。不知是什么原因自己把这块想清楚了,首先把最后推导结果放在下面:
![吴恩达深度学习笔记(一)week3 浅层神经网络 吴恩达深度学习笔记(一)week3 浅层神经网络](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE0MC8xY2RjMTU5NmJhNWNjMTk2ZjE4YjE0ZWQ0NTczNjRmNC5wbmc=)
参数说明:
特征向量维度:n0
隐层神经元个数:n1
输出神经元个数:n2=1
隐层**函数用g[1]表示,输出层**函数为sigmoid函数
以下运算过程中的矩阵维度均以用下标给出:
FP:
Z[1]n1×m=W[1]n1×n0⋅Xn0×m+b[1]n1×1−−−−−−(1.1)
A[1]n1×m=g[1](Z[1])−−−−−−−−−−−−(1.2)
Z[2]n2×m=W[2]n2×n1⋅An1×m+b[2]1×1−−−−−−(1.3)
A[2]n2×m=sigmoid(Z[2])−−−−−−−−−−(1.4)
BP:
dZ[2]=A[2]−Y
dW[2]=1mdZ[2]⋅(A[1])T
db[2]=1mnp.sum(dZ[2])
dZ[1]=(W[2])T×dZ[2]×g[1]′(Z[1])
dW[1]=1mdZ[1]⋅XT
db[1]=1mnp.sum(dZ[1])
其中dZ[2]、dW[2]、db[2]的推导同单层神经元的推导(只看后两层结构一模一样)
根据前向传播过程和链式求导法则,上面涉及的矩阵求导可参考*,这里用到的公式:
![吴恩达深度学习笔记(一)week3 浅层神经网络 吴恩达深度学习笔记(一)week3 浅层神经网络](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk4Mi81OWJlMTFlZTAzMmE1ZDJkOWNjMzFmMTI1NzI4ZjBlZS5wbmc=)
dZ[1]=dZ[2]⋅dZ[2]dA[1]⋅g[1]′(Z[1])=(W[2])T×dZ[2]×g[1]′(Z[1]) 根据公式(1.3)(1.2)
dW[1]=dZ[1]⋅dZ[1]dW[T]=1mdZ[1]⋅XT 根据公式(1.1 )
**函数
几种常用的**函数
![吴恩达深度学习笔记(一)week3 浅层神经网络 吴恩达深度学习笔记(一)week3 浅层神经网络](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY1NC80YWY2ZWIwYTY1MDY4NGQyMjgzMmYzNzRlZmMwZmM5ZS5wbmc=)
sigmoid:a=11+e−z 导数a′=a(1−a)
tanh=a=ez−e−zez+e−z导数a′=1−a2
ReLU(修正线性单元):a=max(0,z)
LeakyReLU:a=max(0.01z,z)
**函数的选择
sigmoid函数:除了输出层是个二分类问题,几乎不使用。
tanh函数:tanh函数适用非常优秀,几乎所有的场合。
ReLU(修正线性单元):最常用的默认**函数