In questo modulo, userai l'Algoritmo integrato Amazon SageMaker NTM (Neural Topic Model) per addestrare il tuo modello di argomento.

Amazon SageMaker NTM è un algoritmo di apprendimento non supervisionato che viene utilizzato per organizzare un corpus di documenti in argomenti che contengono raggruppamenti di parole in base alla distribuzione statistica. I documenti che contengono frequenti occorrenze di parole come "bici", "auto", "treno", "chilometraggio" e "velocità" potrebbero condividere un argomento sul "trasporto", ad esempio. Puoi utilizzare la modellazione degli argomenti per classificare o riepilogare i documenti in base agli argomenti rilevati o per recuperare informazioni o consigliare i contenuti in base alle somiglianze tra argomenti. Gli argomenti dei documenti che NTM apprende sono caratterizzati come una rappresentazione latente perché gli argomenti sono dedotti dalle distribuzioni di parole osservate nel corpus. La semantica degli argomenti solitamente viene dedotta esaminando le parole più importanti che contengono. Dato che il metodo non è supervisionato, viene specificato solo il numero di argomenti e non gli argomenti stessi. Inoltre, non è possibile garantire l'allineamento degli argomenti con la capacità umana di categorizzare naturalmente i documenti.

Nei passaggi seguenti, specifichi l'algoritmo NTM per l'addestramento e l'infrastruttura del modello, quindi imposti i valori degli iperparametri per ottimizzare il modello ed eseguirlo. Dopodiché, distribuisci il modello a un endpoint gestito da Amazon SageMaker per effettuare previsioni.

