【发布时间】:2022-01-23 22:36:05
【问题描述】:
我有一个没有标签的数据集,但我确实有办法获得具有相反标签的示例对,即给定一对 x,z 我知道它们的真实标签是 0,1 或 1,0 .
因此,我正在构建一个模型,该模型接受成对的样本作为输入,并学习用相反的标签对它们进行分类。假设我有一个用于预测单个样本y_hat = f(x) 的任意模型,我正在使用 Keras 构建一个模型,该模型接受样本对 (x,z) 并输出预测对 f(x), f(z)。然后我使用自定义损失函数将模型推向正确的方向:鉴于使用二元交叉熵 (BCE) 训练常规二元分类器以使预测和期望的输出“接近”,我使用 negative 公元前。此外,由于 BCE 不是对称的,因此我将其对称化。所以,我给model.compile方法的损失函数是:
from tensorflow import keras
bce = keras.losses.BinaryCrossentropy()
def neg_sym_bce(y1, y2):
return (- 0.5 * (bce(y1, y2) + bce(y2, y1)))
我的问题是,这个模型甚至无法学习对我的一对单个数据进行分类(我得到f(x)~=f(z)~=0.5),如果我尝试用合成的“简单”数据训练它,需要数百个 epoch 才能收敛(也在一对上)。
这让我怀疑它与“梯度消失”问题有关。实际上,当我绘制(见下文)单对的损失时,它是 2 个变量(2 个输出)的函数,很明显在 0.5, 0.5 点周围有一个很宽的平台。同样明显的是,正如预期的那样,全球最小值在点 0,1 和 1,0 附近。
那么,有没有办法在这里处理消失的梯度?我读到了这个问题,但我发现的参考文献处理的是网络中的梯度消失,而不是损失本身。
或者,是否还有其他损失可以驱动模型预测相反的标签?
【问题讨论】:
-
什么是 (0, 1) 和 (1,0)?这些看起来像是两个不同的标签,实际上是“0”和“1”。
-
@AndrewHolmgren 这是简写符号,我的意思是对于输入对
x_1和x_2,我不知道标签y_1和y_2但我知道 @987654339 @ -
同样,您是否知道 y_1 == y_2?如果是这样,您可能想要使用对比损失。
-
@AndrewHolmgren,不,我没有相同标签的配对。
-
实际上,我可以使用
y_1==y_2访问一个小型数据集(以及一个不同类型的大型数据集),所以我将看看这个损失。谢谢。
标签: tensorflow keras deep-learning loss-function gradient-descent