В этом модуле вы воспользуетесь встроенным алгоритмом нейронной модели темы (NTM) Amazon SageMaker для обучения модели темы.

Amazon SageMaker NTM – это алгоритм неконтролируемого обучения, который используется для распределения корпуса документов, содержащих группы слов, по темам в зависимости от статистического распределения этих групп. Например, документы, в которых часто встречаются такие слова, как «мотоцикл», «автомобиль», «поезд», «пробег» и «скорость», вероятно, относятся к теме «транспорт». Моделирование тем можно использовать для классификации или составления резюме по документам в зависимости от выявленных тем либо для извлечения информации или составления рекомендаций по контенту на основании сходства между темами. Темы из документов, которые изучает NTM, характеризуются как латентная репрезентация, потому что эти темы определяются по наблюдаемому распределению слов в корпусе. Семантика тем обычно определяется путем исследования наиболее часто встречающихся в них слов. Поскольку это неконтролируемый метод, заранее задаются не сами темы, а только их количество. Кроме того, нет гарантии, что эти темы будут соответствовать тем категориям, к которым бы отнес документы человек.

На следующих этапах вы укажете алгоритм NTM для задания обучения, инфраструктуру модели, значения гиперпараметров для ее настройки, затем запустите модель. После вы развернете модель на конечной точке, управляемой Amazon SageMaker, чтобы сформировать прогнозы.

