Deep Learning Notes - 1.3浅层神经网络

Deep Learning Notes - 1.3浅层神经网络

单隐藏层的神经网络

一些约定

  • 上标 [i] 指第 i
  • 上标 (i) 指第 i 个样例
  • 下标 i 指特定层中的第 i 个节点
    • 例如: aj[i] 表示第 i 层中的第 j 个节点
  • 通常输入层不看作一个标准的层,所以输入层常被记为第 0

范例网络

Deep Learning Notes - 1.3浅层神经网络

其中a[0]为输入层,a[1]为隐藏层,a[2]为输出层。

神经网络的计算(一组训练样例)

Deep Learning Notes - 1.3浅层神经网络

每个神经元中,都会进行上图所示的计算,那么所有神经元的计算为:

z1[1]=w1[1]Tx+b1[1],a1[1]=σ(z1[1])z2[1]=w2[1]Tx+b2[1],a2[1]=σ(z2[1])z3[1]=w3[1]Tx+b3[1],a3[1]=σ(z3[1])z4[1]=w4[1]Tx+b4[1],a4[1]=σ(z4[1])

向量化后为:

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]=[w1[1]Tw2[1]Tw3[1]Tw4[1]T]

x=[x1x2x3]

并且bz均为纵向堆叠。

多组训练样例的向量化

假设一共有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+ez

Deep Learning Notes - 1.3浅层神经网络

sigmod**函数的使用范围不大,仅在二元分类网络的输出层使用较多。

**函数tanh(z)

tanh[z]=ezezez+ez

Deep Learning Notes - 1.3浅层神经网络

效果略好于sigmod函数,但使用也不常用,因为训练速度稍慢。

**函数ReLU(z)

ReLU(z)=max(0,z)

Deep Learning Notes - 1.3浅层神经网络

此函数使用最为广泛,基本上作为默认使用。

**函数leakyReLU(z)

leakyReLU(z)=max(cz,z)

一般 c 取一个很小的数,例如 0.01。具体值需要根据训练情况而定。

Deep Learning Notes - 1.3浅层神经网络

此函数效果比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