Problem 4184 --2025AHCPC_L反向传播

4184: 2025AHCPC_L反向传播

"
Time Limit $1$ 秒/Second(s) Memory Limit $128$ 兆字节/Megabyte(s)
提交总数 $0$ 正确数量 $4$
裁判形式 标准裁判/Standard Judge 我的状态 尚未尝试
难度 分类标签

 正向传播与反向传播是现代神经网络的基础,   小 M 在机器学习课程中成绩很不好,   想利用这次安徽省机器人大赛的机会实践一下机器学习的基础理论,   从零开始实现一个机器学习框架.   他手动定义了一个神经元间的结构,   定义了损失函数和优化器,   并初始化了参数,   他想让你帮忙模拟神经网络的正向传播与反向传播过程,   将正确的值告诉他.

         由于担心你的机器学习基础比小 M 更不好,   小 M 贴心地为你准备了一些基础概念,   以供参考:

         神经元 (Neuron):   神经网络的基本计算单元,模拟生物神经元的工作方式,   负责接收输入,   进行加权计算并产生输出.   接受来自前一层神经元的输入 x1,x2,x3,...,xn 并与对应的权重 w1,w2,w3,...,wn 分别相乘后求和,   并与偏置 b 相加.   形式化地,   可以表示为:


z=∑i=1nwixi+b


         正向传播 (Forward Propagation):   神经网络中进行预测的核心过程,   输入数据从输入层进入网络,   依次经过各隐藏层,   每一层的神经元通过加权求和   (输入与权重的线性结合)   并施加激活函数,   将结果传递到下一层,   最终在输出层生成预测值,   对于第 l 层,   形式化地表示为:


z(l)=σ(W(l)a(l−1)+b(l))


         反向传播 (Backward Propagation):   神经网络中基于链式法则计算损失函数对输入的梯度   (偏导数)   的过程,   其核心是通过输出层向输入层逐层回传误差.

         由于小 M 的编程能力很弱,   他设计的神经网络比较简单,   与真实的神经网络有很大差别,   小 Y 将这些特点总结给你:

         小 M 的神经网络中,   对于任意神经元,   偏置 b 皆为 0,   且每个神经元恰好有两个输入,   每一层的激活函数皆为 ReLU 函数,   ReLU 函数定义如下:


         如果如果ReLU(x)={x如果x≥0,0如果x<0.


         特别地,我们将 ReLU 函数在 x=0 处的导数值作为 0 来处理.


         小 M 的神经网络固定有 N=2p−1 个节点,   结构固定是一个满二叉树.   输出层只有一个节点,   即为根节点,   根节点编号固定为 1.   对于编号为 k 的神经元,   与神经元输入端相连的节点编号固定为 2k 和 2k+1.


         在针对某一个目的标签为 0 的任务的训练中,   小 W 将损失函数定义为输出本身,   即反向传播的目的便是计算输入层各分量对最终输出值的偏导数.

         依据计算公式,   我们可以发现,   在这个任务中,   对于一个神经元,   其正向传播过程中,   输出 z 关于输入 x 和 w 的函数为:


         z=ReLU(xinid1×Winid1+xinid2×winid2)


         小 M 首先会告诉你一个神经网络的结构和权重,   在网络初始化完成后,   小 M 给你一个向量维度和输入端口数相同的输入向量 v.

         在网络训练中,   会让你完成三种操作,   它们分别是:

         修改输入:   对于输入向量的某一维度 vi 进行修改,   你需要给出神经网络新的输出结果 res,   结果保留一位小数.

         反向传播:   求损失函数对于输入向量的第 i 维度 vi 的偏导数,    结果保留一位小数.

         优化:   小 M 的肉眼优化器发挥作用,   对神经网络第 k 个神经元的所有输入对应的权重都乘以一个系数,   将其更新.

         注意:   优化操作是对真实网络数据完成的更改,   对后续查询有后效性.

第一行输入一个整数 N,   代表神经元节点个数.

         接下来 N 行,   每行 2 个实数,   描述每一个节点两个输入的权重,   分别代表从 2k 号节点和 2k+1 号节点输入的权重.   如果神经元位于输入层,   则权重均为 0.0.   该输入向量的某一维度直接作为输入层结点的输出.

         接下来 N+12 个实数,   分别为初始状态下各维度输入.

         接下来输入一个整数 Q,   代表操作次数.

         接下来 Q 行,    有如下几种操作

         1 x y:   代表将第 x 个维度的输入的值 vx 改为 y,   其中 y 为实数.

         2 x:   代表求输出 z 关于第 x 维度输入 vx 的偏导数 ∂z∂vx.

         3 x k:   代表将编号为 x 的神经元所有权重都乘 k,   其中 k 为实数,   特别地,   该操作保证不对输入层节点进行操作.

    针对每一次 1 或 2 操作,   输出操作的结果.
3
1.0 1.0
0.0 0.0
0.0 0.0
1.0 2.0
4
1 1 3.0
2 1
3 1 -2.0
2 2
5.0
1.0
0.0

样例解释


         对于初始情况,   该网络结构和输入情况如下,   初始输出为 3.0,   此时对于 v1 为 1.0,   v2 为 2.0.   此时 z=1.0×v1+1.0×v2,   输出结果为 3.0,   输出对于 v1 和 v2 的偏导数均为 1.0.



数据规模与约定


         对于 100% 的数据, 1≤N≤106, 1≤Q≤5×105, |w|,|k|,|y|,|vi|≤103.

推荐代码 查看4184 所有题解 上传题解视频得图灵币

本题记录 用 户(点击查看用户) 运行号(点击购买题解) 时 间
算法最快[$2 $ms] 林偶 1195966 2025-06-11 22:28:45
内存最少[$2216 $KB] s777 1195950 2025-06-11 16:21:40
第一AC s777 1195901 2025-06-08 14:33:34
第一挑战 s777 1195901 2025-06-08 14:33:34

赛题来源/所属竞赛 2025安徽省大学生程序设计大赛 N/A

竞赛编号 竞赛名称 竞赛时间 访问比赛