En este módulo, utilice un algoritmo de modelo de tema neuronal (NTM) de Amazon SageMaker a fin de entrenar el modelo de tema.

El NTM de Amazon SageMaker es un algoritmo de aprendizaje no supervisado que se utiliza para organizar un conjunto de documentos en temas que contengan grupos de palabras en función de la distribución estadística. Los documentos que contienen palabras que se repiten con frecuencia, como “bicicleta”, “vehículo”, “tren”, “kilometraje” y “velocidad” es probable que compartan un tema sobre “transporte”. El modelado de temas se puede utilizar para clasificar o resumir documentos en función de los temas detectados o a fin de recuperar información o contenido recomendado sobre la base de las similitudes del tema. Los temas de los documentos que el NTM aprende se caracterizan como una representación latente porque se infieren de la distribución de palabras observadas en el conjunto. La semántica de los temas generalmente se infiere al examinar las palabras más destacadas. Debido a que el método no es supervisado, solo el número de temas, no los temas en sí, se especifican previamente. Además, no se puede garantizar la correspondencia entre los temas y la forma en que un humano podría categorizar documentos de manera natural.

En los pasos siguientes, especificará el algoritmo NTM para el trabajo de entrenamiento, especificará la infraestructura del modelo y determinará los valores de los hiperparámetros a fin de ajustar y ejecutar el modelo. Luego, implemente el modelo en un punto de enlace administrado por Amazon SageMaker para hacer predicciones.

