Amazon SageMaker と AutoGluon-Text で自然言語処理モデルを作ろう

2020-09-01
デベロッパーのためのクラウド活用方法

Author : 馬目 華奈, 鮫島 正樹

はじめに

アマゾン ウェブ サービス ジャパンでインターンシップをしている馬目です。現在、大学院では自然後処理の分野で文生成に関する研究をしており、同時にインターンシップで様々な機械学習の実装を検証し、実世界への適用をサポートしています。

みなさんは AutoGluon という機械学習のライブラリを聞いたことがあるでしょうか ? AutoGluon は、機械学習に関わる様々な処理を自動化する AutoML をコンセプトとするライブラリです。機械学習は、データサイエンティストとよばれる機械学習のエキスパートを中心に利用されていますが、AutoML によって機械学習に詳しくないエンジニアでも利用できるようになりつつあります。ウェブサイトによれば、AutoGluon によって以下のことを実現できると記載されています。

  • わずか数行のコードで、自分自身のもつデータに合わせたディープラーニング・機械学習のソリューションをすぐに開発できる
  • ハイパーパラメータチューニング、モデル選択・構造探索、データ処理を活用し、機械学習の高精度化ができる
  • 専門的な知識がなくとも最新のディープラーニング・機械学習の技術を自動で利用できる
  • すでに出来上がったモデルやデータの加工方法を簡単に改善することができ、ユースケースによって AutoGluon 自体もカスタマイズできる

本当にここまで簡単に機械学習を利用することが出来るのでしょうか。本記事では、実際に AutoGluon を触って、どの程度簡単に利用できるかを紹介したいと思います。AutoGluon はいまも活発に開発されているライブラリですので、ここで紹介している内容は将来変更されたり、さらに簡単に実装できたりする可能性があります。


1. AutoGluon-Text

AutoGluon は、テーブルデータ、画像データ、テキストデータの 3 つの対象にしています。この記事では、テキストデータを対象とする AutoGluon-Text を試します。現在、AutoGluon-Text ではテキスト分類のタスクのみを解くことが出来ます。テキスト分類のタスクとしては、以下が例として挙げられ、実ビジネスでも様々な用途があるタスクです。

  • 商品レビューがポジティブかネガティブかの判定
  • メッセージがスパム化かそうでないかの判定
  • 顧客からの質問をカテゴリに分類

などなど、このタスクを解くための機械学習のアルゴリズムはこれまで数多く提案されています。


2. 費用とクレジットについて

ご注意

以降の記事を参考にして AutoGluon-Text を試される方は事前に利用料金をご確認ください。本記事では、 ml.p3.2xlarge という高性能なインスタンスを利用するため、相応の料金が利用時間に応じてかかります。詳しい料金については料金表をご覧ください。目安として、精度を気にせず以下の内容をそのまま実行される場合は 30 分程度、すべてのデータで学習を実行する場合は 3 時間以上かかります。すべてのデータを利用する場合は、日本円にして少なくとも 2,000 円ほどかかるため、builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

また、お試しいただいた後は、この記事の最後にある手順に従ってリソースの削除を忘れずにお願いいたします。

builders.flash メールメンバーへの登録・特典の入手はこちら »

*ハンズオン記事およびソースコードにおける免責事項 »


3. Amazon SageMaker のセットアップ

Amazon SageMaker は、機械学習モデルをすばやく構築、学習、デプロイできるようにするためのフルマネージドサービスです。builders.flash には、すでに SageMaker に関するいくつかの記事がありますので、詳細を知りたい方はぜひ参考にしてみてください。

ここでは AutoGluon-Text を利用するために、まずは SageMaker のノートブックインスタンスを作成します。作成手順に関してはこちらの記事を参考にしてください。

今回は、AutoGluon-Text という非常に多くの計算リソースを必要とするライブラリを利用するため、それに応じたインスタンスとして ml.p3.2xlarge という、 NVIDIA® Tesla V100 の GPU を 1 基搭載したインスタンスを利用します。以下のように「ノートブックインスタンスの作成」画面において、ノートブックインスタンスのタイプをデフォルトの ml.t2.medium から ml.p3.2xlarge に変更します。

アカウントによっては、ml.p3.2xlarge の起動が許可されていない場合もございます。その場合は、AWS サポートから上限緩和の申請をお願いいたします。

img_natural-lang-processing_01
img_natural-lang-processing_01

クリックすると拡大します

それ以降は記事の手順に従って、ノートブックインスタンスの作成を進めます。作成が進むと以下のような画面になると思いますので、今回は「JupyterLab を開く」を選択しましょう。(「Jupyter を開く」ではありませんので、ご注意ください)

img_natural-lang-processing_02
img_natural-lang-processing_02

クリックすると拡大します


