TL;DR: BLEU-4 – 0.066, BERTScore – 0.133. (В статье BLEU-4 – 0.068)
3.2 Описания товаров
4.1 Encoder ResNet
4.2 Decoder LSTM
7.1 Изображение из тестовой выборки
Так как перед получением товар, в отличие от оффлайн магазина, нельзя потрогать и померить, то для повышения товарооборота продавцы должны предоставлять потенциальным покупателям качественную информацию о продаваемой вещи, чтобы была возможность проинформировать покупателя обо всех аспектах товара. К тому же, в обычном магазине присутствуют консультанты, которые могут убедить человека приобрести вещь, а в интернет магазинах мотивировать посетителей на покупку можно только с помощью интересного и цепляющего описания. Также уходит большое количество времени на придумывание нужного описания для каждого товара.
Проблема: уходит много времени для составления описаний, которые являются одним из мотивирующих факторов для покупки в онлайн-магазинах.
Решение: генерировать описания на основе изображения.
В качестве данных был взят необработанный датасет с описанием товаров из сферы моды (одежда, обувь, аксессуары), который выложен в общий доступ авторами статьи Fashion Captioning: Towards Generating Accurate Descriptions with Semantic Rewards. В датасете представлено 126 753 записей.
Для задачи генерации описания по фотографии товара было оставлено 18 000 записей, проведено разделение на обучающую и тестовую выборки (15 000 и 3 000 записей соответственно). Предварительно были удалены записи с дублирующимися описаниями.
Все изображения, полученные по ссылкам из датасета, были записаны в два hdf5 файла (по одному на каждую выборку). Все фотографии приведены к размеру 256 на 256 пикселей. Дополнительно был изменен порядок измерений картинок: кол-во каналов, ширина, высота, тк в PyTorch принят такой порядок.
В алгоритме будет задействована предобученная модель ResNet-101, поэтому изображения нужно обработать в соответствии с тем, как модель была обучена: приведение значений пикселей в интервал (0, 1) и их нормализация с помощью приведенных на сайте значений. Так как 15 000 изображений не такая большая цифра, то дополнительно к изображениям будут применяться трансформации: случайный горизонтальный поворот и случайный наклон от -10 до 10 градусов.
Фотографии товаров после нормализации и трансформаций
Разбили все описания на токены. Заменили все слова на индексы с помощью словаря, который составлен по обучающей выборке. Словарь отдельно сохранен в json файл с индексами для токенов <start>, <end>, <pad>, <unk>.
Для того чтобы декодер (LSTM) смог правильно генерировать описания, дополнительно обработаем описания:
- в начало описания ставится индекс токена <start>, чтобы модель начала предсказывать,
- в конец – индекс токена , чтобы модель научилась предсказывать конец описания,
- доводим все описания до одной длины с помощью индекса токена <pad>, так как описания будут передаваться как тензоры фиксированной длины,
- посчитаем длину каждого описания (с токенами начала и конца), чтобы в дальнейшем не делать вычисления с токеном <pad>.
Реализована архитектура модели из статьи Show, Attend and Tell: Neural Image Caption Generation with Visual Attention: encoder и decoder с модулем внимания.
В качестве сверточной сети используется предобученная модель ResNet-101. Так как для модуля внимания нужны признаки в двумерном пространстве и не нужна классификация, то убираем полносвязный слой. Заменяем слой пулинга своим с размерностью 256 на 256; теперь для генерации описания можно подавать на вход изображение любого размера.
В качестве декодера используется LSTM ячейка, на вход которой каждую итерацию будут подаваться ранее сгенерированное слово и взвешенная карта признаков, полученная с помощью модуля мягкого внимания.
Обучение проводилось с размером батча в 32 штуки и дообучением энкодера на протяжении 31 эпохи; лучший результат достигнут на 17-й. В качестве функции потерь использована кросс энтропия, в качестве оптимизатора – Адам.
Для того чтобы не тратить вычисления на токены , если в батче попались описания разной длины, используется функция pack_padded_sequence(), которая сортирует описания по длине и вычисляет новые размеры батчей для каждого момента во времени (timestep), чтобы в одном батче обрабатывались части описаний без токена <pad>
Чтобы бороться с переобучением кроме слоя dropout используем и раннюю остановку. Будем следить за оценкой BLEU-4: после каждой эпохи обучения проводим эпоху валидации; если оценка не улучшается в течение 5 эпох, то понижаем коэффициент скорости обучения; если не видно улучшений на протяжении 20 эпох, то останавливаем обучение.
В качестве простой и быстрой метрики выступает BLEU, основанная на сходстве n-грамм (не символов, а слов) и похожая на оценку точности: считается, сколько n-грамм сгенерированного текста присутствует в исходном; чем больше похожих n-грамм, тем лучше оценивается предсказание модели.
Для повышения качества оценивания сгенерированных текстов можно задействовать BERTScore: используются предобученные векторы BERT, каждое слово заменяется вектором, считается косинусное сходство между каждой парой слов, выбирается максимальное, умножается на IDF.
График ошибок для обучающей и тестовой выборок по эпохам
Если посмотреть на график ошибок, то можно заметить, что модель переобучается. Так как используется early stopping, следящий за оценкой BLEU-4, то в качестве эпохи, показавшей наилучшие результаты, была выбрана 17-ая, хотя ошибка на тестовой выборке перестала падать с 10-й эпохи.
График оценок BLEU и BERTScore по эпохам
Как описывается в статье Improving Image Captioning with Language Modeling Regularizations, существует «loss-evaluation mismatch», так как во время обучения мы считаем ошибку на уровне слов, а во время оценивания пытаемся улучшить метрику (BLEU-4) на уровне предложений. На рисунке можно увидеть, что с 10-й эпохи, когда ошибка на тестовой выборке увеличивалась, BLEU-4 (вместе от BLEU-1 до BLEU-3) и BERTScore продолжали улучшаться. Можно предположить, что модель начинает предсказывать лучше, но менее уверенно.
После 17 эпохи получены следующие результаты:
- BLEU-4 – 0.066,
- BERTScore – 0.133.
Часто авторы статей представляют результаты BLEU-4 в процентах, то есть наш итог – 6,6. Считается, что довольно хорошим можно считать результат от 20 и выше. Однако, если посмотреть на результаты в статье Fashion Captioning: Towards Generating Accurate Descriptions with Semantic Rewards, можно заметить, что их BLEU-4 равен 6,8.
Для картинки с леопардовым пиджаком и исходным описанием «glinting goldtone button add a dash of decadence to this sharply tailored blazer patterned with feisty leopard spot» сгенерируем новую подпись с помощью нашей модели и визуализируем внимание модели во время каждого слова.
" <start> a leopard print and slightly cropped hem add to the charm of this tailored jacket cut from a double face italian silk with a leopard print and leopard pattern that"
Внимание модели во время генерации описания пиджака
Чтобы сгенерировать слова «cropped» и «hem», модель концентрируется на нижней части пиджака; слово «jacket» создано при обращении внимания на верхние края пиджака и пуговицу. Интересно, что при генерации слова «add» и внимании снаружи объекта, при генерации следующего слова модель смотрит внутрь предыдущей области.
"<start> a sweetheart neckline and a thigh high slit add to the sleek silhouette of this sleek sheath gown that s perfect for the bride or a a little more than"
Внимание модели во время генерации описания платья
Опираясь на внимание модели, видно, что она концентрируется на разрезе платья, когда говорит «thigh», и на длине нижней части платья, когда говорит «gown».