--oaa 2 和 --loss_function=logistic 在 Vowpal Wabbit 中的效果

Posted

技术标签:

【中文标题】--oaa 2 和 --loss_function=logistic 在 Vowpal Wabbit 中的效果【英文标题】:Effect of --oaa 2 and --loss_function=logistic in Vowpal Wabbit 【发布时间】:2014-08-31 17:31:36 【问题描述】:

我应该在 VW 中使用哪些参数来执行二元分类任务?例如,让我们使用rcv1_small.dat。我thought 最好使用逻辑损失函数(或铰链),使用--oaa 2 毫无意义。然而,经验结果(在所有 4 个实验中报告了渐进式验证 0/1 损失)表明最佳组合是 --oaa 2 没有逻辑损失(即具有默认平方损失):

cd vowpal_wabbit/test/train-sets

cat rcv1_small.dat | vw --binary
# average loss = 0.0861

cat rcv1_small.dat | vw --binary --loss_function=logistic
# average loss = 0.0909

cat rcv1_small.dat | sed 's/^-1/2/' | vw --oaa 2
# average loss = 0.0857

cat rcv1_small.dat | sed 's/^-1/2/' | vw --oaa 2 --loss_function=logistic
# average loss = 0.0934

我的主要问题是:为什么--oaa 2 没有给出与--binary 完全相同的结果(在上述设置中)

我的第二个问题是:为什么优化逻辑损失并不能改善 0/1 损失(与优化默认平方损失相比)?这是该特定数据集的特定数据吗?

【问题讨论】:

【参考方案1】:

我在使用--csoaa 时遇到过类似的情况。详情请见here。我的猜测是,在 N 个类的多类问题的情况下(无论您将 2 指定为多个类),vw 实际上适用于 N 个特征副本。当对每个可能的类进行预测/学习时,相同的示例会获得不同的 ft_offset 值,并且此偏移量用于散列算法。因此,所有类都从同一数据集的行中获得“独立”的一组特征。当然特征值是相同的,但 vw 不保留值 - 只有特征权重。每个可能的类别的权重都不同。并且由于用于存储这些权重的 RAM 数量是用-b(默认为-b 18)固定的——你有更多的类你有更多的机会得到一个哈希冲突。您可以尝试增加-b 值并检查--oaa 2--binary 结果之间的差异是否正在减小。但我可能错了,因为我没有深入了解大众代码。

至于损失函数 - 您无法直接比较平方(默认)和逻辑损失函数的平均损失值。您应该从使用平方损失获得的结果中获得原始预测值,并根据逻辑损失获得这些预测的损失。该函数将是:log(1 + exp(-label * prediction) 其中标签是先验已知答案。在 vw 中实现的所有损失函数的此类函数 (float getLoss(float prediction, float label)) 可以在 loss_functions.cc 中找到。或者您可以使用1.f / (1.f + exp(- prediction) 将原始预测值初步缩放到 [0..1],然后按照kaggle.com 中的描述计算日志损失:

double val = 1.f / (1.f + exp(- prediction); // y = f(x) -> [0, 1]
if (val < 1e-15) val = 1e-15;
if (val > (1.0 - 1e-15)) val = 1.0 - 1e-15;
float xx = (label < 0)?0:1; // label -1,1 -> 0,1
double loss = xx*log(val) + (1.0 - xx) * log(1.0 - val);
loss *= -1;

您还可以使用“/vowpal_wabbit/utl/logistic”脚本或--link=logistic 参数将原始预测缩放到[0..1]。两者都使用1/(1+exp(-i))

【讨论】:

谢谢,您对我的主要问题的回答似乎是正确的。将-b 28 添加到上面的示例中,结果 squared=0.0856,logistic=0.0909,oaa_squared=0.0855,oaa_logistic=0.0909。有趣的是,由于哈希冲突(使用默认值 -b 18),oaa(具有两倍的特征)有时(平方)更好,有时(逻辑)更差。 直到我猜下面。由于损失函数不仅定义了损失值,而且还定义了在通用梯度下降算法中需要执行的步骤,并且由于 vw 是在线学习系统 - 算法与特定损失函数收敛的速度有多快很重要。此外,当您测量最终平均损失时,它可能取决于数据集的大小。如果数据集很小,那么具有特定损失函数的 gd 在预测接近 50/50 的最初步骤中的表现就很重要。 这个不确定期可能会因 logloss 而更大,转换为 0/1 loss 后其影响会被放大。我会尝试指定--passes n ,并希望在更长的距离上结果可以预期。 你又是对的,vw --binary -c --loss_function=logistic --passes=2 导致损失“0.077 h”。这是一个保留损失,因此它与之前报告的值并不能真正具有可比性(因为现在我只对 90% 的数据进行训练)。但是,--loss_function=logistic 导致相同的损失“0.077 h”,因此似乎两次通过有助于隐藏逻辑损失和平方损失之间的差异。更多的传球几乎没有区别。 --oaa 也是如此。所以我认为我的问题得到了充分的回答。谢谢。 我也可以调整初始学习率,而不是使用更多通道。 vw --binary --loss_function=logistic -l 1 结果为 0.0885。由于最近大众汽车的改进,vw --binary 现在有 0.0856。最佳学习率:vw --binary -l 0.45 为 0.0852。因此,通过调整学习率,logistic 和 squared 之间的差距即使一次通过也会小一些(但它仍然存在)。好的,我已经完成了这个挑剔。

以上是关于--oaa 2 和 --loss_function=logistic 在 Vowpal Wabbit 中的效果的主要内容,如果未能解决你的问题,请参考以下文章

致远OAA6版安装

2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路

运维即服务Operation as Service OaaS

如何在pytorch中获取自定义损失函数的权重?

利用pytorch建立神经网络

Vowpal Wabbit 中的纠错锦标赛 (ect) 多类分类