4. AutoGluon-Text の利用

今回ご紹介するコードの完全版は Github に公開されていますので、実行される場合はそちらをご利用ください。本記事では、実行の内容について詳しく説明をしていきます。

今回、AutoGluon-Text を試す対象として、Amazon における日本語の商品レビューデータセットを利用します。そして、そのレビューがポジティブなのかネガティブなのかを判定する感情分析モデルを学習・推論させます。大まかに以下の 4 ステップで構成されます。

  • ステップ 1 : AutoGluon-Text をインストールする 
  • ステップ 2:Amazonレビューのデータセットを用意し、データセットに対して前処理を行う
  • ステップ 3:AutoGluon-Text でテキスト分類モデルを学習させる
  • ステップ 4:実際に文を入力し、推論する
     

4-1. ステップ1 : AutoGluon-Text をインストールする

まず、準備として必要なライブラリをダウンロードします。2020 年 8 月現在、gluonnlp のバージョンは 0.8.1 が推奨されています

!pip install --upgrade mxnet-cu101
!pip install autogluon
!pip install gluonnlp==0.8.1

AutoGluon ライブラリをインポートします。テキスト分類タスクでは、その名前の通り TextClassification を利用します。

from autogluon import TextClassification as task

4-2. ステップ 2:Amazonレビューのデータセットを用意し、データセットに対して前処理を行う

次に、データセットの準備を行います。今回使用する Amazon の商品レビューデータセットは Registry of Open Data on AWS で公開されており、以下からダウンロード可能です。 このノートブックでは、日本語のデータセットをダウンロードします。

ノートブックで以下のセルを実行すると、ダウンロードが始まり、zip ファイルが解凍され、data ディレクトリに保存されます。 

img_natural-lang-processing_03
img_natural-lang-processing_03

クリックすると拡大します

ダウンロードしたデータには、学習に不要なデータや直接利用できないデータも含まれるため、前処理を行って利用可能なデータに変換します。ダウンロードしたデータには不要なデータも含まれているので削除し、2 クラス分類 (positive が 1, negative が 0) となるように評価データを加工します。

img_natural-lang-processing_04
img_natural-lang-processing_04

クリックすると拡大します

すべてのデータを学習データとすると、データを使って作成したモデルが良いのか悪いのか評価するデータが別途必要になります。そこで、データを学習データ、テストデータに分割して利用します。学習データはモデルの学習に利用し、最終的に作成されたモデルに対してテストデータによる評価を行います。

train_ratio で設定した割合のデータを学習データとし、残ったデータをテストデータに分割して利用します。データは train.tsv、test.tsv としてそれぞれ保存します。

img_natural-lang-processing_06
img_natural-lang-processing_06

クリックすると拡大します

また、AutoGluon では、データのヘッダを指定して学習することができるため、解析するテキストを text、ポジティブかネガティブかを表すラベルを target としてヘッダを与えます。

!sed -i '1s/^/text\ttarget\n/' train.tsv
!sed -i '1s/^/text\ttarget\n/' test.tsv

今回のノートブックでは試験的な利用のため、トレーニングのデータを 1,000 件、テストデータを 100 件に絞って短い計算で終えるようにします。ノートブックでデータの前処理を実行していくと最終的にスクリーンショットのようなデータが作成されます。この部分的なデータでは良い精度を確認することはできませんので、もし数時間をかけて精度を確認されたい場合は、以降の学習において  train.tsv を利用して全データを用いた学習を行ってください。

img_natural-lang-processing_07
img_natural-lang-processing_07

クリックすると拡大します

4-3. ステップ 3:テキスト分類モデルを学習させる

学習はデータセットの指定とモデルに渡すパラメータの指定だけで行うことができます。つまり、たった 2 行のコードから高精度なモデルを構築することが可能です。データの指定では、filepath にデータのパス、usecols に学習のペアとなるラベルを指定します。

AutoGluon のテキスト分類では、予めいくつかの事前学習済み BERT モデルを使用することができます。今回は日本語のレビューなので、wikipedia の複数言語のテキストで学習されたモデルである wiki_multilingual_uncased を使用します。また、学習率  (learning_rate) は、このタスクにあわせて、2e-05 から 2e-06 の間を探索するように設定します。

dataset = task.Dataset(filepath='train_1000.csv', usecols=['text', 'target'])
from autogluon.core import Real
learning_rate = Real(2e-06, 2e-05, log=True)

predictor = task.fit(dataset,
                    lr = learning_rate,
                    epochs=3,
                    pretrained_dataset='wiki_multilingual_uncased')
img_natural-lang-processing_08
img_natural-lang-processing_08

クリックすると拡大します

4-4. ステップ 4:実際に文を入力し、推論する

