Vowpal Wabbit хеш-коллизия работает лучше, чем L1 как регуляризация
У меня есть модель классификации VW, которую я хотел проверить на количество признаков и количество коллизий хешей. Я обучил его и протестировал на разных наборах данных. Наборы данных содержат более 400 тыс. Функций, поэтому с 18-битным пространством VW можно сэкономить только 260 тыс. Без коллизий.
Затем, чтобы проверить его, я создал две читаемые модели: одну с параметром --readable_model, чтобы получить количество всех хешей, вторую с параметром --invert_hash, чтобы получить количество всех объектов, даже тех, которые были в коллизиях хешей. Было 425 тыс. Функций и 208 тыс. Хешей (не 260 тыс., Потому что я использовал некоторую фильтрацию с аргументом --keep, и, насколько я понимаю, vw сохраняет в хеш-таблицу, также игнорируя пространства имен). Затем я измерил качество модели, используя ROC_AUC, MCC и Average Precision. Результаты были 0,903, 0,564, 0,591.
Как видите, коллизия хешей огромна, поэтому я решил увеличить битовое пространство, установив для аргумента -b значение 24. Затем я снова обучил модель. Теперь было 425 тыс. Объектов и 425 тыс. Хэшей = нет столкновений. Однако результаты по тем же показателям были хуже (0,902,0554,0,587).
На данный момент все выглядит так, как будто было большое переоснащение с 24-битным пространством, в то время как 18-битная модель лучше предотвращала переобучение - это было бы хорошим объяснением того, почему результаты были лучше на тестовом наборе данных с 18-битной моделью.
Но затем я решил уменьшить количество функций на 24-битной модели с регуляризацией L1. Некоторое время я играл с ним, и когда я получил модель с 208 тыс. Хешей и 208 тыс. Функций, я был очень удивлен, что ее результаты были еще хуже, чем результаты 18-битной модели с таким же количеством хешей. Это было 0,901,0,584,0,552.
Это заставляет меня поверить, что случайные коллизии хэшей, даже для огромной части функций, работают как лучший регуляризатор, чем регуляризация L1. Как это возможно?
1 ответ
Как это возможно?
И регуляризация, и случайные хеш-коллизии являются механизмами дисконтирования для подмножества характеристик модели. Они выбирают некоторые функции и делают их менее важными (или полностью обесцененными) в модели.
Но на этом сходство заканчивается. Два механизма дисконтирования очень отличаются в:
- Подмножество функций, которые они обесценивают (определенные против случайных)
- Метод дисконтирования (полное или частичное смешение)
- Направление дисконтирования и величина
Удельный против случайного дисконтирования
Регуляризация L1 (--l1 ...
) выбирает очень специфические веса (те, которые ближайший ноль против нормы), тогда как случайные хеш-столкновения "выбирают" случайные веса, некоторые из которых могут быть большими.
Полное или частичное дисконтирование
Регуляризация L1 полностью обрезает / удаляет веса, которые она выбирает, в то время как столкновения со случайным хэшем создают смеси с другими функциями. В каком-то смысле (смешение эффектов) смеси похожи, но не идентичны, на что vw
пересечение с -q <XY>
делает.
Направление и величина дисконтирования
В отличие от конкретного выбора по абсолютному значению веса, случайный выбор может влиять на вес любой величины.
Кроме того, функция может быть плохой функцией, если рассматривать ее отдельно, но фактически вносить свой вклад, если рассматривать ее в сочетании с другой функцией. Одним из примеров было бы сочетание двух плохих черт, одного с положительным, а другого с отрицательным весом. Частично отменяя друг друга, они могут привести к правдоподобно хорошей функции, которая несколько коррелирует с целевой меткой. IOW: смешивание функций иногда может превратить плохой эффект в хороший.
Как дисконтирование может помочь (или навредить) модели?
Это очень распространено в машинном обучении, особенно в задачах с большими данными. Способ повышения точности выбора, обрезки или смешивания зависит от данных.
Если случается игнорировать "плохую" функцию (которая согласуется с данными обучения, но не помогает в обобщении), это делает модель лучше. Однако, если мы упустим из виду хорошую, хорошо обобщающую функцию, это приведет к ухудшению модели при тестировании (из выборочных данных).
Нижняя линия
Создание хороших моделей требует практики. Когда у вас очень большое количество функций, возможна перестройка из-за случайных эффектов (как малых, так и / или больших весов). Этого переоснащения следует избегать.
Есть много способов избежать переоснащения. Регуляризация - это всего лишь один из конкретных способов уменьшения переоснащения. Иногда более общий случайный подход, который затрагивает все функции, а не только те, которые имеют малый вес, может быть полезным в целом.
Когда это происходит, это признак того, что число функций может быть слишком большим, и вы можете их переопределять.
Как правило, я подозреваю, что любая модель, в которой количество примеров (строк набора данных), используемых для обучения, не намного больше, чем количество признаков (отдельные столбцы набора данных). Если у вас есть сотни тысяч (10^6) функций, вам, вероятно, следует иметь 10^12 (триллионов) примеров, чтобы избежать чрезмерного соответствия.
Еще одна вещь, которую я хотел бы сделать с большим количеством функций, - это случайное перемешивание порядка примеров и смешивание нескольких моделей, чтобы убедиться, что конкретный порядок не вызывает чрезмерного соответствия. Обучение онлайн имеет тенденцию перевешивать ранние примеры над более поздними из-за снижения скорости обучения.