ในโมดูลนี้ คุณจะต้องใช้อัลกอริทึม Neural Topic Model (NTM) ในตัวของ Amazon SageMaker เพื่อฝึกฝนโมเดลหัวข้อ

Amazon SageMaker NTM คือ อัลกอริทึมการเรียนรู้แบบไม่มีผู้สอนที่ใช้ในการจัดระเบียบคลังข้อมูลเอกสารให้เป็นหัวข้อต่างๆ ที่ประกอบด้วยการจัดกลุ่มคำตามการแจกแจงเชิงสถิติ เอกสารที่ประกอบด้วยคำที่ปรากฏบ่อย เช่น "จักรยาน", "รถยนต์", "รถไฟ", "ไมล์" และ "ความเร็ว" มีแนวโน้มที่จะอยู่ในหัวข้อเกี่ยวกับ "การคมนาคม" ร่วมกัน เป็นต้น การสร้างโมเดลหัวข้อสามารถใช้ในการแยกประเภทหรือสรุปเอกสารตามหัวข้อที่ตรวจพบ หรือใช้ในการค้นคืนข้อมูลหรือแนะนำเนื้อหาตามความคล้ายคลึงของหัวข้อได้ หัวข้อจากเอกสารที่ NTM เรียนรู้จะถูกอธิบายลักษณะเป็นกลุ่มคำแฝง เนื่องจากระบบจะอนุมานหัวข้อจากการแจกแจงคำที่สังเกตได้ในคลังข้อมูล โดยปกติ ระบบจะอนุมานความหมายของหัวข้อโดยการพิจารณาคำที่ถูกจัดอันดับสูงสุดในหัวข้อ เนื่องจากวิธีนี้เป็นแบบไม่มีผู้สอน จึงมีเพียงจำนวนของหัวข้อเท่านั้นที่ถูกกำหนดไว้ล่วงหน้า โดยไม่รวมถึงตัวหัวข้อเอง นอกจากนี้ อัลกอริทึมนี้ไม่รับประกันว่าหัวข้อจะตรงกับวิธีที่มนุษย์อาจใช้ในการจัดหมวดหมู่เอกสารตามปกติ

ในขั้นตอนต่อไปนี้ คุณจะต้องกำหนดอัลกอริทึม NTM สำหรับงานฝึกฝน กำหนดโครงสร้างพื้นฐานสำหรับโมเดล ตั้งค่าไฮเปอร์พารามิเตอร์เพื่อปรับจูนโมเดล และเรียกใช้โมเดล จากนั้น คุณจะต้องปรับใช้โมเดลไปยังตำแหน่งข้อมูลที่จัดการโดย Amazon SageMaker เพื่อสร้างการคาดการณ์

