Git 如何在版本控制系统中使用随机数组织代码进行分析?

Git 如何在版本控制系统中使用随机数组织代码进行分析?,git,random,version-control,Git,Random,Version Control,这主要是一个关于VCS(如git)中文件组织的问题,但为了更好地了解我的问题,这里简要介绍一下主题: 项目概述 我正在从事一个项目,在这个项目中,类似神经网络的概率模型被实现,并针对不同的参数集进行测试。目前我们正在用Python实现,尽管这个问题可能也与不同的编程语言有关。结果通常是误差测量或图表或类似的东西。目前,我们的项目如下: 有几个人正在开发项目的代码库,并正在实现新特性 其他一些人已经在尝试探索不同参数集的模型行为,即找出模型在哪些参数范围内表现出定性不同的行为 目前,我们使用g

这主要是一个关于VCS(如git)中文件组织的问题,但为了更好地了解我的问题,这里简要介绍一下主题:

项目概述 我正在从事一个项目,在这个项目中,类似神经网络的概率模型被实现,并针对不同的参数集进行测试。目前我们正在用Python实现,尽管这个问题可能也与不同的编程语言有关。结果通常是误差测量或图表或类似的东西。目前,我们的项目如下:

  • 有几个人正在开发项目的代码库,并正在实现新特性

  • 其他一些人已经在尝试探索不同参数集的模型行为,即找出模型在哪些参数范围内表现出定性不同的行为

目前,我们使用git with GitHub作为VCS,其中一个主分支用于当前的稳定版本,另一个分支用于我们团队的每个成员进行积极的开发。我们通过在分支之间合并和合并来交换代码,以掌握任何看似稳定的新特性

总的来说,一个大问题是,这是一个没有明确项目大纲的研究项目。有时,我们会特别修复一些bug,或者实现一些与功能分支相关的计划。但有时还不清楚,下一个功能究竟是什么,或者是否有可能实现我们的想法。我们中的一些人基本上是以或多或少结构化的方式探索模型的行为。我知道。但事实就是这样

控制概率行为 我们的模型在许多层面上都是概率的。使用随机数初始化各个部分,并且在模型仿真运行时也使用随机数

当然,探索概率模型的最佳方法是让它运行多次并对结果进行统计分析。现在,无论是出于演示目的还是为了更深入地探索某些特定行为,您都希望案例是可复制的。目前,我们通过在开始时设置随机数生成器的种子来实现这一点,就像在numpy for python中使用

将numpy导入为np
np.随机种子(42)
a=np.random.rand()#->将始终为0.37454011188473625
b=np.random.rand()#->将始终为0.9507143064099162
版本控制问题 我们发现当前设置存在两个问题:

1)如何存储特定行为的快照以供以后探索?

为了恰当地标记快照,我们考虑在特定实验中使用分支和标记,并找到了一组参数,如下所示:

* master
|
*---------------
|\              \
* * experiment1  * experiment2
| |              |
. * tag setting1 * tag setting1
. |              |
. * tag setting2 * tag setting2
这里的问题是,据我们所知,带有标记的提交并不意味着以后要更改。由于我们以后可能会处理这些设置,因此必须再次从特定标记进行分支

另一种方法是只使用分支,每找到一个设置一个分支,这样每个分支头对应系统的一个工作状态。但这将导致我们确定的所有这些东西的大量分支

那么,你将如何组织这样一个结构?特别是考虑到以下问题:

2)如何在不改变概率行为的情况下将更改合并到存储的快照中

假设我们的一个开发人员在到目前为止的实现中发现了一个bug,或者实现了一个非常有用的特性并在主分支中修复了它。现在,将这些更改用于以后对模型的一个已识别行为的分析可能非常有益。问题是,如果更改使用随机数,则合并后模型的行为可能会完全不同

将numpy导入为np
np.随机种子(42)
a=np.random.rand()#->将始终为0.37454011188473625
#在这里修理一些东西
c=np.random.rand()
#->将为0.9507143064099162,与之前的“b”相同
b=np.random.rand()
#->现在将是0.7319939418114051,不再是0.9507143064099162
# ...
#使用“b”的代码将表现出不同的行为
这确实是一个大问题,因为这意味着:

  • 要么我们不能(或者只有在不改变随机数的情况下)使用新功能,要么应用错误修复来分析已经确定的有趣的参数集和随机条件

  • 或者,在每次使用随机数的更改之后,我们必须一次又一次地识别这些设置

当然,对于这里显示的代码来说,问题仍然很简单,只涉及几个随机调用。但是在我们的模型中,随机数会被生成很多次,并且迭代的次数通常会再次受到其他随机数的计算结果的影响


您对这个问题有什么建议吗?

下面是我们如何处理此类开发和实验工作流的

单独的代码和实验 真的,这是最重要的事情要记住。 这就像设计糟糕的计算机模拟,模拟模型和模拟算法完全交织在一起。由于许多原因,将模型和代码分离是非常重要的

同样,将项目分为:

  • 一个用于核心算法实际代码开发的存储库

  • 每个模型一个存储库

    当然,模型可能包含特定于模型的代码,例如如何在ANN中设置神经元以及解析训练数据的代码等

  • 每个实验一个存储库

    实验就是你用一个明确的科学问题进行的每一次分析,比如“优化x如何影响分类精度?”。 有这样清晰的研究q
    X-<date>-<title>/   # repository for experiment
    |___ models/
    |    |___ M1/       # submodule for M1's repository
    |    |___ M2/       # submodule for M2's repository
    |    |
    |     ...
    |___ code/          # submodule for your core algorithms
    |___ data/          # a copy or link to your data sets
    |___ experiment1.sh # script to run your experiment
    |___ experiment2.sh # possibly some more sub-experiments