# Hierarchical Softmax
**TL;DR:** Идея простая и красивая, но скорее всего не очень рабочая для нас: Давайте приведем flat softmax layer из, например, 10000 выходов в дерево, таким образом вычислений на каждый этап будет не N, а logN (это если честное бинарное дерево), но работает и вариант два уровня - на первом 100 узлов, и на каждом из 100 еще 100, тогда для вычисления каджого сэмпла у нас 200 операций, а не 10000, что явно быстрее.
## Math
Обычный софтмакс:

Дерево:

Вероятность футбола:

Общая формула вероятности item'a:

## Проблемы/минусы
* Юзается почти полностью только для текста, очень мало упоминаний в контексте изображений (да и вообще мало упоминаний)
* Я не нашел как на узлы бьются автоматически, кажется, они чуть ли не в ручную расставляют их, даже нашел инфу что если разбить дерево рандомно, то вообще не обучается. Upd: вроде можно использовать нечто под названием huffman tree
* В некоторых (не самых надежных статьях) было указано, что качество HSM хуже, чем просто softmax
## Идеи как делать дерево
1) Кластеризация ембеддингов
2) Разбить на условные домены (явно выделить)
3) Попробовать много толстых голов и понемногу убирать
4) Динамично строить дерево кластеризацией ембеддингов
5) Прогрев на HSM