Deep Learning Notes - 1.3浅层神经网络
单隐藏层的神经网络
一些约定
- 上标 [i] 指第 i 层
- 上标 (i) 指第 i 个样例
- 下标 i 指特定层中的第 i 个节点
- 例如: a[i]j 表示第 i 层中的第 j 个节点
- 通常输入层不看作一个标准的层,所以输入层常被记为第 0 层
范例网络
其中a[0]为输入层,a[1]为隐藏层,a[2]为输出层。
神经网络的计算(一组训练样例)
每个神经元中,都会进行上图所示的计算,那么所有神经元的计算为:
z[1]1=w[1]T1x+b[1]1,a[1]1=σ(z[1]1)z[1]2=w[1]T2x+b[1]2,a[1]2=σ(z[1]2)z[1]3=w[1]T3x+b[1]3,a[1]3=σ(z[1]3)z[1]4=w[1]T4x+b[1]4,a[1]4=σ(z[1]4)
向量化后为:
z[1]=W[1]x+b[1]a[1]=σ(z[1])z[2]=W[2]a[1]+b[2]a[2]=σ(z[2])
其中:
W[1]=⎡⎣⎢⎢⎢⎢⎢⎢−−−−w[1]T1w[1]T2w[1]T3w[1]T4−−−−⎤⎦⎥⎥⎥⎥⎥⎥
x=⎡⎣⎢x1x2x3⎤⎦⎥
并且b和z均为纵向堆叠。
多组训练样例的向量化
假设一共有m组样例,那么向量化之后如下:
Z[1]=W[1]A[0]+b[1]A[1]=σ(Z[1])Z[2]=W[2]A[1]+b[2]A[2]=σ(Z[2])
其中:X=A[0]
X=⎡⎣⎢|x(1)||x(2)|...|x(m)|⎤⎦⎥nx×m
A[1]=⎡⎣⎢|a[1](1)||a[1](2)|...|a[1](m)|⎤⎦⎥
并且Z也为横向堆叠。
**函数
为什么要使用**函数
如果不适用**函数,即对结果处理为g(z)=z,那么最终输出层输出的是x的线性组合,中间隐藏层便失去了意义(不如去掉)。
而只有面对回归问题时,线性**函数g(z)=z才应用于输出层。
**函数σ(z)
σ(z)=11+e−z
sigmod**函数的使用范围不大,仅在二元分类网络的输出层使用较多。
**函数tanh(z)
tanh[z]=ez−e−zez+e−z
效果略好于sigmod函数,但使用也不常用,因为训练速度稍慢。
**函数ReLU(z)
ReLU(z)=max(0,z)
此函数使用最为广泛,基本上作为默认使用。
**函数leakyReLU(z)
leakyReLU(z)=max(cz,z)
一般 c 取一个很小的数,例如 0.01。具体值需要根据训练情况而定。
此函数效果比ReLU要好,但是使用并不广泛。
梯度下降
向量化之后的计算过程:
dZ[2]=A[2]−YdW[2]=1mdZ[2]A[1]Tdb[2]=1mnp.sum(dZ[2],axis=1,keepdims=True)dZ[1]=W[2]TdZ[2]∗g[1]′(z[1])dW[1]=1mdZ[1]XTdb[1]=1mnp.sum(dZ[1],axis=1,keepdims=True)
上式中的 ∗ 是指逐个相乘。
随机初始化
矩阵W需要随机化,而b置为全零就可以了。
W[1]=np.random.randn((2,2))∗0.01b[1]=np.zeros((2,1))W[2]=np.random.randn((1,2))∗0.01b[2]=0