Dalam modul ini, Anda menggunakan Algoritme Neural Topic Model (NTM) Amazon SageMaker bawaan untuk melatih model topik.

NTM Amazon SageMaker adalah algoritme pembelajaran yang tidak diawasi yang digunakan untuk mengatur korpus dokumen ke dalam topik yang berisi pengelompokan kata berdasarkan distribusi statistiknya. Dokumen yang sering mengandung kata-kata seperti "sepeda", "mobil", "kereta api", "jarak tempuh", dan "kecepatan" cenderung berbagi topik tentang "transportasi" misalnya. Pemodelan topik dapat digunakan untuk mengklasifikasikan atau meringkas dokumen berdasarkan topik yang terdeteksi atau untuk mengambil informasi atau merekomendasikan konten berdasarkan kesamaan topik. Topik dari dokumen yang dipelajari oleh NTM digolongkan sebagai representasi laten karena topik tersebut disimpulkan dari distribusi kata yang diamati dalam korpus. Semantik topik biasanya disimpulkan dengan memeriksa kata-kata peringkat teratas yang dikandungnya. Karena metode ini tidak diawasi, hanya jumlah topik, bukan topik itu sendiri, yang ditentukan sebelumnya. Selain itu, topik tidak dijamin selaras dengan bagaimana manusia dapat secara alami mengelompokkan dokumen.

Dalam langkah berikut, Anda menentukan algoritme NTM untuk tugas pelatihan, menentukan infrastruktur untuk model, mengatur nilai hyperparameter untuk menyesuaikan model, dan menjalankan model. Kemudian, Anda menerapkan model ke titik akhir yang dikelola oleh Amazon SageMaker untuk membuat prediksi.

