Vowpal Wabbit Избыточность взаимодействия

Мне любопытно, как VW создает условия взаимодействия через параметр -q.

Для этой иллюстрации я использую данные игрушки, которые называются cats.vm:

1 |a black |b small  green |c numvar1:1.62 numvar2:342 |d cat |e numvar3:554
1 |a white |b large yellow |c numvar1:1.212 numvar2:562 |d cat |e numvar3:632
-1 |a black |b small green |c numvar1:12.03 numvar2:321 |d hamster |e numvar3:754
1 |a white |b large green |c numvar1:5.8 numvar2:782 |d dog |e numvar3:234
-1 |a black |b small yellow |c numvar1:2.322 numvar2:488 |d dog |e numvar3:265
1 |a black |b large yellow |c numvar1:3.99 numvar2:882 |d hamster |e numvar3:543

Кажется, есть некоторые противоречия в том, как VW создает условия взаимодействия. Вот пара примеров, где команда всегда следующая, с изменением только -q:

vw -d cats.vm --loss_function logistic --invert_hash readable.cat.mod -q X

1. -qaa

Здесь мы имеем взаимодействие в пространстве имен только с одной функцией и получаем только квадратичные термины для черного и белого (черный ^2 и белый ^2), как и ожидалось.

Constant:116060:0.082801
a^black:53863:-0.039097
a^black^a^black:247346:-0.039097
a^white:55134:0.223999
a^white^a^white:227140:0.223999
b^green:114666:0.027346
b^large:192199:0.330261
b^small:80587:-0.096200
b^yellow:255950:0.075754
c^numvar1:132428:0.004266
c^numvar2:30074:0.000211
d^cat:11261:0.188487
d^dog:173570:0.006734
d^hamster:247835:-0.085219
e^numvar3:12042:0.000115

2. -q ab

При взаимодействии между двумя пространствами имен (одно из которых имеет более 1 функции), все идет так, как ожидалось, за исключением того, что в a или b нет квадратичных терминов элементов (например, черный * черный)

Вопрос 1: Есть ли способ заставить эти "взаимодействия между пространствами имен" включать полиномиальные термины, такие как черный * черный?

Constant:116060:0.079621
a^black:53863:-0.035646
a^black^b^green:46005:-0.017797
a^black^b^large:123538:0.137239
a^black^b^small:11926:-0.088733
a^black^b^yellow:187289:-0.053135
a^white:55134:0.206693
a^white^b^green:24528:0.127449
a^white^b^large:102061:0.206693
a^white^b^yellow:165812:0.114003
b^green:114666:0.025218
b^large:192199:0.302959
b^small:80587:-0.088733
b^yellow:255950:0.072339
c^numvar1:132428:0.004038
c^numvar2:30074:0.000199
d^cat:11261:0.176863
d^dog:173570:0.007334
d^hamster:247835:-0.080986
e^numvar3:12042:0.000109

3. -q бб

Здесь мы взаимодействуем в пространстве имен, где есть две особенности. Есть дубликаты (например, b^large^b^green:81557:0.112864 и b^green^b^large:110857:0.112864).

Вопрос 2: эти дублированные термины в модели или это какая-то проблема в --invert_hash? Веса одинаковы для всех дубликатов. Должны ли мы умножить зеленый * большой вес на 2, например, чтобы получить полный эффект зеленого и большого взаимодействия?

Constant:116060:0.062784
a^black:53863:-0.043486
a^white:55134:0.182450
b^green:114666:0.023035
b^green^b^green:33324:0.023035
b^green^b^large:110857:0.112864
b^green^b^small:261389:-0.016840
b^large:192199:0.252576
b^large^b^green:81557:0.112864
b^large^b^large:159090:0.252576
b^large^b^yellow:222841:0.187498
b^small:80587:-0.079945
b^small^b^green:249481:-0.016840
b^small^b^small:215402:-0.079945
b^small^b^yellow:128621:-0.123284
b^yellow:255950:0.051017
b^yellow^b^large:68957:0.187498
b^yellow^b^small:219489:-0.123284
b^yellow^b^yellow:132708:0.051017
c^numvar1:132428:0.003217
c^numvar2:30074:0.000164
d^cat:11261:0.158140
d^dog:173570:0.008735
d^hamster:247835:-0.085383
e^numvar3:12042:0.000086

1 ответ

Решение

Во-первых, основы: когда вы пересекаете функции, vowpal wabbit использует:

  • Для перечеркнутого имени / идентификатора объекта: хэш murmur32 (размерный вектор-вектор) объединенных исходных имен объектов (строк)
  • Для пересеченного значения объекта: пересечение (умножение) исходных значений объекта (весов)

Итак, глядя на ваш вопрос № 3 выше: объединенные именаb^green^b^large или же b^large^b^green, Они имеют одинаковое значение: 0,112864, так как умножение двух значений признаков одинаково. Однако из-за двух возможных способов объединения мы получаем два разных значения хеш-функции и функцию 'split'. Это избыточное (с транспонированным порядком) явление пары признаков, кажется, проявляется только в самопересечениях. Я не уверен, почему, и это может быть ошибкой.

Чтобы ответить на другие вопросы (1 и 2):

Чтобы заставить black^black (на самом деле ^a^black^a^black) тебе нужно пройти -q aa так как black только в пространстве имен a,

Обратите внимание, что вы можете передать несколько -q аргументы vw для достижения любого пересечения вы хотите:

-q aa -q ab -q ...

Вы можете использовать подстановочный знак : пространство имен, чтобы пересечь каждое пространство имен друг с другом:

-q ::

Для большей мощности:

Там также есть --cubic вариант, позволяющий подогнать кубические полиномы. --cubic принимает в качестве аргумента 3 ведущих символа пространства имен, например --cubic abc,

Наконец, вы также можете использовать --keep а также --ignore сохранять или игнорировать пространства имен, начинающиеся с определенного символа.

Другие вопросы по тегам