Dans ce module, vous utilisez l'algorithme Amazon SageMaker NTM (Neural Topic Model) pour entraîner le modèle de rubrique.

Amazon SageMaker NTM est un algorithme d'entraînement non supervisé qui est utilisé pour organiser un corpus de documents en rubriques qui contiennent des groupes de mots en fonction de leur distribution statistique. Les documents qui contiennent des occurrences fréquentes de mots tels que « bike », « car », « train », « mileage » et « speed » sont susceptibles de partager une rubrique sur « transportation », par exemple. La modélisation de rubriques peut être utilisée pour classer ou résumer des documents en fonction des rubriques détectées ou pour récupérer des informations ou recommander du contenu en fonction des similitudes de rubriques. Les rubriques des documents que NTM apprend sont caractérisées comme une représentation latente parce que les rubriques sont déduites des distributions de mots observées dans le corpus. La sémantique des rubriques est généralement déduite en examinant les mots les mieux classés qu'ils contiennent. Étant donné que la méthode n'est pas supervisée, le nombre de rubriques – et non pas les rubriques elles-mêmes – est prédéfini. Il n'est en outre pas garanti que les rubriques s'alignent sur la façon dont un être humain pourrait naturellement classer les documents.

Dans les étapes suivantes, spécifiez votre algorithme NTM pour la tâche d'entraînement, définissez l'infrastructure du modèle, spécifiez les valeurs des hyperparamètres pour optimiser le modèle et exécutez le modèle. Déployez ensuite le modèle sur un point de terminaison géré par Amazon SageMaker pour effectuer des prédictions.

