2014-10-13 5 views
1

Я смущен о том, как функции vw извлекают. Рассмотрим проблему классификации текста, где я хочу использовать символьные ngrams как функции. В простейшем случае, который иллюстрирует мой вопрос, входная строка - «aa», и я использую только 1-граммовые функции. Таким образом, пример должен состоять из одного элемента «A», который имеет счетчик 2, следующим образом:Vowpal Wabbit feature extract

$ 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 

Однако, если я передать строку символов «AA» в VW (введение пространства между символами) , оч.сл. сообщает 2 особенности:

$ 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 и дал больше времени, я мог бы, возможно, выяснить, что происходит; но если кто-то может объяснить объяснение несоответствия между двумя описанными выше случаями (это ошибка?) и/или указать мне на соответствующие части источника, я был бы признателен за помощь.

ответ

2

Я полагаю, что общее значение номера функции - всего лишь счетчик наблюдаемых особенностей. Например, вы получите 10 для следующей команды:

$ echo "1 |X a" | vw --noconstant --passes 10 --cache_file f -k 

Я также видел в Vw коде, который делит значение REGRESSOR особенности путем художественного весом перед печатью вне. Это может быть видно из следующего:

$ echo "1 |X a:1" | vw --noconstant --invert_hash f && grep '^X^' f 
X^a:108118:0.393395 
$ echo "1 |X a:2" | vw --noconstant --invert_hash f && grep '^X^' f 
X^a:108118:0.196698 
$ echo "1 |X a:3" | vw --noconstant --invert_hash f && grep '^X^' f 
X^a:108118:0.131132 
$ echo "1 |X a:10" | vw --noconstant --invert_hash f && grep '^X^' f 
X^a:108118:0.039344 

Я подозреваю, что функции являются эксклюзивными и примеры, как «| X а» и «| Х аа» должен дать тот же результат, но они не:

$ echo "1 |X a" | vw --noconstant --invert_hash f && grep '^X^' f 
X^a:108118:0.393395 
$ echo "1 |X a a" | vw --noconstant --invert_hash f && grep '^X^' f 
X^a:108118:0.375311 
$ echo "1 |X a a" | vw --noconstant --invert_hash f && grep '^X^' f 
X^a:108118:0.366083 

Я действительно не знаю почему. За этим должна быть логика. Но это работает, как ожидалось (мной), если вы укажете --sort_features

$ echo "1 |X a" | vw --noconstant --invert_hash f && grep '^X^' f 
X^a:108118:0.393395 
echo "1 |X a a a a a" | vw --noconstant --invert_hash f --sort_features && grep '^X^' f 
X^a:108118:0.393395 

Интересный факт заключается в том, что если вы укажете --sort_features оч.сл. использует только первое вхождение элемента. Пример:

$ echo "1 |X a a:10" | vw --noconstant --invert_hash f --sort_features && grep '^X^' f 
X^a:108118:0.393395 
$ echo "1 |X a a:2" | vw --noconstant --invert_hash f --sort_features && grep '^X^' f 
X^a:108118:0.393395 
$ echo "1 |X a:10 a" | vw --noconstant --invert_hash f --sort_features && grep '^X^' f 
X^a:108118:0.039344 

Надеюсь, что с этими наблюдениями вы сможете сделать работу VW по мере необходимости. Но я не уверен, что это ошибка или функция. Будет пересылать автору комментарии.

+0

Я раньше не использовал '--sort_features', и я бы не ожидал, что он приведет к поведению в ваших примерах. В записи справки говорится: «Включите это, чтобы игнорировать порядок, в котором определены функции, что приведет к меньшему размеру кеша». Но почему порядок, в котором функции определены, в первую очередь? Возможно, это ключ к моему первоначальному вопросу. – Ken

+0

У меня нет подсказки. Я поднял этот вопрос на официальной странице https://github.com/JohnLangford/vowpal_wabbit/issues/425 – truf

+0

Если вы не отслеживаете обсуждение с автором - его ответ: _it по сути является вычислительной проблемой. Мы могли бы попытаться объединить все функции в уникальный набор, или мы могли бы оставить дубликаты в системе. Выполнение второго, похоже, на самом деле происходит быстрее, потому что большинство наборов функций не имеют внутри-примерных конфликтов ._ – truf

Смежные вопросы