#P4239. 第3题-反向传播实现
-
1000ms
Tried: 309
Accepted: 67
Difficulty: 7
所属公司 :
华为
时间 :2025年10月17日-AI方向
-
算法标签>机器学习算法
第3题-反向传播实现
解题思路
这道题要求实现一个多层前馈神经网络的反向传播算法,计算损失函数对每层权重矩阵和偏置向量的梯度。
核心算法是反向传播(Backpropagation),其基本思想是利用链式法则从输出层向输入层逐层计算梯度。具体实现包括以下步骤:
第一步是前向传播。从输入层开始,逐层计算每一层的线性组合结果Z和激活值A。前K-1层使用ReLU激活函数,最后一层使用Softmax激活函数得到类别概率分布。在前向传播过程中,需要保存所有的Z和A值,供反向传播使用。
第二步是计算输出层的梯度。对于交叉熵损失函数配合Softmax激活函数的组合,其对Z[K]的梯度有简化形式:dZ[K] = (output_probabilities - Y_true) / N,其中Y_true是真实标签的one-hot编码。
题目内容
给定K层前馈网络模型的权重矩阵M[i]、偏移向量b[i],以及一批输入数据X和对应的真实分类标签Y_true_labels,请计算出总损失L对每一个权重矩阵M[i]和每一个偏移向量b[i]的梯度。
模型架构
模型有K个权重矩阵,第i个矩阵是M[i]。还有K个偏移向量,第i个向量是b[i]。
网络的计算过程(前向传播)如下:
- 输入是一个 N×w 的矩阵 x,其中 N 是
batch size(本次输入数据的个数),w 是初始特征的数量。 - 网络的计算分为K层。我们用 A[i] 代表第 i 层的输出(激活值)。初始输入 A[0]=X。
- 对于第 i 层(从 i=1 到 K−1 ):
- 线性计算:Z[i]=A[i−1]⋅M[i]+b[i]
- 激活函数:A[i]=ReLU(Z[i])
- 对于最后一层(第 K 层),使用 Softmax 激活函数来输出每个类别的概率:
- 线性计算:Z[K]=A[K−1]⋅M[K]+b[K]
- 激活函数:A[K]=Softmax(Z[K])
- 最终的输出为 A[K],我们称之为
output_probabilities。这是一个 N×10 的矩阵。
为了衡量模型预测的好坏,使用了交叉熵损失(Cross-Entropy Loss),具体计算公式参见提示部分。
输入描述
-
第一行是一个整数K,代表网络的层数。
-
第二行是K个整数,依次代表每层的维度h[0],h[1],h[2],…,h[K−1]。 最后一层的输出维度固定为10,代表10个类别。其中h[0]=W,h[K]=10。
-
M[i]的形状是h[i−1]×h[i](其中h即为w),1≤i≤K。
-
b[i]的形状是1×h[i]。
-
接下来是 K 个权重矩阵 M[1],…,M[K] 的数据。第 i 矩阵的数字分为 h[i−1] 行、每行 h[i] 个浮点数、第 i 行j列表示 M[i] 矩阵的第 i 行j列 1≤i≤K)。
-
接下来是K个偏移向量b[1],…,b[K]的数据。 分为K行,第i行有h[i]个数字,表示b[i]的权重(1≤i≤K)。
-
之后是一个整数N,代表batch size。
-
接下来是N行,每行w个浮点数,代表输入矩阵X。
-
最后是N行,每行一个整数y∈{0,1,…,9},代表真实的类别标签。
输入保证输入的所有浮点数绝对值不超过100,且小数点后最多2位数字。 即任意输入浮点数f,有∣f∣≤100,且100⋅f是整数。
输出描述
-
依次输出K个权重矩阵的梯度和K个偏移向量的梯度。
-
对于第i层(从1到K):
- 首先,输出梯度矩阵∂M[i]∂L,分为h[i−1]行输出,每行h[i]个实数,用一个空格分隔,行末不能有空格。
- 然后,输出平均梯度向量∂b[i]∂L,一行有h[i]个数字,用一个空格分隔,行末不能有空格。
-
所有浮点数保留4位小数。
输入保证计算出来的输出梯度不会有NAN,且可以被双精度浮点数表示(即不会炸梯度,不会出现NAN/INF)。
样例1
输入
2
4 5
1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0
0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
0.1 0.1 0.1 0.1 0.1
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2
0.5 0.5 0.5 0.5
0.5 0.5 0.5 0.5
2
8
输出
0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000
0.2100 0.2100 -0.8400 0.2100 0.2100 0.2100 0.2100 0.2100 -0.8400 0.2100
0.2100 0.2100 -0.8400 0.2100 0.2100 0.2100 0.2100 0.2100 -0.8400 0.2100
0.2100 0.2100 -0.8400 0.2100 0.2100 0.2100 0.2100 0.2100 -0.8400 0.2100
0.2100 0.2100 -0.8400 0.2100 0.2100 0.2100 0.2100 0.2100 -0.8400 0.2100
0.2100 0.2100 -0.8400 0.2100 0.2100 0.2100 0.2100 0.2100 -0.8400 0.2100
0.1000 0.1000 -0.4000 0.1000 0.1000 0.1000 0.1000 0.1000 -0.4000 0.1000
说明
输入样例是2个样本,特征相同,但是标签不同。
样例2
输入
1
2
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1
1
50.0 60.0
4
输出
0.0000 0.0000 0.0000 0.0000 -50.0000 0.0000 0.0000 0.0000 0.0000 50.0000
0.0000 0.0000 0.0000 0.0000 -60.0000 0.0000 0.0000 0.0000 0.0000 60.0000
0.0000 0.0000 0.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 0.0000 1.0000
说明
一层网络,一个样本。
Z[1] = [56.01 112.02 168.03 224.04 280.05 336.06 392.07 448.08 504.09 560.1]
A[1] = [1.1925994847839173e-219, 2.519582300056682e-195, 5.323073712302622e-171, 1.1245956818306658e-146, 2.3759119560363354e-122, 5.019544102861018e-98, 1.060469557238993e-73, 2.240433909505195e-49, 4.733322204863164e-25, 1.0]
Ground Truth是[0,0,0,0,1,0,0,0,0,0]
提示
Loss计算公式
对于一批(batch)大小为N的输入,每个输入都有一个真实的类别标签
yj∈{0,1,…,9}
首先,我们将真实标签yj转换为one-hot向量(Ytrue)j。例如,如果真实标签为2,其one-hot向量为
[0,0,1,0,0,0,0,0,0,0]。
总损失L的计算方式是批次中所有样本损失的平均值:
L=−N1j=1∑Nl=0∑9(Ytrue)jllog(output_probabilitiesjl)其中(output_probabilities)jl是第j个样本的预测输出向量(经过Softmax后)的第l个元素。
数据范围
1≤K≤5
1≤w,h[i]≤100
1≤N≤100
所有输入浮点数的绝对值不超过100,且浮点数小数点后最多两位小数。
提示
提示
- 提示1:
$\frac{\partial L}{\partial b[i]_j} = \frac{\partial Z[i]_j}{\partial b[i]_j} \cdot \frac{\partial L}{\partial Z[i]_j} = \frac{\partial L}{\partial Z[i]_j}$
- 提示2:
$\frac{\partial L}{\partial M[i]_{kj}} = \frac{\partial Z[i]_j}{\partial M[i]_{kj}} \cdot \frac{\partial L}{\partial Z[i]_j} = A[i-1][k] \cdot \frac{\partial L}{\partial Z[i]_j}$
- 提示3:
根据链式法则,dM[i]=A[i−1]T×dZ[i](T表示转置)