Waktu untuk Menyelesaikan Modul: 20 Menit


  • Langkah 1. Membuat dan menjalankan tugas pelatihan

    Algoritme Amazon SageMaker bawaan disimpan sebagai kontainer docker di Amazon Elastic Container Registry (Amazon ECR). Untuk pelatihan model, Anda harus terlebih dahulu menentukan lokasi kontainer NTM di Amazon ECR, yang terdekat dengan wilayah Anda.

    Di instans notebook Anda, salin dan tempel kode berikut ke sel kode baru dan pilih Jalankan.

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

    Python SDK Amazon SageMaker menyertakan penilai sagemaker.estimator.Estimator. Penilai ini memungkinkan Anda menentukan infrastruktur (jenis instans Amazon EC2, jumlah instans, hyperparameter, jalur output, dan secara opsional, semua pengaturan terkait keamanan (virtual private cloud (VPC), grup keamanan, dsb.) yang mungkin relevan jika kita melatih model kami dalam VPC khusus pilihan kami dan bukan VPC Amazon. NTM memanfaatkan sepenuhnya perangkat keras GPU, dan secara umum melatih dengan memperkirakan besarnya lebih cepat pada GPU daripada pada CPU. Pelatihan multi-GPU atau multi-instans selanjutnya meningkatkan kecepatan pelatihan secara linear jika overhead komunikasi rendah dibandingkan dengan waktu komputasi.

    Untuk membuat instans kelas sagemaker.estimator.Estimator, salin dan tempel kode berikut ke sel kode baru, dan pilih Jalankan.

    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)
    

    Sekarang Anda dapat menentukan hyperparameter untuk model topik:

    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 menawarkan dua mode untuk saluran data:

    • FullyReplicated: Semua file data disalin ke semua pekerja.
    • ShardedByS3Key: File data dipecah ke pekerja berbeda, yaitu setiap pekerja menerima bagian berbeda untuk dataset lengkap.

    Saat penulisan, secara default Python SDK Amazon SageMaker menggunakan mode FullyReplicated untuk semua saluran data. Mode ini disukai untuk saluran validasi (uji) tetapi tidak seefisien untuk saluran pelatihan, saat Anda menggunakan banyak pekerja.

    Dalam hal ini, Anda ingin setiap pekerja melewati bagian berbeda dari dataset lengkap untuk memberikan gradien yang berbeda di dalam epoch. Anda menentukan distribusi menjadi ShardedByS3Key untuk saluran data pelatihan sebagai berikut.

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

    Anda akan melihat output berikut di terminal Anda:

    Completed - Training job completed

    Berhasil! Anda telah melatih model topik dengan algoritme NTM.

    Di langkah berikutnya, Anda menerapkan model Anda ke layanan hosting Amazon SageMaker.

  • Langkah 2. Menerapkan model topik

    Model yang dilatih mandiri hanyalah sebuah file tar yang terdiri dari bobot model dan tidak melakukan apa-apa dengan sendirinya. Untuk membuat model berguna dan mendapatkan prediksi, Anda perlu menerapkan model.

    Ada dua cara untuk menerapkan model di Amazon SageMaker, tergantung bagaimana Anda ingin menghasilkan inferensi:

    • Untuk mendapatkan satu inferensi dalam sekali waktu, siapkan titik akhir yang persisten menggunakan layanan hosting Amazon SageMaker.
    • Guna mendapatkan inferensi untuk seluruh dataset, gunakan Batch Transform Amazon SageMaker.

    Lab ini memberikan opsi untuk Anda memilih pendekatan terbaik untuk kasus penggunaan Anda.

    Dalam hal layanan hosting Amazon SageMaker, titik akhir HTTP langsung aktif dengan instans Amazon EC2 yang dapat Anda berikan muatan dan memperoleh inferensi.

    Ketika Anda menerapkan model, Anda memanggil metode deploy di objek sagemaker.estimator.Estimator. Ketika Anda memanggil metode deploy, Anda menentukan jumlah dan jenis instans ML yang ingin digunakan untuk meng-hosting titik akhir.

    Salin dan tempel kode berikut dan pilih Jalankan untuk menerapkan model.

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

    Metode penerapan menciptakan model yang bisa diterapkan, mengonfigurasi titik akhir layanan hosting Amazon SageMaker, dan meluncurkan titik akhir untuk meng-hosting model.

    Untuk menjalankan inferensi terhadap titik akhir, Anda perlu memastikan bahwa muatan input diserialisasi dalam format yang dapat dibaca model yang dilatih, dan output inferensi dideserialisasi menjadi format yang dapat dibaca manusia. Dalam kode berikut, Anda menggunakan csv_serializer dan json_deserializer yang melewati data terformat CSV (sebagai vektor) ke model untuk menghasilkan output JSON.

    Salin dan tempelkan kode berikut ke sel kode dan pilih Jalankan.

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

    Berikutnya, ekstrak vektor topik untuk data pelatihan yang akan Anda gunakan di model K-NN.

    Salin dan tempelkan kode berikut ke sel kode baru dan pilih Jalankan.

    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]
    

    Berhasil! Sekarang, Anda dapat menjelajahi output model.

    Dengan batch transform, Anda dapat menjalankan inferensi pada batch data pada saat bersamaan. Amazon SageMaker menciptakan infrastruktur komputasi yang diperlukan dan membongkarnya setelah pekerjaan batch selesai.

    Kode batch transform menciptakan objek sagemaker.transformer.Transformer dari model topik. Kemudian, kode tersebut memanggil metode transform objek untuk membuat tugas transformasi. Ketika Anda membuat objek sagemaker.transformer.Transformer, Anda menentukan jumlah dan jenis instans yang akan digunakan untuk melakukan pekerjaan batch transform, dan lokasi di Amazon S3 tempat Anda ingin menyimpan inferensi.  

    Untuk menjalankan inferensi sebagai tugas batch, salin dan tempel kode berikut ke sel kode, lalu pilih Jalankan.

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

    Setelah tugas transformasi selesai, Anda dapat menggunakan kode berikut untuk mengunduh output kembali ke instans notebook lokal Anda untuk diperiksa.

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

    Berhasil! Model tersebut mengonversi setiap dokumen ke vektor pelatihan dimensional NUM_TOPICS. Anda kini dapat menjelajahi model topik.

  • Langkah 3. Jelajahi model topik

    Satu pendekatan untuk menjelajahi output model adalah untuk memvisualisasikan vektor topik yang dihasilkan menggunakan plit T-SNE. T-SNE, atau t-Distributed Stochastic Neighbor Embedding, adalah teknik nonlinear untuk pengurangan dimensi yang bertujuan untuk memastikan bahwa jarak antara nearest neighbor di ruang dimensi tinggi asli dipertahankan di ruang dimensi lebih rendah yang dihasilkan. Dengan mengatur jumlah dimensi ke 2, ini dapat digunakan sebagai alat visualisasi untuk memvisualisasikan vektor topik dalam ruang 2D.

    Di Jupyter notebook Anda, salin dan tempelkan kode berikut dan pilih Jalankan.

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

    Plot TSNE harus menampilkan beberapa klaster topik besar seperti gambar berikut. Plot seperti ini dapat digunakan untuk mengekstrak jumlah klaster topik yang berbeda dalam dataset. Saat ini, NUM_TOPICS diatur ke 30, tetapi tampaknya ada banyak topik yang berdekatan satu sama lain dalam plot TSNE dan dapat digabungkan menjadi satu topik tunggal. Pada akhirnya, karena pemodelan topik sebagian besar merupakan masalah pembelajaran yang tidak diawasi, Anda harus menggunakan visualisasi seperti ini untuk menentukan berapa jumlah topik yang tepat untuk menyekat dataset.

    Coba bereksperimen dengan nomor topik yang berbeda untuk melihat seperti apa visualisasi itu.


Dalam modul ini, Anda mengambil Algoritme Neural Topic Model (NTM) Amazon SageMaker dari Amazon ECR. Kemudian, Anda menentukan hyperparameter khusus algoritma dan menyediakan bucket Amazon S3 untuk penyimpanan artefak. Selanjutnya, Anda menerapkan model ke titik akhir menggunakan layanan hosting Amazon SageMaker atau batch transform. Akhirnya, Anda menjelajahi model menggunakan nilai yang berbeda untuk nomor topik.

Dalam modul berikutnya, Anda melatih dan menggunakan model rekomendasi konten Anda.