Bu modülde konu modelini eğitmek üzere yerleşik Amazon SageMaker Sinirsel Konu Modeli (NTM)’ni kullanacaksınız.

Amazon SageMaker NTM istatistiksel dağılımlarına göre kelime grupları içeren konulara belgelerden oluşan bir kitaplığı düzenlemek amacıyla kullanılan, denetlenmeyen bir öğrenme algoritmasıdır. Örneğin “bisiklet”, “araba”, “tren”, “mesafe” ve”hız” gibi kelimelerin sık geçtiği belgelerin “ulaşım” ile ilgili bir konuda olması daha muhtemeldir. Konu modelleme, belgeleri tespit edilen konulara göre sınıflandırmak veya özetlemek ya da konu benzerliklerine göre bilgi veya önerilen içerik almak amacıyla kullanılabilir. NTM’nin öğrendiği belgelerden konular örtük temsil olarak karakterize olur çünkü konular kitaplıkta gözlenen kelime dağılımlarından çıkarılır. Konuların semantiği genel olarak en üste sıralanan kelimelerin incelenmesinden çıkarılır. Bu yöntem denetlenmediği için konuların kendisi değil yalnızca birkaç tanesi önceden belirlenir. Ek olarak, konuların bir insanın belgeleri doğal olarak nasıl kategorize edeceği ile uyumlu hale getirileceği garanti edilmez.

Aşağıdaki adımlarda eğitim işi için NTM algoritmanızı belirtecek, model altyapısını belirleyecek, modeli ayarlamak için hiper parametre değerlerini ayarlayacak ve modeli çalıştıracaksınız. Daha sonra, tahmin yürütmesi için modeli Amazon SageMaker tarafından yönetilen uç noktaya dağıtacaksınız.

