Tensorflow(或Pytorch?),其成本函数是根据Monte Carlo采样定义的(成本函数在每个时期都会改变)

时间:2019-03-03 01:31:49

标签: tensorflow math physics pytorch mathematical-optimization

编辑:我本质上已经将其重写为(希望)更加清晰和简洁。这是新版本,然后是原始版本。


我目前正在使用TensorFlow来解决物理优化问题(物理细节/背景基本上无关紧要,不过如果您有兴趣并了解专业术语,请参阅下文)。实际上,这与机器学习无关。我只是使用TF进行自动区分。

因此,可以说,用损失函数L(x 1 ,x 2 ,...,x N sub> 1 ,x 2 ,...,x N )。我的问题是L(x 1 ,x 2 ,...,x N )无法精确有效地计算;但是,可以通过采样来近似。也就是说,L(x 1 ,x 2 ,...,x N )几乎等于:

l(x 1 ,x 2 ,...,x N )=Σ i λ i (x 1 ,x 2 ,...,x N

其中每个λ i 可以得到有效计算。但是,每个λ i 的形式都取决于x 1 ,x 2 ,...,x的当前值。 N 。也就是说,采样不是“随机”的,而是根据参数的当前值以受控方式进行的。

对于优化问题,其想法是使用l代替L作为成本函数。复杂的是,l每次迭代都会更改(或ML术语中的“ epoch”)。因此,算法为:

在每个时期:

  1. 从l = 0开始; l作为x k 的函数的形式在这一点上是未知的

  2. 确定λ 1 的形式。然后评估λ 1 (并自动计算∂λ 1 /∂x k

  3. 在定义和评估l的过程中对i求和(并自动∂l/∂x k )。

  4. 根据导数> l i /∂x更新x 1 ,...,x N k

我不确定如何在TensorFlow中处理此问题,因为“ if”语句不起作用。我知道有TensorFlow条件语句(tf.cond),但是我遇到了各种各样的问题,我甚至不确定这是否是使用tf.cond的正确位置。 PyTorch会更好吗?

[在物理学背景上:我正在寻找量子自旋系统的基态;损失函数是能量,我正在使用变分蒙特卡罗方法进行计算。我所谓的λ i 是某种自旋结构的局部能量。然后翻转随机自旋,并以概率=波函数振幅的比率接受此新的自旋配置。 λ i + 1 是新自旋结构的局部能量,依此类推。]


原始版本: 基本上,问题是我的损失函数不是严格定义的,而是每次迭代都会更改。

这是怎么产生的: 假设我要优化的变量是x 1 ,x 2 ,...,x N ,损失函数是L(x 1 ,x 2 ,...,x N )。在我正在处理的问题中,要精确计算L(x 1 ,x 2 ,...,x N )会涉及做一个很大的和,所以唯一的方法是通过以下方法计算L(x 1 ,x 2 ,...,x N )蒙特卡洛采样方法。具体来说,该方法是马尔可夫链蒙特卡罗方法(即顺序采样)。

实际上,我的情况基本上是:

使用采样方法,我有类似L(x 1 ,...,x N )= L 1 (x i 1 1 ,...,x i 1 n )+ L 2 (x i 2 1 ,...,x i 2 n )+ ... + L M (x i M 1 ,...,x i M n )。重要的是,函数L 1 ,L 2 ,...并不是一成不变的(既从功能形式上,又从哪个子集上它们所依赖的变量)。为了计算L,一个拳头从L 1 开始(基本上,设置了L k 的一般形式,但保留了一些自由参数。通常,我们以“随机” L 1 )。然后,我们通过随机生成其中的自由参数来生成L 2 “候选”。然后根据x 1 ... N 变量的一些量的值来接受或拒绝该变量。一旦找到L 2 ,就对其求值并添加到总L中,然后我们移至L 3 ,依此类推。为了再次计算L,重复整个过程。

为了优化,整个过程在每个迭代(或ML术语中的“ epoch”)中重复进行。即使L的精确功能形式在每个时期之间都不同,对于x 1 ,...,x N 的任何给定值,L(x < sub> 1 ,...,x N )定义得很好(在近似的精度范围内),因此优化仍应收敛。

问题是:在TensorFlow中可以做到这一点吗?使用if语句编写常规Python代码来评估L(x 1 ,...,x N )很容易,但这并不能很好地转化为TensorFlow 。 PyTorch会更好吗?

1 个答案:

答案 0 :(得分:0)

首先,可以通过pyMC3tensorflow-probability之类的库使用MCMC。出色的Probabilistic Programming and Bayesian Methods for Hackers中提供了两个框架的动手示例。

关于您的实际计算,我不确定是否遵循。通常,通过随机采样进行的反向传播有两种主要方式:路径导数和得分函数。尽管您也许可以找到更好的资源,但两者都在PyTorch documentation中进行了简要描述。由于路径空间的大小,我认为您的问题不适合使用逐阶导数,而且不确定分数函数是否也可以工作。

一个期望值最大化的方法是一个可能可行的想法,但如果没有其他知识我就无法判断。以下是否可能解决您的问题?

  1. 从您的马尔可夫链[S1, ..., SN]中提取N个样本(期望)
  2. 计算损失L(S1) + ... + L(SN),对其进行最小化(最小化)
  3. 重复