Время, необходимое для прохождения модуля: 20 минут


  • Шаг 1. Создание и запуск задания обучения

    Встроенные алгоритмы Amazon SageMaker хранятся в Amazon Elastic Container Registry (Amazon ECR) в виде контейнеров Docker. Для обучения модели сперва нужно задать расположение контейнера NTM в Amazon ECR, наиболее близком к вашему региону.

    Скопируйте приведенный ниже код, вставьте его в новую ячейку кода инстанса блокнота и нажмите Исполнить.

    import boto3
    from sagemaker.amazon.amazon_estimator import get_image_uri
    container = get_image_uri(boto3.Session().region_name, 'ntm')

    В Amazon SageMaker Python SDK включено средство прогнозирования sagemaker.estimator.Estimator. Оно дает возможность указать инфраструктуру (тип инстанса Amazon EC2, количество инстансов, гиперпараметры, путь вывода и задать необязательные параметры безопасности (виртуальное частное облако (VPC), группы безопасности и т. д.), которые могут потребоваться, если мы обучаем модель в пользовательском VPC, а не в Amazon VPC. NTM в полной мере использует аппаратное обеспечение графического процессора и обычно обучается приблизительно на порядок быстрее при использовании графического, а не центрального процессора. Если обучение ведется с применением нескольких графических процессоров или инстансов, скорость обучения линейно повышается еще больше, если нагрузка с точки зрения обмена данными меньше, чем с позиции времени вычислений.

    Чтобы создать экземпляр класса sagemaker.estimator.Estimator, скопируйте приведенный ниже код, вставьте его в новую ячейку кода и нажмите Исполнить.

    sess = sagemaker.Session()
    ntm = sagemaker.estimator.Estimator(container,
                                        role, 
                                        train_instance_count=2, 
                                        train_instance_type='ml.c4.xlarge',
                                        output_path=output_path,
                                        sagemaker_session=sess)
    

    Теперь можно задать гиперпараметры для модели темы:

    ntm.set_hyperparameters(num_topics=NUM_TOPICS, feature_dim=vocab_size, mini_batch_size=128, 
                            epochs=100, num_patience_epochs=5, tolerance=0.001)
    

    В SageMaker реализовано два режима каналов данных.

    • FullyReplicated: все файлы данных копируются на каждый из рабочих узлов.
    • ShardedByS3Key: файлы распределяются между различными рабочими узлами, то есть каждый рабочий узел получает свою часть набора данных.

    На момент написания этого материала Amazon SageMaker Python SDK по умолчанию использует режим FullyReplicated для всех каналов данных. Этот режим является желательным для канала проверки (тестирования), но он не настолько же эффективен для канала обучения, если используется несколько рабочих узлов.

    В таком случае для предоставления различных градиентов для разных периодов потребуется, чтобы каждый рабочий узел обработал свою часть набора данных. Чтобы указать режим распределения ShardedByS3Key для канала обучения, выполните следующие действия.

    from sagemaker.session import s3_input
    s3_train = s3_input(s3_train_data, distribution='ShardedByS3Key') 
    ntm.fit({'train': s3_train, 'test': s3_val_data})
    

    В терминале отобразятся такие выходные данные:

    Completed - Training job completed

    Готово! Вы обучили модель темы с помощью алгоритма NTM.

    На следующем шаге вы развернете свою модель на хостинге Amazon Sagemaker.

  • Шаг 2. Развертывание модели темы

    Обученная модель сама по себе является tar-файлом, содержащим значения веса моделей, и не производит никаких действий. Чтобы воспользоваться моделью и получить прогнозы, необходимо ее развернуть.

    Развернуть модель в Amazon SageMaker можно двумя способами. Это зависит от того, как требуется формировать логические выводы.

    • Чтобы получать по одному выводу за раз, настройте постоянную конечную точку с помощью сервисов хостинга Amazon SageMaker.
    • Чтобы получать логические выводы на основании полного набора данных, используйте Amazon SageMaker Batch Transform.

    В этом курсе предоставляются оба способа, и вы можете выбрать тот, который больше подходит для вашего примера внедрения.

    В случае использования сервисов хостинга Amazon SageMaker конечная точка HTTPs в режиме реального времени располагается на инстансе Amazon EC2, которому можно передать нагрузку и получить логические выводы.

    Во время развертывания модели вызывается метод deploy объекта sagemaker.estimator.Estimator. Во время вызова метода deploy указывается количество и тип инстансов МО, которые требуется использовать для хостинга конечной точки.

    Скопируйте и вставьте следующий код и нажмите Исполнить, чтобы развернуть модель.

    ntm_predictor = ntm.deploy(initial_instance_count=1, instance_type='ml.m4.xlarge')

    Метод deploy создает развертываемую модель, настраивает конечную точку в сервисах хостинга Amazon SageMaker и запускает ее для хостинга модели.

    Чтобы получить логические выводы от конечной точки, необходимо убедиться, что входная нагрузка сериализуется в формате, который способна прочитать обученная модель, а выходные логические выводы десериализуются в удобочитаемый формат для человека. В следующем фрагменте кода используются csv_serializer и json_deserializer, которые передают данные в формате CSV (как векторы) в модель, чтобы получить вывод в формате JSON.

    Скопируйте приведенный ниже код, вставьте его в ячейку кода и нажмите Исполнить.

    from sagemaker.predictor import csv_serializer, json_deserializer
    
    ntm_predictor.content_type = 'text/csv'
    ntm_predictor.serializer = csv_serializer
    ntm_predictor.deserializer = json_deserializer

    Затем извлеките векторы тем для обучающих данных, которые будут использоваться в модели k-NN.

    Скопируйте приведенный ниже код, вставьте его в новую ячейку кода и нажмите Исполнить.

    predictions = []
    for item in np.array(vectors.todense()):
        np.shape(item)
        results = ntm_predictor.predict(item)
        predictions.append(np.array([prediction['topic_weights'] for prediction in results['predictions']]))
        
    predictions = np.array([np.ndarray.flatten(x) for x in predictions])
    topicvec = train_labels[newidx]
    topicnames = [categories[x] for x in topicvec]
    

    Готово! Теперь можно ознакомиться с выводом модели.

    При использовании пакетного преобразования можно получать логические выводы на основании пакета данных за раз. Amazon SageMaker создает необходимую вычислительную инфраструктуру и освобождает ее после завершения задания.

    Код пакетного преобразования создает объект sagemaker.transformer.Transformer из модели темы. Затем он вызывает метод transform этого объекта, чтобы создать задание преобразования. Во время создания объекта sagemaker.transformer.Transformer необходимо указать количество и тип инстансов, которые требуется использовать, чтобы выполнить задание пакетного преобразования, и расположение в Amazon S3, в котором нужно сохранить логические выводы.  

    Чтобы запустить задание по формированию логических выводов как пакетное, скопируйте приведенный ниже код, вставьте его в соответствующую ячейку и нажмите Исполнить.

    np.savetxt('trainvectors.csv',
               vectors.todense(),
               delimiter=',',
               fmt='%i')
    batch_prefix = '20newsgroups/batch'
    
    train_s3 = sess.upload_data('trainvectors.csv', 
                                bucket=bucket, 
                                key_prefix='{}/train'.format(batch_prefix))
    print(train_s3)
    batch_output_path = 's3://{}/{}/test'.format(bucket, batch_prefix)
    
    ntm_transformer = ntm.transformer(instance_count=1,
                                      instance_type ='ml.m4.xlarge',
                                      output_path=batch_output_path
                                     )
    ntm_transformer.transform(train_s3, content_type='text/csv', split_type='Line')
    ntm_transformer.wait()
    

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

    !aws s3 cp --recursive $ntm_transformer.output_path ./
    !head -c 5000 trainvectors.csv.out

    Готово! Модель преобразовала каждый документ в обучающие векторы с размерностью NUM_TOPICS. Теперь можно изучить модель темы.

  • Шаг 3. Исследование модели темы

    Одним из подходов к исследованию выходных данных модели является визуализация векторов тем, созданных с использованием диаграммы T-SNE. T-SNE или t-распределенное стохастическое встраивание соседей – это нелинейный метод сокращения размерности, который гарантирует, что расстояние между двумя ближайшими соседями в исходном пространстве с несколькими измерениями сохраняется в полученном пространстве с меньшим их количеством. Если указать размерность 2, его можно использовать как инструмент визуализации векторов тем в двумерном пространстве.

    Скопируйте следующий код в блокнот Jupyter и нажмите Исполнить.

    from sklearn.manifold import TSNE
    time_start = time.time()
    tsne = TSNE(n_components=2, verbose=1, perplexity=50, n_iter=5000)
    tsne_results = tsne.fit_transform(predictions)
    print('t-SNE done! Time elapsed: {} seconds'.format(time.time()-time_start))
    tsnedf = pd.DataFrame()
    tsnedf['tsne-2d-one'] = tsne_results[:,0]
    tsnedf['tsne-2d-two'] = tsne_results[:,1]
    tsnedf['Topic']=topicnames
    plt.figure(figsize=(25,25))
    sns.lmplot(
        x="tsne-2d-one", y="tsne-2d-two",
        hue='Topic',
        palette=sns.color_palette("hls", NUM_TOPICS),
        data=tsnedf,
        legend="full",
        fit_reg=False
    )
    plt.axis('Off')
    plt.show()

    На диаграмме TSNE должны быть показаны некоторые крупные кластеры тем, как на следующем рисунке. Подобные диаграммы можно использовать для извлечения количества кластеров различных тем, представленных в наборе. На данный момент NUM_TOPICS имеет значение 30, но существует большее количество тем, которые расположены рядом на диаграмме TSNE и могут быть объединены в одну. В конце концов, поскольку моделирование тем является проблемой неконтролируемого обучения, необходимо использовать подобные визуализации, чтобы определить правильное количество тем, на которые требуется разделить набор данных.

    Поэкспериментируйте с различными темами, чтобы узнать, как могут выглядеть визуализации.


В этом модуле вы получили алгоритм нейронной модели темы (NTM) Amazon SageMaker из Amazon ECR. Вы указали специфические гиперпараметры для алгоритма и предоставили корзину Amazon S3 для хранения артефактов. Затем вы развернули модель в конечной точке с помощью сервисов хостинга Amazon SageMaker или пакетного преобразования. Потом вы исследовали модель, указывая различное количество тем.

В следующем модуле вы обучите и развернете модель рекомендаций по контенту.