Trong mô-đun này, bạn sẽ dùng Thuật toán mô hình chủ đề nơ-ron (NTM) Amazon SageMaker tích hợp để huấn luyện mô hình chủ đề.

Amazon SageMaker NTM là thuật toán học không giám sát, được dùng để sắp xếp tập ngữ liệu trong các tài liệu thành những chủ đề chứa các nhóm từ được phân chia dựa trên phân phối thống kê. Ví dụ: các tài liệu chứa những từ xuất hiện nhiều lần như "xe đạp", "ô tô", "tàu hỏa", "quãng đường" và "vận tốc" thì có khả năng cao sẽ thuộc chủ đề "giao thông". Kỹ thuật tạo mô hình chủ đề có thể được dùng để phân loại hoặc tóm tắt tài liệu dựa trên những chủ đề phát hiện được, hoặc dùng để truy xuất dữ liệu hay đề xuất nội dung dựa trên những sự tương đồng về chủ đề. Các chủ đề của những tài liệu mà NTM học hỏi sẽ được biểu diễn dưới dạng ẩn vì các chủ đề này được suy diễn từ các phân phối từ ngữ quan sát được trong tập ngữ liệu. Ngữ nghĩa học của các chủ đề thường được suy luận bằng cách kiểm tra những từ xếp hạng cao nhất có trong đó. Do đây là phương pháp học không giám sát, nên chỉ có thể xác định trước số lượng chủ đề, chứ không phải chính chủ đề. Ngoài ra, không có gì đảm bảo các chủ đề này sẽ thống nhất với cách phân loại tài liệu thông thường của con người.

Trong các bước tiếp theo, bạn sẽ xác định thuật toán NTM cho tác vụ đào tạo, xác định cơ sở hạ tầng cho mô hình, đặt giá trị siêu tham số để tinh chỉnh mô hình và chạy mô hình. Sau đó, bạn sẽ triển khai mô hình cho một điểm cuối do Amazon SageMaker quản lý để đưa ra dự đoán.

