Я запутался в том, как vw извлекает функции. Рассмотрим задачу классификации текста, в которой я хочу использовать символьные ngrams в качестве признаков. В простейшем случае, который иллюстрирует мой вопрос, входная строка «аа», и я использую только 1-граммовые функции. Таким образом, пример должен состоять из одной функции «a», которая имеет количество 2, как показано ниже:
$ echo "1 |X a:2" | vw --noconstant --invert_hash f && grep '^X^' f
Num weight bits = 18
learning rate = 0.5
initial_t = 0
power_t = 0.5
using no cache
Reading datafile =
num sources = 1
average since example example current current current
loss last counter weight label predict features
1.000000 1.000000 1 1.0 1.0000 0.0000 1
finished run
number of examples per pass = 1
passes used = 1
weighted example sum = 1
weighted label sum = 1
average loss = 1
best constant = 1
total feature number = 1
X^a:108118:0.196698
Однако, если я передам строку символов «аа» в vw (введя пробелы между символами), vw сообщит о двух функциях:
$ echo "1 |X a a" | vw --noconstant --invert_hash f && grep '^X^' f
Num weight bits = 18
learning rate = 0.5
initial_t = 0
power_t = 0.5
using no cache
Reading datafile =
num sources = 1
average since example example current current current
loss last counter weight label predict features
1.000000 1.000000 1 1.0 1.0000 0.0000 2
finished run
number of examples per pass = 1
passes used = 1
weighted example sum = 1
weighted label sum = 1
average loss = 1
best constant = 1
total feature number = 2
X^a:108118:0.375311
Фактическая модель содержит только одну функцию (как и следовало ожидать), но ее вес (0,375311) отличается от первой модели (0,196698).
При обучении на реальных наборах данных с n-граммами более высокого порядка можно наблюдать существенные различия в средних потерях в зависимости от того, какой формат ввода используется. Я просмотрел исходный код в parser.cc и, если бы у меня было больше времени, я, вероятно, смог бы понять, что происходит; но если бы кто-нибудь мог объяснить несоответствие между двумя вышеприведенными случаями (это ошибка?) и/или указать мне на соответствующие части источника, я был бы признателен за помощь.