في هذه الوحدة، يمكنك استخدام لوغاريتم نموذج الموضوع العصبي (NTM) في Amazon SageMaker لتدريب نموذج الموضوع.

إن نموذج الموضوع العصبي Amazon SageMaker NTM هو لوغاريتم تعلّم بدون إشراف يُستخدم لتنظيم مجموعة كبيرة من المستندات داخل موضوعات تحتوي على مجموعات من الكلمات بناءً على التوزيع الإحصائي الخاص بها. من المحتمل أن تتشارك المستندات التي تحتوي على تكرارات كلمات مثل "دراجة" و "سيارة" و "قطار" و "المسافة المقطوعة" و "السرعة" في موضوع حول "وسائل النقل" على سبيل المثال. يمكن استخدام نموذج الموضوع لتصنيف أو تلخيص المستندات بناءً على الموضوعات المكتشفة أو لاسترداد المعلومات أو التوصية بالمحتوى بناءً على أوجه التشابه بين الموضوعات. يتم تمييز الموضوعات من المستندات التي يتعلمها لوغاريتم NTM على أنها تمثيل كامن لأنه يتم استنتاج الموضوعات من توزيعات الكلمات الملحوظة في المجموعة. عادة ما يتم استنتاج دلالات المواضيع من خلال فحص الكلمات ذات التصنيف الأعلى التي تحتوي عليها. ونظرًا لأن الطريقة غير خاضعة للرقابة، فإن عدد المواضيع فقط، وليس الموضوعات نفسها، يكون محددًا مسبقًا. بالإضافة إلى ذلك، لا يتم ضمان محاذاة الموضوعات مع كيفية تصنيف البشر بشكل طبيعي للمستندات.

في الخطوات التالية، حدد لوغاريتم NTM لمهمة التدريب، مع تحديد البنية التحتية للنموذج وتعيين قيم المعلمات الفائقة لضبط النموذج وتشغيله. بعد ذلك، قم بنشر النموذج إلى نقطة نهاية يديرها Amazon SageMaker لوضع تنبؤات.