Tempo necessario per completare il modulo: 20 minuti


  • Fase 1. Creazione ed esecuzione dell'attività di addestramento

    Gli algoritmi integrati di Amazon SageMaker sono archiviati come container Docker in Amazon Elastic Container Registry (Amazon ECR). Per addestrare un modello, devi per prima cosa specificare la posizione del container NTM in Amazon ECR più vicina alla tua regione.

    Nella tua istanza notebook, copia e incolla il codice seguente in una nuova cella di codice e seleziona Esegui.

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

    L'SDK Python di Amazon SageMaker include lo strumento di stima sagemaker.estimator.Estimator. Questo strumento di stima ti consente di specificare l'infrastruttura (tipo di istanza Amazon EC2, numero di istanze, iperparametri, percorso di output e, in alternativa, tutte le impostazioni inerenti alla sicurezza (Virtual Private Cloud (VPC), gruppi di sicurezza, ecc.) che potrebbero essere rilevanti nel caso in cui il modello venga addestrato in un VPC personalizzato di nostra scelta, anziché nel VPC di Amazon. Il modello NTM sfrutta tutti i benefici dell'hardware GPU e, in generale, addestra un ordine di grandezza in modo più rapido su una GPU rispetto a una CPU. L'addestramento di più istanze o GPU migliora ulteriormente la velocità di addestramento in modo abbastanza lineare se il sovraccarico di comunicazione è ridotto rispetto al tempo di elaborazione.

    Per creare un'istanza della classe sagemaker.estimator.Estimator, copia e incolla il codice seguente in una nuova cella di codice e seleziona Esegui.

    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)
    

    Ora, puoi impostare gli iperparametri per il modello di argomento:

    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 ti offre due modalità per i canali dati:

    • FullyReplicated: tutti i file dati vengono copiati per tutti i lavoratori.
    • ShardedByS3Key: i file dati sono partizionati tra i vari lavoratori, in altre parole ogni lavoratore riceve una porzione diversa di set di dati completa.

    In fase di scrittura, per impostazione predefinita, l'SDK Python di Amazon SageMaker utilizza la modalità FullyReplicated per tutti i canali dati. Questa modalità è auspicabile per canali (test) di convalida, ma non è altrettanto efficiente per i canali di addestramento, se intendi affidarti a più lavoratori.

    In questo caso, desideri che ogni lavoratore si occupi di una porzione di set di dati completi diversa per fornire gradienti diversi nelle epoche. Specifichi la modalità ShardedByS3Key per la distribuzione del canale dati di addestramento come illustrato di seguito.

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

    Dovresti visualizzare l'output seguente nel terminale:

    Completed - Training job completed

    Operazione riuscita. Hai addestrato il modello di argomento con l'algoritmo NTM.

    Nella fase successiva, distribuirai il modello nei servizi di hosting di Amazon SageMaker.

  • Fase 2. Distribuzione di un modello di argomento

    Un modello addestrato non è altro che un file tar composto dal peso del modello e non è in grado di eseguire nessuna azione da solo. Distribuendolo, il modello ti sarà utile e potrà effettuare stime.

    Ci sono due modalità per distribuire un modello in Amazon SageMaker, in base a come vuoi generare le inferenze:

    • Per ottenere un'inferenza per volta, configura un endpoint persistente tramite i servizi di hosting di Amazon SageMaker.
    • Per ottenere interferenze per un set di dati completo, usa la trasformazione in batch di Amazon SageMaker.

    Questo corso ti illustrerà entrambe le modalità. In questo modo, potrai scegliere l'approccio che meglio si addice al tuo caso d'uso.

    Nel caso dei servizi di hosting di Amazon SageMaker, un endpoint HTTPs live avvia l'istanza Amazon EC2 a cui puoi trasferire il payload e da cui ottenere le inferenze.

    Durante la distribuzione del modello, richiami il metodo di distribuzione dell'oggetto sagemaker.estimator.Estimator. Richiamando il metodo di distribuzione, specifichi il numero e il tipo di istanze di machine learning che desideri usare per ospitare l'endpoint.

    Copia e incolla il seguente codice e seleziona Esegui per distribuire il modello.

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

    Il metodo di distribuzione crea un modello distribuibile, configura l'endpoint dei servizi di hosting di Amazon SageMaker e avvia l'endpoint per ospitare il modello.

    Per eseguire le inferenze rispetto a un endpoint, devi assicurarti che il payload in entrata sia serializzato in un formato leggibile dal modello addestrato e che l'output di inferenza sia deserializzato in un formato leggibile dall'uomo. Nel codice seguente, usi csv_serializer e json_deserializer per trasferire i dati formattati CSV (come vettori) al modello per produrre un output JSON.

    Copia e incolla il codice seguente in una cella di codice e seleziona Esegui.

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

    Quindi, estrai i vettori di argomento per i dati di addestramento che userai nel modello K-NN.

    Copia e incolla il codice seguente in una nuova cella di codice e seleziona Esegui.

    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]
    

    Operazione riuscita. Ora puoi esplorare gli output del modello.

    Con la trasformazione in batch, puoi eseguire le inferenze su un batch di dati simultaneamente. Amazon SageMaker crea l'infrastruttura di elaborazione necessaria e l'arresta al termine dell'attività di batch.

    Il codice di trasformazione in batch crea un oggetto sagemaker.transformer.Transformer a partire dal modello di argomento. Quindi, richiama il metodo di trasformazione dell'oggetto per creare un'attività di trasformazione. Quando crei l'oggetto sagemaker.transformer.Transformer , specifichi il numero e il tipo di istanze da utilizzare per eseguire l'attività di trasformazione in batch e la posizione in Amazon S3 in cui desideri memorizzare le inferenze.  

    Per eseguire le inferenze come attività di batch, copia e incolla il codice seguente in una cella di codice e seleziona Esegui.

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

    Al termine dell'attività di trasformazione, puoi usare il codice seguente per scaricare gli output nell'istanza del notebook locale per analizzarli.

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

    Operazione riuscita. Il modello ha convertito tutti i documenti in vettori di addestramento dimensionali NUM_TOPICS. Ora puoi esplorare un modello di argomento.

  • Fase 3. Esplorazione di un modello di argomento

    Un modo per esplorare gli output del modello è visualizzare i vettori di argomento generati tramite plot T-SNE. Per T-SNE (o t-Distributed Stochastic Neighbor Embedding) si intende una tecnica non lineare di riduzione della dimensionalità il cui scopo è garantire il mantenimento della distanza tra nearest neighbor nell'elevato spazio dimensionale originale nello spazio dimensionale inferiore ottenuto. Impostando il numero di dimensioni su 2, può essere usato come strumento di visualizzazione per visualizzare i vettori di argomento in uno spazio 2D.

    Nel tuo notebook Jupyter, copia e incolla il codice seguente in una nuova cella del codice e seleziona Esegui.

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

    Il plot T-SNE dovrebbe mostrarti cluster di argomenti di grandi dimensioni, come nell'immagine riportata di seguito. Puoi utilizzare plot come questi per estrarre il numero di cluster su vari argomenti nel set di dati. In questo momento, NUM-TOPICS è impostato su 30, ma risulta che alcuni argomenti sono vicini nel plot T-SNE e potrebbero essere combinati in un solo argomento. Infine, dato che la modellazione degli argomenti è principalmente un problema di apprendimento non supervisionato, devi usare viste come queste per determinare il numero adeguato di argomenti in cui suddividere il set di dati.

    Prova a sperimentare con numeri di argomenti diversi per vedere come appare la vista.


In questo modulo, hai recuperato l'algoritmo Amazon SageMaker NTM (Neural Topic Model) da Amazon ECR. Dopodiché, hai specificato gli iperparametri specifici dell'algoritmo e fornito il bucket di Amazon S3 per lo storage di artefatti. Quindi, hai distribuito il modello in un endpoint tramite i servizi di hosting o la trasformazione in batch di Amazon SageMaker. Infine, hai esplorato il modello usando diversi valori per il numero di argomenti.

Nel modulo seguente, addestrerai e distribuirai un modello di raccomandazione dei contenuti.