Durée du module : 20 minutes


  • Étape 1. Créer et exécuter la tâche d'entraînement

    Les algorithmes intégrés d'Amazon SageMaker sont stockés sous forme de conteneurs Docker dans Amazon Elastic Container Registry (Amazon ECR). Pour l'entraînement des modèles, commencez par spécifier, pour le conteneur NTM dans Amazon ECR, l'emplacement le plus proche de votre région.

    Allez dans votre instance de bloc-notes, puis copiez et collez le code suivant dans une nouvelle cellule de code. Choisissez ensuite Exécuter.

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

    Le kit SDK Python Amazon SageMaker contient l'estimateur sagemaker.estimator.Estimator. Cet estimateur vous permet de spécifier l'infrastructure (type d'instance Amazon EC2, nombre d'instances, hyperparamètres, chemin de sortie et, éventuellement, tous les paramètres liés à la sécurité – notamment Virtual Private Cloud (VPC), des groupes de sécurité, etc. – qui peuvent être pertinents si nous entraînons notre modèle dans un VPC personnalisé de notre choix, par opposition à un Amazon VPC. L'algorithme NTM tire pleinement parti du matériel GPU. En règle générale, il s'entraîne plus rapidement sur une GPU que sur une CPU, pour donner un ordre de grandeur approximatif. L'entraînement multi-GPU ou multi-instance améliore encore la vitesse d'entraînement de façon à peu près linéaire si la surcharge de communication est faible par rapport au temps de calcul.

    Pour créer une instance de la classe sagemaker.estimator.Estimator, copiez et collez le code suivant dans une nouvelle cellule de code et choisissez Exécuter.

    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)
    

    À partir de ce moment, vous pouvez définir les hyperparamètres du modèle de rubrique :

    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 propose deux modes pour les canaux de données :

    • FullyReplicated : tous les fichiers de données sont copiés vers tous les travaux.
    • ShardedByS3Key : les fichiers de données sont répartis entre les différents travaux, c'est-à-dire que chaque travail reçoit une partie différente de l'ensemble de données complet.

    Au moment de la rédaction de ce document, le kit SDK Python Amazon SageMaker utilise par défaut le mode FullyReplicated pour tous les canaux de données. Lorsque vous utilisez plusieurs travaux, ce mode est souhaitable pour le canal de validation (test), mais pas aussi efficace pour le canal d'entraînement.

    Dans ce cas, pensez à faire passer chaque travail par une partie différente de l'ensemble de données afin de fournir des gradients différents au sein des époques. Spécifiez la que distribution doit être ShardedByS3Key pour le canal de données d'entraînement comme suit.

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

    La sortie suivante doit s'afficher dans votre terminal :

    Completed - Training job completed

    Bravo ! Vous avez entraîné votre modèle de rubrique avec l'algorithme NTM.

    Dans l'étape suivante, vous déployez votre modèle sur les services d'hébergement Amazon Sagemaker.

  • Étape 2. Déployer le modèle de rubrique

    Un modèle auto entraîné est simplement un fichier tar composé des modérations de modèle et ne fait rien de lui même. Vous devez le déployer pour le rendre utile et obtenir des prédictions.

    Il existe deux façons de déployer le modèle dans Amazon SageMaker, selon la façon dont vous souhaitez générer des inférences :

    • Pour obtenir une seule inférence à la fois, configurez un point de terminaison persistant à l'aide des services d'hébergement Amazon SageMaker.
    • Pour obtenir des inférences pour un ensemble de données entier, utilisez Amazon SageMaker Batch Transform.

    Cet exercice vous offre les deux options pour vous permettre de choisir la meilleure approche pour votre cas d'utilisation.

    Dans le cas des services d'hébergement Amazon SageMaker, un point de terminaison HTTP en direct réside sur une instance Amazon EC2 à laquelle vous pouvez transmettre une charge utile et obtenir des inférences.

    Lorsque vous déployez le modèle, vous appelez la méthode deploy de l'objet sagemaker.estimator.Estimator. Lorsque vous appelez la méthode deploy, vous spécifiez le nombre et le type d'instances de ML à utiliser pour héberger le point de terminaison.

    Copiez et collez le code suivant et choisissez Exécuter pour déployer le modèle.

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

    La méthode de déploiement crée le modèle déployable, configure le point de terminaison des services d'hébergement Amazon SageMaker et lance le point de terminaison pour héberger le modèle.

    Pour exécuter des inférences par rapport à un point de terminaison, vous devez vous assurer que la charge utile d'entrée est sérialisée dans un format que le modèle entraîné peut lire. Assurez-vous aussi que la sortie d'inférence est désérialisée dans un format convivial. Dans le code suivant, vous utilisez un utilitaire csv_serializer et un utilitaire json_deserializer qui envoient des données au format CSV (comme vecteurs) au modèle pour produire une sortie JSON.

    Copiez et collez le code suivant dans une cellule de code et choisissez Exécuter.

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

    Ensuite, extrayez les vecteurs de rubrique des données d'entraînement que vous utiliserez dans le modèle K-NN.

    Copiez et collez le code suivant dans une nouvelle cellule de code et choisissez Exécuter.

    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]
    

    Bravo ! Vous pouvez à présent explorer les résultats du modèle.

    Avec la transformation par lots, vous pouvez exécuter des inférences sur un lot de données à la fois. Amazon SageMaker crée l'infrastructure de calcul nécessaire et la détruit une fois la tâche par lots terminée.

    Le code de transformation par lots créé un objet sagemaker.transformer.Transformer depuis le modèle de rubrique. Ensuite, il appelle la méthode transform de l'objet pour créer une tâche de transformation. Lorsque vous créez l'objet sagemaker.transformer.Transformer, vous spécifiez le nombre et le type d'instances à utiliser pour effectuer la tâche de transformation par lots et l'emplacement dans Amazon S3 où vous souhaitez stocker les inférences.  

    Pour exécuter les inférences comme tâche par lots, copiez et collez le code suivant dans une nouvelle cellule de code et choisissez Exécuter.

    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()
    

    Une fois la tâche de transformation terminée, vous pouvez utiliser le code suivant pour télécharger les sorties vers votre instance de bloc-notes locale pour inspection.

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

    Bravo ! Le modèle a converti chaque document en vecteurs d'entraînement dimensionnels NUM_TOPICS. Maintenant, vous pouvez explorer le modèle de rubrique.

  • Étape 3. Explorer le modèle de rubrique

    Une approche pour explorer les sorties du modèle consiste à visualiser les vecteurs de rubrique générés à l'aide d'un graphique T-SNE. T-SNE, ou t-Distributed Stochastic Neighbor Embedding, est une technique non linéaire de réduction de dimension qui vise à garantir que la distance entre les plus proches voisins dans l'espace dimensionnel supérieur de départ est préservée dans l'espace dimensionnel inférieur d'arrivé. En fixant le nombre de dimensions à 2, il peut être utilisé comme outil de visualisation pour visualiser les vecteurs de rubrique dans l'espace 2D.

    Dans votre bloc-notes Jupyter, copiez et collez le code suivant dans une nouvelle cellule de code et choisissez Exécuter.

    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()

    Le graphique TSNE doit montrer de grands groupes de rubriques, comme sur l'image suivante. Ces types de graphiques peuvent être utilisés pour extraire le nombre de groupes de rubriques distinctes dans l'ensemble de données. Actuellement, NUM_TOPICS a la valeur 30, mais il semble que de nombreuses rubriques sont proches les unes des autres dans le graphique TSNE et peuvent être combinées pour former une seule rubrique. En fin de compte, comme la modélisation des rubriques est en grande partie un problème d'entraînement non supervisé, vous devez utiliser des visualisations de ce type pour déterminer le nombre approprié de rubriques pour partitionner l'ensemble de données.

    Essayez d'expérimenter différents nombres de rubriques pour savoir comment se présente la visualisation.


Dans ce module, vous avez récupéré l'algorithme Amazon SageMaker NTM (Neural Topic Model) d'Amazon ECR. Ensuite, vous avez spécifié des hyperparamètres spécifiques à l'algorithme et fourni le compartiment Amazon S3 pour le stockage des artefacts. Vous avez ensuite déployé le modèle sur un point de terminaison en utilisant les services d'hébergement Amazon SageMaker ou la transformation par lots. Enfin, vous avez exploré le modèle en utilisant différentes valeurs pour le nombre de rubriques.

Dans le module suivant, vous entraînez et déployez votre modèle de recommandation de contenu.