Tiempo para completar el módulo: 20 minutos


  • Paso 1. Cree y ejecute el trabajo de entrenamiento

    Los algoritmos integrados de Amazon SageMaker se almacenan como contenedores de Docker en Amazon Elastic Container Registry (Amazon ECR). Para entrenar el modelo, primero debe especificar la ubicación del contenedor NTM en Amazon ECR más cercano a su región.

    En la instancia del bloc de notas, copie y pegue el siguiente código en una nueva celda de código y elija Ejecutar.

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

    El SDK para Python de Amazon SageMaker incluye el estimador sagemaker.estimator.Estimator. El estimador le permite especificar la infraestructura (tipo de instancia Amazon EC2, número de instancias, hiperparámetros, ruta de salida y, de manera opcional, cualquier ajuste relacionado con la seguridad (nube virtual privada [VPC], grupos de seguridad, etc.) que puede ser relevante si estamos entrenando nuestro modelo en una VPC personalizada y no en una VPC de Amazon. El NTM aprovecha completamente el hardware de la GPU y, en general, entrena una orden de magnitud más rápidamente en una GPU que en una CPU. El entrenamiento en varias GPU o instancias mejora aún más la velocidad de entrenamiento de manera lineal si la sobrecarga de comunicación es baja con respecto al tiempo de cómputo.

    Para crear una instancia de clase sagemaker.estimator.Estimator, copie y pegue el siguiente código en una nueva celda de código y seleccione Ejecutar.

    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)
    

    Ahora, puede configurar los hiperparámetros para el modelo de tema:

    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 ofrece dos modelos de canales de datos:

    • FullyReplicated: todos los archivos de datos se copian para todos los empleados.
    • ShardedByS3Key: los archivos de datos se comparten con diferentes empleados, es decir, cada uno recibe una porción distinta del conjunto de datos completo.

    En el momento de escribir, de manera predeterminada, el SDK para Python de Amazon SageMaker utiliza el modo FullyReplicated para todos los canales de datos. Se prefiere este modo para el canal de validación (prueba), pero no es tan eficaz para el canal de entrenamiento cuando se utilizan varios empleados.

    En este caso, cada empleado debe pasar por una porción diferente del conjunto de datos completo para ofrecer diferentes gradientes dentro de una época. Especifique la distribución ShardedByS3Key para el canal de datos de entrenamiento de la siguiente manera.

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

    En el terminal debería ver los siguientes resultados:

    Completed - Training job completed

    ¡Correcto! Ha entrenado su modelo de tema con el algoritmo NTM.

    En el paso siguiente, implemente el modelo para los servicios de alojamiento de Amazon Sagemaker.

  • Paso 2. Implemente el modelo de tema

    Un modelo entrenado por sí mismo es simplemente un archivo tar que consta de los pesos del modelo y no hace nada por sí solo. A fin de que este modelo sea útil y obtenga las predicciones, debe implementarlo.

    Existen dos maneras de implementar el modelo en Amazon SageMaker, según cómo desee generar las inferencias:

    • Para obtener una inferencia a la vez, configure un punto de enlace persistente con los servicios de alojamiento de Amazon SageMaker.
    • A fin de obtener inferencias para un conjunto de datos completo, utilice la transformación por lotes de Amazon SageMaker.

    Este laboratorio ofrece ambas opciones con la finalidad de que elija el mejor enfoque para su caso de uso.

    En el caso de los servicios de alojamiento de Amazon SageMaker, hay un punto de enlace HTTP en directo en una instancia de Amazon EC2 a la cual puede pasar una carga útil y obtener inferencias.

    Cuando implementa el modelo, llama el método de implementación del objeto sagemaker.estimator.Estimator. Cuando llama el método de implementación, especifica el número y tipo de instancias de aprendizaje automático que desea utilizar para alojar el punto de enlace.

    Para implementar el modelo, copie y pegue el siguiente código y elija Ejecutar.

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

    El método de implementación crea un modelo implementable, configura el punto de enlace de los servicios de alojamiento de Amazon SageMaker y lanza el punto de enlace para alojar el modelo.

    Para ejecutar las inferencias en un punto de enlace, debe garantizar que la carga útil de entrada se serialice en un formato que el modelo de entrenamiento pueda leer y que la inferencia de salida se deserialice en un formato que pueda ser leído por seres humanos. En el siguiente código, utiliza un serializador_csv y un deserializador_json que pasa los datos en formato CSV (como vectores) al modelo para producir una salida JSON.

    Copie y pegue el siguiente código en una nueva celda de código y elija Ejecutar.

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

    A continuación, extraiga los vectores del tema para los datos de entrenamiento que utilizará en el modelo K-NN.

    Copie y pegue el siguiente código en una nueva celda de código y elija Ejecutar.

    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]
    

    ¡Correcto! Ahora, puede explorar las salidas del modelo.

    Con la transformación en lotes, puede ejecutar inferencias en un lote de datos a la vez. Amazon SageMaker crea la infraestructura informática necesaria y la deshecha una vez que el trabajo en lote se completó.

    El código de transformación en lotes crea un objeto sagemaker.transformer.Transformer del modelo de tema. Luego, llama al método de transformación del objeto para crear un trabajo de transformación. Al crear el objeto sagemaker.transformer.Transformer, especifica el número y tipo de instancias que desea utilizar a fin de realizar un trabajo de transformación en lotes así como la ubicación de Amazon S3 donde desea almacenar las inferencias.  

    Para ejecutar las inferencias como un trabajo en lotes, copie y pegue el siguiente código en una nueva celda de código y elija Ejecutar.

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

    Una vez que se llevó a cabo el trabajo de transformación, puede utilizar el siguiente código para descargar las salidas nuevamente en la instancia de bloc de notas local a fin de inspeccionarlas.

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

    ¡Correcto! El modelo convirtió cada documento en vectores de entrenamiento dimensional NUM_TOPICS. Ahora puede explorar el modelo de tema.

  • Paso 3. Explore el modelo de tema

    Un enfoque para explorar las salidas del modelo es visualizar los vectores de temas generados con un plot T-SNE. Un T-SNE o incrustación estocástica de vecinos distribuidos en t, es una técnica no lineal para la reducción de la dimensionalidad que tiene por objetivo garantizar que la distancia entre el vecino más cercano en el espacio dimensional original alto se preserve en el espacio dimensional más bajo. Al configurar en 2 el número de dimensiones, puede utilizarse como una herramienta de visualización de vectores de tema en espacio 2D.

    En su bloc de notas de Jupyter, copie y pegue el siguiente código en una nueva celda de código y elija Ejecutar.

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

    El plot TSNE debe mostrar algunos clústeres de temas grandes como la imagen a continuación. Plots como estos se pueden utilizar para extraer el número de diferentes clústeres de tema en el conjunto de datos. Actualmente, NUM_TOPICS se configura en 30, pero parece haber muchos temas cercanos unos de otros en el plot TSNE y se pueden combinar en un tema único. Finalmente, como el modelado de temas es mayormente un problema de aprendizaje no supervisado, debe utilizar visualizaciones como estas para determinar cuál es el número correcto de temas en que se debe dividir el conjunto de datos.

    Pruebe experimentar con diferentes números de temas para ver cómo es la visualización.


En este módulo, obtuvo de Amazon ECR el algoritmo del modelo de tema neuronal (NTM) de Amazon SageMaker. Luego, determinó los hiperparámetros específicos del algoritmo y proporcionó el bucket de Amazon S3 para almacenar artefactos. Luego, implementó el modelo en un punto de enlace con los servicios de alojamiento de Amazon SageMaker o la transformación en lotes. Finalmente, exploró el modelo con diferentes valores para el número de temas.

En el próximo módulo, entrene e implemente el modelo de recomendación de contenido.