Thời gian hoàn thành mô-đun: 20 phút


  • Bước 1. Tạo và chạy tác vụ đào tạo

    Các thuật toán Amazon SageMaker tích hợp được lưu trữ dưới dạng bộ chứa docker trong Amazon Elastic Container Registry (Amazon ECR). Để đào tạo mô hình, trước tiên bạn phải xác định vị trí của bộ chứa NTM trong Amazon ECR sao cho gần nhất với khu vực của bạn.

    Trong phiên bản sổ ghi chép, hãy sao chép và dán đoạn mã sau vào một ô mã mới rồi chọn Chạy.

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

    Amazon SageMaker Python SDK chứa trình ước lượng sagemaker.estimator.Estimator. Trình ước lượng này cho phép bạn xác định cơ sở hạ tầng (loại phiên bản Amazon EC2, số lượng phiên bản, siêu tham số, đường dẫn đầu ra và mọi cài đặt liên quan đến bảo mật (không bắt buộc) như đám mây riêng ảo (VPC), nhóm bảo mật, v.v.) có thể liên quan nếu chúng ta đào tạo mô hình trong một VPC ảo tùy chỉnh tự chọn chứ không phải VPC của Amazon. NTM tận dụng tối đa phần cứng GPU và nhìn chung có tốc độ đào tạo trên GPU nhanh hơn gấp khoảng 10 lần so với trên CPU. Khi đào tạo trên nhiều GPU hoặc nhiều phiên bản, tốc độ đào tạo sẽ cải thiện đáng kể, gần như theo tuyến tính nếu chi phí chung cho việc liên lạc thấp hơn so với thời gian điện toán.

    Để tạo một phiên bản của lớp sagemaker.estimator.Estimator, hãy sao chép và dán đoạn mã sau và một ô mã mới rồi chọn Chạy.

    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)
    

    Bây giờ, bạn có thể đặt các siêu tham số cho mô hình chủ đề:

    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 có 2 chế độ dành cho kênh các dữ liệu:

    • FullyReplicated: Tất cả các tệp dữ liệu đều được sao chép cho toàn bộ nhân công.
    • ShardedByS3Key: Các tệp dữ liệu được phân mảnh cho những nhân công khác nhau, nghĩa là mỗi nhân công sẽ nhận được một phần khác nhau của tập dữ liệu đầy đủ.

    Tại thời điểm ghi, theo mặc định, Amazon SageMaker Python SDK sẽ dùng chế độ FullyReplicated cho mọi kênh dữ liệu. Chế độ này phù hợp cho kênh xác thực (thử nghiệm) nhưng không quá hiệu quả đối với kênh đào tạo, khi bạn dùng nhiều nhân công.

    Trong trường hợp này, bạn sẽ muốn mỗi nhân công làm việc với một phần khác nhau của tập dữ liệu đầy đủ, nhờ đó mang lại những gradient khác nhau trong các epoch. Bạn sẽ xác định phân phối cần dùng là ShardedByS3Key cho kênh đào tạo dữ liệu như sau.

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

    Bạn sẽ thấy kết quả sau đây trong cửa sổ dòng lệnh của mình:

    Completed - Training job completed

    Thành công rồi! Bạn đã đào tạo xong mô hình chủ đề bằng thuật toán NTM.

    Trong mô hình tiếp theo, bạn sẽ triển khai mô hình vừa tạo vào các dịch vụ lưu trữ của Amazon Sagemaker.

  • Bước 2. Triển khai mô hình chủ đề

    Mô hình đã đào tạo về bản chất chỉ đơn giản là một tệp tar chứa các trọng số của mô hình và tự thân nó không thể làm được gì. Để mô hình trở nên hữu dụng và có thể đưa ra các dự đoán, bạn phải triển khai mô hình.

    Có 2 cách để triển khai mô hình trong Amazon SageMaker, tùy vào cách thức bạn muốn tạo ra các suy luận:

    • Để tạo từng suy luận một, hãy thiết lập một điểm cuối lâu dài bằng dịch vụ lưu trữ của Amazon SageMaker.
    • Để tạo nhiều suy luận cho toàn bộ tập dữ liệu, hãy dùng tính năng chuyển đổi hàng loạt cho Amazon SageMaker.

    Trong lab này, bạn có thể chọn bất kỳ phương án nào phù hợp nhất với trường hợp sử dụng của mình.

    Trong trường hợp bạn dùng dịch vụ lưu trữ Amazon SageMaker, một điểm cuối HTTPs sẽ tồn tại trên phiên bản Amazon EC2. Bạn có thể chuyển tải trọng sang điểm cuối này và tạo các suy luận.

    Khi triển khai mô hình, bạn sẽ gọi ra phương thức triển khai của đối tượng sagemaker.estimator.Estimator. Khi gọi ra phương thức triển khai, bạn xác định số lượng và loại của các phiên bản máy học mà bạn muốn dùng để lưu trữ điểm cuối.

    Hãy sao chép và dán đoạn mã sau rồi chọn Chạy để triển khai mô hình.

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

    Phương thức triển khai sẽ tạo ra mô hình triển khai được, đặt cấu hình điểm cuối các dịch vụ lưu trữ Amazon SageMaker cũng như khởi chạy điểm cuối để lưu trữ mô hình.

    Để chạy các suy luận đối với điểm cuối, bạn cần phải đảm bảo rằng tải trọng đầu vào được tuần tự hóa theo định dạng mà mô hình đã đào tạo có thể đọc, đồng thời, kết quả suy luận được giải tuần tự thành định dạng con người có thể đọc. Trong đoạn mã sau, bạn sử dụng csv_serializerjson_deserializer, có tác dụng chuyển dữ liệu CSV đã định dạng (thành véc-tơ) sang mô hình để tạo đầu ra JSON.

    Sao chép và dán đoạn mã sau vào một ô mã rồi chọn Chạy.

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

    Tiếp đến, hãy giải nén véc-tơ chủ đề cho dữ liệu đào tạo mà bạn sẽ dùng trong mô hình K-NN.

    Sao chép và dán đoạn mã sau vào một ô mã mới rồi chọn Chạy.

    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]
    

    Thành công rồi! Bây giờ, bạn có thể khám phá đầu ra của mô hình.

    Với tính năng chuyển đổi hàng loạt, bạn có thể chạy nhiều suy luận cùng lúc trên một lô dữ liệu. Amazon SageMaker xây dựng cơ sở hạ tầng cần thiết rồi phá bỏ sau khi hoàn thành tác vụ hàng loạt.

    Mã lệnh chuyển đổi hàng loạt sẽ tạo một đối tượng sagemaker.transformer.Transformer từ mô hình chủ đề. Sau đó, mã lệnh này gọi ra phương thức chuyển đổi của đối tượng đó để tạo tác vụ chuyển đổi. Khi tạo đối tượng sagemaker.transformer.Transformer , bạn sẽ xác định số lượng và loại phiên bản cần dùng để thực hiện tác vụ chuyển đổi hàng loạt, cũng như vị trí lưu trữ suy luận mà bạn mong muốn trong Amazon S3.  

    Để chạy các suy luận dưới dạng tác vụ hàng loạt, hãy sao chép và dán đoạn mã sau vào ô mã rồi chọn Chạy.

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

    Khi hoàn thành tác vụ chuyển đổi, bạn có thể dùng đoạn mã sau để tải kết quả xuống phiên bản sổ ghi chép trên thiết bị của mình để kiểm tra.

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

    Thành công rồi! Mô hình đã chuyển đổi từng tài liệu thành véc-tơ đào tạo NUM_TOPICS theo chiều. Bây giờ, bạn có thể khám phá mô hình chủ đề.

  • Bước 3. Khám phá mô hình chủ đề

    Một phương pháp để khám phá đầu ra của mô hình là biểu diễn trực quan các vec-tơ chủ đề đã tạo bằng biểu đồ T-SNE. T-SNE hay t-Distributed Stochastic Neighbor Embedding, là một kỹ thuật phi tuyến tính để giảm số chiều, có tác dụng đảm bảo rằng khoảng cách giữa các điểm lân cận gần nhất trong không gian gốc nhiều chiều được giữ nguyên trong không gian kết quả ít chiều hơn. Bằng cách đặt số chiều là 2, kỹ thuật này có thể được dùng làm công cụ trực quan hóa để biểu diễn véc-tơ chủ đề trong không gian 2D.

    Trong sổ ghi chép Jupyter, hãy sao chép và dán đoạn mã sau và ô mã mới rồi chọn Chạy.

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

    Biểu đồ TSNE sẽ biểu diễn một số cụm chủ đề lớn như hình dưới đây. Những biểu đồ như vậy có thể được dùng để trích xuất số lượng các cụm chủ đề khác biệt trong tập dữ liệu. Hiện tại, NUM_TOPICS được đặt thành 30. Tuy nhiên, dường như có nhiều chủ đề ở gần nhau trong biểu đồ TSNE và có thể kết hợp lại với nhau thành một chủ đề. Sau cùng, kỹ thuật tạo mô hình chủ đề là một vấn đề lớn trong học không giám sát, nên bạn phải dùng những hình ảnh trực quan như thế này để xác định đúng số lượng chủ đề cần phân vùng cho tập dữ liệu.

    Hãy thử nghiệm những số lượng chủ đề khác nhau để xem hình ảnh trực quan sẽ trông như thế nào.


Trong mô-đun này, bạn đã truy xuất Thuật toán mô hình chủ đề nơ-ron (NTM) Amazon SageMaker từ Amazon ECR. Sau đó, bạn đã xác định các siêu tham số theo thuật toán cụ thể và cung cấp vùng lưu trữ Amazon S3 để lưu trữ thành phần lạ. Tiếp đến, bạn đã triển khai mô hình chủ đề cho điểm cuối bằng các dịch vụ lưu trữ Amazon SageMaker hoặc bằng tính năng chuyển đổi hàng loạt. Cuối cùng, bạn đã khám phá mô hình theo những giá trị khác nhau đối với số lượng chủ đề.

Trong mô-đun tiếp theo, bạn sẽ đào tạo và triển khai mô hình đề xuất nội dung.