どんな記事?
深層学習のモデリングであれやこれや試してみたいけど、どうやって実装したらいいかわからん人向けに
割と自由度が高く、程よく抽象化されている枠組みとしてのkerasのfunctional APIを使って
sequentialでは難しいseq2seqをなるべくシンプルに実装してみる
目次
解くタスク
英→日の機械翻訳モデルを構築します。
文字列はあらかじめ単語単位に分解されているものとします。
具体的には以下のデータを使います
https://github.com/odashi/small_parallel_enja
モデルの概要
まず、入力単語列を単語IDに変換し、適当な次元に埋め込みます。
次に入力単語列に対応する埋め込みベクトルたちの可変長ベクトル列をLSTMを使って
固定長の特徴ベクトルである2つのLSTMセルの隠れ状態h,cにエンコードします。
エンコードされた隠れ状態h, cと文章開始を表す特別な単語(の埋め込みベクトル)を別のLSTMに入力し、
LSTMの出力を全結合層に渡してsoftmaxを取ることで1単語目が各単語である確率を得ます。
1単語目が各単語である確率のargmaxを取ると1単語目の推定結果になります。
以降、t単語目の単語の埋め込みベクトルとt単語目の時点の隠れ状態h, cから次々と単語を生成していき、出力の単語列を得ます。
図にすると以下のような感じです。
同じ色の四角はウェイトが同じです。
具体的な単語が入っている四角の実際の入力は単語を対応する単語IDに変換したものです。便宜上単語そのもので書いています。
例として、今回書いたコードでの各セル間で受け渡される値の次元を書いておきましたが、それらはハイパーパラメータです。
ニューラル機械翻訳に限らずseq2seqはもっと色々モデルがありますが、kerasに慣れることを重視してシンプルなモデルでいきます。
環境構築
色々面倒なのでSagemakerのノートブックインスタンスを使います。
諸々のライブラリやら、GPUインスタンスならGPU環境やらが構築済みでお値段なんと0.0464 USD/hourから!
GPU使うとml.p2.xlargeで1.26 USD/hourとかしますので、デバッグをml.t2.mediumでやって、学習時だけml.p2.xlarge使うなどすればお安く抑えられるかと。
手元にゲーミングPCあるので手元でもできるんですが、何かと面倒なので最近はずっとノートブックインスタンスばっかつかってます。
参考
前処理部分は下記
アテンションを用いたニューラル機械翻訳
https://www.tensorflow.org/tutorials/text/nmt_with_attention
学習・推論部分のコードのベースは下記
Sequence to sequence example in Keras (character-level).
https://keras.io/examples/lstm_seq2seq/
学習に使ったデータは下記
https://github.com/odashi/small_parallel_enja
本記事のコードが入ってるリポジトリ
https://github.com/nagiton/simple_NMT