- 现在我将详细解释训练过程中涉及的具体数学计算和操作:
1. 神经网络的前向传播计算
在我们的例子中,神经网络有两层全连接层(Linear Layer)。每一层都执行以下数学运算:
对于一个线性层(如 fc1 或 fc2),其数学表达式为:
Y = XW^T + B
其中:
- X 是输入向量
- W 是权重矩阵
- B 是偏置向量
- ^T 表示转置
具体来说,在我们的网络中:
第一层 fc1 将 2 维输入映射到 2 维输出:
[fc1](file:///d:/demo/my_torch/demo.py#L7-L7) 计算: h = x * W1^T + b1
然后应用 ReLU 激活函数:
a = ReLU(h) = max(0, h) # 对h中的每个元素取最大值(0, h)
第二层 fc2 将 2 维输入映射到 1 维输出:
[fc2](file:///d:/demo/my_torch/demo.py#L8-L8) 计算: output = a * W2^T + b2
2. 损失函数计算
使用的是均方误差损失函数(MSE Loss):
Loss = (1/n) * Σ(output_i - target_i)^2
其中:
- n 是样本数量
- output_i 是神经网络对第i个样本的预测值
- target_i 是第i个样本的真实值
3. 反向传播计算梯度
PyTorch 的自动微分系统会根据计算图自动计算梯度。反向传播使用链式法则计算每个参数的梯度:
对于复合函数 L = f(g(h(x))),链式法则是:
dL/dx = (dL/df) * (df/dg) * (dg/dh) * (dh/dx)
具体到我们的网络中,对于第二层权重 W2:
dL/dW2 = dL/d(output) * d(output)/dW2
对于第一层权重 W1:
dL/dW1 = dL/d(output) * d(output)/d(activation) * d(activation)/d(hidden) * d(hidden)/dW1
4. Adam优化器更新参数
Adam优化器结合了动量(Momentum)和RMSprop的思想。更新公式如下:
计算梯度的一阶矩估计(均值)和二阶矩估计(非中心化的二阶矩):
m_t = β1 * m_{t-1} + (1-β1) * g_t
v_t = β2 * v_{t-1} + (1-β2) * g_t^2
其中:
- g_t 是当前梯度
- β1 和 β2 是衰减率(通常分别为0.9和0.999)
进行偏差修正:
m_hat = m_t / (1 - β1^t)
v_hat = v_t / (1 - β2^t)
更新参数:
θ = θ - lr * m_hat / (sqrt(v_hat) + ε)
其中:
- lr 是学习率
- ε 是一个小常数(通常为1e-8),防止除零错误
5. 整体训练流程的数学描述
在一个训练周期(epoch)中,完整的计算流程如下:
前向传播:
h1 = X * W1^T + b1
a1 = ReLU(h1)
output = a1 * W2^T + b2
计算损失:
loss = MSE(output, Y) = (1/n) * Σ(output_i - Y_i)^2
反向传播计算梯度:
grad_W2 = d(loss)/d(W2)
grad_b2 = d(loss)/d(b2)
grad_W1 = d(loss)/d(W1)
grad_b1 = d(loss)/d(b1)
Adam优化器更新参数:
W2 = W2 - AdamUpdate(grad_W2)
b2 = b2 - AdamUpdate(grad_b2)
W1 = W1 - AdamUpdate(grad_W1)
b1 = b1 - AdamUpdate(grad_b1)
这个过程重复多次,直到模型收敛或达到预设的训练轮数。通过这种方式,神经网络逐步学习输入和输出之间的映射关系。
965

被折叠的 条评论
为什么被折叠?



