1

我最近正在实施如https://arxiv.org/abs/2102.07501中所述的退火流传输方法。在某一时刻,任务是通过使用 SGD 学习归一化流来最小化给定的损失函数。我研究了很多关于这个问题带来的几个主题的论文,但无法弄清楚如何将这些想法联系起来。所以,问题来了:

假设给定分布 p 的样本 (x_1,...,x_N)。我们现在想学习一个规范化流 T,它传输每个粒子,使得 (T(x_1),...,T(x_N)) 是目标分布 q 的适当样本。正如已经提到的来源中所述,这是通过最小化 T(p) 和 q 的 Kullback-Leibler-Divergence 来完成的。由此产生的损失函数(我们想要最小化的那个)被标记为 L 或 L(T)。

作者非常详细地描述了他们的算法,但此时他们只是说“使用 SGD 学习 T 以最小化 L”。

我的意图是使用 TensorFlow 和 Keras,使用 L 作为自定义损失函数,并且 - 正如作者建议的那样 - Adam 优化器,但是,就目前而言,这是我的代码:

def LearnFlow_Test(train_iters, x_train, W_train, x_val, W_val):
    
    # Initialize
    
    identity = lambda x: x # Initialize flow
    flows = np.array(identity)
    
    y_true = np.array([f_target(identity(x)) for x in x_val])
    y_pred = np.array([f_initial(x)/jacobian_det(identity,x) for x in x_val])
        
    val_losses = loss_function(y_true, y_pred)
    
    # Learn
    
    for j in range(train_iters):
        
        # Compute training loss
        
        y_true = np.array([f_target(identity(x)) for x in x_train])
        y_pred = np.array([f_initial(x)/jacobian_det(identity,x) for x in x_train])
        
        train_loss = loss_function(y_true, y_pred)
        
        """        
        Update flow using SGD to minimize train_loss
        minimizing_flow =
        
        """         
        
        # Update list of flows & list of validation losses
        
        flows = np.append(flows, minimizing_flow)
        
        # Compute new validation loss and update the list
        
        y_true = np.array([f_target(minimizing_flow(x)) for x in x_val])
        y_pred = np.array([f_initial(x)/jacobian_det(minimizing_flow,x) for x in x_val])
        
        val_losses = np.append(val_losses,[loss_function(y_true, y_pred)])a
        
        
        
    return flows[np.argmin(val_losses)] # Return flow with the smallest validation error 

我将不胜感激任何建议,因为我对现有代码的搜索没有成功。

非常感谢,克里斯蒂安

4

0 回答 0