Я заинтересован в реализации иерархической модели softmax, которая может обрабатывать большие словари, например, порядка 10M классов. Каков наилучший способ сделать это для того, чтобы быть масштабируемым до большого класса и эффективным? Например, по крайней мере одна статья показала, что HS может достичь ускорения ~ 25x для больших словаров при использовании двухуровневого дерева, где каждый node sqrt(N)
. Меня интересует также более общая версия для произвольного дерева глубины с произвольным коэффициентом ветвления.
Есть несколько вариантов, которые я вижу здесь:
1) Запустите tf.gather
для каждой партии, где мы собираем индексы и разбиваем. Это создает проблемы с большими размерами партий и жировыми деревьями, где теперь коэффициенты дублируются, что приводит к ошибкам OOM.
2) Подобно # 1, мы могли бы использовать tf.embedding_lookup
, который мог бы помочь с ошибками OOM, но теперь держит все на процессоре и немного замедляет работу.
3) Используйте tf.map_fn
с помощью parallel_iterations=1
, чтобы обрабатывать каждый образец отдельно и вернуться к использованию сбора. Это намного более масштабируемо, но на самом деле не приближается к 25-кратному ускорению из-за сериализации.
Есть ли лучший способ реализовать HS? Существуют ли разные способы для глубоких и узких или коротких и широких деревьев?