Aidemy 2020/10/30
はじめに
こんにちは、んがょぺです!バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます!
今回は、ネガポジ分析の3つ目の投稿になります。どうぞよろしくお願いします。
*本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。
今回学ぶこと
・LSTMモデルの実装
・構築したモデルを使ったネガポジ分析
LSTMで学習
LSTM
・(復習)LSTMはRNNの一種で、最初の方に入力したデータを記憶しておくことができる。すなわち、長期記憶が可能なRNNモデルである。
学習データセットの作成
・Chapter2で作成したデータを学習データセットとして使う。学習データXは単語を数値化したもの(features)、教師ラベルyはネガポジを数値化したもの(label)から作成する。
・featuresの長さに0.8をかけることで、分割の基準となる長さを設定する。これに基づいて、featuresの「~0.8」の部分は「train_X」とし、残りの部分は「val_X」として学習データを作成する。同様に、labelsの「~0.8」の部分は「train_y」とし、残りの部分は「val_y」として教師ラベルを作成する。
・また、val_X,val_yの半分は精度評価用の「test_X」「test_y」とする。(もう半分はバリデーションデータとして使う)
・LSTMで学習させるデータは(サンプル数、シーケンス長、次元数)の形に変形する必要がある。シーケンス長とは、モデルがステップごとに学習するデータ数を指す。今回は1ステップで1文を学習するので「1」となる。
・学習データXについては、形の変換は「np.reshape()」で行う。第一引数には変形するデータ自身を渡し、第二引数には変形の内容、すなわち上記(サンプル数、シーケンス長、次元数)にあたる物を渡す。
・データXの形は(サンプル数,次元数)となっているので、サンプル数は「shape[0]」で取得でき、次元数は「shape[1]」で取得できる。
・教師ラベルyについては、「0,1,2」のいずれかの数値が格納されているので、分析する際にこれらの値が平等に扱われるようone-hotベクトルに変換する。(変換しないと「1」が「0と2の中間」というような分析になってしまう)
・one-hotベクトルへの変換は「to_categorical(データ,ベクトル数)」で行う。今回のベクトル数は「0,1,2」の3つである。
KerasでLSTMを実装する
LSTM層の定義
・今回はKerasのSequentialモデルを使っていくので、Functional APIと異なり、LSTM層も「add」を使うことで簡単に追加することができる。
・一層目は入力層になるので、「入力されるデータのshape」を指定する必要がある。二次元データの場合はinput_dimで次元数だけを指定すれば良いが、今回のような3次元のデータでは、input_lengthでシークエンス長も指定なければならない。
・また、input_shape=(シークエンス長,次元数)とすることもできる。
・二層目にLSTM層、三層目に全結合層(出力層)を追加する。LSTM層を定義する時、次の層もLSTMである場合はreturn_sequencesにTrueを指定し、LSTM層以外であればFalseを指定する必要がある。
コンパイル、学習、評価
・層の追加が終わったら、コンパイルを行ってモデルの学習処理について設定をする。コンパイルは「model.compile()」で行い、引数には損失関数lossと活性化関数optimizerを指定する。今回は分類モデルなので、損失関数には「クロスエントロピー誤差」を使う。活性化関数には'rmsprop'を使い、モデル評価の際の指標となるmetricsには['accuracy']を指定する。
・モデルの学習は「model.fit()」で行う。モデルに一度に入力するデータの数を決めるbatch_sizeは32、モデルの学習回数epochsは2回とする。
・最後にモデルの評価を行う。これは「model.evaluate()」で行う。これにテストデータを渡せば良い。
モデルを別のデータに使ってみる
入力データの加工
・ここからは作ったモデルに新しいデータを渡してネガポジ診断をさせる。
・入力データとして「text」に英文を格納し、これを加工していく。まずはChapter2で作成した形態素解析の関数「tweet_to_words()」にtextを渡して、さらにsplit()を使うことで単語ごとに分ける。
・次に、分割した単語を数値に変換する。Chapter2で作成したデータベース「vocab_to_ints」を参照して、データベースに存在すればその数値を、なければ0を空のリストwords_intに格納する。
・最後に、Chapter2で行ったように、リストの長さを統一して完成。
・あとはこのfeaturesに、学習させたモデル「lstm_model」を適用してpredictで予測し、3つの分類のうち、最も予測値の高かった物をanswerとして出力する。
・予測値が最も高いものは、最大値のインデックス番号を返す「np.argmax()」を使って取得すれば良い。
まとめ
・モデルの実装にあたっては、Chapter2で作成したデータを学習データセットとして使う。学習データXは単語を数値化したもの(features)、教師ラベルyはネガポジを数値化したもの(label)から作成する。
・LSTMで学習させるデータは(サンプル数、シーケンス長、次元数)のように3次元である必要がある。このうちシーケンス長はモデルがステップごとに学習するデータ数を指す。
・モデルの実装はSequentialモデルで行う。「add」で層を追加し、「compile」でコンパイル、「fit」で学習したら完成。完成したモデルについては「evaluate」で評価する。
・作成したモデルに別のテキストデータを渡すときは、前項の関数を使うなどして、データを整形してからモデルに渡す。ネガポジの予測は「predict」で行う。
今回は以上です。最後まで読んでいただき、ありがとうございました。