自然言語処理に挑戦!part1.計算編

久しぶりの投稿になりました!今回は自然言語処理に挑戦してみました。
そもそも自然言語処理とは
「人間が日常的に使っている自然言語をコンピュータに処理させる試み」
のことです。自然言語処理を用いることで音声認識や質問応答システム、情報抽出などのシステムを作ることもできます。
今回はPythonを使って簡単な自然言語処理に挑戦してみます。挑戦する内容は「足し算を答える」受け答えアプリケーションです。
今回はプログラムで計算して答えを出すのではなく、数字や記号に対してどのような処理をすべきなのかを全く与えない状態で
人工知能に勉強させながら徐々に正確な回答を得ていきます。

 今回はニューラルネットワークのモデルの一つSequence-to-Sequence(Seq2Seq)を用いてやっていきます。Seq2Seqとは、入出力データが
ある時系列データに対し、再帰型ニューラルネットワーク(RNN)を用い処理していく仕組みです。ムズカシイ話は後述する書籍を参考に
していただければと思います。早速中身を見ていきましょう

大きな流れとしてモデルを定義するinference()、誤差関数を定義するloss()、正解率を求めるaccuracy()学習アルゴリズムを定義するtraining()、それらを用いて具体的に
処理をするmain処理に分けてみていきます。
まずinference()についてです。サンプルソースは以下のようになります

LSTM(long short-term memory)という考え方を用いて実装しています。前半でエンコード、デコード処理を実施し、後半でデコード処理の出力に対し
活性化処理をすることでモデルの出力シーケンスを得る動きになります

次にloss()とtraining()、accuracy()の内容です。サンプルソースです。

tensorflowを用いて誤差関数および学習アルゴリズム、正解率を定義しています。
これで定義が完了したのでmain処理に入っていきます。サンプルです

今回は4桁同士の足し算を200エポック学習させてみました。最初の段階では
Q: 3205+6
A: 3149
T/F: F

Q: 1945+528
A: 3301
T/F: F
といったとんでもない計算をしていましたが最後のほうには
Q: 6687+2
A: 6689
T/F: T

Q: 389+695
A: 1064
T/F: F
といったように計算できるようになりました。正解率9割ぐらいで計算できるようになっていました。
今後この方法を応用してチャットボットを作成していく予定です。また進捗があればここでお知らせします。