Hatena::ブログ(Diary)

shi3zの長文日記 RSSフィード Twitter

2016-03-12

[]AlphaGoの勝利が確定しましたが、その隙にTensorFlowで英仏翻訳する人工知能を育ててみた 18:14


 やあ、ディープラーニングしてるかな?

 AlphaGoがついに勝ち越しちゃったねえ。


 人類危うし!

 もうあと人類に残された最後の希望は、不完全情報ゲームである麻雀と軍人将棋くらいしかない


 ということで、今の深層学習がどの程度進んでいるのか、最先端のリカレントニューラルネットワーク(以下RNN)について紹介しよう。


 そもそも深層学習ことディープラーニングが注目されたのは畳込みニューラルネットワーク(以下CNN)がきっかけだった。


 AlphaGoが使っているのも基本的にはこのCNNだ。

 CNNは画像などのパターン認識が得意だ。


 画像であればなんでも入力して分類できるので、かなり使いやすい。

 株価の変動グラフを覚えさせて株価変化の予兆を掴んだりとか、その他いろいろなことに使える。

 また、CNNは自然言語処理なんかにも応用されたりしている。


 しかしCNNは、構造としては極めて単純な、関数に過ぎない。


 ある画像群Xとその画像群のあるべきクラス群Tを与え、T=f(X)となるような関数fを学習する。

 Xは学習セットなので通常はXに二次元の絵を入れようとすると、色情報が乗って三次元、さらにそれがたくさんあるので学習セットの次元が足されて四次元になる。こんなふうに次元が増えたり減ったりするので、単純にあれはベクトルだとかあれは行列だとか表現し辛い。そこでそれらを一般化した名称であるテンソルと呼ぶ(スカラーは0階、ベクトルは1階、行列は2階のテンソルである)。

 

 まあ難しいのは用語くらいなものであって、我々は偉大なるGoogle神が下々に配布するTensorFlowというフレームワークを使うことでかなり簡単にこの恩恵を体験することができるのだ。


 しかしCNNはf(X)という関数に過ぎないので、同じXを与えたら、常に同じ答えが返ってきてしまう。

 これはこれで扱いやすいけれども、それではもっと複雑な問題を扱うのに向いてない。


 そこで、RNNは一部のレイヤーがループし、内部状態を持つようになっている。

 その代表的なものがLSTMやGRUだが、これも理屈は難しそうだが、実際にはプログラムにするとそこまで難しくない。


 いまどき、JPEGを扱うのに誰も離散コサイン変換を勉強しないのと同じように、科学者様が作ってくださった便利なライブラリをいかに面白おかしく、時に便利に使えるか考えるのが泥臭いプログラマーの美徳であり役得でもある。


 というわけで、TensorFlowのチュートリアルにある「英語-フランス語」翻訳なるものを試しに作るとする。

 いわゆるseq2seq、シークエンス・トゥ・シークエンスというやつだ。


https://i.gyazo.com/d1d750f3b56f9b8948f42f8273f7a36a.png


 このseq2seqというやつ、感動的なくらい言ってることが単純だ。

 上の図では、abcという文字列を入力したら、wxyzという文字列を出力せよと学習させる。

 それだけ!

 ただ、それだけ!!


 CNNでは多くの場合、入出力のデータ長は固定になるが、seq2seqの場合、不定長でいいのが特徴だ。


 んで、どうやってこの人工知能にフランス語と英語を教えるか。


 まず英語の文章

Observatories

Astronomers Introduction Introduction video What is Astronomy?

Often considered the oldest science, it was born of our amazement at the sky and our need to question Astronomy is the science of space beyond Earth’s atmosphere.

The name is derived from the Greek root astron for star, and nomos for arrangement or law.

 そしてフランス語の文章

Observatoires

Astronomes Introduction Vidéo d'introduction Qu'est-ce que l'astronomie?

Souvent considérée comme la plus ancienne des sciences, elle découle de notre étonnement et de nos questionnements envers le ciel L'astronomie est la science qui étudie l'Univers au-delà de l'atmosphère terrestre.

Son nom vient du grec astron, qui veut dire étoile et nomos, qui veut dire loi.


 こんな文章が2.3ギガバイトも延々と続く。

 気が遠くなるというのはまさしくこのことだ。


 つまりこれは、英語とフランス語を同時に教えてるに等しい。

 英語の入力にはフランス語の出力。


 まあ正直言って狂ってる。

 こんなに膨大な対訳が存在していることがそもそも驚きである。


 この対訳を大量に読ませると一体どうなるか。


 なんと英語からフランス語へと変換する人工知能ができてしまうのである。


 「嘘つけ」と思うだろう。


 僕も始めはそうだった。

 しかし実際にできてるところを見ると、もはやこれがシャレになってないことに気づく。


 ひとまずTITAN X二枚刺しのマシンで丸一日、つまり24時間ブン回した程度でperplexityが一桁になっていた。

