有一个实用的解决方案:您可以编写成本函数,将高成本置于负权重上。我在 TensorFlow 中使用 python 的矩阵分解模型中做到了这一点,并且效果很好。正确的?我的意思是这很明显。但是没有其他人提到它,所以你去吧。编辑:我刚刚看到 Mark Borderding 在我之前还提供了另一个基于损失和成本的解决方案实施。
如果想要“最好的方式”,正如 OP 所问的那样,那会怎样?好吧,“最佳”实际上可能是特定于应用程序的,在这种情况下,您需要对数据集尝试几种不同的方法并考虑您的应用程序要求。
这是增加不需要的负解变量成本的工作代码:
cost = tf.reduce_sum(keep_loss) + Lambda * reg # Cost = sum of losses for training set, except missing data.
if prefer_nonneg: # Optionally increase cost for negative values in rhat, if you want that.
negs_indices = tf.where(rhat < tf.constant(0.0))
neg_vals = tf.gather_nd(rhat, negs_indices)
cost += 2. * tf.reduce_sum(tf.abs(neg_vals)) # 2 is a magic number (empirical parameter)
您可以自由使用我的代码,但如果您选择使用它,请给我一些信任。请在 stackoverflow.com 上提供此答案的链接。
这种设计将被视为软约束,因为如果允许,您仍然可以获得负权重,具体取决于您的成本定义。
似乎在 TF v1.4+ 中也可以使用 constraint= 作为 tf.get_variable() 的参数,您可以在其中传递像 tf.clip_by_value 这样的函数。在我看来,这似乎是另一个软约束,而不是硬约束,因为它取决于您的功能是否正常工作。它也可能很慢,因为其他回答者尝试了相同的功能并报告收敛速度很慢,尽管他们没有使用 constraint= 参数来执行此操作。我看不出有什么理由比另一个更快,因为它们都使用相同的裁剪方法。因此,如果您使用约束 = 参数,那么您应该期望在原始海报应用程序的上下文中收敛缓慢。
如果 TF 也为 API 提供真正的硬约束,并让 TF 弄清楚如何实现它并使其在后端高效,那就更好了。我的意思是,我已经在线性规划求解器中看到了这一点很长时间了。应用程序声明一个约束,后端让它发生。