0%

机器学习日记(6) 初识神经网络

基本结构

  一个最简单的前馈神经网络通常包含三类层:

  • 输入层 (Input Layer)
  • 隐藏层 (Hidden Layer)
  • 输出层 (Output Layer)

  一个简易神经网络结构如下图所示:

  

图 1 神经网络结构
  

  其中每一个圆圈就代表一个神经元节点。图中的 x 就是输入向量,每一层输出的向量是激活值,下一层的输入就是上一层的输出。其中每一层都会做一个线性变换,如$z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]}$,然后将线性变换后的值代入激活函数,如$a^{[l]} = g(z^{[l]})$,常见的激活函数有 Sigmoid 和 ReLU 函数。

  综上完整的传导如下:

$$
a^{[l]} = g\left(W^{[l]}a^{[l-1]} + b^{[l]}\right)
$$

  其中的 W 是权重矩阵,其作用是决定上一层中每个神经元对当前层神经元的影响程度。如何直观理解?

  假设上一层有四个神经元,输出的是一个 $4 \times 1$ 的矩阵,当前层有三个神经元,那么这一层的 W 就是一个 $3 \times 4$ 的矩阵

$$
W^{[l]} =
\begin{bmatrix}
w_{11} & w_{12} & w_{13} & w_{14} \\
w_{21} & w_{22} & w_{23} & w_{24} \\
w_{31} & w_{32} & w_{33} & w_{34}
\end{bmatrix}
$$

  其中每一行代表一个神经元,例如第一行

$$
[w_{11}, w_{12}, w_{13}, w_{14}]
$$

  表示当前层第一个神经元,计算如下

$$
z_1 = w_{11}a_1 + w_{12}a_2 + w_{13}a_3 + w_{14}a_4 + b_1
$$

  然后再计算激活函数

$$
a_1 = g(z_1)
$$

前向传播的具体解释

  如下所示是一个简易两层网络,第一层由 3 个神经元组成,输出层由一个神经元组成。

  

图 2 一个两层网络
  

  假设输入数据维度为 2,那么就是一个长度为 2 的向量,在第一层的计算过程中,程序会做以下几件事:先依次计算每个神经元的线性变换的激活值,然后再将其组成第一层神经元个数长度的向量,输入给第二层。

  

图 3 第一层计算
  

  第二层的输出使用这个公式

  

图 4 第二层输出
  

使用 tensorflow 实际构建一个神经网络

  在 Tensorflow 中,可以使用 Dense 创建一个层,其中包含了单元数、激活函数类型等,接下来使用 Sequential 将多个层整合起来,在使用 compile 赋予更多信息,使用 fit 训练, predict 前向推导。基本过程如下图所示:

  

图 5 Tensorflow构建模型
  

  如下代码就展示了如何构建一个三层模型:

1
2
3
4
5
6
7
8
9
model = Sequential([
Dense(units = 25, activation = 'sigmoid'),
Dense(units = 15, activation = 'sigmoid'),
Dense(units = 1, activation = 'sigmoid')
])

model.compile(loss = BinaryCrossentropy())

model.fit(X,y,epochs = 100)

  在这段代码中,第一段决定了这个神经网络有多少层,每一层有多少个单元,这一层用的是什么激活函数。第二段编译模型,并告诉他该用什么损失函数,在这段代码中使用的是二元交叉熵损失。第三段就是调用 fit 函数来最小化代价函数。

  在这段代码中所搭建的神经网络架构如下所示:

  

图 6 神经网络架构