Как справиться с чрезмерной подгонкой в ​​моделях CNN на основе НЛП для мультиклассовой классификации текста с встраиваниями слов?

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

  1. Удаление игнорируемых слов, знаков препинания, пробелов и т. Д. И разбиение описания на токены.
  2. Преобразовал метки и токены в векторы слов.
  3. Преобразуйте токены в модель встраивания слов.
  4. Настройте CNN с 62 выходными узлами. (62 различных отраслевых тега для классификации)

Ссылка на изображение / набор данных для справки: https://drive.google.com/drive/folders/1yLW2YepoHvSp_koHDDzcAAJBIaYQIen0?usp=sharing


Проблема, с которой я сталкиваюсь, заключается в том, что модель переоснащается, независимо от внесенных мной изменений. (Заканчивается раньше из-за обратного вызова, который я настроил на потерю)[точность CNN][7]

      max_features = 700
maxlen = 200
embedding_dims = 50
filters = 200
kernel_size = 3
hidden_dims = 160
es_callback = EarlyStopping(monitor='val_loss', patience=5)

model = Sequential()
model.add(Embedding(vocab_size, 100, weights=[embedding_matrix], trainable=False))
model.add(Dropout(0.4))

model.add(Conv1D(filters,
                 kernel_size,
                 padding='valid',
                 activation='relu',
                 strides=1))
model.add(GlobalMaxPooling1D())

model.add(Dense(hidden_dims))
model.add(Dropout(0.4))
model.add(Activation('relu'))

model.add(Dense(62))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

history = model.fit(X_train, y_label_train,
              batch_size=64,
              epochs=50,
              validation_data=(X_test, y_label_test),
              callbacks=[es_callback])

Ссылка на код: https://colab.research.google.com/drive/1YqbhPX6e4bJ5FnbfHj7fTQH4tUe6diva?usp=sharing

1 ответ

Я считаю этот вопрос довольно общим, хотя он полезен не только для НЛП. Поэтому я думаю, что есть много тем, которые нужно осветить, чтобы полностью решить эту проблему. Я советую вам сначала сосредоточиться на этапах предварительной обработки данных, поэтому фрагмент кода здесь, описывающий архитектуру нейронной сети (на мой взгляд), может быть последним шагом. Основываясь на первом взгляде на ваш код в colab, я бы посоветовал:

  • Лучшая предварительная обработка данных

    • Более правильная предварительная обработка данных :

      • Например, я думаю, вы применили следующее только к данным поезда X['Text_Clean'] = X['Business Description'].apply(lambda x: remove_punct(x)), и я не видел ни конвейера для подобных преобразований на тестовом наборе, ни прямого преобразования.
      • Вы применили к токенам вложения слов . Я считаю, что они придали бы большую ценность вашей текстовой функции text_final, чтобы вы могли получить ценность от семантических представлений текстового повествования.
    • В общем, я бы сказал: преобразование в нижний регистр, удаление тегов html, знаков препинания, неалфавитных символов, удаление игнорируемых слов / добавление некоторых других слов в список игнорируемых слов на основе вашего конкретного текста, исправление некоторого неформального текста в словаре, например, "что" -> "что есть", и корень для преобразования слов с примерно одинаковой семантикой в ​​одну стандартную форму.

    • Проблемы несбалансированной классификации : возникает

когда количество примеров в наборе обучающих данных для каждой метки класса не сбалансировано.

Проще говоря, когда небольшое количество ваших тегов занимает большое количество ваших ярлыков, связанных с вашим текстом, тогда не так много обучения происходит с остальными тегами «меньшинства», которые нужно изучить.

  • Разработка функций : вы можете создавать дополнительные функции и метаданные для улучшения обучения и обучения. Например, вы можете добавить столбец, отражающий тональность каждого экземпляра, и / или вы можете применить моделирование темы в качестве дополнительного атрибута (они будут похожи на «токены», которые вы поместили во фрейм данных, поддерживая - а не заменяя - основной текстовый атрибут).

Наконец, я бы не считал плохой идеей сначала начать с TfidfVectorizer и понаблюдать за точностью, прежде чем переходить к нейронным сетям. Если вышеупомянутого недостаточно, вы также можете изучить более надежное трансферное обучение и предварительно обученные модели при использовании глубоких нейронных сетей.

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