张量表达式编译与 r-softmax:提升深度学习效率与性能
1. 张量表达式编译为 Einsum
1.1 编译任务与表达式树
将符合特定语法的表达式编译为可高效计算的 Einsum 表达式是一项重要任务。以 Tucker 分解为例,其表达式树包含不同类型的节点,如粗体节点表示求和操作,虚线矩形节点表示索引,其他节点为常见操作或张量。编译所需的信息可从表达式树中获取,编译过程采用递归方式,将节点标签映射到相应的库函数,再处理子节点。
1.2 编译的特殊情况
编译过程中有两种特殊情况:
- 求和节点 :若子节点为乘法节点,可将求和与乘法合并为一个操作。例如,对于 sum[l,m,n](Z[l,m,n]*B[l,i]*C[m,j]*D[n,k]) ,可编译为 einsum('lmn ,li ,mj ,nk ->ijk ', Z, B, C, D) ,比分别编译求和与乘法更简洁易读。
- 二元操作节点 :两个操作数张量的维度必须相等,因为二元操作是逐点操作,仅适用于形状相同的张量。若维度不同,可通过检查子节点维度来验证匹配条件,若维度不同,可使用额外的全 1 张量扩展缺失维度。例如,将维度 lmn 添加到节点 A 可通过 einsum('ijk ,lmn ->ijklmn ', A, ones(L, M, N)) 实现,此变换不改变表达式的值。
超级会员免费看
订阅专栏 解锁全文
840

被折叠的 条评论
为什么被折叠?



