我目前正在进行高能物理方面的研究,并希望在使用这些粒子进行计算之前,实现一个神经网络来确定应用于粒子的最佳“运动学切割”。
目前,我正在使用蒙特卡罗模拟产生1e5粒子事件。事件被定义为两个质子与E_cm = 13 TeV碰撞。当这些质子碰撞时,它们会混沌地产生许多其他粒子,有些是稳定的,有些则不是。通过蒙特卡罗模拟,我能够确保在任何情况下,一个特定的粒子衰变发生。这种衰变的产物是我想研究的。
通过每个事件中大量的粒子列表,我的目标是可靠地收集这些特定的粒子。由于数据不明确(没有“确定”的方法知道哪些粒子实际上来自衰变),所以我们采用运动学的方法来帮助排除更多不可能的候选粒子。在一种情况下,我正在研究的粒子的横向动量( pT )往往高于其他粒子,因此忽略pT低于某一阈值的粒子是有帮助的:一个粒子的pT必须大于(例如)2 GeV才能计算。所以“pT运动学切割”是2 GeV。这些运动学切割可以被认为是过滤器!任何带有pT <= 2的粒子都不会通过这个过滤器。
这带来了一个问题!如果我们使用更具侵略性的过滤器。粒子必须有pT >5 GeV),我们的输出计算更精确和准确!但是,许多事件将有正确的粒子不能通过过滤器。这样的事件将会丢失,因此我们失去了选择效率。另一方面,一个不那么激进的过滤器。粒子必须有pT >1 GeV)让如此多的背景粒子,以至于许多错误的组合最终被收集。
现在,我想实现一个神经网络,测试这些运动学割集的不同值,以便优化计算的精度和精度以及选择效率。
我使用的是C++、Pythia8,我的代码完全依赖于std::vector::tuple。通常排序vector>
我试过openNN,但它根本行不通。一个程序,允许我输入我的代码与调整和期望的输出将是理想的。
发布于 2023-01-23 13:38:59
很抱歉,如果我误解了你的问题,但听起来你是在寻找软件来优化单个参数,pT运动学阈值。
神经网络不是优化单个参数的好工具。神经网络(尤其是深度学习系统)从它们密集的层中获得能量,将许多输入神经元与许多输出神经元连接起来,从而使它们产生任意形状近似函数。对于一个单一的输入神经元,没有什么可做的,不能用更简单的方法完成。此外,神经网络在开始给出好的预测之前,需要接受很多已知的例子(参数集给出了精度)来进行训练。即使在你训练了神经网络之后,你仍然需要从神经网络对给定参数集的精度和精度的预测中得到最优的参数集值,对此你可能仍然需要使用一种优化方法。
一维优化可以通过二进制搜索、黄金分割搜索、逐次抛物插值、方法的组合来进行,甚至可以通过在常规网格上最小化的函数进行评估(当函数有噪声和/或包含大量局部极小值时,这可能会有所帮助)。
执行此优化的简单方法之一是从C++中键入数字规则书,第10.2至10.4章代码。GSL (一个C库,可从C++获得)也有现成的优化器可用。
多变量函数的优化(最大化precision(pT, ...)或accuracy(pT, ...))是一个更复杂的问题。许多优化方法都需要良好的梯度来确定最优的步长方向。有些需要二阶导数(Hessian矩阵)来确定步长的大小。从C++中可以使用的一个很好的优化方法集合是NLopt库。我在CRS2算法中取得了很好的效果,它是无梯度的,但是您可能会在其他方面更成功。
我假设您的函数没有解析导数,但是您可以尝试数值微分(计算这样的梯度所需的时间与参数的数目成正比)或自动微分(另请参阅:谷神星求解器,它使用C++模板处理对偶数)。
https://softwarerecs.stackexchange.com/questions/85011
复制相似问题