In diesem Modul verwenden Sie den integrierten Amazon SageMaker Neural Topic Model (NTM)-Algorithmus, um das Themenmodell zu schulen.

Amazon SageMaker NTM ist ein unbeaufsichtigter Lernalgorithmus, der beim Organisieren eines Dokumentenkorpus in Themen verwendet wird, die Wortgruppierungen basierend auf ihrer statistischen Verteilung enthalten. Beispielsweise werden Dokumente, in den die Wörter wie z. B. "Fahrrad", "Auto", "Zug", "Meilen" und "Geschwindigkeit" häufig auftreten, wahrscheinlich zum Thema "Transport" gehören. Die Themenmodellierung kann verwendet werden, um basierend auf den erkannten Themen Dokumente zu klassifizieren oder zusammenzufassen oder Informationen abzurufen oder basierend auf Themenähnlichkeiten Inhalte zu empfehlen. Die Themen aus Dokumenten, die NTM lernt, werden als latente Darstellung charakterisiert, da die Themen aus den beobachteten Wortverteilungen im Korpus abgeleitet werden. Die Semantik von Themen wird in der Regel durch die Untersuchung der hochgestellten Wörter abgeleitet, die sie enthalten. Da die Methode nicht überwacht wird, wird nur die Anzahl der Themen (nicht die Themen selbst) vorab angegeben. Darüber hinaus wird es nicht garantiert, dass die Themen an Dokumente so angleichen, wie ein Mensch diese natürlich kategorisieren.

In den folgenden Schritten geben Sie den NTM-Algorithmus für den Trainingsauftrag, die Infrastruktur für das Modell an, setzen die Hyperparameterwerte fest, um das Modell zu optimieren, und führen das Modell aus. Anschließend stellen Sie das Modell auf einem Endpunkt bereit, der von Amazon SageMaker verwaltet wird, um Prognosen vorzunehmen.

