Понимание иерархического softmax - PullRequest
0 голосов
/ 04 ноября 2018

Я новичок в машинном обучении, поэтому я потратил около недели, чтобы понять, как работает иерархический softmax, но мне все еще неясно. Было бы очень полезно, если бы вы помогли мне уточнить некоторые детали.

У меня есть входной вектор (элементов), обозначенный X и соответствующая метка y.

Я реализовал дерево Хаффмана, и я передаю свои y (метки) в функцию (get_huffman_tree), и она дает мне дерево, то есть каждый узел содержит вектор весов (как они выглядят? Просто как 1 тусклый вектор, верно?), и это число. Смотрите ниже:

print(get_tree(tree))
print(path_to_leaf(tree,'1'))

[(1240, 1.0, 0), (32, 0.457, 1), (10, 0.503, 4), (3, 0.248, 2), (2, 0.249, 3), (1, 0.25, 5), (0, 0.253, 6)]
[(0, 1), (4, -1), ('0', -1)]

После этого мы можем вычислить log pi_k = - sum_i(log(1+exp(-delta * w_i * x_j)

В данный момент мне нужно нечто вроде большой W матрицы, которая состоит из v_i строк (где v_i - вектор каждого узла в дереве), и я умножу это на конкретную x_j в моем X матрица (особенности)

В данный момент я понятия не имею, как его реализовать и как использовать пути в дереве Хаффмана.

Затем мы можем вычислить нашу функцию потерь => loss = lambda/2 * ||V||^2 - sum_j(log pi_k_j) -> min (v) и найти ее grad(loss), которая дает нам матрицу сдвигов наших весов.

...