如何使用随机梯度下降学习归一化流

问题描述

我最近致力于实施 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 

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

非常感谢, 克里斯蒂安

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)