Modülü Tamamlama Süresi: 20 Dakika


  • 1. Adım. Eğitim işini oluşturun ve çalıştırın

    Yerleşik Amazon SageMaker algoritmaları Amazon Elastic Container Registry (Amazon ECR)’de docker container olarak depolanır. Model eğitimi için öncelikle Amazon ECR’deki NTM container’ın yerini size en yakın bölge olacak şekilde belirtmeniz gerekir.

    Not defteri bulut sunucunuzda aşağıdaki kodu kopyalayıp yeni bir kod hücresine yapıştırın ve Çalıştır ögesini seçin.

    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 tahmin aracını içerir. Amazon VPC’nin aksine eğitim modelimizi kendi seçtiğimiz özel bir VPC içerisinde eğitmemiz durumunda tahmin aracı (Amazon EC2 bulut sunucusu tipi, bulut sunucusu sayısı, hiperparametreler, ürün yolu ve isteğe bağlı olarak herhangi bir güvenlikle ilgili ayar (sanal özel bulut (VPC), güvenlik bulutları gibi.) ilgili olabilecek altyapıları belirlemenizi sağlar. NTM GPU donanımı’ndan tam olarak yararlanır ve genel olarak bir büyüklük kuralını CPU üzerinde olduğundan daha çok GPU üzerinde eğitir. Ek yükün işlem zamanına göre düşük olduğu durumda çoklu GPU veya çoklu bulut sunucusu eğitim hızını doğrusal bir şekilde geliştirir.

    sagemaker.estimator.Estimator sınıfı bir bulut sunucusu oluşturmak için aşağıdaki kodu yeni hücre koduna kopyalayıp ve yapıştırdıktan sonra Çalıştır ögesini seçin.

    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)
    

    Artık konu modeli için hiperparametreleri ayarlayabilirsiniz:

    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, veri kanalları için iki mod önermektedir:

    • FullyReplicated: Tüm veri dosyaları tüm çalışanlara kopyalanır.
    • ShardedByS3Key: Veri dosyaları farklı çalışanlara parçalanır; bu da her çalışanın tam veri kümesinin farklı kısımlarını alması demektir.

    Yazma zamanında Amazon SageMaker Python SDK tüm veri kanalları için varsayılan olarak FullyReplicated modu kullanır. Bu mod, doğrulama (test) kanalı için istenir ama birden fazla çalışanı kullandığınızda eğitim kanalı için o kadar etkili değildir.

    Bu durumda zaman içinde farklı gradyanlar sağlanması için tam veri kümesinin farklı bir kısmını gözden geçirmek istersiniz. Aşağıdaki gibi eğitim veri kümesi için dağıtımın ShardedByS3Key olmasını belirlersiniz.

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

    Terminalinizde aşağıdaki çıktıları görmeniz gerekir:

    Completed - Training job completed

    Başardınız! Konu modelinizi NTM algoritması ile eğittiniz.

    Sonraki adımda dağıtım modelinizi Amazon Sagemaker barındırma hizmetlerine dağıtacaksınız.

  • 2. Adım. Konu modelini dağıtma

    Eğitilmiş bir model kendi başına basitçe model ağırlıklarını içeren bir tar dosyasıdır ve kendi kendine hiçbir şey yapmaz. Modeli kullanışlı yapmak ve tahminleri almak için modeli dağıtmanız gerekir.

    Çıkarsamaları nasıl üretmek istediğinize dayalı olarak Amazon SageMaker’da model dağıtmanın iki yolu vardır:

    • Tek seferde bir çıkarsama almak için Amazon SageMaker barındırma hizmetleri ile kalıcı bir uç nokta kurun.
    • Tüm bir veri kümesi için çıkarsamalar almak istiyorsanız Amazon SageMaker toplu dönüşüm’ü kullanın.

    Bu laboratuvar, kullanım örnekleriniz için en iyi yaklaşımı seçmeniz amacıyla size iki seçenek sunar.

    Amazon SageMaker barındırma hizmetleri durumunda canlı bir HTTPs uç noktası bir yük geçirebileceğiniz ve çıkarsamalar alabileceğiniz bir Amazon EC2 bulut sunucusunda bulunur.

    Modeli dağıttığınızda sagemaker.estimator.Estimator nesnesi dağıtım modelini ararsınız. Dağıtım yöntemini aradığınızda uç noktayı barındırmak için kullanmak istediğiniz makine öğrenimi bulut sunucusu sayısını ve tipini belirlersiniz.

    Modeli dağıtmak için aşağıdaki kodu kopyalayıp yapıştırın ve Çalıştır ögesini seçin.

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

    Dağıtım yöntemi dağıtılabilir bir modeli oluşturur, Amazon SageMaker barındırma hizmetleri uç noktasını yapılandırır ve modeli barındırmak üzere uç noktayı başlatır.

    Bir uç noktasına karşı çıkarsamalar yapmak için girdi yükünün eğitilmiş bir modelin okuyabileceği biçimde serileştirildiğinden ve çıkarsama çıktısının insan tarafından okunabilir şekilde serileştirilmediğinden emin olmalısınız. Aşağıdaki kodda JSON çıktısı üretmek için CSV biçimli verileri (vektör olarak) modele geçiren csv_serializer ve json_deserializer kullanırsınız.

    Aşağıdaki kodu kopyalayıp bir kod hücresine yapıştırın ve Çalıştır ögesini seçin.

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

    Sonra, K-NN modelinde kullanacağınız eğitim verileri için konu vektörlerini çıkarın.

    Aşağıdaki kodu kopyalayıp yeni bir kod hücresine yapıştırın ve Çalıştır’ı seçin.

    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]
    

    Başardınız! Şimdi model çıktılarını keşfedebilirsiniz.

    Toplu dönüşüm ile bir seferde veri grubuna yönelik çıkarsamalar çalıştırabilirsiniz. Amazon SageMaker gerekli işlem altyapısını oluşturur ve toplu iş tamamlandığında işi kapatır.

    Toplu dönüşüm kodu konu modelinden bir sagemaker.transformer.Transformer nesnesi oluşturur. Daha sonra bir dönüşüm işi oluşturmak için nesnenin dönüşüm yöntemini arar. sagemaker.transformer.Transformer nesnesini oluşturduğunuzda toplu dönüşüm işini yürütmek için kullanacağınız bulut sunucularının sayısını ve tipini ve çıkarsamaları Amazon S3’te depolamak istediğiniz lokasyonu belirlersiniz.  

    Çıkarsamaları toplu bir iş olarak çalıştırmak amacıyla aşağıdaki kodu kopyalayıp bir kod hücresine yapıştırın ve Çalıştır ögesini seçin.

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

    Dönüşüm işi tamamlandığında denetleme için yerel not defteri bulut sunucunuza çıktıları indirmek amacıyla aşağıdaki kodu kullanabilirsiniz.

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

    Başardınız! Model her bir belgeyi NUM_TOPICS boyutlu eğitim vektörüne dönüştürdü. Artık konu modelini keşfedebilirsiniz.

  • 3. Adım. Konu modelini keşfedin

    Model çıktılarını keşfetmenin bir yolu T-SNE çizimini kullanarak üretilmiş konu vektörlerini görselleştirmektir. Bir T-SNE veya t-Dağıtımlı Stokastik Komşu Eklemesi orijinal yüksek boyutlu alandaki en yakın komşular arasındaki mesafenin azalan boyut alanında korunmasını hedefleyen boyut azaltma için lineer olmayan bir tekniktir. Boyut sayıları 2 olarak ayarlanarak konu vektörlerini 2 boyutlu alanda görselleştirmek üzere bir görselleştirme aracı olarak kullanılabilir.

    Jupyter not defterinizde aşağıdaki kodu kopyalayıp yeni bir kod hücresine yapıştırın ve Çalıştır’ı seçin.

    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 çizimi aşağıdaki resim gibi büyük konu kümelerini göstermelidir. Bunlar gibi çizimler veri kümesinde belirgin konu kümelerinin sayılarını çıkarmak için kullanılabilir. Şu an NUM_TOPICS 30 olarak ayarlı, ancak TSNE çiziminde birbirine yakın çok konu var ve bunlar tek bir konuya birleştirilebilir. Nihayetinde konu modelleme büyük oranda denetlenmeyen bir öğrenme sorunu olduğu için bunlar gibi görselleştirmeleri kullanmalı ve içine veri kümesini eklemek için bölümlenecek konu sayısının ne kadar olması gerektiğine karar vermelisiniz.

    Görselleştirmenin nasıl göründüğünü görmek için farklı konu numaralarıyla deneyin.


Bu modülde Amazon ECR’den Amazon SageMaker Sinirsel Konu Modeli (NTM) Algoritmasını geri aldınız. Sonra, algoritmaya özgü hiperparametreleri belirlediniz ve yapıt depolama için Amazon S3 klasörünü sağladınız. Daha sonra, modeli Amazon SageMaker barındırma hizmetleri veya toplu dönüşüm ile bir uç noktasına dağıttınız. Son olarak, konu sayısı için farklı değerler kullanarak modeli keşfettiniz.

Bir sonraki modülde içerik öneri modelinizi eğiteceksiniz.