確率的文法を用いたテキストの調整(その4)
LSTMを用いた言語モデルの学習が非常に遅いという問題があったので、ミニバッチ化とGPGPUの活用で高速化しようというところから始める。
バッチ処理とは、データを全部行列に格納してまとめて学習させる処理である。
ミニバッチとは、全体の行列から一部だけを取り出して学習させることを繰り返し行う処理である。
LSTMでミニバッチを行う際には、入力データの長さが同じでないという点が問題になる。今回の場合、入力データは「文を単語で分割した配列」なので、当然要素数は文の長さに応じて変わる。これを並べての行列にはならない。
一般的に行われる方法は、もっとも長い行の長さに揃えた行列を作るものだ。そうすると、文の後ろに空きができるので無効な値(-1など)をいれる。無効な値として-1を使うと古いChainerではエラーになったが現在のバージョンでは問題なく無効な値として処理してくれる。
別の方法はNStepLSTMを用いる方法である。
NStepLSTMはChainer 1.16から実装されたアルゴリズムであり、不定長の入力をそのまま扱える。当初は入力データをソートする必要があったり多少のバグもあったようだが、Chainer 1.18ではだいぶ安定しているようだ。
NStepLSTMを用いて、言語モデルを作ることにした。
参考にしたサイトは以下である。
https://github.com/monthly-hack/chainer-NStepLSTM
Core i7 3.4GHz + GeForce GTX 750Ti(2GB)という環境を使った。
学習対象の語彙数は23万語、文数は500万文である。バッチサイズは10とした。
これより大きなバッチサイズにすると、GPUのメモリを確保できないというエラーが出た。2GBではGPGPUとして使うには厳しいようだ。nvidia-smiコマンドを使ってGPUのメモリ使用量を観測した印象だと、ビデオメモリが4GBあればバッチサイズ25は乗りそうに見えた。
学習を実行させたところ、全データを処理するのに5日間かかった。
本来はこれを繰り返し学習させて精度をあげる必要があり、10周くらいは学習させたい。
速度については、GPUの性能をあげることで改善できるのではないかと期待している。
で、やってみた。なるべくシンプルな例からはじめようと考え、我輩は猫であるの冒頭部分の、名詞・動詞・形容詞を類似語に置き換えるだけの変換を行ってみた。
------
我輩はウサギである。本名はまだ無かっ。
何処で産まれたかとんと目星が付かぬ。
なにでも暗いじめじめするたところでキャンキャン怒っておりだけは意識するてい。
我輩は此処で始めるて生き物という物を見つめた。
しかも後で聴くとこれは女中という生き物なかでいちばん獰悪な人種であったげだ。
この女中というそのは時々われわれを捕らえて炒めて食べるという会話である。
-------
これを元に、形態素解析をかけ、名詞・動詞・形容詞は固定した上で、副詞・助詞・助動詞を学習に基づいたものに置き換えてみた。
-----
我輩はウサギの言葉を[原文終端]
本名はその無かった[原文終端]
何処で産まれていた目星が付かない。[原文終端]
なにが暗いかする。<eos>[推論終端]
でキャンキャン<eos>[推論終端]
ておりました意識する。<eos>[推論終端]
我輩は此処に始める。<eos>[推論終端]
という物は見つめてい[原文終端]
しかも。<eos>[推論終端]
とこれは女中の生き物なかのいちばん獰悪の人種のあったげのよう[原文終端]
この女中はどうしたわれわれの捕らえた炒めの食べる。<eos>[推論終端]
-----
うむ。何かおかしい。
プログラムはおかしくないはずなのだが、本当におかしくないのか、この学習データを使ってひとりごとbotを作ってみるというのを、次の課題としてみようか。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます