返回列表

13th Place Solution: plain machine learning.

524. G2Net Detecting Continuous Gravitational Waves | g2net-detecting-continuous-gravitational-waves

开始: 2022-10-04 结束: 2023-01-03 物理与天文 数据算法赛
第13名方案:纯机器学习方法

第13名方案:纯机器学习方法

作者:assign (Master) | 比赛排名:13th

摘要

  • 数据集
  • 归一化
  • PyFstat 数据生成 / 参数范围
  • 大卷积核与 FFT
  • 使用 EMA 进行更多训练
  • 其他

数据集

  • test/:用于训练期间的数据增强(最终未应用)
  • train/:验证数据
  • 从 PyFstat 生成:用于训练的数据

归一化

from scipy.stats import norm
def Fnormalize(X):
    X /= X.sum(-2, keepdims=True)
    return X
def Pnormalize(X):
    n = np.prod(X.shape[-2:])
    POS = min(int(n * 0.999), n - 10)
    EXP = norm.ppf((POS + 1 - np.pi / 8) / (n - np.pi / 4 + 1))
    scale = np.partition(X.flatten(), POS, -1)[POS]
    X /= scale / EXP.astype(scale.dtype) ** 2
    return X
def normalize(X):
    X = (X[..., None].view(X.real.dtype) ** 2).sum(-1)
    X = Fnormalize(X)
    X = Pnormalize(X)
    return X

这种数据归一化有着简单的理论背景。
Fnormalize:将复数输入转换为元素实部和虚部平方之和,将输入转换为 chi2 分布。
Pnormalize:进行缩放,使得正态分布中第 POS 大的数的平方等于数据中第 POS 大的数。
针对 chi2 分布来解释 Pnormalize 可能是个好主意,但由于该函数仅对输入进行缩放,我认为你会获得相似的性能。
在同一模型中,通过改变推理步骤的归一化技术,性能得到了提升。

Private Public
仅 Pnormalize 0.766 0.739
Fnormalize + Pnormalize 0.770 0.751

PyFstat 数据生成 / 参数范围

在实现数据集采样代码之前,我阅读了 PyFstat 库代码并追踪了参数范围。然而,没有找到 psiphi 的范围。
令人惊讶的是,在比赛结束前 5 天,我才在这里发现了正确的范围,模型性能随之提升。

设置 1(Gen1):

tstart: [630720013, 1861492413)
F0: [45, 600)
F1: 10 ^ truncnorm.isf(rng.uniform(), a=-100, b=3, loc=-15, scale=2)
Alpha: [0, 2pi)
Delta: [-pi/2, pi/2)
cosi: [-1, 1)
psi: [-1, 1)
phi: [-1, 1)
Tsft: 1800
SFTWindowType: "tukey"
SFTWindowBeta: 0.0001

设置 2(Gen2):

tstart: [630720013, 1861492413)
F0: [45, 600)
F1: 10 ^ truncnorm.isf(rng.uniform(), a=-100, b=3, loc=-15, scale=2)
Alpha: [0, 2pi)
Delta: [-pi/2, pi/2)
cosi: [-1, 1)
psi: [-pi/4, pi/4)
phi: [0, 2pi)
Tsft: 1800
SFTWindowType: "tukey"
SFTWindowBeta: 0.0001
验证集 ROCAUC Private Public
exp/v0.2-1229-1 最佳验证 (Gen1) 0.8569 0.761 0.747
exp/v0.2-1229-1 最后一个 epoch (Gen1) 0.7278
exp/v0.2-1230-2