global step 55200 learning rate 0.3812 step-time 1.20 perplexity 6.44
  eval: bucket 0 perplexity 4.32
  eval: bucket 1 perplexity 5.40
  eval: bucket 2 perplexity 6.49
  eval: bucket 3 perplexity 7.22

 欲を言えば1未満まで追い込みたいけど、とりあえず一回停止をかけて、試してみる。

 なにしろGPUをガチでぶん回すため、学習させながら試そうとすると落ちる。

Sat Mar 12 18:00:42 2016       
+------------------------------------------------------+                       
| NVIDIA-SMI 352.30     Driver Version: 352.30         |                       
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX TIT...  Off  | 0000:01:00.0      On |                  N/A |
| 32%   73C    P2   112W / 250W |  11724MiB / 12287MiB |     31%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX TIT...  Off  | 0000:02:00.0     Off |                  N/A |
| 32%   74C    P2   135W / 250W |  11715MiB / 12287MiB |     57%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0      1553    G   /usr/bin/X                                     164MiB |
|    0      2775    G   compiz                                         147MiB |
|    0      3132    C   python                                         558MiB |
|    0     10779    C   python                                       10823MiB |
|    1     10779    C   python                                       11689MiB |
+-----------------------------------------------------------------------------+

 さすがにTITAN X二枚じゃ足りないと思ったのは初めてだ。2つのGPUで計20GB以上消費してる。

 DEEPstation、自社でも購入したいがお客様向けの納期が一ヶ月待ちなので我慢してる。

 もうそろそろクラウドになるべき。

 

 さて、とりあえず試した感じどうなったのか紹介してみよう。

Reading model parameters from train_dir/translate.ckpt-74000
> 

 実行するとだらだら〜っとなにか出てきて、最後にプロンプトになる。

 そこで、チュートリアル通りの例文「Who is the president of the United States?」を入力してみよう。

Who is the president of the United States?
Qui est le président des États-Unis ?

 なんか出た!

 だがshi3zはフランス語がわからぬ。

 邪智暴虐のGoogle翻訳に頼らるばならぬ

 とりあえずこれをGoogle翻訳にかけると「米国の大統領は誰ですか?」となる。

 すげえ!!!翻訳されてる!!

 

 しかしこれは予定調和的な話し。

 まだ学習が足りないのか、そもそもニュース記事のようなものを対訳で学習させたのが悪いのか、口語表現にはとことん弱いようだ。

> Hello
_UNK
> Hi
_UNK
> I am fine
Je suis _UNK

 なんだよ_UNKって、アレか?アレのことか?


 ソースコードを見てみると、どうもこれはUnkownのことらしい。つまり「そんな単語はオレの辞書にねえよ」ってことだ。ナポレオンの辞書かよ!その辞書、落丁だから書店で交換してもらえよ。


 というわけで口語表現だと弱いらしい。Helloが一度も出てこないニュースなんてありえるのか。まああり得なくもないか。


 「I am」だけが「Je suis」に翻訳されている。「Je」は「私」だから、合ってる。


 うまくいくのもある。

> Who are you?
Qui est ?
> He is a hero
Il est un _UNK
> He is a man
Il est un homme
> Please let me know.
Veuillez vous informer .
> What is your name?
Quel est votre nom ?
> Excuse me
_UNK
> It's mine.
C ' est la société de l ' énergie .
> It is mine.
Il est _UNK .

 Excuse meとか、やはり口語表現には弱いし、heroを知らないということはエンタメ系の言葉にも弱いらしい。そしてなによりなんで「It's mine」が「C ' est la société de l ' énergie .(これは、会社のエネルギーです)」になるのかわからぬ。ぬぬぬ・・・・


 まあとりあえずperplexityが1未満になるまで我慢してみようか。

 TensorFlowのサンプルが凄いのは学習を再開しても勝手に前回の続きから学習してくれることだ。時間がムダにならない。


 ちなみにGoogleのチュートリアルみると、さりげなく34万ステップまで回してて、「おまえらどんだけコンピューティングリソース余ってんじゃああああ」と言いたくなる。


 しかしおわかりいただけただろうか。

 最新の深層学習ではこんないい加減な教え方でも、英語をフランス語に翻訳できるAIを訓練可能なのだ。


 だとすれば囲碁くらいタスクが絞りこまれていれば、人間に勝ち越すのもそう不思議はない。

 そしてこのseq2seqは、データさえあればありとあらゆる不定長データの学習が可能なはずだ。

 既に音声を入力して言葉に変換する、なんていう研究も行われている。

 絵を入力して言葉に変換したり、言葉を入力して絵に変換したりもたぶんできるだろう。


 そうなると、もう人間は「なんかネコミミついて、青髪で、全体的に可愛いというかドSな感じの女の子描いて」と支持すると、それっぽい絵が出力されてくる、なんてこともできるのかもしれん。んーまあでもさすがに入力長に対して出力長が長すぎるのは無理かなあ。・・・いや、しかし或いは、さらなるブレークスルーを経て、なにかとんでもないことが起きるのではないだろうか。


 そのとき・・・・どどど、ど、どうする人類!!!