本教程将带你系统学习多维数组运算与神经网络前向传播的核心知识。从矩阵乘法的基本操作入手,逐步实现一个三层神经网络的推理过程,并深入讲解输出层的设计原理与激活函数的选用策略。内容通俗易懂,配合代码示例与示意图,助你快速掌握这些关键概念。
一、多维数组与矩阵运算
在深度学习中,数据通常以多维数组(NumPy数组)的形式呈现。掌握数组的维度与形状是学习的第一步。
1.1 获取数组的维数与形状
- np.ndim():返回数组的维数(轴的数量)。例如,二维数组将返回2。
- np.shape():返回一个元组,表示数组每个维度的大小。例如,形状 (3,4) 表示3行4列。
提示:形状元组中的元素个数即为维数。例如 shape=(5,) 表示一维数组(向量),shape=(2,3) 表示二维数组(矩阵)。
1.2 矩阵乘法(点积)
神经网络中最重要的运算之一就是矩阵的点积。使用 np.dot(A, B) 计算两个矩阵的乘积。
规则:A(m × n) · B(n × k) = C(m × k)。即第一个矩阵的列数必须等于第二个矩阵的行数。
import numpy as np
A = np.array([[1,2], [3,4]]) # 2×2
B = np.array([[5,6], [7,8]]) # 2×2
C = np.dot(A, B)
print(C) # 结果: [[19, 22], [43, 50]]
1.3 神经网络中的内积示例
如下图所示,一个简单的神经网络:输入 X 是一维数组(2个元素),权重 W 是二维数组(2×3),输出 Y 是一维数组(3个元素)。计算公式为:X(2) · W(2×3) = Y(3)

注意:这里的 X 是行向量(1×2),W 是2×3,点积得到1×3的行向量 Y,实际代码中可以直接用 np.dot(X, W)。
常见问题:为什么神经网络中要用矩阵乘法,而不是逐元素乘法?
答:矩阵乘法可以一次性完成所有神经元之间的加权求和,效率极高。例如,输入有2个特征,隐藏层有3个神经元,通过一次点积就能同时计算3个神经元的加权和,从而避免显式循环。
二、三层神经网络的实现
下面我们实现一个包含两个隐藏层和一个输出层的全连接神经网络。目前权重和偏置是手动赋值的(后续将用学习算法自动更新)。整个过程称为前向传播。

2.1 从输入到第一个隐藏层
输入 X 是一维数组(2个元素),权重 W1 是形状 (2,3) 的二维数组,偏置 B1 是一维数组(3个元素)。计算公式:
A1 = np.dot(X, W1) + B1
这里的 A1 是加权和(3个元素)。然后通过激活函数 sigmoid 得到第一个隐藏层的输出 Z1:
def sigmoid(x):
return 1 / (1 + np.exp(-x))
Z1 = sigmoid(A1)
2.2 从第一个隐藏层到第二个隐藏层
将 Z1 作为输入,使用权重 W2(形状 (3,2))和偏置 B2(2个元素):
A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid(A2)
2.3 从第二个隐藏层到输出层
最后,使用权重 W3(形状 (2,2))和偏置 B3(2个元素),输出层激活函数选择恒等函数(回归问题常用):
def identity_function(x):
return x
A3 = np.dot(Z2, W3) + B3
Y = identity_function(A3)
提示:代码中的 W1、W2、W3 和 B1、B2、B3 需要提前定义。例如:W1 = np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]])
常见问题:为什么第一层权重 W1 的形状是 (2,3)?
答:因为输入有2个特征,第一隐藏层有3个神经元。权重矩阵的行数等于输入特征数,列数等于该层神经元数。偏置的长度等于神经元数。后续各层同理。
三、输出层的设计
输出层激活函数的选择取决于问题的类型:
- 回归问题(预测连续数值):使用 恒等函数,即 y = x。
- 二元分类问题(如判断是/否):使用 sigmoid 函数,输出在0~1之间,可解释为概率。
- 多元分类问题(如识别数字0~9):使用 softmax 函数。
3.1 softmax 函数
softmax 将输出层的每个值转换为0~1之间的概率,且所有输出之和为1。公式如下:
yk = exp(ak) / Σi=1n exp(ai)
其中 n 是输出层神经元的个数(即类别数量)。
由于指数函数可能造成数值溢出(例如 exp(1000) 非常大),需要对分子分母同时减去一个常数。通常减去输入中的最大值:
def softmax(a):
C = np.max(a) # 获取最大值
exp_a = np.exp(a - C) # 减去最大值,避免溢出
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
重要特性:
- 输出值在0~1之间。
- 所有输出值的总和为1,因此可以解释为概率。
- 因为指数函数是单调递增的,输出值最大的神经元对应的类别就是概率最高的分类结果。
在分类任务中,输出层神经元的数量就是类别的数量。例如手写数字识别有10个类别(0~9),输出层就有10个神经元,每个神经元代表该数字的概率。
常见问题:为什么 softmax 要减去最大值?
答:防止数值溢出。如果输入中有很大的正数(如1000),exp(1000) 会超出计算机浮点数的表示范围。减去最大值后,最大的指数项变成 exp(0)=1,所有指数项都在可控范围内,且函数值不变(因为分子分母同除以一个常数 exp(C))。
通过本教程,你已经掌握了多维数组运算、三层神经网络的实现,以及输出层激活函数的选择与 softmax 函数的细节。这些知识是构建和训练神经网络的基础。下一阶段可以尝试用真实数据训练网络,并学习反向传播算法来自动更新权重和偏置。
