交易中的神经网络:双曲型潜在扩散模型(HypDiff)(基础篇)
◍ 用双曲空间装下行情的隐变量
传统扩散模型把价格序列的隐变量摊在平面欧氏空间里,遇到高波动的多尺度结构容易把长程依赖抹平。HypDiff 改走双曲流形,曲率为负的空间对树状、分形式的行情层级更友好,隐变量在低维双曲坐标里就能拉开不同周期状态的距离。 在 MT5 里跑这套,核心是把扩散前向过程的状态映射从线性仿射换成指数映射(exp map)。下面这段是双曲潜在空间里做一步噪声注入的精简写法,注意它和普通扩散的区别在最后一行的曲率项。 外汇与贵金属属高风险品种,模型输出只代表状态演化的概率倾向,不构成方向承诺。
class="type">class="kw">double HypMap(class="type">class="kw">double x[], class="type">class="kw">double c) { class="type">class="kw">double nx = class="num">0; for(class="type">int i=class="num">0;i<ArraySize(x);i++) nx += x[i]*x[i]; class="type">class="kw">double denom = class="num">1 + c*nx/class="num">4; class="type">class="kw">double k = class="num">2*x/denom; class="kw">return k; }
「非欧图结构里扩散模型的两条死路」
把扩散模型直接搬去生成图结构,先撞上的是计算复杂度。图本质是离散、稀疏、非欧几里德拓扑,普通扩散用的高斯噪声扰动对离散数据并不友好;为了凑出完全连接的噪声图,模型被迫走连续高斯过程,结构信息和背后的拓扑特性大概率在这一步就丢了。 另一个坑是非欧几里德各向异性。节点嵌入在连续潜在空间里沿特定方向拉扯,映射到欧氏空间后这种方向性很明显;而潜在空间里的各向同性扩散,会把各向异性结构当成噪声洗掉,去噪阶段也就无从恢复。 双曲几何给了一条岔路:它本来就是表征树状、分层离散结构的连续流形。在双曲空间里,节点嵌入全局接近各向同性,局部又留住各向异性,极坐标里角度和径向测量还能统一,等于给了潜在空间一个带物理语义的几何先验。 顺着这个思路,HypDiff 做了两件事:用基于径向量值的扩散过程补上双曲空间里高斯分布可加性未定义的问题;再上角度约束压住各向异性噪声,让结构先验不被洗掉,生成的图拓扑完整性倾向更好。外汇与贵金属相关的图神经网络研究属高风险实验,结论仅作技术参考。
双曲潜在扩散怎么绕开图生成的拓扑塌陷
HypDiff 把图数据 𝒢=(X, A) 先塞进低维双曲空间,再做潜在扩散,核心动机是欧氏扩散在图上信噪比掉得太快——各向同性噪声一加进去,拓扑信息几天就糊了。它用双曲自动编码器拿预训练节点嵌入:编码器走 HGCN 映射到双曲流形 ℍᵈ,费米-狄拉克解码器再还原回图域,指数/对数映射在流形和切空间之间来回倒。 双曲空间里高斯分布不可加,直接套黎曼正态或包裹正态会崩,所以作者改在多个流形乘积空间里扩散,并用切平面 𝒯μ 上的高斯去近似。更麻烦的是莫比乌斯加法替代了线性加法,各向同性噪声会迅速压低信噪比,这正是标准扩散在图上任不住的根因。 解法是一套双曲各向异性扩散:先用任意相似度聚类把节点分堆,聚类数 k∈[1,n] 决定把双曲空间切成几个扇区;每个簇投影到自己质心 Oi 的切平面 𝒯oi 上扩散,等效于 Klein 模型 𝕂c,n 里多曲率 Ci 的近似。k 取值不同,扇区粒度和噪声注入灵活度就变,训练和去噪效率跟着走。 前向扩散以簇质心到北极 O 的测地线为主方向,靠几何约束拽着走;反向用基于 UNet 的 DDM 预测 X0。作者验证过采样能在单一切线空间联合跑,不用跨多个质心切空间,MT5 之外跑图生成实验时可重点看这块提速比。外汇贵金属行情图若想借这类层次结构做形态抽象,双曲嵌入的高风险在于曲率参数敏感,调错 k 可能把结构噪声当信号。
◍ 把 HypDiff 塞进 OpenCL 内核
双曲扩散(HypDiff)的思路并不停留在论文里,落地时第一刀就砍在 OpenCL 程序上。先把输入序列投到洛伦兹模型的双曲空间,HyperProjection 内核接收序列指针和结果指针,第一维是序列长度、第二维是特征向量大小,且每个元素特征向量会多带一个附加分量。 工作组线程先把全局缓冲载入局部数组并算二次值,再累加平方值得向量范数——但只取第一个元素当双曲坐标,其余平移。开方时显式限定大于零,避免运行时非法值。反向传播的 HyperProjectionGrad 内核新增 inputs_gr 与 outputs_gr 缓冲,位置静态不可训,其余梯度按特征分量比例回传。 作者原框架先对序列预聚类再投切平面,这里故意不分组,把每个元素投到全部质心切平面,操作量上升但序列信息更密。LogMap 内核吃 7 个指针(features、centroids、curvatures、outputs + 3 个中间缓冲),用闵可夫斯基乘积替代欧氏乘法,首元素取逆符号。 LogMapGrad 反向内核再加 4 个梯度缓冲,质心梯度需汇全部序列元素。局部数组同步阻碍反复出现,虽冗长但保线程正确。完整源码在附件,主程序端实现留待下一篇拆。 下面这段是前向投影最小可跑内核,注意 LOCAL_ARRAY_SIZE 需在你 clBuild 时以 -D 传入,否则编译失败。
__kernel class="type">void HyperProjection(__global const class="type">class="kw">float *inputs, __global class="type">class="kw">float *outputs ) { const class="type">size_t pos = get_global_id(class="num">0); const class="type">size_t d = get_local_id(class="num">1); const class="type">size_t total = get_global_size(class="num">0); const class="type">size_t dimension = get_local_size(class="num">1); __local class="type">class="kw">float temp[LOCAL_ARRAY_SIZE]; const class="type">int ls = min((class="type">int)dimension, (class="type">int)LOCAL_ARRAY_SIZE); const class="type">int shift_in = pos * dimension + d; const class="type">int shift_out = pos * (dimension + class="num">1) + d + class="num">1; class="type">class="kw">float v = inputs[shift_in]; if(isinf(v) || isnan(v))