如何在张量流中添加约束以确保权重尽可能接近 0?

问题描述

假设我们有一个具有 4 Dense 层的简单神经网络,Lin -> L1 -> L2 -> Lout;假设 L2 = matrix[1x5] 并且这 5 个值可以表示为 [a1,a2,a3,a4,a5];当我们训练模型时,我们知道有很多 [a1,a5] 组满足数据,例如 [1,2,3,4,5] [1,5,5] [0,15,0] [0,0];

我的问题是如何向层权重添加约束,以便我们可以确保它们中的大多数为 0。例如,4组L2权重[1,0],其中第3和第4个有4个零;并且 5

我们知道 TensorFlow Keras 具有以下功能https://keras.io/api/layers/constraints/

但是我的问题没有内置约束。关于如何编写这样的约束的任何想法,或者可能有另一种方法来做到这一点?

更具体地说,我们有很多向量,我们想要对向量进行分类,我们想要一个层来识别哪些列是重要的(但我们不知道确切的列,比如词嵌入,我们需要将一个词转换为向量;这里我们需要将向量转换为重要性位掩码,然后进行进一步处理),我们可以删除其他列。例如,我们有特征 [x1,x2,x3,x4,x5] 并且我们得到 L2 [0,0],那么我们可以说,第 4 列很重要,因此我们可以将特征向量转换为 [0,5 * x4,0]

提前谢谢。

解决方法

这样我们就可以确保它们中的大多数都是 0

如果对 0 的数量没有严格要求(正如您在单列示例中所建议的那样),您正在寻找 Lasso regression(所谓的 L1 正则化),简单地说,就是惩罚每个权重的大小。只有在对推理绝对至关重要的情况下,权重才会很大。

在 tensorflow 2.x 中,这可以通过 kernel regularizer 完成。现在,这会强制使权重变小,但并不能保证权重为 0。此外,如果滥用会严重影响性能。

附带说明,您可能尝试解决的问题与机器学习的可解释性/可解释性有关,虽然您的方法很有趣,但可能值得研究一下单独构建的方法/模型为此目的(有些模型能够产生特征意义等)

,

您可以使用 L1 和 L2 损失。 具有 L1 损失的权重变得稀疏。许多元素将为 0。具有 L2 损失的权重没有很多零,但 L2 范数很小。