1. Job Roadmap
  2. Home
  3. Problem Set
  4. codenotelist
  5. Forum
  6. course
  7. Shore Share Sessions
  8. Record
  1. Login
  2. Sign Up
  3. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文
    ZhContent TextSol AI分析

解题思路

这道题要求实现一个多层前馈神经网络的反向传播算法,计算损失函数对每层权重矩阵和偏置向量的梯度。

核心算法是反向传播(Backpropagation),其基本思想是利用链式法则从输出层向输入层逐层计算梯度。具体实现包括以下步骤:

第一步是前向传播。从输入层开始,逐层计算每一层的线性组合结果Z和激活值A。前K-1层使用ReLU激活函数,最后一层使用Softmax激活函数得到类别概率分布。在前向传播过程中,需要保存所有的Z和A值,供反向传播使用。

第二步是计算输出层的梯度。对于交叉熵损失函数配合Softmax激活函数的组合,其对Z[K]的梯度有简化形式:dZ[K] = (output_probabilities - Y_true) / N,其中Y_true是真实标签的one-hot编码。

P4239.第3题-反向传播实现

    1000ms Tried: 429 Accepted: 98 Difficulty: 7 所属公司 : 华为
    算法与标签>机器学习算法

题目内容

给定K层前馈网络模型的权重矩阵M[i]M[i]M[i]、偏移向量b[i]b[i]b[i],以及一批输入数据XXX和对应的真实分类标签Y_true_labelsY\_true\_labelsY_true_labels,请计算出总损失LLL对每一个权重矩阵M[i]M[i]M[i]和每一个偏移向量b[i]b[i]b[i]的梯度。

模型架构

模型有K个权重矩阵,第i个矩阵是M[i]。还有K个偏移向量,第i个向量是b[i]。

网络的计算过程(前向传播)如下:

  1. 输入是一个 N×wN \times wN×w 的矩阵 xxx,其中 NNN 是 batch size (本次输入数据的个数),www 是初始特征的数量。
  2. 网络的计算分为K层。我们用 A[i]A[i]A[i] 代表第 iii 层的输出(激活值)。初始输入 A[0]=XA[0] = XA[0]=X。
  3. 对于第 iii 层(从 i=1i = 1i=1 到 K−1K - 1K−1 ):
    • 线性计算:Z[i]=A[i−1]⋅M[i]+b[i]Z[i] = A[i - 1] \cdot M[i] + b[i]Z[i]=A[i−1]⋅M[i]+b[i]
    • 激活函数:A[i]=ReLU(Z[i])A[i] = ReLU(Z[i])A[i]=ReLU(Z[i])
  4. 对于最后一层(第 KKK 层),使用 Softmax 激活函数来输出每个类别的概率:
    • 线性计算:Z[K]=A[K−1]⋅M[K]+b[K]Z[K] = A[K - 1] \cdot M[K] + b[K]Z[K]=A[K−1]⋅M[K]+b[K]
    • 激活函数:A[K]=Softmax(Z[K])A[K] = Softmax(Z[K])A[K]=Softmax(Z[K])
  5. 最终的输出为 A[K]A[K]A[K],我们称之为 output_probabilities。这是一个 N×10N \times 10N×10 的矩阵。

为了衡量模型预测的好坏,使用了交叉熵损失(Cross-Entropy Loss),具体计算公式参见提示部分。

输入描述

  • 第一行是一个整数KKK,代表网络的层数。

  • 第二行是KKK个整数,依次代表每层的维度h[0],h[1],h[2],…,h[K−1]h[0], h[1], h[2], \ldots, h[K-1]h[0],h[1],h[2],…,h[K−1]。 最后一层的输出维度固定为10,代表10个类别。其中h[0]=W,h[K]=10h[0] = W, h[K] = 10h[0]=W,h[K]=10。

  • M[i]M[i]M[i]的形状是h[i−1]×h[i]h[i-1] \times h[i]h[i−1]×h[i](其中hhh即为www),1≤i≤K1 \le i \le K1≤i≤K。

  • b[i]b[i]b[i]的形状是1×h[i]1 \times h[i]1×h[i]。

  • 接下来是 KKK 个权重矩阵 M[1],…,M[K]M[1], \ldots, M[K]M[1],…,M[K] 的数据。第 iii 矩阵的数字分为 h[i−1]h[i - 1]h[i−1] 行、每行 h[i]h[i]h[i] 个浮点数、第 iii 行j列表示 M[i]M[i]M[i] 矩阵的第 iii 行j列 1≤i≤K1 \leq i \leq K1≤i≤K)。

  • 接下来是KKK个偏移向量b[1],…,b[K]b[1], \ldots, b[K]b[1],…,b[K]的数据。 分为KKK行,第iii行有h[i]h[i]h[i]个数字,表示b[i]b[i]b[i]的权重(1≤i≤K1 \le i \le K1≤i≤K)。

  • 之后是一个整数NNN,代表batch size。

  • 接下来是NNN行,每行www个浮点数,代表输入矩阵XXX。

  • 最后是NNN行,每行一个整数y∈{0,1,…,9}y \in \{0,1,\ldots,9\}y∈{0,1,…,9},代表真实的类别标签。

