第 65 课 - 神经网络基础概念
1. 学习目标
完成本课学习后,你将能够:
- 理解神经网络的基本组成结构及其生物类比
- 描述神经元、权重、偏置和激活函数在神经网络中的作用
- 解释前向传播如何在网络中处理数据并产生输出
- 认识损失函数和优化器如何共同驱动神经网络的学习过程
- 使用 Python 框架(PyTorch)构建一个简单的神经网络示例
2. 核心概念
神经网络是一种受人脑启发的计算模型,旨在从数据中学习复杂的模式。它由大量相互连接的“神经元”组成。
1. 神经元(Neuron) 它是神经网络的基本计算单元。你可以把它想象成一个简单的决策开关。
- 输入:接收来自数据或其他神经元的多个信号(x1, x2, x3...)。
- 处理:每个输入都乘以一个权重(weight),权重代表了这个输入的重要程度。所有加权输入的和,再加上一个**偏置(bias)**项,就得到了该神经元的原始激活值。
z = w1*x1 + w2*x2 + ... + wn*xn + b
- 激活:原始激活值
z会通过一个激活函数(Activation Function) 进行非线性变换,得到该神经元的最终输出a = f(z)。没有激活函数,网络无论多少层都只能表示线性关系,能力会非常有限。
2. 网络结构
- 输入层(Input Layer):接收原始数据。例如,一张28x28像素的灰度图片,输入层就有784个神经元(28*28)。
- 隐藏层(Hidden Layers):位于输入层和输出层之间,负责对输入数据进行层层抽象和特征提取。层数和每层神经元数量决定了网络的“深度”和“宽度”,是影响模型能力的关键。
- 输出层(Output Layer):产生最终的预测结果。例如,一个分类任务(识别数字0-9),输出层通常有10个神经元,每个代表一个类别的概率。
3. 前向传播 数据从输入层,经过各个隐藏层的权重、偏置计算和激活函数处理,最终到达输出层的过程,就叫前向传播。这个过程就是网络做出预测的完整路径。
4. 损失函数与优化
- 损失函数(Loss Function):用来衡量网络预测结果(
y_pred)与真实标签(y_true)之间的差距。差距越大,损失越大。常见损失函数有均方误差(MSE,用于回归)和交叉熵损失(Cross-Entropy,用于分类)。 - 优化器(Optimizer):如梯度下降(Gradient Descent),它根据损失函数计算出的误差梯度,来调整网络中所有神经元的权重和偏置,目标是让损失函数的值越来越小。这个过程就是神经网络的“学习”或“训练”。
3. 代码示例
以下是一个使用 PyTorch 构建简单神经网络的完整示例。我们将构建一个网络,输入3个特征,通过一个隐藏层(4个神经元),输出1个预测值。
import torch
import torch.nn as nn
import torch.optim as optim
# 定义神经网络模型
class SimpleNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(SimpleNN, self).__init__()
# 定义一个线性层(全连接层)作为隐藏层:输入层 -> 隐藏层
self.hidden_layer = nn.Linear(input_size, hidden_size)
# 定义激活函数,ReLU是最常用的激活函数之一
self.activation = nn.ReLU()
# 定义输出层:隐藏层 -> 输出层
self.output_layer = nn.Linear(hidden_size, output_size)
# 定义前向传播逻辑
def forward(self, x):
# 数据通过隐藏层
x = self.hidden_layer(x)
# 通过激活函数引入非线性
x = self.activation(x)
# 数据通过输出层得到预测值
x = self.output_layer(x)
return x
# 设置网络超参数
input_features = 3 # 输入特征数
hidden_neurons = 4 # 隐藏层神经元数
output_neurons = 1 # 输出神经元数
learning_rate = 0.01 # 学习率
# 实例化网络、损失函数和优化器
model = SimpleNN(input_features, hidden_neurons, output_neurons)
loss_function = nn.MSELoss() # 均方误差损失
optimizer = optim.SGD(model.parameters(), lr=learning_rate) # 随机梯度下降优化器
# 模拟一些训练数据
# 假设我们有10个样本,每个样本有3个特征
X_train = torch.randn(10, 3)
# 假设我们要预测的目标值(真实值)
y_train = torch.randn(10, 1)
print("--- 训练前的网络预测(随机权重) ---")
# 进行一次前向传播,查看初始预测
initial_predictions = model(X_train[:3]) # 取前3个样本查看
print(f"初始预测:\n{initial_predictions}")
print(f"对应真实值:\n{y_train[:3]}")
print("\n--- 开始训练循环 ---")
# 简单的训练循环
num_epochs = 100
for epoch in range(num_epochs):
# 1. 前向传播:计算预测
predictions = model(X_train)
# 2. 计算损失
loss = loss_function(predictions, y_train)
# 3. 反向传播:计算梯度
optimizer.zero_grad() # 清空之前的梯度
loss.backward() # 反向传播计算新梯度
# 4. 优化:更新权重和偏置
optimizer.step()
# 每20个epoch打印一次损失
if (epoch+1) % 20 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
print("\n--- 训练后的网络预测 ---")
final_predictions = model(X_train[:3])
print(f"最终预测:\n{final_predictions.detach().numpy()}")
print(f"对应真实值:\n{y_train[:3].numpy()}")
print("可以看到,预测值向真实值靠近了。")
代码说明:
- 我们定义了一个
SimpleNN类,它继承自nn.Module。 __init__方法中初始化了网络的层。forward方法定义了数据如何流经这些层,即前向传播的路径。- 训练循环清晰地展示了前向传播、计算损失、反向传播(计算梯度)和优化(更新参数)这四个核心步骤。
4. 实践练习
练习 1:理解前向传播
假设一个非常简单的网络,只有一个神经元(无隐藏层),权重 w1=0.5, w2=-0.3,偏置 b=0.1,激活函数是 f(x)=max(0, x) (ReLU)。
输入样本 x = [2.0, 1.0]。
请手动计算该神经元的输出。
# 你的计算过程:
z = w1*x1 + w2*x2 + b = ?
a = max(0, z) = ?
练习 2:修改网络结构
基于上面的代码示例,请创建一个新的网络类 MediumNN,它具有两个隐藏层。第一个隐藏层有8个神经元,第二个隐藏层有4个神经元。输入和输出维度不变。用随机数据测试你的网络。
练习 3:探索激活函数
在 SimpleNN 的基础上,尝试将隐藏层的激活函数从 ReLU 换成 Sigmoid (nn.Sigmoid()) 或 Tanh (nn.Tanh())。运行训练代码,观察损失下降的趋势和最终结果是否有所不同。(提示:可能需要调整学习率)。
5. 常见错误
- 忘记添加激活函数:在隐藏层后如果不使用非线性激活函数,那么无论网络有多少层,其表达能力都与一个单层线性网络无异,无法学习复杂的模式。
- 学习率设置不当:
- 学习率太大:损失可能剧烈震荡,甚至不降反升,导致训练无法收敛。
- 学习率太小:训练速度极其缓慢,需要非常长的时间才能看到效果。
- 输入数据未归一化:神经网络对输入数据的尺度很敏感。如果特征数值范围差异巨大(如一个特征是0-1,另一个是0-10000),会严重影响训练效果。通常需要将输入数据标准化到0均值、1方差或0-1区间。
- 网络结构过于复杂或简单:
- 过于简单(容量不足):无法捕捉数据中的复杂规律,导致欠拟合。
- 过于复杂(容量过大):可能会“记住”训练数据的所有噪声,导致在新数据上表现很差,即过拟合。
6. 小结
本节课我们学习了神经网络最基础的概念:
- 基本结构:神经网络由输入层、隐藏层和输出层的神经元构成。
- 核心计算:神经元通过权重和偏置对输入进行加权求和,再通过激活函数引入非线性,这个过程称为前向传播。
- 学习过程:网络通过损失函数量化预测误差,然后使用优化器(如梯度下降)根据误差来调整权重和偏置,使损失最小化。
- 实现工具:现代深度学习框架(如PyTorch,TensorFlow)极大地简化了神经网络的定义、训练和部署过程。
理解这些基础概念是进入更复杂的深度学习模型(如卷积神经网络CNN、循环神经网络RNN)的坚实基础。下一课我们将深入学习最早的神经网络模型之一——感知机,并由此引出多层感知机(MLP)的原理。