# Hierarchical Softmax **TL;DR:** Идея простая и красивая, но скорее всего не очень рабочая для нас: Давайте приведем flat softmax layer из, например, 10000 выходов в дерево, таким образом вычислений на каждый этап будет не N, а logN (это если честное бинарное дерево), но работает и вариант два уровня - на первом 100 узлов, и на каждом из 100 еще 100, тогда для вычисления каджого сэмпла у нас 200 операций, а не 10000, что явно быстрее. ## Math Обычный софтмакс: ![](https://i.imgur.com/THTcwgQ.png) Дерево: ![](https://i.imgur.com/WupBbjB.png) Вероятность футбола: ![](https://i.imgur.com/PpdiHf1.png) Общая формула вероятности item'a: ![](https://i.imgur.com/JQaWcFU.png) ## Проблемы/минусы * Юзается почти полностью только для текста, очень мало упоминаний в контексте изображений (да и вообще мало упоминаний) * Я не нашел как на узлы бьются автоматически, кажется, они чуть ли не в ручную расставляют их, даже нашел инфу что если разбить дерево рандомно, то вообще не обучается. Upd: вроде можно использовать нечто под названием huffman tree * В некоторых (не самых надежных статьях) было указано, что качество HSM хуже, чем просто softmax ## Идеи как делать дерево 1) Кластеризация ембеддингов 2) Разбить на условные домены (явно выделить) 3) Попробовать много толстых голов и понемногу убирать 4) Динамично строить дерево кластеризацией ембеддингов 5) Прогрев на HSM