笔者注
神经网络的前向传播(Forward Propagation)是指输入数据从输入层经过各隐藏层传递到输出层,逐层计算激活值的过程。这一过程不涉及参数更新,主要用于生成预测结果或为反向传播提供中间值。如果觉得理解起来过于抽象,就把这个过程作为为了得到结果所需要做的必要过程好了。
1. 神经网络结构基础
之前笔记介绍过
神经网络由多层神经元组成,一般有3层结构:
- 输入层:接收原始数据。
- 隐藏层:1个或多个中间层,通过非线性变换提取特征。
- 输出层:生成最终预测结果。
- 神经元连接:每层神经元通过带权重的边与下一层神经元相连,权重决定输入信号的重要性。
2. 前向传播核心步骤
假设神经网络有L层,第l层的输入为,输出为
。每一层的计算分为两步:
步骤1:线性变换(Linear Transformation)
- 公式:
- :第l层的权重矩阵(维度为
)。
- :第l层的偏置向量(维度为
)。
- :第l-1层的激活值(输入)。
- :第l层的线性组合结果(未激活值)。
步骤2:非线性激活(Non-linear Activation)
- 公式:
- :激活函数(如ReLU、sigmoid、tanh等)。
- 作用:引入非线性,使神经网络能学习复杂模式。
3. 逐层计算示例
以一个简单的3层网络(输入层→隐藏层→输出层)为例:
1. 输入层到隐藏层:
- 输入数据 (假设X为样本矩阵,维度为
,m为样本数)。
- 计算 。
- 激活:。
2. 隐藏层到输出层:
- 计算 。
- 输出层激活(根据任务选择函数):
- 回归任务:线性激活。
- 分类任务:Softmax激活(输出概率分布)。
4. 激活函数的选择
- 常见激活函数:
- Sigmoid:输出范围(0,1),适合二分类。
- ReLU:计算高效,缓解梯度消失()。
- Softmax:输出层多分类常用,将值归一化为概率分布。
- 选择依据:根据任务类型(分类/回归)和网络深度(避免梯度问题)。
5. 矩阵运算的高效性
- 向量化计算:通过矩阵乘法同时处理多个样本,避免循环。
- 示例:若有m个样本,每个样本的输入为 ,则
,矩阵运算可批量计算所有样本的激活值。
6. 前向传播的作用
- 预测阶段:输入新数据,逐层计算输出,得到预测结果。
- 训练阶段:为反向传播提供中间值(如各层的z和a),用于计算梯度并更新参数。
7.简单的算法示例代码
import numpy as np
# 定义激活函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 前向传播函数
def forward_propagation(X, W1, b1, W2, b2):
# 输入层到隐藏层的线性变换
z1 = np.dot(W1, X) + b1
# 隐藏层的激活函数
a1 = sigmoid(z1)
# 隐藏层到输出层的线性变换
z2 = np.dot(W2, a1) + b2
# 输出层的激活函数
a2 = sigmoid(z2)
return a2
# 示例数据
# 输入特征,假设有3个样本,每个样本有2个特征
X = np.array([[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]]).T
# 隐藏层神经元数量
n_hidden = 3
# 输入层神经元数量
n_input = X.shape[0]
# 输出层神经元数量
n_output = 1
# 初始化权重和偏置
# 输入层到隐藏层的权重
W1 = np.random.randn(n_hidden, n_input)
# 隐藏层的偏置
b1 = np.zeros((n_hidden, 1))
# 隐藏层到输出层的权重
W2 = np.random.randn(n_output, n_hidden)
# 输出层的偏置
b2 = np.zeros((n_output, 1))
# 执行前向传播
output = forward_propagation(X, W1, b1, W2, b2)
print("前向传播的输出结果:")
print(output)
8. 总结
前向传播的核心是将输入数据通过层层线性变换和非线性激活,最终映射到输出空间。其数学本质是复合函数的嵌套计算,而矩阵运算的优化使得这一过程在大规模数据上高效运行。理解前向传播是掌握反向传播、梯度下降等神经网络核心算法的基础。