Processing math: 100%

Deep Learning Note: 1-5 浅神经网络

1. 基本概念

  图 1 给出了一个简单的神经网络。

图 1

图 1

  在图 1 中,左边的 x1x2x3 为输入的特征,称为输入层(Input Layer);中间的一列 4 个节点称为隐藏层(Hidden Layer);最右边的一个节点称为输出层(Output Layer),输出预测 ˆy。输入层的特征和输出层的预测都与样本集合有关,而隐藏层的数值则在样本集合中没有体现,是“隐藏”的状态。

  图 1 所示的神经网络是一个两层的网络,计算网络层数时,通常只考虑隐藏层和输出层,不计输入层。

  使用 a 表示激活值(Activation),使用方括号上角标表示层数,使用下角标表示节点在该层的位置,如 a[1]2 表示第 1 层第 2 个节点的激活值。

  输入层记为第 0 层,a[0] 表示第 0 层的激活值,也就是输入的特征向量 x

a[0]=[a[0]1a[0]2a[0]3]=[x1x2x3]

  隐藏层也会产生对应的激活值,即:

a[1]=[a[1]1a[1]2a[1]3a[1]4]

  输出层的 a[2] 是一个实数,作为模型的预测,即 ˆy
  
  隐藏层和输出层都具有对应的参数,记为 w[l]b[l],其中 l 为层数。对图 1 所示的网络,w[1] 是一个 4×3 的矩阵,b[1] 是一个 4×1 的向量;w[2] 是一个 1×4 的向量,b[2] 是一个实数。

2. 计算网络输出

  假设图 1 中隐藏层的每一个节点使用了和之前一样的逻辑回归模型,则每个隐藏层节点的计算过程如图 2 所示。

图 2

图 2

  每个节点的计算都分为两步:

z=wTx+b

a=σ(z)

  由此得到 4 个隐藏层节点的计算过程为:

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)

  其中 w[1]1w[1]2w[1]3w[1]4 均为 3×1 的矢量,将它们转置后纵向叠加,得到一个 4×3 的矩阵,定义为 W[1]

W[1]=[w[1]T1w[1]T2w[1]T3w[1]T4]

  则所有隐藏节点的计算可以向量化为:

z[1]=W[1]x+b[1]a[1]=σ(z[1])

  整个神经网络的计算过程为,给定输入 x,计算:

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],使得形式更加统一。各矩阵的大小为:

a[0]:3×1,W[1]:4×3,b[1]:4×1a[1]:4×1,W[2]:1×4,b[2]:1×1a[2]:1×1

3. 多样本的向量化

  上面给出了输入单个样本时神经网络的输出,下面考虑 m 个样本的情况。最直接的方法是使用 for 循环迭代各个样本:

fori=1tom:z[1](i)=W[1]x(i)+b[1]a[1](i)=σ(z[1](i))z[2](i)=W[2]a[1](i)+b[2]a[2](i)=σ(z[2](i))

  使用显式的循环非常麻烦和低效,可以利用矩阵乘法,通过向量化提高效率。依旧采用前面定义的 X,即

X=[x(1)x(2)x(m)]

  由上面式 (3)~(6),有:

Z[1]=W[1]A[0]+b[1]A[1]=σ(Z[1])Z[2]=W[2]A[1]+b[2]A[2]=σ(Z[2])

  (默认 b[1]b[2] 分别为其原值被复制为 m 份并水平叠加在一起,以满足矩阵运算要求。)

  其中 Z[1] 是各个样本对应 z[1] 的值水平叠加后的结果,即:

Z[1]=[z[1](1)z[1](2)z[1](m)]

  类似地,A[1]Z[2]A[2] 也都是各个样本计算得到的对应值水平叠加后构成的矩阵。对于这些矩阵,水平方向上的索引代表不同的样本,垂直方向的索引代表该层中不同的节点。