ニューラルネットの言語処理と人間の言語処理
【ーー】 いまの一連の話とも関連しますが、もうすこし個別的な話として、最近の自然言語処理では、例えばワードエンベディングでは、語をベクトルで表現すると、意味的に似た語が似たベクトルになるとか、足し算引き算ができるとか、そういった有名な話があります。ああいうものも、ある意味では我々の言語に関する感覚を捉えているように見えるのですが、他方では、どんな単語も一つの空間に全部ぶち込んでしまうという、ちょっと不思議なところもあって、どこまで我々の理解できる枠組みで解釈できるものなのか、あるいは解釈すべきものなのかというのはなかなか難しい気がします。
あるいは、最近の機械翻訳で言えば、単語単位で入力を切らないでサブワードで処理するというような話になってくると、そもそもその単位が何を意味しているか、あるいはそこで区切る意味が我々にはよく分からなくなります。そういう意味では、いまの機械翻訳の道具立ての中には、常識的な言語の見方で理解できる部分とそうでない部分が混在しているように思われます。それをどう考えたらいいのかというのもちょっと漠然とした話ですが、最終的には、人間にぱっと意味合いが理解できるか、解釈できるかどうかにこだわらないほうがよいということになるのでしょうか。
【小町】 やっぱり開発するにしても、人間が何か分からないと改良しようがないので、解釈性がある程度あるというのは大事だと思います。
Word2Vecの話でいうと、計算機で扱う以上、全ての情報を何らかの枠組みに押し込めて、その中で処理しないと扱えないので、それがベクトルなのか行列なのかテンソルなのか、いろいろ選択肢はありますが、たとえば単語の表現としてベクトルを採用したとして、皆さんがこれはうまくいってるなと思うものは大体多義じゃない単語で、多義の単語だったら明らかに2つ以上のベクトルにしないといけないですよね。強引に1つにしたら合成されて、この内分点のここ、みたいな感じで出てくると思います。手法によってはそういう多義の単語を扱えるようにしている表現もありますし、1点じゃなくて分散も考慮して、多義のものはぼんやりするような形で表現するのもありますし、あるいは、もう単語自身がベクトル1本じゃなくて行列を持っていて、例えば名詞はベクトルでいいけど、形容詞って形容詞単体でredって意味じゃなくて、例えばred carというと、carのほうの単語ベクトルの意味を変えて、別のベクトルにするという処理で、ベクトルをベクトルに移すような演算をするのは行列ですよねというので、行列として形容詞とかを表現しようという研究もあります。あとは他動詞ですね。英語で SVO というと、動詞が主語と目的語という2つの引数を取って文の意味を返す演算と見ることができます。2つのベクトルをとって1つのベクトルを返すような仕組みは、3階のテンソルをつくれば実現できるので、SVO のような他動詞はテンソルで持っておけばよい、という研究もあります。いずれにせよ、何を数学的な道具として表現して、機械学習の枠組みによって学習するのか、というのは研究的には諸説ありますが、実用上はベクトルぐらいにしておくと、さっき言ったデータ量の問題とかも含めて、ちょうどいいぐらいになっていると。
ただ、今の深層学習による言語処理を支えているのは、Word2Vecのような形のベクトルじゃないんです。単語そのものに固定の1個のベクトルがつくというようなやり方は、今のニューラルネットワークではしてないです。周辺の文脈を見ながらベクトルを決めています。実際には文脈付ベクトルといって、一個一個の単語に関して、周辺の文脈を見て単語のベクトルを決めます。さっきのbankって多義語でも、周辺にriverがあったらこれは土手の意味のbankのベクトルになっているし、周辺にmoneyがあったらこれは銀行の意味のベクトルになっているというような形で解析します。そうしないとそもそも翻訳するときに翻訳し分けられないですよね。
あと、後半のほうでおっしゃっていたことは何でしたっけ。すみません。
【ーー】 サブワードの話ですね。ベクトルぐらいだと、そういうふうに表現できるというのがしっくりくる感じがあるわけですが、サブワードのようなものは、何でそれが役に立つのかというのが、直観的にはあまりぴんとこない。そういうものをどう理解したらよいのだろうという問題ですね。
【小町】 ありがとうございます。それがやっぱり、人間が理解する単位と機械が理解する単位が異なるという話につながるんですけど、深層学習以前には、サブワードみたいな単位はあんまり使っていなかったんですよ。細かすぎる単位を使ったからといってよくなるとも限らなかったのです。ニューラルネットワークになったら、細かい単位でも自動的にベクトルや行列を学習できるようになったので、サブワードの研究が華開いた感じです。
まず一番大きな問題は未知語ですね。未知の文字列があると、ニューラルネットワークはこれにどういうベクトルを当てたらいいか分からなくなるので、既知のベクトルで表現したいと。既知のベクトルで表現するときには、単語としては知らなくても、サブワードに切ってあげると、これは見たことある、これは見たことある、これは見たことある、となって、全体を既知語扱いして翻訳したりできるます。これがつながっていて1単語のままだと、未知語ベクトルになっちゃうんです。これがどんな文字列から構成されているという情報が全く消えてしまって、周辺の文脈しか手がかりがなくなる、というのが多分一番大きな問題です。サブワードでぷつぷつぷつと切ってあげることによって、それぞれのサブワードのベクトルから単語のベクトルを構成できるようになって、翻訳できるようになる、というのが多分一番大きいかなと思います。
言語によっては長い複合語を作るような言語もあります。たとえば日本語で漢字を並べて複合語を作るように、ドイツ語では長い名詞を作ることができます。それをサブワード化すると、この長い単語は知らないけど、これはこれとこれの単語の複合語じゃん、と知っている単語に切れてくれるんです。書き言葉で見ると長い単語と思っているかもしれないけど、例えば音声言語として聞いたら、必ずしもこれが単語だと思わないというような短い単位で分割を学習したりするので、言語によっては、これはもっと切ればいいんじゃないのと思うようなところは切れてくれたりするのがあるので、それはよしあしかなと思いますね。人間はやっぱり単語の形になっていたほうが理解しやすいので、その形で書いたりするんですけど、機械からすると、必ずしもその単位が分かりやすいとは限らないので、もっと細かくしてくれたほうが滑らかにつながるんです。それぞれの言語で何を語とするのかも、言語テストがあって、それによって、これは語であるが、これはあやしい、みたいのがあるのかもしれないですけど。
【ーー】 サブワードをニューラルネットの内部で使うことに関してはかなり明確な理由があって、また、少なくとも単語の語幹とか語尾とかそういう固まりに関しては、人間もある意味同じようなことをやっているかもしれないと。そう考えると、どのくらい一般化できるのかは分かりませんが、ニューラルネットの自然言語処理の中で見つかったいろいろなテクニックなり特徴なりが、じつは人間も同じようなものを使っているんだということになる、人間の言語理解に関する研究にフィードバックされる、そういう可能性もあるわけですね。
【小町】 はい、あると思います。日本語でも、例えば派生文法というのがあります。日本で普通に学校文法を習うと、活用は平仮名より細かくしないじゃないですか。でも、活用は平仮名じゃなくて音素まで分解していいと思うと、「書く」という動詞は実は「kak」という語幹になっていて、ここに「imas-u」とかいうのがくっつくと「書きます」になる、というふうに切ると、もっとシンプルに文法が書けますという文法があったりするんですけど、ニューラル翻訳でも多分同じで、単語よりサブワードの方がいい、サブワードより文字の方がいい、いやいや文字よりももっと細かい単位でやったほうが統一的に処理することができて性能が上がる、というようなことも、見つかり得ると思います。大体の場合は、データが十分にあれば、アプリケーションの精度の観点からは、細かく分解する必要はないし、細かくすれば細かくするほど学習に時間がかかるので、適当なところでトレードオフがある、ということになると思うんですけど。
データの分量問題というのは結構ありますね。レアじゃなければもう十分テキストの中で出てくるので、そんなことしなくてもいい。人間の情報処理も、頻度の高い不規則動詞みたいなものは脳内に直接入っていて、レアなやつは規則で、みたいなのが脳内でも発動して。ニューラル機械翻訳も同じで、高頻度の単語は一瞬で意味を引っ張ってくるための特殊なエントリーがあって、低頻度の単語は分割して意味を計算する処理みたいなものが発動する。確かに、人間がやっているようなことをやっているような感じもするんですけど、たまたまかもしれません。
【ーー】 その辺は非常に興味深いです。一方で、多くの人工知能研究者は、必ずしも人間の言語処理のメカニズムを解明することが目的ではないということを自覚しているけれども、他方で、実際にいろいろな手法が出てくると、じつは人間も同じことをやっているんじゃないかということが見えてくる。あるいは、さきほどのお話にあったように、文法的なカテゴリーのようなものがじつはニューラルネットの中で形成されているんだというようなことが分かってきて、従来の言語学理論との接点が見えてくる。だから、建前としては、人間の言語処理のメカニズムを解明することと、特定の課題ができる自然言語処理システムをつくるというのは、別のプロジェクトなのだけれども、やはり両者は無関係ではなくて、やればやるほどいろいろとつながりが見えてくるのだとすれば、そこは非常に興味深いところです。
他方で、完全に重なるわけではなくて、人間はこういうことは多分やっていないのだけど、こういう手法を取り入れると、機械翻訳としてはパフォーマンスが上がるということもあるわけですね。人間は絶対こんなことやってないけど、ということも多分あるわけですね。
【小町】 そうです。今、実際そうなっているので。
【ーー】 そこは面白いですね。つながる部分、重なる部分と重ならない部分と両方あるという。
【小町】 そうですね。
自然言語処理研究の課題
【ーー】 いまの話とも関係するのですが、自然言語処理に関する人工知能の限界、現状での困難、課題はどの辺りにあるのかということに関しては、どうお考えでしょうか。
【小町】 現状で明確に課題があるのは、推論みたいな処理ですね。何か複数のステップを経ないと結論にたどりつけないようなものは、明らかに苦手です。Chain-of-thought といって、複雑な処理を複数の中間ステップに分けて教えてあげることで、言語モデルの推論能力を向上させることができる、ということも知られています。
あとは否定。否定も、さっきのベクトルでいうと、意味が似ているというのは近くにベクトルを置いておけばいいんですけど、意味が違う、反対って、じゃあどうしたらいいですか、って話なんですよね。結局、対義語って、意味はほとんど同じなんだけど、ある一点で違うから対義語になっているんです。だから、意味が同じなんだけど違う、全然無関係じゃないということとかも入れなくちゃいけないので、否定はそういう意味では、その度合いもそうですし、あと、どこを否定しているのか、スコープも決めなくちゃいけないので難しいですね。
根本的には、最近パフォーマンスがよくなっている深層学習系のものというのは、これまでは、データをそもそもそんなに入れていなかったというのと、データを入れてもそんなにできないだろうと思っていたのが、データをたくさん食わせたら、結構な事例はデータの中に出てくるんだなということが分かったということだと思っています。ウェブデータとか本のデータとかをわーっとたくさん入れて学習させてあげたら、何か質問応答できちゃったと。こういうのが結構あるんですよね。逆に、存在しない何かも答えちゃったりする場合もあるんですけど、それは別の話で、データの外挿の問題です。現在のモデルで分かっているデータの外側にある事例を予測するのは、全然違う出力を出してくることがあるんですけど、ほとんどのものは中にある事例の組合せで表現できるので、大丈夫というか、うまく動いているように見えると。
人間の関するタスクってほとんど FAQ みたいなタスクばっかなので、何か、言語学とか哲学とかやってると例外が気になって、病的な事例について「これができないでしょう」と言いたくなるんですけど、日常生活で出会うのはほとんど典型例なんです。例えばウェブ検索するのに、誰も知らないような単語は普通入れないんです。ほとんどはみんなが知っている単語を入れているので、それが解けるようになっていれば、実用上の精度は高くなるというような形だと思っています。工学的には、大きな課題のうち、潰せるところから潰していく、という戦略で改善していくので、90%を99%にする、99%を99.9%にする、というのはそれぞれエラー率を1/10にするという気の遠くなるような作業ですが、50%のものを75%にするのはエラー率を半分にするだけなので、そこまで大変ではないのです。
とはいえ、言うは易く行うは難しで、問題点が何かというと、基本的にはデータをどれぐらい用意できるかという話と、そもそもデータを用意することで解くことができる問題なのかどうかという、この2つだと思います。そして、言語生成の大部分の問題は、データをたくさん入れればそこそこ流暢な出力が出せるようになっているという現状で、これは、10年、20年前とはかなり違うところだと思っています。
日本語入力って、コンピューターが登場した当初はできないって言われてたんですよね。1970年代は全ての漢字がキーとして存在するような入力方式が主流で、訓練しないと使えないものでした。1976年に東大教授が出版した本でも、かな漢字変換のような複雑な処理はできるはずがない、と書いていたんですけど、今、小学生でもスマホで日本語入力できるのに、こんなこと言ったら笑い物になりますよね。そんな感じで、技術の革新というものは結構我々の予想を上回る速度で出てくるので、流暢な、それこそ人間と区別つかないようなテキストが出てくるというのが普通の時代になると、それが自分の生きているうちに到来する、と思っています。
原理的な問題に関して言うと、基本的には多層パーセプトロンって任意の関数を近似できるんです。だから、関数の形で書ける処理は全部出せます。あとは、ちゃんと関数を学習するためのデータがあるかという話と、あと、関数じゃない処理はどうなのかって。内部状態を持っている処理は駄目という話なんですけど、ほとんどの場合は、内部状態を無視して、同じ入力が来たら同じ出力を返せばいいような問題がほとんどなので、あとはデータを集めるという問題になると思うんですけど。内部状態を持つにしても、30年前の記憶は必要なくて、ほんの少し前の記憶があればいいのであれば、擬似的に表現できますし。
あとは、ロボットなんかやっている人は、言語理解には身体性がないといけないという立場の人もいますが、それも全部データをいかに取得するかという話に多分なると思っています。これに関しては生きているうちに解決するかどうか分からないですけど、センサーデータもたくさん取れる時代になっているので、そのうち実現されるんじゃないかなと楽観的に思ってはいます。
言語生成の研究をしているからかもしれませんが、生み出す系は結構できるという気がしていて、むしろできないのは評価する系だと思っています。芸術でも、生み出すほうは多分、たくさん出すのは近い未来にできます。人間は一生で1作品かもしれないですけど、機械はもう何百万とかあっという間につくれます。新しい作品でも、パーツも含めて完全に新しい、というような子はあまりなくて、パーツはどれもどこかで見たことがあるが、この組み合わせはこれまでになかった、というものばかりでしょう。しかし、「この組み合わせの中でいいのはどれ」という評価をするのが多分難しいと考えています。
あるいは、外から見ると人間と区別できないような振る舞いを示すような、何かモジュールというかシステムをつくることは、多分データの問題なんでそこそこできると思っていますが、このできたシステムが感情を持っているかみたいなことを言われても、それは難しい問題で、多分できないんじゃないかな。相手が人間でも、究極的には分からないように。これは単なる予想ですけどね。
その4に続く