--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 中的效果的主要内容,如果未能解决你的问题,请参考以下文章
2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路