الوقت اللازم لاستكمال الوحدة: 20 دقيقة


  • الخطوة 1. إنشاء مهمة تدريب وتشغيلها

    يتم تخزين لوغاريتمات Amazon SageMaker المضمنة كمجموعات منصات في سجل حاوية Amazon المرن (Amazon ECR) . لتدريب النموذج، تحتاج أولًا إلى تحديد موقع حاوية NTM في Amazon ECR، حاول أن تجعله الأقرب إلى منطقتك.

    في نسخة دفتر الملاحظات الخاص بي، انسخ والصق التعليمات البرمجية التالية في خانة تعليمات برمجية جديدة واختر تشغيل.

    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 وعدد المثيلات والمعلمات الفائقة ومسار الإخراج، وبشكل اختياري، أي إعدادات متعلقة بالأمان (السحابة الخاصة الافتراضية (VPC)، ومجموعات الأمان، وما إلى ذلك) التي قد تكون ذات صلة إذا قمنا بتدريب نموذجنا في VPC مخصص من اختيارنا بدلًا من VPC من Amazon. يستفيد NTM بشكل كامل من أجهزة GPU ، وبشكل عام، فهو يدرب تقريبًا ترتيبًا على وحدة معالجة الرسومات أسرع من وحدة المعالجة المركزية. كما يعمل التدريب متعدد وحدات GPU أو متعدد المثيلات على تحسين سرعة التدريب بشكل خطي تقريبًا إذا كانت النفقات العامة للاتصال منخفضة مقارنة بوقت الحوسبة.

    لإنشاء مثيل لفئة sagemaker.estimator.Estimator ، انسخ التعليمة البرمجية التالية والصقها في خانة تعليمات برمجية جديدة واختر تشغيل.

    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 وضعين لقنوات البيانات:

    • 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، اعتمادًا على الطريقة التي تريد بها إنشاء استدلالات:

    • للحصول على استدلال واحد في كل مرة، قم بإعداد نقطة نهاية مستمرة باستخدام خدمات استضافة Amazon SageMaker.
    • للحصول على استدلالات لمجموعة بيانات كاملة، استخدم تحويل حزمة Amazon SageMaker.

    يوفر لك هذا التمرين المعملي كلا الخيارين لاختيار أفضل طريقة لحالة الاستخدام الخاصة بك.

    في حالة خدمات استضافة Amazon SageMaker، توجد نقطة نهاية HTTP مباشرة على مثيل Amazon EC2 والتي يمكنك تمرير حمولة إليها والحصول على الاستدلالات.

    عند نشر النموذج، يمكنك استدعاء طريقة نشر للكائن sagemaker.estimator.Estimator . عندما تستدعي طريقة نشر، فإنك تحدد عدد ونوع مثيلات ML التي تريد استخدامها لاستضافة نقطة النهاية.

    انسخ والصق التعليمة البرمجية التالية واختر تشغيل لنشر النموذج.

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

    تنشئ طريقة النشر النموذج القابل للنشر، وتقوم بتكوين نقطة نهاية لخدمات استضافة Amazon SageMaker، وتُشغل نقطة النهاية لاستضافة النموذج.

    لتشغيل الاستدلالات مقابل نقطة نهاية، تحتاج إلى التأكد من أن حمولة المدخلات متسلسلة بتنسيق يمكن للنموذج المتدرب قراءته، ويتم ترجمة تسلسل مخرجات الاستدلال إلى تنسيق يمكن قراءته بشريًا. في التعليمات البرمجية التالية، يمكنك استخدام csv_serializer و json_deserialize الذي يقوم بتمرير البيانات بتنسيق CSV (كمتجهات) إلى النموذج لإنتاج مخرج JSON.

    انسخ والصق التعليمات البرمجية التالية إلى خانة التعليمات البرمجية واختر تشغيل.

    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.

    انسخ والصق التعليمات البرمجية التالية إلى خانة التعليمات البرمجية الجديدة واختر تشغيل.

    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 حيث تريد تخزين الاستدلالات.  

    لتشغيل الاستدلالات كمهمة حزمة، انسخ والصق التعليمة البرمجية التالية في خانة التعليمات البرمجية واختر تشغيل.

    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، عبارة أسلوب غير خطي لتقليل الأبعاد والذي يهدف إلى ضمان الحفاظ على المسافة بين أقرب مجاورات في المجال الأصلي ذي الأبعاد العالية في المجال الناتج ذي الأبعاد الأقل. من خلال تعيين عدد الأبعاد إلى 2، يمكن استخدامها كأداة عرض لتصور متجهات الموضوع في مجال ثنائي الأبعاد.

    في دفتر ملاحظات Jupyter الخاص بك، انسخ والصق التعليمة البرمجية التالية في خانة تعليمة برمجية جديدة واختر تشغيل.

    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 ويمكن دمجها في موضوع واحد. في النهاية، نظرًا لأن صياغة نموذج الموضوع تكون إلى حد كبير مسألة تعلم غير خاضعة للرقابة، يجب عليك استخدام تصورات مثل هذه لتحديد العدد الصحيح من الموضوعات لتقسيم مجموعة البيانات إليها.

    حاول تجربة أعداد موضوعات مختلفة لترى كيف تبدو الصورة المرئية.


في هذه الوحدة، قم باستعادة لوغاريتم نموذج الموضوع العصبي (NTM) في Amazon SageMaker من Amazon ECR. بعد ذلك، قم بتحديد معلمات فائقة خاصة باللوغاريتمات وقدمت حاوية Amazon S3 لتخزين الأدوات. بعد ذلك، قمت بنشر النموذج إلى نقطة نهاية باستخدام خدمات استضافة Amazon SageMaker أو تحويل الحزمة. وأخيرًا، قمت باستكشاف النموذج باستخدام قيم مختلفة لعدد الموضوعات.

في الوحدة التالية، ستقوم بتدريب نموذج توصية المحتوى الخاص بك ونشره.