Тематическая модель Sagemaker LDA - как получить доступ к параметрам обученной модели? Также есть простой способ зафиксировать согласованность

Я новичок в Sagemaker и провожу несколько тестов, чтобы измерить производительность NTM и LDA на AWS по сравнению с молотком LDA и собственной моделью Gensim LDA.

Я хочу проверить обученных моделей на Sagemaker и посмотреть, какие слова имеют наибольший вклад в каждую тему. А также для оценки согласованности модели.

Я смог успешно получить, какие слова имеют наибольший вклад в каждую тему для NTM на Sagemaker, загрузив выходной файл, распаковав его и разархивировав, чтобы открыть 3 файла params, symbol.json и meta.json.

Однако, когда я пытаюсь проделать тот же процесс для LDA, нераспакованный выходной файл не может быть разархивирован.

Возможно, мне что-то не хватает или мне нужно сделать что-то другое для LDA по сравнению с NTM, но мне не удалось найти никакой документации по этому поводу. Кроме того, кто-нибудь нашел простой способ расчета согласованности модели?

Будем очень благодарны любой помощи!


person D_usv    schedule 28.02.2019    source источник


Ответы (2)


Этот блокнот SageMaker, который углубляется в научные детали LDA, также демонстрирует, как проверять артефакты модели. В частности, как получить оценки для предварительного alpha Дирихле и матрицы распределения тематических слов beta. Вы можете найти инструкции в разделе под названием «Проверка обученной модели». Для удобства воспроизведу здесь соответствующий код:

import tarfile
import mxnet as mx

# extract the tarball
tarflie_fname = FILENAME_PREFIX + 'model.tar.gz' # wherever the tarball is located
with tarfile.open(tarfile_fname) as tar:
    tar.extractall()

# obtain the model file (should be the only file starting with "model_")
model_list = [
    fname
    for fname in os.listdir(FILENAME_PREFIX)
    if fname.startswith('model_')
]
model_fname = model_list[0]

# load the contents of the model file into MXNet arrays
alpha, beta = mx.ndarray.load(model_fname)

Это должно дать вам данные модели. Обратите внимание, что темы, которые хранятся в виде строк beta, не представлены в каком-либо определенном порядке.

