SMOTE с несколькими входами для причалов

Я создаю модель классификации текста с несколькими классами, используя Кераса и Берта (HuggingFace), но у меня очень несбалансированный набор данных. Я использовал SMOTE из Sklearn, чтобы сгенерировать дополнительные образцы для классов с депрессией (всего у меня их 45), что отлично работает, когда я использую входные идентификаторы из Bert Tokenizer.

Однако я хотел бы иметь возможность также использовать сглаживание для идентификаторов входных масок, чтобы позволить модели определять, где находятся заполненные значения.

Мой вопрос в том, как я могу использовать сглаживание как для идентификаторов ввода, так и для идентификаторов масок? До сих пор я делал следующее, и модель не жалуется, но я не уверен, соответствуют ли передискретизированные маски строке передискретизированных входных идентификаторов для строки. Smote требует двух входов, входов и меток, поэтому я продублировал процесс с тем же случайным состоянием и просто вернул необходимые элементы:

def smote(input_ids, input_masks, labels):

    smote = SMOTE("not majority", random_state=27)

    input_ids_resampled, labels_resampled = smote.fit_sample(input_ids, labels)
    input_masks_resampled, _ = smote.fit_sample(input_masks, labels)

    return input_ids_resampled, input_masks_resampled, labels_resampled

Это приемлемо? Есть лучший способ сделать это?


person ML_Engine    schedule 13.05.2020    source источник


Ответы (2)


Я просто хочу пояснить, что это неправильный способ применять SMOTE к input_ ids. Вам нужно взять соответствующее встраивание в CLS. Используйте BERT, чтобы получить токен CLS для каждого твита, а затем примените к нему SMOTE. Затем передайте его из классификатора (любого классификатора). Это нужно делать без тонкой настройки.

person Gul Jabeen    schedule 12.08.2020

Я не думаю, что данный код - хорошая идея.

Поскольку идентификаторы масок сообщают вам, какие токены являются настоящими, а какие - из заполнения, если вы выберете их независимо от входных идентификаторов, вы получите синтетические входные идентификаторы, поступающие из реальные входные идентификаторы, которые не учитываются моделью, потому что соответствующие синтетические идентификаторы маски (сгенерированные из полностью независимых токенов) указывают, что ваши синтетические входные идентификаторы являются заполнителями.

Глупый пример:

  • t_1: input ids = [1209, 80183, 290], mask ids = [1,1,0,]
  • t_2: input ids = [39103, 38109, 2931], mask ids = [1,1,1]
  • t_3: input ids = [1242, 1294, 3233], mask ids = [1,0, 0]

Предположим для простоты, что синтетическое создание выполняется путем усреднения двух тензоров. Если ваша случайная сглаженная выборка усредняет входные идентификаторы t_1 и t_2, но идентификаторы маски t_2 и t_3, полученный синтетический t_4 не имеет никакого значения: это не среднее значение любого реального наблюдения.

Разумное решение проблемы, описанной выше: вы выбираете только входные идентификаторы, а в качестве идентификаторов масок вашего синтетического токена вы берете среднее тех же идентификаторов масок. Я говорю среднее, но думаю, что медианное значение каждой записи векторов идентификаторов масок, вероятно, более подходящее. Это можно было бы организовать, просто сглаживая входные идентификаторы и идентификаторы масок в 1d-тензор и применяя к ним сглаживание (я думаю, предполагая, что сглаживание работает покомпонентно).

Однако я думаю, что вышеупомянутое исправление все еще не имеет особого смысла. Я далек от эксперта по BERT, но я понимаю, что каждый токен соответствует точному целому числу (вплоть до, возможно, хеш-коллизий). Если это так, просто усредняя токены, вы получите полную тарабарщину. Даже выбор медианы для каждого токена (скажем, 5 тензоров в одном классе) приведет к полному бреду.

Итак, вывод: я не знаю, как решить эту проблему. Возможно, в какой-то момент можно обойтись на полпути через модель BERT, когда токены уже частично обработаны, чтобы быть плавающими. Или, возможно, даже при выходе из стандартной модели Bert и перед точной настройкой под вашу конкретную задачу.

Наконец, я хочу оставить это для следующего человека, который столкнется с этим: очевидно, есть модификация SMOTE, SMOTENC, которая подходит (среди других задач) для целочисленных векторов. По причинам, описанным выше, я не думаю, что он подходит для этой цели, но приятно знать.

person user94041    schedule 13.07.2020