输入保证输入的所有浮点数绝对值不超过100,且小数点后最多2位数字。 即任意输入浮点数fff,有∣f∣≤100|f| \le 100∣f∣≤100,且100⋅f100 \cdot f100⋅f是整数。

输出描述

  • 依次输出KKK个权重矩阵的梯度和KKK个偏移向量的梯度。

  • 对于第iii层(从1到KKK):

    • 首先,输出梯度矩阵∂L∂M[i]\dfrac{\partial L}{\partial M[i]}∂M[i]∂L​,分为h[i−1]h[i-1]h[i−1]行输出,每行h[i]h[i]h[i]个实数,用一个空格分隔,行末不能有空格。
    • 然后,输出平均梯度向量∂L∂b[i]\dfrac{\partial L}{\partial b[i]}∂b[i]∂L​,一行有h[i]h[i]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}y_j \in \{0,1,\ldots,9\}yj​∈{0,1,…,9}

首先,我们将真实标签yjy_jyj​转换为one-hot向量(Ytrue)j(Y_{true})_j(Ytrue​)j​。例如,如果真实标签为2,其one-hot向量为

[0,0,1,0,0,0,0,0,0,0][0,0,1,0,0,0,0,0,0,0][0,0,1,0,0,0,0,0,0,0]。

总损失LLL的计算方式是批次中所有样本损失的平均值:

L=−1N∑j=1N∑l=09(Ytrue)jllog⁡(output_probabilitiesjl)L = -\frac{1}{N} \sum_{j=1}^{N} \sum_{l=0}^{9} (Y_{true})_{jl} \log(output\_probabilities_{jl}) L=−N1​j=1∑N​l=0∑9​(Ytrue​)jl​log(output_probabilitiesjl​)

其中(output_probabilities)jl(output\_probabilities)_{jl}(output_probabilities)jl​是第jjj个样本的预测输出向量(经过Softmax后)的第lll个元素。

数据范围

1≤K≤51 \le K \le 51≤K≤5

1≤w,h[i]≤1001 \le w, h[i] \le 1001≤w,h[i]≤100

1≤N≤1001 \le N \le 1001≤N≤100

所有输入浮点数的绝对值不超过100,且浮点数小数点后最多两位小数。

提示

提示

  • 提示1:

∂L∂b[i]j=∂Z[i]j∂b[i]j⋅∂L∂Z[i]j=∂L∂Z[i]j\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}∂b[i]j​∂L​=∂b[i]j​∂Z[i]j​​⋅∂Z[i]j​∂L​=∂Z[i]j​∂L​

  • 提示2:

∂L∂M[i]kj=∂Z[i]j∂M[i]kj⋅∂L∂Z[i]j=A[i−1][k]⋅∂L∂Z[i]j\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}∂M[i]kj​∂L​=∂M[i]kj​∂Z[i]j​​⋅∂Z[i]j​∂L​=A[i−1][k]⋅∂Z[i]j​∂L​

  • 提示3:

根据链式法则,dM[i]=A[i−1]T×dZ[i]dM[i] = A[i-1]^T \times dZ[i]dM[i]=A[i−1]T×dZ[i](T表示转置)

登录后即可使用 AI 分析。

模式
倒计时时长
:

最长 10 小时 59 分;应用后按此时长重新开始。

提示:点击提交记录在左侧题面区域查看详情
题库
AI分析设置
留空使用官方API Key,每天有次数限制(自定义API Key仅限会员和管理员使用,不限次数)
会员和管理员可切换模型;切到 Kimi/智谱/通义/豆包时需填写对应供应商 API Key
升级会员,可将运行与提交冷却时间缩短至 1 秒起

Status

  • Judging Queue
  • Service Status

Development

  • Open Source

Support

  • Help
  • Contact Us

About

  • About
  • Privacy
  • Terms of Service
  • Copyright Complaint
  1. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文
  2. Legacy mode
  3. Theme
    1. Light
    2. Dark
  1. 京ICP备2025123107号-1
  2. Worker 0, 51ms
  3. Powered by Hydro v5.0.0-beta.18 Community
CLOSE


ScanQRCodePrompt

请使用微信扫描下方二维码完成注册

Forgot password or username?