ระยะเวลาที่ใช้ในการศึกษาโมดูล: 20 นาที


  • ขั้นตอนที่ 1 สร้างและเรียกใช้งานฝึกฝน

    อัลกอริทึม Amazon SageMaker ที่อยู่ในตัวถูกจัดเก็บเป็นคอนเทนเนอร์ Docker ใน Amazon Elastic Container Registry (Amazon ECR) สำหรับการฝึกฝนโมเดล คุณจำเป็นต้องกำหนดตำแหน่งที่ตั้งของคอนเทนเนอร์ NTM ใน Amazon ECR ที่อยู่ใกล้กับเขตของคุณที่สุดก่อน

    ในอินสแตนซ์โน้ตบุ๊กของคุณ ให้คัดลอกและวางโค้ดต่อไปนี้ลงในเซลล์โค้ดใหม่ แล้วเลือก Run (เรียกใช้)

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

    Amazon SageMaker Python SDK มีตัวประมาณค่า sagemaker.estimator.Estimator รวมอยู่ด้วย ตัวประมาณค่านี้ทำให้คุณสามารถกำหนดโครงสร้างพื้นฐาน (ประเภทอินสแตนซ์ Amazon EC2, จำนวนอินสแตนซ์, ไฮเปอร์พารามิเตอร์, เส้นทางเอาต์พุต และอาจรวมถึงการตั้งค่าที่เกี่ยวข้องกับความปลอดภัยใดๆ (Virtual Private Cloud (VPC), กลุ่มความปลอดภัย ฯลฯ)) ที่อาจเกี่ยวข้องหากเราจะฝึกฝนโมเดลใน VPC แบบกำหนดเองตามต้องการ ซึ่งตรงข้ามกับ Amazon VPC NTM ใช้ประโยชน์อย่างเต็มที่จากฮาร์ดแวร์ GPU และโดยทั่วไปจะฝึกฝนบน GPU ได้เร็วกว่าบน CPU โดยคร่าวๆ หนึ่งระดับขนาด การฝึกฝนแบบหลาย GPU หรือหลายอินสแตนซ์ช่วยเพิ่มความเร็วในการฝึกฝนให้ดียิ่งขึ้นโดยคร่าวๆ ในเชิงเส้น หากเวลาที่ใช้ในการสื่อสารมีสัดส่วนต่ำเมื่อเทียบกับเวลาในการคำนวณ

    หากต้องการสร้างอินสแตนซ์ประเภท sagemaker.estimator.Estimator ให้คัดลอกและวางโค้ดต่อไปนี้ลงในเซลล์โค้ดใหม่ แล้วเลือก Run (เรียกใช้)

    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)
    

    ตอนนี้คุณสามารถตั้งค่าไฮเปอร์พารามิเตอร์สำหรับโมเดลหัวข้อ:

    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 มี 2 โหมดให้เลือกสำหรับช่องทางข้อมูล:

    • FullyReplicated: ไฟล์ข้อมูลทั้งหมดจะถูกคัดลอกไปยังผู้ทำงานทุกคน
    • ShardedByS3Key: ไฟล์ข้อมูลจะถูกแชร์ไปยังผู้ทำงานที่แตกต่างกัน โดยผู้ทำงานแต่ละรายจะได้รับข้อมูลคนละส่วนของชุดข้อมูลแบบเต็ม

    ณ เวลาที่เขียนเนื้อหานี้ ตามค่าเริ่มต้นแล้ว Amazon SageMaker Python SDK จะใช้โหมด FullyReplicated สำหรับช่องทางข้อมูลทั้งหมด โหมดนี้มีประโยชน์สำหรับช่องทางการตรวจสอบความถูกต้อง (ทดสอบ) แต่ไม่มีประสิทธิภาพนักสำหรับช่องทางการฝึกฝน เมื่อคุณใช้ผู้ทำงานหลายราย

    ในกรณีนี้ คุณต้องการให้ผู้ทำงานแต่ละรายดำเนินการกับข้อมูลคนละส่วนของชุดข้อมูลแบบเต็มเพื่อให้การไล่ระดับที่แตกต่างกันภายในรอบการคำนวณ คุณต้องกำหนดการแจกแจงให้เป็น ShardedByS3Key สำหรับช่องทางข้อมูลการฝึกฝนดังนี้

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

    คุณควรจะเห็นผลลัพธ์ต่อไปนี้ในเทอร์มินัลของคุณ

    Completed - Training job completed

    สำเร็จ! คุณได้ฝึกฝนโมเดลหัวข้อด้วยอัลกอริทึม NTM เรียบร้อยแล้ว

    ในขั้นตอนถัดไป คุณจะต้องปรับใช้โมเดลไปยังบริการโฮสต์ Amazon Sagemaker

  • ขั้นตอนที่ 2 ปรับใช้โมเดลหัวข้อ

    โดยตัวโมเดลเองแล้ว โมเดลที่ฝึกฝนนั้นเป็นเพียงไฟล์ tar ที่ประกอบด้วยน้ำหนักของโมเดลและไม่ได้ทำหน้าที่ใดด้วยตัวเอง หากต้องการให้โมเดลมีประโยชน์และรับผลการคาดการณ์ คุณจะต้องนำโมเดลมาปรับใช้

    การปรับใช้โมเดลใน Amazon SageMaker มี 2 วิธี ทั้งนี้ขึ้นอยู่กับวิธีที่คุณต้องการสร้างการอนุมาน:

    • หากต้องการรับการอนุมานครั้งละหนึ่งรายการ ให้ตั้งค่าตำแหน่งข้อมูลถาวรโดยใช้บริการโฮสต์ Amazon SageMaker
    • หากต้องการรับการอนุมานสำหรับชุดข้อมูลทั้งชุด ให้ใช้ Amazon SageMaker Batch Transform

    แล็บนี้มีทั้งสองตัวเลือกเพื่อให้คุณเลือกวิธีที่เหมาะกับกรณีใช้งานของคุณมากที่สุด

    ในกรณีของบริการโฮสต์ Amazon SageMaker ตำแหน่งข้อมูล HTTP แบบสดจะอยู่บนอินสแตนซ์ Amazon EC2 ที่คุณสามารถส่งผ่านส่วนข้อมูลไปถึงและรับการอนุมานได้

    เมื่อปรับใช้โมเดล คุณจะเรียกวิธีการ ปรับใช้ ของอ็อบเจกต์ sagemaker.estimator.Estimator เมื่อเรียกวิธีการ ปรับใช้ คุณจะต้องระบุจำนวนและประเภทของอินสแตนซ์ ML ที่ต้องการใช้เพื่อโฮสต์ตำแหน่งข้อมูล

    คัดลอกและวางโค้ดต่อไปนี้แล้วเลือก Run (เรียกใช้) เพื่อปรับใช้โมเดล

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

    วิธีการปรับใช้นี้จะสร้างโมเดลที่สามารถปรับใช้ได้ กำหนดค่าตำแหน่งข้อมูลบริการโฮสต์ Amazon SageMaker และเปิดใช้ตำแหน่งข้อมูลเพื่อโฮสต์โมเดล

    หากต้องการเรียกใช้การอนุมานกับตำแหน่งข้อมูล คุณจะต้องตรวจสอบให้แน่ใจว่าส่วนข้อมูลอินพุตได้รับการทำให้เป็นอนุกรมในรูปแบบที่โมเดลที่ฝึกฝนสามารถอ่านได้ และผลลัพธ์การอนุมานได้รับการแปลงกลับให้เป็นรูปแบบที่มนุษย์สามารถอ่านได้ ในโค้ดต่อไปนี้ คุณจะต้องใช้ csv_serializer และ json_deserializer ซึ่งส่งผ่านข้อมูลในรูปแบบ CSV (เป็นเวกเตอร์) ไปถึงโมเดลเพื่อผลิตเอาต์พุต JSON

    คัดลอกและวางโค้ดต่อไปนี้ลงในเซลล์โค้ดแล้วเลือก Run (เรียกใช้)

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

    ถัดไป ให้แยกเวกเตอร์หัวข้อสำหรับข้อมูลการฝึกฝนที่คุณจะใช้ในโมเดล K-NN

    คัดลอกและวางโค้ดต่อไปนี้ลงในเซลล์โค้ดใหม่ แล้วเลือก Run (เรียกใช้)

    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]
    

    สำเร็จ! ตอนนี้คุณสามารถสำรวจเอาต์พุตของโมเดลได้

    เมื่อใช้การแปลงเป็นชุด คุณสามารถเรียกใช้การอนุมานกับชุดข้อมูลได้ทีละชุด Amazon SageMaker จะสร้างโครงสร้างพื้นฐานในการคำนวณที่จำเป็นและจะทำลายเมื่องานชุดนั้นเสร็จสมบูรณ์แล้ว

    โค้ดการแปลงเป็นชุดจะสร้างอ็อบเจกต์ sagemaker.transformer.Transformer จากโมเดลหัวข้อ จากนั้นจะเรียกใช้วิธีการแปลงของอ็อบเจกต์นั้นเพื่อสร้างงานแปลง เมื่อสร้างอ็อบเจกต์ sagemaker.transformer.Transformer คุณต้องระบุจำนวนและประเภทของอินสแตนซ์ที่จะใช้ในการดำเนินงานแปลงเป็นชุด รวมถึงตำแหน่งที่ตั้งใน Amazon S3 ที่คุณต้องการจัดเก็บการอนุมาน  

    หากต้องการเรียกใช้การอนุมานเป็นงานชุด ให้คัดลอกและวางโค้ดต่อไปนี้ลงในเซลล์โค้ดแล้วเลือก Run (เรียกใช้)

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

    เมื่องานแปลงเสร็จเรียบร้อยแล้ว คุณสามารถใช้โค้ดต่อไปนี้ในการดาวน์โหลดเอาต์พุตกลับไปยังอินสแตนซ์โน้ตบุ๊กภายในเครื่องเพื่อตรวจสอบได้

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

    สำเร็จ! โมเดลนี้แปลงเอกสารแต่ละชิ้นเป็นเวกเตอร์การฝึกฝนเชิงมิติ NUM_TOPICS ตอนนี้คุณสามารถสำรวจโมเดลหัวข้อได้แล้ว

  • ขั้นตอนที่ 3 สำรวจโมเดลหัวข้อ

    วิธีหนึ่งในการสำรวจเอาต์พุตของโมเดลก็คือการแสดงภาพเวกเตอร์หัวข้อที่สร้างขึ้นโดยใช้แผนผัง T-SNE T-SNE หรือ t-Distributed Stochastic Neighbor Embedding คือ เทคนิคแบบไม่เชิงเส้นสำหรับการลดมิติข้อมูล ซึ่งมีวัตถุประสงค์เพื่อตรวจสอบให้แน่ใจว่าระยะทางระหว่างเพื่อนบ้านที่ใกล้ที่สุดในปริภูมิมิติสูงดั้งเดิมได้รับการรักษาไว้ในปริภูมิมิติต่ำที่เป็นผลลัพธ์ เมื่อตั้งค่าจำนวนของมิติเป็น 2 จะสามารถใช้เป็นเครื่องมือการแสดงผลข้อมูลเป็นภาพเพื่อแสดงภาพเวกเตอร์หัวข้อในปริภูมิ 2 มิติได้

    ในโน้ตบุ๊ก Jupyter ของคุณ ให้คัดลอกและวางโค้ดต่อไปนี้ลงในเซลล์โค้ดใหม่ แล้วเลือก Run (เรียกใช้)

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

    แผนผัง TSNE ควรจะแสดงคลัสเตอร์หัวข้อขนาดใหญ่ส่วนหนึ่งเหมือนในรูปต่อไปนี้ แผนผังเช่นนี้สามารถใช้ในการแยกจำนวนของคลัสเตอร์หัวข้อที่แตกต่างกันอย่างชัดเจนในชุดข้อมูลได้ ขณะนี้ NUM_TOPICS ถูกตั้งค่าไว้ที่ 30 แต่ดูเหมือนว่าจะมีหัวข้อมากมายที่อยู่ใกล้กันในแผนผัง TSNE และอาจรวมเข้าด้วยกันเป็นหัวข้อเดียวได้ ท้ายที่สุดแล้ว เนื่องจากโดยทั่วไปการสร้างโมเดลหัวข้อนั้นเป็นปัญหาการเรียนรู้แบบไม่มีผู้สอน คุณจึงต้องใช้การแสดงผลข้อมูลเป็นภาพเช่นในลักษณะนี้เพื่อกำหนดจำนวนหัวข้อที่เหมาะสมในการแบ่งส่วนชุดข้อมูล

    ลองทดสอบด้วยจำนวนหัวข้อที่แตกต่างกันไปเพื่อดูว่าการแสดงผลข้อมูลด้วยภาพจะมีลักษณะเป็นอย่างไร


ในโมดูลนี้ คุณได้เรียกใช้อัลกอริทึม Amazon SageMaker Neural Topic Model (NTM) จาก Amazon ECR จากนั้นคุณได้กำหนดไฮเปอร์พารามิเตอร์เฉพาะอัลกอริทึม และจัดเตรียมบัคเก็ต Amazon S3 สำหรับจัดเก็บอาร์ทิแฟกต์ ถัดไป คุณได้ปรับใช้โมเดลไปยังตำแหน่งข้อมูลโดยใช้บริการโฮสต์ Amazon SageMaker หรือการแปลงเป็นชุด สุดท้าย คุณได้สำรวจโมเดลโดยใช้ค่าที่แตกต่างกันไปสำหรับจำนวนหัวข้อ

ในโมดูลถัดไป คุณจะได้ฝึกฝนและปรับใช้โมเดลการแนะนำเนื้อหา