Современная RecSys

Введение в Visual RecSys

В этой главе мы рассмотрим данные hello world для визуальных моделей, набор данных FashionMNIST от Zalando с PyTorch, Tensorboard и Colab.

Это часть моей серии Modern Visual RecSys; не стесняйтесь проверить остальную часть серии в конце статьи.

FashionMNIST и визуальный вызов

Данные состоят из:

  • Учебный набор из 60 000 изображений и тестовый набор из 10 000 изображений.
  • Каждое изображение имеет размер 28x28 в оттенках серого и относится к 10 классам: футболка/топ, брюки, пуловер, платье, пальто, сандалии, рубашка, кроссовки, сумка, ботильоны.

Наша цель — получить интуитивное представление о двух важнейших концепциях: встраивания и расстояние, поскольку они являются фундаментальными строительными блоками для следующей главы, посвященной Сверточные нейронные сети (CNN). ).

Что такое эмбеддинги и зачем они нужны?

Традиционно мы представляем изображения в виде большого массива целых чисел (3D-массив для изображений RGB и 1D-массив для изображений в градациях серого). Эти массивы громоздки и растут экспоненциально — нам нужно будет отслеживать миллионы чисел, чтобы анализировать сотни изображений с высоким разрешением! Любое моделирование с использованием массивов целых чисел будет невозможно масштабировать; следовательно, создается современный подход вложений.

Одной из прекрасных иллюстраций концепции вложений является пример в Объяснении встраивания нейронных сетей Уилла Кёрсена. Традиционно для представления элементов в матрице мы использовали такие методы, как однократное кодирование. Например, для трех книг у нас будет матрица 3x3, где каждый элемент представлен массивом дискретных чисел, которые растут с каждым добавленным новым элементом (4x4 с 4 элементы, 5x5 с 5 элементами…). Кроме того, нет ощущения сходства или расстояния, поскольку элементы не связаны никакими отношениями.

# One Hot Encoding Categoricals
books = ["Harry Potter and The Philosopher's Stone",
         "Harry Potter and The Chamber of Secrets", 
         "The Lean Startup"]
books_encoded = [[1, 0, 0],
                 [0, 1, 0],
                 [0, 0, 1]]
Similarity (dot product) between First and Second = 0
Similarity (dot product) between Second and Third = 0
Similarity (dot product) between First and Third = 0

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

# Idealized Representation of Embedding
books = ["Harry Potter and The Philosopher's Stone",
         "Harry Potter and The Chamber of Secrets", 
         "The Lean Startup"]
books_encoded_ideal = [[0.53,  0.85],
                       [0.60,  0.80],
                       [-0.78, -0.62]]
Similarity (dot product) between First and Second = 0.99
Similarity (dot product) between Second and Third = -0.94
Similarity (dot product) between First and Third = -0.97

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

Поскольку мы можем контролировать размер векторных представлений, мы можем уменьшить масштаб огромного массива изображений до небольшого вектора, состоящего из гораздо меньшего числа чисел. Результат можно увидеть из объектов FashionMNIST на изображении выше, где объекты проецируются на трехмерное векторное пространство. В процессе встраивания похожие векторы изображений будут проецироваться близко друг к другу. Таким образом, когда у нас есть вложения, мы можем:

  • Спроецируйте объекты в векторное пространство и сформулируйте понятие расстояния и соседей для наглядности и простых рекомендаций (эта глава).
  • Используйте вложения для обучения моделей глубокого обучения (следующая глава)

Давайте посмотрим, как мы можем построить такие вложения.

Инструменты

Краткий обзор инструментов, которые мы будем использовать для разделов кодирования:

  • PyTorch против Tensorflow: это две доминирующие платформы в области глубокого обучения. PyTorch набирает обороты в исследованиях благодаря своей простоте и характеру Python, что облегчает интеграцию в рабочие процессы Python. Даже такие организации, как OpenAI, переходят на PyTorch. Я нахожу Tensorflow многословным и запутанным в использовании из-за изменений в Tensorflow 2.0, которые ломают старый код с новыми именами функций и параметрами. Простота PyTorch подходит для нашего рабочего процесса. Мы будем использовать PyTorch во всех наших примерах кода. Я добавил учебные материалы PyTorch (книги и учебные пособия) в раздел дополнительных материалов.
  • Tensorboard: раньше Tensorboard был одним из ключевых отличительных факторов Tensorflow. Теперь, когда Tensorboard изначально поддерживает PyTorch, мы можем кодировать в PyTorch и визуализировать его в Tensorboard.
  • Colab: Google Colab размещает ноутбуки Jupyter в облаке с бесплатным доступом к графическому процессору. Для нас это отличный способ поделиться кодом и изучить фреймворки глубокого обучения без хлопот и затрат на настройку среды GPU (вам просто нужна бесплатная учетная запись Google).

Код

Вы можете просмотреть большую часть кода ниже, но вам нужно будет запустить Colab, чтобы взаимодействовать с Tensorboard (самая важная часть этой главы).

Начать Колаб

Что мы узнали

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

В следующей главе мы будем опираться на все это понимание для разработки рекомендателя на основе сверточных нейронных сетей (CNN).

Изучите остальную часть серии Modern Visual RecSys















Этикетки серий:

  • Базовый: общие знания и теории, требуется минимальный опыт программирования.
  • Ядро: более сложные материалы с кодом.
  • Плюсы: сложные материалы и код, инструменты производственного класса.

Дальнейшие чтения