
Celu算子【免费下载链接】cann-ops-competitions本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。项目地址: https://gitcode.com/cann/cann-ops-competitions难度系数1.0一、赛题背景CeluContinuously-differentiable Exponential Linear Unit是深度学习中一种连续可微的激活函数是ELU的改进变体。相比ELU在零点处的不可导性Celu在整个定义域上保持连续可导梯度更加平滑有利于优化过程的稳定性广泛应用于对梯度连续性有严格要求的深度学习模型训练场景。本题要求基于PyTorch原生torch.nn.functional.celu算子的核心业务逻辑采用Ascend C编程语言进行算子原生开发在昇腾NPU硬件上实现一款高性能、高兼容性、高适配性的Celu算子。相似类型算子的实现可参考开源仓https://gitcode.com/cann/ops-mathhttps://gitcode.com/cann/ops-nnhttps://gitcode.com/cann/ops-cvhttps://gitcode.com/cann/ops-transformerhttps://gitcode.com/cann/cann-samples二、算子功能描述实现的Celu算子需对输入多维张量的每个元素执行连续可微指数线性单元激活操作返回与输入形状相同的结果张量。算子支持通过alpha参数控制负值区间的饱和程度为逐元素计算输出形状与输入形状完全一致且需兼容非32整倍数的维度非对齐场景。三、核心定义与约束3.1 参考算子PyTorch原生算子torch.nn.functional.celu算子行为、计算结果需与该算子完全对齐3.2 数学公式$$ \text{celu}(x) \max(0, x) \min(0, \alpha \times (\exp(x / \alpha) - 1)) $$其中 αalpha为可配置参数默认值为1.0。3.3 输入输出与属性总览类型参数名类型维度形状支持数据类型数据格式备注INPUT(必选)selftensor(..., N4, N3, N2, N)float32ND输入张量ATTR(属性)alphafloat--ND控制负值区间饱和程度的参数默认值为1.0OUTPUT(输出)outtensor(..., N4, N3, N2, N)float32ND激活后的结果张量形状与输入一致3.4 关键输入约束维度取值范围(均为正整数):N ∈ [1, 10000]N2 ∈ [1, 10000]N3 ∈ [1, 1000]N4 ∈ [1, 1000]输入为任意多维张量最终维度可拆解为(..., N4, N3, N2, N)前序...为任意合法批次维度shape支持0-8维非对齐场景兼容: N、N2、N3、N4 均可能为非32的整倍数算子需适配内存/数据非32字节对齐的场景数值取值约束: 输入张量的数值取值范围不超出float32数据类型的原生表达范围3.5 核心属性说明alphafloat默认1.0: 控制负值区间的指数饱和速率。alpha值越大负值区间的过渡越平缓alpha值越小负值区间的过渡越陡峭。alpha必须为正数。3.6 输出严格要求形状约束: 输出形状与输入形状完全一致类型约束: 输出数据类型为float32数值含义: 输出张量中每个位置的值为输入张量对应位置元素经Celu激活函数计算后的结果精度要求: 要求与torch.nn.functional.celu标杆精度误差满足浮点数精度要求相对误差不超过1e-5或绝对误差不超过1e-63.7 特殊值处理规则NaN处理: 如果输入包含NaN输出对应位置为NaNInf处理:输入为Inf时输出为Inf正值区域直接输出输入为-Inf时输出为 α × (exp(-Inf/α) - 1) α × (0 - 1) -α零值处理:输入为0时输出为 max(0, 0) min(0, α × (exp(0) - 1)) 0 0 0alpha为0的处理: alpha必须为正数不应出现alpha0的情况若alpha趋近于0需保证数值稳定性四、规则要求逐元素计算规则: 对输入张量的每个元素独立执行Celu激活函数计算元素之间无依赖关系形状不变规则: 输出张量形状与输入张量形状完全一致不改变维度信息alpha参数规则: alpha为正浮点数计算公式中需使用x/α作为指数函数的输入α控制负值区间的缩放比例指数函数精度规则: 对exp(x/α)的计算需保证数值稳定性当x/α为较大负数时exp(x/α)趋近于0不应产生数值异常连续可微规则: Celu在x0处必须保持连续且可微即celu(0)0左导数与右导数在零点连续五、示例说明示例1: 一维张量基础计算alpha1.0输入self: tensor([-1.0, 0.0, 1.0, 2.0]), dtypefloat32, shape[4] (N4)属性配置: alpha1.0输出out: tensor([-0.6321, 0.0, 1.0, 2.0]), dtypefloat32, shape[4]结果解释:celu(-1.0) 0 1.0 × (exp(-1.0) - 1) ≈ 0 (0.3679 - 1) ≈ -0.6321celu(0.0) 0 0 0.0celu(1.0) 1.0 0 1.0celu(2.0) 2.0 0 2.0示例2: 二维张量计算alpha2.0输入self: tensor([[0.5, -0.5], [1.5, -1.5]]), dtypefloat32, shape[2, 2] (N22, N2)属性配置: alpha2.0输出out: tensor([[0.5, -0.3935], [1.5, -0.7769]]), dtypefloat32, shape[2, 2]结果解释:celu(-0.5, α2.0) 0 2.0 × (exp(-0.5/2.0) - 1) 2.0 × (exp(-0.25) - 1) ≈ -0.3935celu(-1.5, α2.0) 0 2.0 × (exp(-1.5/2.0) - 1) 2.0 × (exp(-0.75) - 1) ≈ -0.7769示例3: 不同alpha值对比输入self: tensor([-2.0]), dtypefloat32, shape[1] (N1)属性配置: alpha0.5输出out: tensor([-0.4323]), dtypefloat32, shape[1]结果解释: celu(-2.0, α0.5) 0 0.5 × (exp(-2.0/0.5) - 1) 0.5 × (exp(-4.0) - 1) ≈ -0.4323示例4: 特殊值处理输入self: tensor([inf, -inf, nan]), dtypefloat32, shape[3] (N3)属性配置: alpha1.0输出out: tensor([inf, -1.0, nan]), dtypefloat32, shape[3]结果解释: Inf输出Inf-Inf输出α×(0-1)-1.0NaN输出NaN六、测试用例覆盖范围数据类型覆盖: float32维度场景覆盖:0维标量场景1维、2维、3维、4维(N4,N3,N2,N)、含批次维度的多维场景(..., N4,N3,N2,N)N~N4 为非32整倍数的非对齐场景数值场景覆盖:正数区间x 0线性区域负数区间x 0指数区域零点附近x ≈ 0连续性验证极大正值、极小负值属性组合覆盖:alpha1.0默认值alpha 1.0如0.5、0.1alpha 1.0如2.0、5.0特殊值场景覆盖:NaN值Inf、-Inf零值【免费下载链接】cann-ops-competitions本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。项目地址: https://gitcode.com/cann/cann-ops-competitions创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考