实现隐藏层
先修要求
接下来我们会讲神经网络在多层感知器里面的数学部分。讲多层感知器我们会用到向量和矩阵。你可以通过下列讲解对此做个回顾:
由来
之前我们研究的是只有一个输出节点网络,代码也很直观。但是现在我们有多个输入单元和多个隐藏单元,它们的权重需要有两个索引 wij,其中 i表示输入单元,j 表示隐藏单元。
例如在下面这个网络图中,输入单元被标注为 x1,x2, x3,隐藏层节点是h1 和 h2。
对比上面的示意图,确保你了解了不同的权重在矩阵中与在神经网络中的对应关系。
用 NumPy 来初始化这些权重,我们需要提供矩阵的形状(shape),如果特征是一个包含以下数据的二维数组:
# Number of records and input units # 数据点数量以及每个数据点有多少输入节点 n_records, n_inputs = features.shape # Number of hidden units # 隐藏层节点个数 n_hidden = 2 weights_input_to_hidden = np.random.normal(0, n_inputs**-0.5, size=(n_inputs, n_hidden))
这样创建了一个名为 weights_input_to_hidden
的二维数组,维度是 n_inputs
乘 n_hidden
。记住,输入到隐藏节点是所有输入乘以隐藏节点权重的和。所以对每一个隐藏层节点 h_jhj,我们需要计算:
为了实现这点,我们需要运用矩阵乘法,如果你对线性代数的知识有些模糊,我们建议你看下之前先修部分的资料。这里你只需要了解矩阵与向量如何相乘。
在这里,我们把输入(一个行向量)与权重相乘。要实现这个,要把输入点乘(内积)以权重矩阵的每一列。例如要计算到第一个隐藏节点 j = 1的输入,你需要把这个输入与权重矩阵的第一列做点乘:
代表指向 h1 的权重的线条被标成了红色,这样更好区分。
为了定位权重,我们把输入节点的索引 i 和隐藏节点的索引 j 结合,得到:
w11代表从 x1 到h1 的权重;
w12代表从 x_1x1 到 h_2h2 的权重。
下图包括了从输入层到隐藏层的所有权重,用 wij 表示:
之前我们可以把权重写成数组,用wi 来索引。
现在,权重被储存在矩阵中,由 wij 来索引。矩阵中的每一行对应从同一个输入节点发出的权重,每一列对应传入同一个隐藏节点的权重。这里我们有三个输入节点,两个隐藏节点,权重矩阵表示为: