murawaki の雑記

はてなグループから移転してきました

ニューラル機械翻訳と記号幻想の死

ニューラル機械翻訳が最近ひどいことになっている。科学技術論文の中日翻訳の結果を見て、ボスの中では機械翻訳はできてしまったことになっている。長年開発してきた用例ベース機械翻訳システムもあっさりお払い箱。しかしボスは満足している。既存研究の再実装にいろんなチューニングを加えただけで、論文にできるような新規性は何一つないにも関わらず。そのぶん、機械翻訳以外をやっている私たちへの風当たりがきつい。

そんなある日、AIが翻訳の不可能性に気付く日というブログ記事を見つけた。率直に言えば、懐かしさすら覚えるひどい代物。ここ2、3年ほどの機械翻訳研究をまったく追わないまま、聞きかじった話を適当に組み合わせるとこうなるのだろう。しかし、いままでぼんやりと考えていたことが、いい感じにツッコミどころとして配置されている。この機会に言語化してみようという気になった。なお、ブログ記事で引用されている文献は一切確認していない。

教師あり学習としての機械翻訳

ニューラル機械翻訳に限らず、機械翻訳の入出力は単純明快。源言語のテキストを入力として受け取り、目的言語のテキストを出力する。テキストといっても、現在のシステムの処理単位は基本的に文。

そうしたシステムをどうやって作るか。翻訳に必要な知識をどうやって計算機に教えるか。人間が翻訳規則を直接書いていた大昔ならいざしらず、現在は計算機自身に翻訳のための知識を獲得させる。そのために、源言語と目的言語の文ペアを大量に計算機に与える。日英や日中なら百万のオーダ。その大量の文ペアから、どういう入力に対してどういう出力をするかという対応を計算機が学習する。教師データと完全一致する文しか翻訳できないようでは困るので、ある程度汎化した形で対応を学習する。教師データから学習するので教師あり学習といえる。*1

では、教師データである源言語と目的言語のペアは誰が作ったのか。人間である。計算機は人間が翻訳した結果から学習し、その結果をもとに未知の源言語テキストを翻訳するのである。翻訳不可能性もへったくれもない。人間が、目的言語に等価な表現がなくて困り、適当な近似的表現を編み出していたなら、計算機はそれを学習する。それが計算機に期待された動作。源言語のテキストが表現しているものが、いままで人間が目的言語で表現したことないもので、翻訳に苦労することなんていくらでもあると思う。そんなものを機械翻訳が魔法のように翻訳してくれるわけがない。そんなことは期待されていない。実際、科学技術論文だけを与えて学習した中日翻訳システムは、「你好」すらまともに訳せない。

現状の確認

機械翻訳の従来の定番手法はフレーズベース統計的機械翻訳とよばれるもので、Google Translate の中身も基本的にはこれ。いわゆる深層学習とは無縁だったはず。

機械翻訳はそれなりに大掛かりなタスクであり、ニューラルネットワークが華麗に復活したあとも、しばらくはニューラルネットワークの使いみちはサブタスクを解くことだった。

やがて源言語から目的言語への翻訳をニューラルネットワークで一気に行うモデルが提案されるようになった。2014年が当たり年で、これこれは、精度的には従来手法を下回っていたものの、唖然とするほど単純なモデルでそれなりの精度を叩き出したことで衝撃を与えた。それまでは、機械翻訳といえば、頭の良い人が計算量の爆発と戦いながら、精緻なモデルを頑張って作る分野だった。*2 今までの苦労は何だったのか。

これらのモデルには長い文に弱いという欠点があったが、同じく2014年に提案された改良版解消軽減されている。現在定番となっているのはこの手法。

Google が発表したニューラル機械翻訳もこの流れ。*3 2016年9月には Google Translate の中英翻訳がニューラル機械翻訳に置き換えられている。他の言語対もそのうち置き換えられるだろう。

記号操作の排除

言語は少なくとも表層的には記号列でできている。記号への思い入れが強い人がいて、記号だけで一つの業界ができていたりする。しかし、記号の背後にある意味についてはいまだに誰も正しい扱い方を知らない。意味についても記号の操作だけで何とかできると考える人がいた。isa(Socrates, Man) みたいに記号によって記号同士の関係を記述するとか、Woman を +HUMAN, +ADULT, -MALE のように別の記号の組み合わせに分解して表現するとか。少なくとも昔の人工知能研究はそんな感じだった。でも、人間のような天然知能は記号操作だけを行っているわけではない。結局、記号操作だけで完結する実用的なシステムが作られることはついになかった。ニューラル機械翻訳はそうした記号幻想に引導を渡そうとしている。定番化した手法の時点で記号排除が進んでいるうえに、最近の流行はより一層暴力的に記号を扱うこと。

ニューラル機械翻訳であっても、入出力は源言語と目的言語の文、つまりは記号列。しかし記号列なのは入り口と出口だけで、その間をつなぐ経路からは記号が徹底的に排除されている。

ニューラル機械翻訳は、広くは sequence-to-sequence (seq2seq)、つまり系列から系列へ変換する手法の一種として実現されている。源言語系列は一度に全部受け取るが、目的言語側では記号を一つ一つ出力する。少しややこしいが、システムへの入力は (1) 源言語記号列と (2) システム自身が途中まで吐いた目的言語記号列。これらをもとにシステムは目的言語の次の記号を出力する。

日英翻訳を例にとると、源言語の記号列「私 は 学生 です 。 」( は終了を表す特殊記号) と目的言語の途中までの記号列「I am a」を受け取ったとき、システムは次の出力記号として「student」を吐く (ことが期待される)。出力の頭では、源言語の文だけを受け取った状態で「I」を吐くし、「.」を吐いた次は を吐く (ことが期待される)。

システムの中身を直感的に説明するのは難しい。LeCun 御大の例えをもじって、ノブを使った説明を試みる。機械翻訳というブラックボックスには、上部と下部に大量の穴があいていて、それぞれ入力と出力に対応する。上部の適切な穴に水を注ぐと、下部の適切な穴から水が出てくる。上部と下部の穴の間には複雑にからまったパイプがあり、途中で分岐 (というより分身) したり合流したりするし、途中に水を貯めている箇所があったりもする。そういう箇所にはノブがあって、水の流れを制御する。実際には、量が増幅されたり、負の値をとったりするので、水で例えるのは微妙だけど。

上部と下部の穴は何を表すか。いま、源言語と目的言語の語彙をそれぞれ3万に制限するとする。足りない語は無理矢理 という特殊記号に変換してしまう。そうすると、源言語の各単語に対して、3万個の穴を用意し、そのうちの一つだけに水を注げばよい。「私」なら42番目の穴、「は」なら3番目の穴といった具合。源言語文が を含めて 6 つの記号だとすると、それは 6x3万=18万個の穴に対応する。出力済みの単語も同じように上部の穴に対応していて、水を注ぎ込む。下部の穴は、次の単語を表す3万個の穴。そのうちの一つから水が流れ出す。802番の穴なら「student」といった具合。

学習とはノブを調整すること。ノブを適切に調整していないと、別の穴からちょろちょろと水が漏れたりする。正しい穴だけから水が出るようにノブを調整する。こういった階層の深いシステムであっても、充分な教師データを与えれば適切にノブを調整できることがわかった。それが深層学習とよばれているもの。とはいえ、途中を流れている水を見ても、何が起きているのか人間には (システム設計者ですら) さっぱりわからない。

そろそろノブの例えが厳しくなってきたのでここでやめにするが、最後に一つ付け加える。システム内部は、水の流れが多いか少ないかという数量で制御されている。確かに入り口と出口は離散的だけど、中は連続値で支配されている。記号の出る幕はない。

記号の連続空間表現

機械翻訳において、意味はどのように扱われているのだろうか。ニューラル以前は、記号同士を直接結びつけようとしていた。素朴には、例えば、英語の「cat」と日本語の「猫」を結びつけておけばよい。しかし、そう単純にいかないからシステムが複雑化していく。「bank」が「銀行」と「土手」に対応するといった曖昧性、「punctual」と「時間 に 正確だ」のように単語単位では扱えない対応など。そこで、ニューラル以前のフレーズベース統計的機械翻訳がとった対策は 2 つ。(1) 単語ではなく句を単位にする。(2) スコアによって曖昧性を解消する。フレーズベース統計的機械翻訳は、句単位での源言語と目的言語との対応にスコアを紐付ける。翻訳時には、とにかく候補を列挙して、スコアが最大となる訳を選んでいた。スコアのような非記号的要素が加わったとはいえ、記号同士を直接結びつけていた。

ニューラル機械翻訳は記号同士を直接結びつけるのをやめてしまった。システムの中で何が起きているのかよくわからないが、入力直後と出力直前の処理であればまだ想像できる範囲内。

入力の各単語は、まず連続空間表現 (分散表現) に変換される。(-1.26, 0.23, 0.92, ..., -0.54) のような、500次元くらいの実数値の羅列。こうした数値列が「私」、「は」といった単語タイプごとに辞書に格納されていて、入力単語は辞書引きによって連続空間表現に変換される。源言語の語彙を3万に制限していたので、3万x500で1500万個の実数値。目的言語も同じだけある。この数値列が実際のところ何を表しているのかよくわからない。ただ、「私」の連続空間における近傍を探すと「僕」が見つかったりする。意味的に似た単語が近くにくる傾向は確認できるので、何らかの意味を表しているのだろうと推測できる。

ニューラルネットワークの特徴量と意味論の素性は全然別物。前者は連続値で後者は離散的。実態を確認せずに「特徴量 = feature = 素性」という連想ゲームをやるのは無意味。

入力は置いておいて、出力直前の処理を見よう。出力単語の候補も辞書に格納されている。例によって語彙が3万で、500次元とする。やはり似た意味の単語は近くに集まっている。出力直前には、システムはこれと同じ長さ (500次元) の数値列を作り出す。システムはこの数値列と出力候補の3万語各々との内積をとり、一番大きな値を返した候補を出力する。内積\mathbf{a}\cdot\mathbf{b}=\left\|\mathbf{a}\right\|\left\|\mathbf{b}\right\|\cos\theta と変形でき、長さがほぼ同じと仮定すると、単なる cosine 類似度になる。つまり、システムが作った500次元の数値列に一番近い連続空間表現を持つ単語を選んでいると解釈できる。これは面白くて、システムはまず次に出力したい「意味」を作って、次にそれを一番うまく近似する単語を選んでいることになる。

出力直前の処理は、ニューラル機械翻訳が犯す誤りを見るとよくわかる。例えば、英日翻訳で、「Tunisia」を「ノルウェー」と翻訳するといった不思議な間違いが生じる。「チュニジア」も「ノルウェー」も地名としてテキスト中で同じように振る舞うから、連続空間上で近くに配置され、つい間違えてしまうのだろう。

要素還元主義のおわり

「bank」が「銀行」と「土手」に対応するといった曖昧性はどのように解消されているのだろうか。よくわからない。わからないので以下は単なるクソポエムだが、源言語文の文脈によって解消されているのではないかと想像する。

入力単語はまず連続空間表現に変換されると言ったが、この数値列から出力の意味を直接作ろうとするのではない。さらに変換をかませた結果を使う。この変換は、源言語の系列を前から後ろに流れてくる数値列と自身の数値列を合成することで実現される。同じように、後ろから前に流れてくる数値列と自身の数値列を合成しており、最終的には前向き版と後ろ向き版を結合したものを使う。

想像するに、この前向きと後ろ向きの流れが文脈を表していて、例えば源言語文で「deutsche」が「bank」の前に来ていたら、前向き文脈に引っ張られて「銀行」の方の意味が活性化するのではないか。本当にそんなことが起きているのか検証したいところ。

ともかく、ニューラル機械翻訳以前は、文をどうやって翻訳に有効な構成要素に分解するかに頭を悩ましていたのだが、文脈の数値列によって、ふわっと解消されてしまったように見える。

文法よいずこへ

翻訳においては、訳語の選択だけでなく、語順の変換も難しい。ニューラル機械翻訳以前は、源言語記号列を目的言語記号列に並べ替えるモデル (distortion model) がまず研究された。これは単なる列の並べ替えだが、それでは駄目で、統語構造をちゃんと考えましょうという研究も流行っていた。

ニューラル機械翻訳が来て、時計の針が巻き戻されてしまった。seq2seq は系列を見ているだけで、統語構造を陽には扱わない。陽には扱っていないのに、語順を適切に並べ替えたように見える結果を出力してくる。並べ替えができるということは、この巨大なモデルの膨大なパラメータのどこかに語順に関する情報が保持されているはずである。それがどう表現されているか以前に、どのあたりにあるのかすらよくわからない。誰か助けて。

再帰性は実は難しくない

人間が他の動物と異なるのは言語を持つことであり、言語を特徴づけるのは再帰性だと思っていた。人間と他の動物との知能にはそれなりの断絶がありそうだから、再帰性を扱うのはそれだけ難しいと推測してもおかしくない。しかしどうやら再帰性はそんなに難しくないらしい。単なる系列モデルで再帰性が扱えることが実証されてしまった。

2014年末に発表された Grammar as a Foreign Language は、seq2seq で構文解析を行う。入力は

John has a dog .

のような普通の文。出力は

(S (NP NNP )NP (VP VBZ (NP DT NN )NP )VP . )S

のように構文木を直列化したもの。ニューラル機械翻訳に既存の構文解析器の出力をひたすら食わせて訓練すると、少なくともその構文解析器の振る舞いは再現できてしまったようである。

何が起きているのだろうか? 自分が「(NP」を吐いたことを覚え続けておいて、適切な時点で「)NP」を吐く、あるいはスタックに非終端記号を積んだら、あとで取り出すということはできている。それに、「(NP」を吐いたら、NP 内という文脈に移行して、「)NP」を吐いたら、S 内という文脈に戻りつつ、既に NP を吐いたという追加情報を加えた文脈に移行できている。この2つを系列モデルで難なく行えることが実証されてしまった。それも実用的な精度で。

もちろんこれは教師あり学習であり、構文木は教師データとしてシステムに直接与えられている。幼児の言語獲得のように明確な教師データのない設定で実現できてはじめて再帰性を克服できたと言えるのだろうが。

Grammar as a Foreign Language は本気で構文解析を置き換えるというよりも、単なる一発ネタっぽかった。2016 年に発表された Recurrent Neural Network Grammars はもう少し本気さがうかがえる。やりかたは、seq2seq よりも遷移型 (前から順番に単語を読みながら構文木を組み立てる) の構文解析に近い。とはいえ、seq2seq と同様に、系列モデルの枠組みで、文脈を前から後ろに流しながら構文解析を行っている。

言語には系列データとしての側面と、再帰性を持つ構文構造という側面があり、両側面をどうやって統合的に扱うかは個人的にずっと謎だった。伝統的な構文解析は系列としての側面を軽視しすぎている印象があったし、従来の系列モデルは構文的側面を完全に無視していた。どうやら、系列を主体としつつ再帰性を扱うのが正解っぽい感触がある。

さらなる暴力の連鎖

ここまではテキスト処理だけを見てきたが、画像から説明文を生成する研究も2014年頃から流行っている。画像を入力すると、「A group of people shopping at an outdoor market. 」のような自然文が出力される。これも結局、源言語文だったものが画像に置き換えられただけで、翻訳の一種と言える。記号列だった入力が、最初から数値列で与えられる。テキスト翻訳の場合は源言語の情報を過不足なく目的言語に変換する必要があったが、画像の場合は、膨大な数値列から必要な情報を抽出する感じ。それを除けば同じ枠組み。どうしてこんな無茶苦茶なモデルが動いているのだろうか。

機械翻訳の多言語化も流行っている。一つの源言語から複数の目的言語へ翻訳したり、複数の源言語から一つの目的言語へ翻訳したり、さらには多対多だったり。途中のパラメータを共有している。単純には教師データが増えるという利点がある。それ以上に深い効果があるのかはよくわからない。言語対特有のエラーが減るという観察もある。

ニューラル機械翻訳では内部から記号操作が排除されたとはいえ、入力と出力は記号列である。記号幻想の最後の拠り所といえるここにも暴力の嵐は及んでいる。ニューラル機械翻訳では語彙を3万とか、比較的小さな数で固定しないといけない。語彙を増やすと速度が下がるし、低頻度語はうまく学習できないし、教師データに出てこない未知語は学習しようがない。そこで、入出力を単語単位で扱うのをやめて、あるいは補助的に、もっと小さな単位を導入する。文字単位で処理するとか、文字よりは単位が大きいものの、高頻度な文字の連鎖を適当に連結しただけの代物を使うとか。さらに、これは (まだ) 機械翻訳への適用ではないけど、文字よりも小さなバイト列を処理するという話すらある。もう無茶苦茶。

おわりに

記号絶対殺すマン自体は大昔からいて、おそらくコネクショニストとよばれていたのだと思う。よく知らないけど。おもちゃのような実験設定でいろいろ議論している昔の論文が探せばみつかるはず。機械翻訳は、そういう実験とは違って、大勢の頭の良い人が長年取り組んできた実際的な問題。この問題がある程度解けたとなると本物である。

複雑だと思っていた問題が、驚くほど単純なモデルで解けている。ではそれで満足かというと、まったく満足感がない。わかった感じがほとんどなくて、むしろもどかしい。機械翻訳は個別の現象を分析するには複雑に入り組みすぎている。

そもそも、ここに書きなぐったことがいつまで有効かもまったくわからない。異常な速度で新しい成果が報告されるので。

2016年11月12日追記: 11月11日頃から、Google Translate の日英翻訳もニューラルっぽい振る舞いをするようになった。公式の告知はないけど。

私には当たり前すぎて明確には書いてなかったけど、読者にとってはもしかしたら当たり前ではないかもしれないこと。機械翻訳という問題が最終的に解決したとは私は微塵も思っていない。従来よりも良い精度の翻訳が、従来よりもはるかに簡単なシステムで実現できるようになっただけ。機械翻訳は複雑な問題なので、現時点で解けない事例はいくらでもある。その本質的な難しさを垣間見たければ、takeda25 さんのブログ記事がおすすめ。

*1:ニューラル機械翻訳が来るまで、単なる文ペアは明示的な教師データとはあまり考えられていなかった。以前は要素還元主義的で、単語や句といった文より小さな単位で源言語と目的言語を対応付ける必要があった。単なる文ペアにはそうした対応の正解が付いていない。計算機は、正解データがないまま、そうした対応を学習する必要があった。だから、教師データのない状況で学習する、教師なし学習の一種とみなされがちであった。

*2:ニューラル以前の統計的機械翻訳モデルの、作っている人の頭のヤバさ加減を知りたければ、渡辺太郎ほか『機械翻訳』(2014) を眺めればよい。

*3:Google のシステムは金に物を言わせたえげつない代物で、うちの研究室程度の資金力では再現しようがない。