person Chris Swierczewski    schedule 01.03.2019
comment
Спасибо, это работает, довольно болезненная проблема: бета, хотя это усложняет интерпретацию тем. - person D_usv; 04.03.2019
comment
из интереса, где вы читали, что бета-строки не расположены в каком-то определенном порядке? - person D_usv; 04.03.2019
comment
Я рад, что теперь это работает! Что касается интерпретации тем, на языке LDA тема - это просто распределение вероятностей по словарю. Требуется некоторая постобработка, чтобы применить значение / ярлыки к каждой из тем. Например, необходимо выполнить какую-то семантическую интерпретацию, чтобы назначить высокую вероятность {мяч, игра, игра, удар} тематическому ярлыку спорта. Ярлыки тем являются самостоятельной темой. Что касается вашего второго вопроса, я знал об отсутствии конкретного заказа, потому что был одним из создателей SageMaker LDA. С удовольствием отвечу на другие вопросы! - person Chris Swierczewski; 04.03.2019
comment
Вот статья (я уверен, что одна из многих) о том, как извлечь репрезентативные ключевые слова из текстового документа. (arxiv.org/pdf/1308.2359.pdf) Возможно, его можно использовать для решения темы проблема с маркировкой? - person Chris Swierczewski; 04.03.2019
comment
Спасибо за ответ, похоже, я не мог бы поговорить с человеком лучше для этого! Понимаю, что надо вручную выбирать темы, я уже играл с Gensim и mallet LDA. Когда я говорю «интерпретация», я имею в виду, как в случае с молотком / Gensim LDA, можно изучить каждую тему и оценить вклад каждого слова. Если вы говорите, что строки в бета-версии не упорядочены в Sagemaker LDA, как я могу быть уверен, какая строка для какой темы? - person D_usv; 05.03.2019
comment
Теперь я лучше понимаю твой вопрос. Каждая строка матрицы beta - это тема: распределение вероятностей по словарю. 0-я запись - это вероятность того, что слово_0 встречается в этой теме, первая запись - это вероятность появления слова_1 в этой теме и т. Д. Если вы argsort вероятности в этой строке / теме, вы можете найти слова в словаре, которые наиболее представлены в той теме. В частности, argsort дает вам индексы слов, которые вы затем будете искать, используя выбранное вами вложение. (например, «кот» - ›слово_0,« собака »-› слово_1, «птица» - ›слово_2, ...) - person Chris Swierczewski; 05.03.2019
comment
Конечно, я это понимаю, но как мне узнать, какая строка соответствует какой теме, если строки не упорядочены? Так, например, как мне узнать, какая строка соответствует теме 5? Логически я бы сказал строку 5, но, похоже, это не так. Кроме того, правильно ли я предполагаю, что порядок столбцов в бета-версии такой же, как во входной матрице? Очень признателен за вашу помощь в этом! - person D_usv; 05.03.2019
comment
Первая строка - это тема 1, вторая строка - это тема 2 и т. Д. Без определенного порядка я имел в виду, что порядок, в котором представлены темы, не имеет особого значения. Темы как раз те, которые алгоритм нашел. Я полагаю, что путаницу можно прояснить с помощью следующего сценария: предположим, вы сгенерировали тестовые данные, используя априори известные темы. Алгоритм LDA должен обнаружить те же самые темы. Однако строки beta будут перестановкой априорных тем. То есть первая строка не обязательно соответствует первой известной теме. См. Пример связанной записной книжки. - person Chris Swierczewski; 05.03.2019
comment
Привет, Крис, есть ли простой способ получить смеси тем для учебного набора? - person D_usv; 28.03.2019
comment
Я не верю, что они вычисляются в процессе обучения, поэтому вам придется настраивать конечную точку вывода. В качестве альтернативы, я считаю, что вы можете сэкономить на развертывании второго экземпляра, используя SageMaker пакетное преобразование, но я сам этого не пробовал. - person Chris Swierczewski; 30.03.2019
comment
Я подумал, что это может быть так, но хотел дважды проверить. Спасибо, что вернулись ко мне - person D_usv; 01.04.2019

Что касается согласованности, в sagemaker AFAIK нет реализации по умолчанию.

Вы можете реализовать собственную метрику следующим образом:

from itertools import combinations
from sklearn.metrics.pairwise import cosine_similarity

def calculate_coherence(topic_vectors):
    similarity_sum = 0.0
    num_combinations = 0
    for pair in combinations(topic_vectors, 2):
        similarity = cosine_similarity([pair[0]], [pair[1]])
        similarity_sum = similarity_sum + similarity
        num_combinations = num_combinations + 1
    return float(similarity_sum / num_combinations)

и получите согласованность для вашей реальной модели, например:

print(calculate_coherence(beta.asnumpy()))

Вот несколько интуитивных тестов на согласованность:

predictions = [[0.0, 0.0, 0.0],
               [0.0, 1.0, 0.0],
               [0.0, 0.0, 1.0],
               [1.0, 0.0, 0.0]]

assert calculate_coherence(predictions) == 0.0, "Expected incoherent"

predictions = [[0.0, 1.0, 1.0],
               [0.0, 1.0, 1.0],
               [0.0, 1.0, 1.0],
               [0.0, 1.0, 1.0]]

assert calculate_coherence(predictions) == 1.0, "Expected coherent"

predictions = [[0.0, 0.0, 1.0],
               [0.0, 0.0, 1.0],
               [1.0, 0.0, 0.0],
               [1.0, 0.0, 0.0],
               [0.0, 1.0, 0.0],
               [0.0, 1.0, 0.0]]
assert calculate_coherence(predictions) == 0.2, "Expected partially coherent"

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

person the dude    schedule 17.02.2020