Veranschlagte Zeit für das Modul: 20 Minuten


  • Schritt 1. Erstellen und Ausführen des Trainingsauftrags

    Die integrierten Amazon SageMaker-Algorithmen werden als Docker-Container in Amazon Elastic Container Registry (Amazon ECR) gespeichert. Für Training des Modells müssen Sie zunächst in Amazon ECR den Speicherort des NTM-Containers angeben, der Ihrer Region am nächsten liegt.

    Kopieren Sie den folgenden Code in eine neue Codezelle in Ihre Notebook-Instance und wählen Sie Run aus.

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

    Das Amazon SageMaker Python SDK enthält den Schätzer sagemaker.estimator.Estimator. Mit diesem Schätzer können Sie die Infrastruktur (Amazon EC2-Instance-Typ, Anzahl der Instances, Hyperparameter, Ausgabepfad und optional alle sicherheitsbezogenen Einstellungen (Virtual Private Cloud (VPC), Sicherheitsgruppen usw.) angeben, die relevant sein können, wenn wir unser Modell im Gegensatz zu einer Amazon VPC in einer benutzerdefinierten VPC unserer Wahl schulen. Das NTM nutzt die GPU-Hardware völlig aus und im Allgemeinen schult eine Größenordnung schneller auf einer GPU als auf einer CPU. Multi-GPU- oder Multi-Instance-Training verbessert die Trainingsgeschwindigkeit etwa linear, wenn der Kommunikationsaufwand im Vergleich zur Rechenzeit gering ist.

    Um eine Instanz der Klasse sagemaker.estimator.Estimator zu erstellen, kopieren Sie den folgenden Code in eine neue Codezelle und wählen Sie Run aus.

    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)
    

    Jetzt können Sie die Hyperparameter für das Themenmodell festsetzen:

    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 bietet zwei Modi für Datenkanäle:

    • FullyReplicated: Alle Datendateien werden für alle Auftragnehmer kopiert.
    • ShardedByS3Key: Datendateien werden an verschiedene Auftragnehmer geshardt, d. h., jeder Auftragnehmer erhält einen anderen Teil des vollständigen Datensatzes.

    Zum Zeitpunkt des Schreibens verwendet das Amazon SageMaker Python SDK standardmäßig den FullyReplicated-Modus für alle Datenkanäle. Dieser Modus ist für den Validierungskanal (Testkanal) erwünscht, aber nicht so effizient für den Trainingskanal, wenn Sie mehrere Auftragnehmer verwenden.

    In diesem Fall soll jeder Auftragnehmer einen anderen Teil des vollständigen Datensatzes durchgehen, um unterschiedliche Gradienten innerhalb von Epochen bereitzustellen. Sie geben die Verteilung als ShardedByS3Key für den Trainingsdatenkanal wie folgt an.

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

    Sie sollten die folgende Ausgabe in Ihrem Terminal sehen:

    Completed - Training job completed

    Erfolg! Sie haben Ihr Themenmodell mit dem NTM-Algorithmus geschult.

    Im nächsten Schritt stellen Sie Ihr Modell für Amazon Sagemaker-Hostingdienste bereit.

  • Schritt 2. Bereitstellen des Themenmodells

    Ein geschultes Modell ist selbst einfach eine Tar-Datei, die aus den Modellgewichtungen besteht und allein nichts bewirkt. Um das Modell nützlich zu machen und Prognosen zu erhalten, müssen Sie das Modell bereitstellen.

    Es gibt zwei Möglichkeiten, das Modell in Amazon SageMaker bereitzustellen, je nachdem, wie Sie Inferenzen generieren möchten:

    • Um jeweils eine Inferenz zu erhalten, richten Sie einen persistenten Endpunkt mit Amazon SageMaker-Hostingdiensten ein.
    • Um Inferenz für einen gesamten Datensatz zu erhalten, verwenden Sie Amazon SageMaker Batch Transform.

    Diese Übung bietet Ihnen beide Optionen, um den besten Ansatz für Ihren Anwendungsfall auszuwählen.

    Bei Amazon SageMaker-Hostingdiensten befindet sich ein Live-HTTPs-Endpunkt in einer Amazon EC2-Instance, an die Sie eine Nutzlast übergeben und Inferenzen abrufen können.

    Wenn Sie das Modell bereitstellen, rufen Sie die Bereitstellungs-Methode des Objekts sagemaker.estimator.Estimator auf. Wenn Sie die Bereitstellungs-Methode aufrufen, geben Sie die Anzahl und den Typ der ML-Instanzen an, die Sie zum Hosten des Endpunkts verwenden möchten.

    Kopieren Sie den folgenden Code und wählen Sie Run aus, um das Modell bereitzustellen.

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

    Die Bereitstellungsmethode erstellt das bereitstellungsfähige Modell, konfiguriert den Amazon SageMaker-Hostingdienste-Endpunkt und startet den Endpunkt zum Hosten des Modells.

    Um Inferenzen auf einen Endpunkt auszuführen, müssen Sie sicherstellen, dass die Eingabenutzlast in einem Format serialisiert wird, das das geschulte Modell lesen kann, und die Inferenzausgabe in ein von Menschen lesbares Format deserialisiert wird. Im folgenden Code verwenden Sie einen csv_serializer und einen json_deserializer, der die CSV-formatierte Daten (als Vektoren) an das Modell übergibt, um JSON-Ausgabe zu erzeugen.

    Kopieren Sie den folgenden Code in eine Codezelle und wählen Sie Run aus.

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

    Extrahieren Sie dann die Themenvektoren für die Trainingsdaten, die Sie im K-NN-Modell verwenden.

    Kopieren Sie den folgenden Code in eine neue Codezelle und wählen Sie Run aus.

    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]
    

    Erfolg! Jetzt können Sie die Modellausgaben erkunden.

    Mit Batch Transform können Sie Inferenzen auf einen Datenstapel gleichzeitig ausführen. Amazon SageMaker erstellt die erforderliche Verarbeitungsinfrastruktur und reißt sie ab, sobald der Batch-Job abgeschlossen ist.

    Der Batch Transform-Code erstellt ein Objekt sagemaker.transformer.Transformer aus dem Themenmodell. Anschließend ruft es die Transform-Methode dieses Objekts auf, um einen Transform-Auftrag zu erstellen. Wenn Sie das Objekt sagemaker.transformer.Transformer erstellen, geben Sie die Anzahl und den Typ der Instances an, die zum Ausführen des Batch Transform-Auftrags verwendet werden sollen, sowie den Speicherort in Amazon S3, an dem Sie die Inferenzen speichern möchten.  

    Um Inferenzen als Batch-Job auszuführen, kopieren Sie den folgenden Code in eine Codezelle und wählen Sie Run aus.

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

    Sobald der Transform-Auftrag abgeschlossen ist, können Sie den folgenden Code verwenden, um die Ausgaben zur Überprüfung zurück in Ihre lokale Notebook-Instance herunterzuladen.

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

    Erfolg! Das Modell hat jedes Dokument in NUM_TOPICS dimensionalen Trainingsvektoren konvertiert. Sie können nun das Themenmodell erkunden.

  • Schritt 3. Erkunden des Themenmodells

    Ein Ansatz zum Erkunden der Modellausgaben besteht darin, die mit einem T-SNE-Diagramm generierten Themenvektoren zu visualisieren. Ein T-SNE oder t-Distributed Stochastic Neighbor Embedding ist eine nichtlineare Technik zur Dimensionsreduktion. Dabei wird sichergestellt, dass die Entfernung zwischen den nächstgelegenen Nachbarn vom ursprünglichen hochdimensionalen Raum im resultierenden niedrigdimensionalen Raum erhalten bleibt. Durch Festsetzen der Anzahl der Dimensionen auf 2 kann es als Visualisierungstool verwendet werden, um die Themenvektoren im 2D-Raum zu visualisieren.

    Kopieren Sie den folgenden Code in eine neue Codezelle in Ihr Jupyter-Notebook und wählen Sie Run aus.

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

    Das TSNE-Diagramm soll einige große Themencluster wie das folgende Bild anzeigen. Diagramme wie diese können verwendet werden, um die Anzahl der unterschiedlichen Themencluster in den Datensatz zu extrahieren. Derzeit ist NUM_TOPICS auf 30 festgesetzt, aber es gibt wahrscheinlich eine Menge Themen, die im TSNE-Diagramm nahe beieinander liegen und zu einem einzigen Thema zusammengefasst werden können. Da die Themenmodellierung weitgehend ein unbeaufsichtigtes Lernproblem darstellt, müssen Sie Visualisierungen wie diese verwenden, um festzulegen, in welche Anzahl von Themen der Datensatz partitioniert werden soll.

    Experimentieren Sie mit verschiedenen Themenanzahlen, um zu sehen, wie die Visualisierung aussieht.


In diesem Modul haben Sie den Amazon SageMaker Neural Topic Model (NTM)-Algorithmus von Amazon ECR abgerufen. Anschließend haben Sie algorithmenspezifische Hyperparameter angegeben und den Amazon S3-Bucket für die Artefaktspeicherung bereitgestellt. Als Nächstes haben Sie das Modell mithilfe von Amazon SageMaker-Hostingdiensten oder Batch Transform auf einem Endpunkt bereitgestellt. Schließlich haben Sie das Modell anhand verschiedener Werte für die Themenanzahl erkundet.

Im nächsten Modul schulen und stellen Sie Ihr Inhaltsempfehlungsmodell bereit.