#P4486. 反向传播(两层全连接网络)

反向传播(两层全连接网络)

题目描述

实现一个两层全连接神经网络,网络结构为:

  • 输入层:2 维
  • 隐藏层:3 个神经元,激活函数为 ReLU
  • 输出层:1 个神经元,激活函数为 Sigmoid

给定网络参数 W1, b1, W2, b2,单个输入样本 x = [x1, x2] 和标签 y(0 或 1),以及学习率 lr,对这个样本执行:

  1. 一次前向传播(Forward)
  2. 计算二分类交叉熵损失(Binary Cross Entropy)
  3. 一次反向传播(Backward)
  4. 使用梯度下降更新参数

需要返回 loss 和更新后的参数。

前向传播公式

设输入为 xR2x \in \mathbb{R}^2

  1. 隐藏层线性变换: z1=W1x+b1(维度 3)z_1 = W_1 x + b_1 \quad (\text{维度 } 3)

  2. ReLU 激活: h=ReLU(z1)=max(0,z1)h = \text{ReLU}(z_1) = \max(0, z_1)

  3. 输出层线性变换: z2=W2h+b2(标量)z_2 = W_2^\top h + b_2 \quad (\text{标量})

  4. Sigmoid 输出: y^=σ(z2)=11+ez2\hat{y} = \sigma(z_2) = \frac{1}{1 + e^{-z_2}}

损失函数(BCE)

loss=[ylogy^+(1y)log(1y^)]\text{loss} = -\big[y \log \hat{y} + (1 - y)\log(1 - \hat{y})\big]

反向传播(单样本)

你需要对以上计算过程进行反向传播,求出对所有参数的梯度,并使用学习率 lr 做一次梯度下降更新:

  • W1W1lrlossW1W_1 \leftarrow W_1 - lr \cdot \frac{\partial \text{loss}}{\partial W_1}
  • b1b1lrlossb1b_1 \leftarrow b_1 - lr \cdot \frac{\partial \text{loss}}{\partial b_1}
  • W2W2lrlossW2W_2 \leftarrow W_2 - lr \cdot \frac{\partial \text{loss}}{\partial W_2}
  • b2b2lrlossb2b_2 \leftarrow b_2 - lr \cdot \frac{\partial \text{loss}}{\partial b_2}

输入参数

  • lr:学习率
  • W1:形状为 2×32 \times 3 的隐藏层权重矩阵
  • b1:长度为 33 的隐藏层偏置向量
  • W2:长度为 33 的输出层权重向量
  • b2:输出层偏置标量
  • x:长度为 22 的输入向量
  • y:标签,y0,1y \in {0,1}

返回值

  • loss:当前样本的二分类交叉熵损失
  • W1'b1'W2'b2':一次梯度更新后的参数

示例 1

输入:

lr = 0.1
W1 = [[0.1, -0.5, 0.3],[0.4,  0.5, -0.6]]
b1 = [0.0, 0.1, 0.0]
W2 = [0.2, -0.1, 0.4]
b2 = 0.0
x = [1.0, 2.0]
y = 1

输出:

loss = 0.63
W1' = [[0.11, -0.5, 0.3], [0.42, 0.49, -0.6]]
b1' = [0.01, 0.1, 0.0]
W2' = [0.24, -0.07, 0.4]
b2' = 0.05

提示

  • 输入和参数均为浮点数,使用双精度计算

  • 维度约束:

    • W12×32 \times 3
    • b1 长度为 33
    • W2 长度为 33
    • b2 为标量
    • x 为长度 22
  • 学习率范围: 0<lr10 < lr \le 1

  • 输入向量范围: 1000x[i]1000-1000 \le x[i] \le 1000

  • 权重与偏置范围: 10W1[i][j]10-10 \le W1[i][j] \le 10

    10b1[j]10-10 \le b1[j] \le 10

    10W2[j]10-10 \le W2[j] \le 10

    10b210-10 \le b2 \le 10