テストデータに対する accuracy を確認してみましょう。test_100.tsv を読み込んで evaluate を呼ぶことで評価が可能です。

testset = task.Dataset(filepath='test_100.tsv', usecols=['text', 'target'])
test_acc = predictor.evaluate(testset)
print('Top-1 test acc: %.3f' % test_acc)
Top-1 test acc: 0.920

テストデータによりますが、すべてのデータを利用して学習していれば 90 % 以上の精度を簡単に得ることができると思います。また、実際の文書を用いた推論も行えます。文がポジティブの場合は [1]、ネガティブの場合は [0] として判定されます。

sentence = '子供でも簡単に操作ができて、暇つぶしに最高です。'
ind = predictor.predict(sentence)
print('The input sentence sentiment is classified as [%d].' % ind.asscalar())
The input sentence sentiment is classified as [1].

すべてのデータを利用した場合の推論結果の例をいくつか示します。この結果は学習によって変わる可能性があります。

例 1 : 素晴らしいパフォーマンス。ミュージカル映画版の物足りない歌唱とは違います。
結果 : ポジティブ
正解 : ポジティブ

例 2 : 残念ながら・・・趣味ではありませんでした。正直退屈・・・
結果 : ネガティブ 
正解 : ネガティブ

例 3 : どちらも無料の時に購入しましたが、モバイルの方は使い方が分かりにくくてツールの切り替えがとてもめんどくさいのですが、こちらだとだいぶ扱いやすくなってます。自分の使っているペンの先が硬く細いので筆圧感知はできないみたいですが、落書きやラフ描きにはとても良いです。
結果 : ポジティブ
正解 : ポジティブ

例4 : コンサートや演奏内容はすばらしい。が、DVD としては最低といわざるを得ない。アメリカ版ではワイドスクリーンのため、舞台全体が見渡せるのだが、これはテレビサイズのため、ソロの場面の大半で歌手の映像が肩で切れている。 
結果 : ポジティブ
正解 : ネガティブ

概ね正解なのですが、最後の例はネガティブな内容を誤ってポジティブと判定していますね。今回のデータは約 90 % がポジティブなデータなので、ネガティブな内容をポジティブと判定する傾向がありました。データの偏りを整えたり、より多くの学習を回すことによってこれらは改善できる可能性があります。


5. リソースの削除

今回は SageMaker のノートブックインスタンスをリソースとして利用しましたので、こちらの削除を行います。

SageMaker のコンソール画面に戻り、左のメニューからノートブックインスタンスの一覧を表示します。すると、今回作成したノートブックインスタンスを確認できると思いますので、

(1) 作成したノートブックインスタンスを選択して停止を行い、
(2) 停止後に再度選択して削除を行います。

図は停止を行う際の画面例で、停止後に「アクション」のプルダウンを開くと削除ができるようになります。

img_natural-lang-processing_09
img_natural-lang-processing_09

クリックすると拡大します


6. まとめ

本記事では、AutoGluon-Text を利用して高精度なテキスト分類モデルの構築を試しました。学習に必要なコードはわずか数行ですが、内部的には BERT という非常に優れた自然言語処理モデルを呼び出して、高度な学習を行っています。しかし、ユーザ側はモデルに関する深い知識がなくとも、簡単に利用できることがわかりました。

今回は SageMaker のノートブックインスタンスで AutoGluon-Text を実行する方法を説明しましたが、この場合だと 学習を実行していない間も GPU インスタンスを起動し続けることになりますね。そこで学習時のみ GPU インスタンスを利用するような、SageMaker を活用したコードも公開しています。こちらもぜひご覧いただき、もしよければ試してみてください。(その場合、リソース削除も忘れずにお願いします)

プロフィール

photo_umame_kana

馬目 華奈
アマゾン ウェブ サービス ジャパン株式会社 機械学習ソリューションアーキテクト インターン

計算言語学の研究室で、自然言語処理分野の文生成に取り組んでいる大学院生。 インターンでは、機械学習のクラウドを中心に学んでいる。
健康オタクであり、筋トレやヨガが好き。

photo_samejima_masaki

鮫島 正樹
アマゾン ウェブ サービス ジャパン株式会社 機械学習ソリューションアーキテクト

前職は情報系の大学教員で、Operations Research などにおける組合せ最適化に関する研究と並行して、最適化の観点から機械学習の応用研究を実施。機械学習の実行環境としてクラウドに興味をもちアマゾン ウェブ サービス ジャパンに入社。

余暇のほとんどは子供の世話。好きなものはお酒で、嫌いなことは禁酒。

AWS のベストプラクティスを毎月無料でお試しいただけます

さらに最新記事・デベロッパー向けイベントを検索

下記の項目で絞り込む
絞り込みを解除 ≫
フィルタ
フィルタ
1

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する