Как ответить
В последнем проекте по классификации текстов я использовал комбинацию из кросс-энтропии и регуляризации L2. Основа — это стандартная категориальная кросс-энтропия (categorical cross-entropy), потому что задача была многоклассовой: нужно было отнести текст к одному из 12 типов обращений в техподдержку. К ней добавил L2-регуляризацию на веса полносвязных слоёв, чтобы бороться с переобучением — датасет был небольшой, около 8 тысяч примеров.
Конкретно loss выглядела так:
import tensorflow as tf
model.compile(
optimizer='adam',
loss=tf.keras.losses.CategoricalCrossentropy(),
metrics=['accuracy']
)
# L2-регуляризация добавлена через kernel_regularizer в Dense слоях:
# tf.keras.regularizers.l2(0.001)Почему именно такой выбор. Во-первых, кросс-энтропия хорошо штрафует модель за уверенные неправильные предсказания, что критично для классификации с чёткими границами классов. Во-вторых, L2 с коэффициентом 0.001 подобрал экспериментально — на валидации loss без регуляризации расходился с тренировочным уже после 10 эпох, а с L2 разница стабилизировалась. Пробовал ещё dropout (0.3), но он дал чуть хуже по recall на редких классах.
Из альтернатив рассматривал focal loss из-за дисбаланса классов: класс «жалоба на качество» встречался в 3 раза реже, чем «запрос статуса». Но на практике кросс-энтропия с взвешиванием классов (class weights) сработала не хуже, а код был проще. Focal loss оставил как запасной вариант, если бы дисбаланс был сильнее — например, 1:100.
Ещё один нюанс: я использовал label smoothing с коэффициентом 0.1, чтобы модель не была слишком самоуверенной. Это немного снизило точность на тренировке (с 98% до 96%), но на тесте accuracy выросла с 89% до 91% — модель лучше обобщала.