はじめに
仕事で深層学習を使うことはないのですが、扱える技術の幅を広げていきたいなと思い、BLSTMを用いた文書分類についてkerasでの簡単なサンプルコードをやってみようと思います。データは以前集めた、某不動産紹介サイトの賃貸マンションの設備に関する文書とそれがデザイナーズマンションかどうかのラベルを使います。そして文書内の単語からその文書がデザイナーズマンションかどうかを予測します。前回はAUCで83%だったので、それを超えれると良いですね。目次
単純なRNNとは
- モチベーション
- フィードフォワード型のニューラルネットワークではうまく扱うことができない時系列データをうまく扱えるようにすること。
- 特徴
- 入力が互いに関係している(多層パーセプトロンの際は置かれていない仮定)
- 直訳すると循環するニューラルネットワークとなる。
- 最初の文の単語が2つ目、3つ目の単語に影響を与える可能性を考慮。
- 入力が互いに関係している(多層パーセプトロンの際は置かれていない仮定)
- 具体的な関数の形としては、 h_t = \tanh (W h_{t-1} + U x_t) \\\ y_t = softmax(V h_t) で与えられる。
- h_t は隠れ層の状態を、 x_t は入力変数を、 y_t は出力ベクトルを表している。(他のアルファベットは重み行列)
LSTMとは
- モチベーション
- 単純なRNNの勾配消失問題を解決するために提案された手法。
- 特徴
- 単純なRNNに置き換えることで性能が大幅に向上することも珍しくない。
- 時系列データ、長い文章、録音データからなる長期的なパターンを取り出すことを得意としている手法。
- 勾配消失問題に強い
- Long Short-Term Memory:長短期記憶
- 長期依存性を学習できるRNNの亜種。
- 入力ゲート、忘却ゲート、出力ゲート、内部隠れ層という4つの層が相互に関わり合う。重要な入力を認識し、それを長期状態に格納すること、必要な限りで記憶を保持すること、必要なときに記憶を取り出すことを学習する。
- 入力ゲート:内部隠れ層のどの部分を長期状態に加えるかを決める。
- 忘却ゲート:長期状態のどの部分を消去するか決める。
- 出力ゲート:各タイムステップで、長期状態のどの部分を読み出し、出力するかを決める。
- 単純なRNNに置き換えることで性能が大幅に向上することも珍しくない。
f:忘却ゲート(forget)
o:出力ゲート(output)
\sigma :シグモイド関数
g:内部隠れ層状態
c_t :時刻tにおけるセル状態
h_t :時刻tにおける隠れ状態
Bidirectional LSTMとは
- モチベーション
- 従来のRNNの制約を緩和するために導入。
- 特徴
- ある特定の時点で過去と将来の利用可能な入力情報を用いて訓練するネットワーク
- 従来のRNNのニューロンをフォワード(未来)なものとバックワード(過去)なものとの2つに分ける。
- 2つのLSTMを訓練している。
- 全体のコンテキストを利用して推定することができるのが良いらしい。
- 文章で言うと、文章の前(過去)と後(未来)を考慮して分類などを行うイメージ。
- 人間もコンテキストを先読みしながら解釈することもある。
- 従来のRNNのニューロンをフォワード(未来)なものとバックワード(過去)なものとの2つに分ける。
- BLSTMは全てのシークエンスの予測問題において有効ではないが、適切に扱えるドメインで良い結果を残す。
- 1997年とかなり歴史があるものらしい
- ある特定の時点で過去と将来の利用可能な入力情報を用いて訓練するネットワーク

Bidirectional LSTMで文書分類
今回は、BLSTMを使って、マンションの設備に関するテキスト情報から、そのマンションがデザイナーズマンションかどうかを予測します。全体のソースコードはGoogle Colabを御覧ください。データ
データを確認してみると、
前処理
Google Colab上で形態素解析を行うために、MeCabをインストールする。これでMaCab NeologdをGoogle ColabのPythonで実行できます。
テキストデータの前処理を行うために名詞だけを抽出してリスト形式で返す関数を定義します。
実行
先程作成したデータを訓練データとテストデータに分けます。追記
TensorBoardの検証のloglossを見てみます。

参考文献
- [1] Antonio Gulli , Sujit Pal (2018) , 『直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ』, オライリージャパン
- [2] 斎藤 康毅 (2018), 『ゼロから作るDeep Learning ❷ ―自然言語処理編』, オライリージャパン
- [3] Sebastian (2018),『[第2版]Python 機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)』, インプレス
- [4] How to compute Receiving Operating Characteristic (ROC) and AUC in keras?
- [5] TimeseriesGenerator
- [6] KerasでF1スコアをmetircsに入れる際は要注意
- [7] How to Develop a Bidirectional LSTM For Sequence Classification in Python with Keras
- [8] Deep Dive into Bidirectional LSTM
- [9] Aurélien Géron (2018) , 『scikit-learnとTensorFlowによる実践機械学習』, オライリージャパン
- [10] Trains a Bidirectional LSTM on the IMDB sentiment classification task.