Amazon SageMaker BlazingText(学習編)

目次

Amazon SageMaker(以下SageMaker)には、たくさんの組み込みアルゴリズムがあります。その中のテキスト処理で使われるアルゴリズムの一つにBlazingTextというものがあります。今回はBlazingTextを使ってWordベクトルを得るためのモデルを学習させます。

SageMakerの組み込みアルゴリズム

SageMakerは自分で用意した学習処理でモデルを構築するだけでなく、あらかじめ用意された組み込みアルゴリズムを使って機械学習モデルを構築することができます。

用意されている組み込みアルゴリズムには、AutoMLのライブラリであるAutoGluonや、勾配ブースティングツリーのライブラリである、LightGBM、XGBoostなどの教師あり学習に使用できるものや、PCA(主成分分析)、kmeansアルゴリズムなどの教師なし学習に利用できるものもあります。

その中で、テキストデータを対象とする組み込みアルゴリズムの一つに、word2vecを得るためや、テキスト分類に使用できるBlazingTextがあります。

BlazingTextのメリット

BlazingTextを利用するメリットとして以下が挙げられるかと思います。

  • 大量のデータ処理に対するスケール性能を得られる
  • 単語のnグラムだけでなく、文字nグラムのベクトル表現を学習するサブワード学習機能によって、学習データにない単語に対するベクトル生成
  • テキストデータを所定の形式で用意するだけで、word2vecのモデルが得られる
  • ほぼ同じ構造の処理でテキスト分類モデルも作成できる

BlazingTextの学習データ形式の用意

BlazingTextの学習データ形式は、単語ごとにスペース区切りにした1行1文のテキストデータです。

but in this labour he incurred the hostility of many of his own countrymen .

今回は、以前に1行1文の形式のデータを用意したので、それを使用します。 ただし、該当データは1行1文ではあるものの、完全なスペース区切りになっているわけではないので、その時にも使用したspaCyを使用して、全ての単語や句読点(カンマ、ピリオド)をスペースで区切ったデータに変換します。

import spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("hello world.")
tokens = [token.text for token in doc]
data = " ".join(tokens)

上記のように、spaCyによって、tokenごとにリスト化できるので、それをスペースで文字列結合してあげれば、BlazingTextのデータ形式に変換できます。

BlazingTextを使用するための準備

BlazingTextも他のSageMakerの処理と同じで、pythonのSageMaker SDKを使用することができます。

なので、SageMaker SDKをインストールします。

pip install sagemaker

基本的には、公式ドキュメントの通りに実行すれば問題ありません。

ただ、公式のドキュメントはSageMakerのv2の記述にはなっていないので、そのままでは実行できません。(といってもいくつか関数名や引数名が異なる程度です。)

まずは共通設定です。

import sagemaker
import boto3


sess = sagemaker.Session()
role = "arn:aws:iam::ACCLOUNT_ID:role/SageMakerExecutionRole"
region = boto3.Session().region_name
bucket = sess.default_bucket()
prefix = "sagemaker/blazingtext-vector"
s3_train_data = f"s3://{bucket}/{prefix}/train"
s3_output_location = f"s3://{bucket}/{prefix}/output"

IAMロールやデータが保持されているバケットを指定しています。適宜変更します。

学習に使用するデータをs3_train_dataのパスに用意します。ファイル名をtrainで用意します。なので、s3_train_dataはS3上のトレーニングデータを示すフルパスになります。

container = sagemaker.image_uris.retrieve("blazingtext", region)

次に、使用するコンテナを指定します。これは使用するアルゴリズム、リージョンごとに異なるので、それぞれ指定します。

上記の関数によって、以下の様なコンテナイメージが得られます。

501404015308.dkr.ecr.ap-northeast-1.amazonaws.com/blazingtext:1

BlazingTextでの学習処理の設定

まずはEstimatorを用意します。

model = sagemaker.estimator.Estimator(
    container,
    role,
    instance_count=1,
    instance_type="ml.m5.large",
    volume_size=5,
    max_run=3600,
    input_mode="File",
    output_path=s3_output_location,
    sagemaker_session=sess,
)

実際に学習処理を実行する際のインスタンスタイプやその数、出力場所などを指定します。

ハイパーパラメータの設定

次にハイパーパラメータを指定します。 前述までの処理は他の組み込みアルゴリズムを利用する際でもほぼ定型ですが、ハイパーパラメータの値はアルゴリズムごとに固有の値を設定します。

model.set_hyperparameters(
    mode="batch_skipgram",
    epochs=5,
    min_count=5,
    sampling_threshold=0.0001,
    learning_rate=0.05,
    window_size=5,
    vector_dim=100,
    negative_samples=5,
    batch_size=11,  
    evaluation=True, 
    subwords=False,
)

なお、BlazingTextはword2vecを得るためのモデルだけでなく、テキスト分類にも使用できると前述しましたが、modeのハイパーパラメータによってその動作が変更されます。

入力データの準備

入力データの形式を指定します。組み込みアルゴリズムによっては、単純なテキストファイル形式だけでなく、学習処理を効率化するためのRecordIOに対応しているので、それらの指定を行います。今回は単純なテキストファイルを利用するので、以下の様に設定します。

train_data = sagemaker.inputs.TrainingInput(
    s3_train_data,
    distribution="FullyReplicated",
    content_type="text/plain",
    s3_data_type="S3Prefix",
)
data_channels = {"train": train_data}

学習処理の実行

さて、ここまで設定ができれば学習処理を実行できます。

といっても、実行自体はシンプルです。

model.fit(inputs=data_channels, logs=True)

入力データを渡してあげてfitメソッドを実行するだけです。 しばらくすると、学習処理が完了した旨のメッセージが表示されます。

次回はこのモデルをデプロイし、推論(Word Vectorの取得)を行いたいと思います。