自然言語処理の研究に悩む

背景

  • 自然言語処理分野の博士課程の学生です。何もわからないのが得意
  • 研究テーマないし進め方に悩んでいます。その考えごとを書きます
  • 何もわからん

ここに何を書きたいか

 研究が進められていない気がする。論文が書けない気がする。何も考えていないわけではないと思うが、自分の研究をどのように進めればよいのか混乱している。自分の目的・条件・研究分野の性質等を整理して、手がかりを得たい。という感じです。本当は(訓練のためにも)英語で書くべきですが、やはり日本語で考えたほうが脳内の通りがよいので(たとえばこういう表現自体を英語にできない)このまま日本語で書きます。

個人的な目的・目標

  • 自然言語処理や計算言語学(以下 NLP/CL)と呼ばれるものの定義は様々ですが、個人的には「人間がどのように言語を獲得・理解・産出(以下まとめて処理とします)するのかを計算可能な仕方でモデル化し、言語資源・知識資源・視覚や音声など利用可能な情報の分析・学習を通して検証する」という雰囲気で位置づけています。よくある「人工知能っぽい意味で言語が処理できるエージェントを作るのであれば、人間の模倣は必要条件ではない」という指摘には同意しますが、人間が扱う言語についてあれこれさせるためには何らかの形で人間に漸近するような機能が備わっているべきだとは考えています。このあたりは個人の嗜好だと思うので、「どちらかと言えば機械より人間に興味がある」くらいに考えていただければと。
  • 上記の背景のもとで、とくに言語理解に興味があります。
  • やったことを博士論文くらいの単位の成果にまとめなければなりません。その後の生存戦略を考えると、できれば目立った業績が伴うことが望ましいです(しかし意識しすぎると頭が回らなくなるのであまり考えないようにする)。

研究のスタイル

 上に書いた NLP/CL の個人的定義から、どのような研究の単位があり得るかを考えてみます。研究全体の流れを整理しましょう。研究はそこで提示された内容がどれくらい妥当か吟味される必要があります(本当か?)。したがって上記定義にしたがえば、「何らかの言語を処理するモデルを作り、そのモデルを何らかのタスクに基づいて評価して信用してもらう」のがおそらく「みんなでやっていること」になります。

 これも個人的な区別ですが、「モデル」と「タスク」の2つが NLP/CL の研究では中心的な構成要素になると考えています。モデルを作ったりタスクを作ったり、モデルの改善をしたりタスクの改善をしたり、が研究の単位になります。ということで大きく2つにスタイルを分けると次のようになりそうです。

  1. 言語を処理するモデルを作り、何らかのタスクで評価する。
  2. モデルを評価するためのタスクを定義する。

 順にどのような細分化がなされるかを書いていきます。まず 1. について。上では、獲得・理解・産出を処理と呼んでいました。もちろんこの区別は厳密ではありません。人間は言語をどのように処理するでしょうか。全体としての(認知神経科学的な)流れはよくわかりませんが、「少なくとも振る舞いとしてこういうのはできるだろう」というのがあります。これには複数のレイヤーが考えられます。もっとも基礎的なものには形態素解析構文解析、意味役割の認識などが含まれそうです。もっとも応用的なものには翻訳や対話が含まれるでしょう。以上のようにNLP/CL の研究では言語処理の部分的な振る舞いをモデル化します。たぶん。モデル化のためには「内部的にどうなっていてそのように振る舞っているか」に関する何らかの仮説を立てます。「こうすれば上手く振る舞ってくれるだろう」という仮説です。実際に上手くいったのであれば、評価に用いたデータセットの範囲内でその仮説が(その上手くいった程度に応じて)妥当なものだと見なされます。

 2. についてです。タスクの意義は、モデルの振る舞いを評価して何らかの仮説の妥当性を裏付けることにあります。しかし重要なのは、仮説の妥当性がその「評価に用いたタスク」の範囲内でしか裏付けられないという点です。あるタスクで良い振る舞いをしたからといって、別の同種のタスクでも良い振る舞いができないのであればその有用性は限定的になってしまいます。したがって、あるタスクで用いるデータやその評価方法は同種の課題に対してなるべく汎用的であるほうがよいですし、モデルの評価はなるべく多種のデータに対して行われたほうがよいでしょう(ここには「理論は広く有用であるべき」という規範が入っていますが、学術的価値や技術的価値にとっておそらく必要なことだと思います)。また、ある振る舞い(だいたいは言語的な出力)をどのように観察すれば妥当な評価が行えるのかは簡単でない場合があります。たとえば機械翻訳の結果を評価するのは難しいですね。対話システムも特に雑談の場合はしんどいという話を聞きます。タスクのデザインはモデルの設計と同等かそれ以上に難しいと個人的には思います。

 以上の両者をバランスよくやっていくのが研究分野全体として必要だと思います(参考: ベンチマークの功罪 – CTRL+x CTRL+s )。

言語理解の研究について

 自分の興味は言語理解とかそのあたりにあります。言語理解と端的に言っても定義は非常に難しいです。まずその定義には正解がなく、人によって「〜だったら言語が理解できてると言える」の「〜」に入るものが違ったりします。話を進めるために、何か暫定的なものを決めましょう。一説には「ある言語入力に対してその言語が使われている共同体の規範や慣習に沿った振る舞いができること」という定義があり、これを採用してみます(ここで規範や慣習と書いたのは人間の言語に話を限定しているからですが、他の動物がやりとりする記号や表象も含めて定義したいね、という話は案の定ですがミリカン『意味と目的の世界』などを読んでください)。さて、そこでは「言語を理解しているときの適切な振る舞い」というのをどうやって(なるべく一般的な社会規範として)決めていくかが問題となります。

 人間について考えてみます。まず言語を行使する能力がそもそもあるかどうか、という点で見ると失語症のテストが考えられます("aphasia test" あたりで検索するとそれっぽいのが出てきます)。また「言語を理解する能力」の段階的な評価として、教育的な観点からの調査が考えられます。たとえば OECD の教育部門は PISA (The Programme for International Student Assessment) と呼ばれる調査を行っており、読解力・数学的知識・科学的知識という分類を作っています。ここで言う読解力というのは単なる文章を読む能力から、文字を含んだ図表の理解まで対象にしています(詳しい解説はたとえば 平成23年度 追加分析報告書:文部科学省東北大学の成果報告書1の pp.26-32 など)。

 機械についてはどうでしょう。まず思い出されるのはチューリングテストです。しかし「対話」だと実はそれっぽい鸚鵡返しや相づち、話題転換で誤魔化せてしまうという指摘があります(ELIZA はその一例かもしれません)。このあたりは Levesque さんの On Our Best Behaviour [paper] [slide] という2013年の IJCAI の発表(と翌年の論文)で議論されており、振る舞いとして誤魔化しのきかない形式を考えるべきだと指摘しています。次いで彼は「選択式のクイズでいいのでは?」(意訳)とみたいなことを言っており、最終的に提案されているのが Winograd Schema Challenge でした。これは background knowledge を問うタスクですが、問題数も少ないのであまり流行ってはいない気がします(でも難しいです)。

 さて最近の界隈では、質問応答のひとつの延長として読解タスク(machine reading comprehension)というのが流行っている気がします。端的に言えば文章題です。これを「言語理解の能力を振る舞いから評価する」ためのひとつの枠組みだと考えて、そのためのモデルやタスクの構築について考えてみます。先に引いた人間の読解力の調査として使われている手段に近しいのと、 Levesque さんの言う「対話ではなく選択式のクイズでも十分に振る舞いが評価できる」という話に乗っかってみる感じです。

読解の研究をどうする?

 先程と同じようにモデル・タスクに分けて考えてみます。まず読解をするモデルについて。人間の読解のモデルについての研究は、たとえば心理学では Kintsch さんによる Construction and Integration Model があります(1980年代後半くらい)。これを基礎にしていくつかモデルが出ていますが、あくまで理論的な話で、あまり「実際に作る」という話には至っておらず、(そりゃそうですが)こうした理論的な仮説を心理学的な実験で検証するというのが彼らのやり方です。そのモデルにおける個々のコンポーネントやその関わりがどうなっているかを神経科学的に見ようとすると一気に難しくなり、知識(というか記憶)がどこから湧いてくるか、読んだものが逐次的にどのように処理されるか、など諸々の振る舞いに対する仮説を解剖学的な部位や時間的位置を特定したりしながら検証していきます。これを計算論的に仮説を立てて再現して処理できるかどうかやってみればよいのでは? という感じになりますが、ハードルがあまりにも多くて心の底からよくわかりません。一方で読解のタスクに対して提案されている NLP/CL の側のモデルは、たとえば [1611.01603] Bidirectional Attention Flow for Machine Comprehension[1711.04289] Natural Language Inference with External Knowledge のような(図を見てみてください)それっぽい気もするようなしないような構造をしています。人間についてのモデルとの大きな差異のひとつは読解における知識の保持・利用の仕方だと思いますが、知識がちゃんと必要になるようなタスクが少ないのでしっかりとした正答率が出せている印象です。そうです、一部のデータセットではけっこう人間に肉薄した性能が出ちゃったりしています。うーんでもじゃあこれで人間っぽい読解力が持てるようになったのか、と聞かれると全く肯定できません。どうしてでしょう。

 どうして納得できないのか。流行りのタスクが悪い気がします。上で述べた表現を使えば、「同種の課題に対する汎用性が全然なさそう」だと感じます。あるいは「問題が簡単すぎる」気もします。しかしそれをきっちり浮かび上がらせて定量的に示すのはなかなか難しいです(自分のこれまでの研究はここを何とかしようとする試みでした)。Levesque さんは同じ議論の中で、選択式のクイズが適切に振る舞いを評価するに足るための要件を挙げています。「Google-proof (検索が無効)であること」「典型的なパターンマッチでは解けないこと」「語順や文法などにバイアスが含まれていないこと」の3つです。うーん本当にそうだなあという感じです。いまデータセットとして流行っている The Stanford Question Answering Dataset (SQuAD) について Goldberg さんが「ちょっと凝ったパターンマッチじゃん」と言っていたのが記憶に新しいです(スライド)。つまり流行りのタスクは、単なるパターンマッチ+バイアスの発見で解けるような問題じゃないかな、という気がするわけです(そしてモデルはまさにそうした情報を掴むための構造になっています)。

タスクを作る?

 モデルの方は本当によくわからない・理想的なものを考えても評価する手段がないので、タスクをより改善していったほうがよいかもしれません。Levesque さんの挙げた要件を守りつつ、難易度が高そうな問いがたくさん作れるのがよさそうです。でもそれってどうするの?? というのが現在時点での悩みです(やっとここまで説明できました……長くてすみません)。質のよいクイズを作るというのはなかなかに骨の折れる作業です。人間が解く試験問題を作るのが大変なのと同じだと思います。しかもそれがなるべくたくさん欲しいわけです(最近は大規模なデータセットでないと注目してもらえないのがよくない風潮だと思います。もちろん少なければ少ないほどバイアスが発見しやすかったりするのかもしれませんが(本当か?))。どうすればいいんだろう、何を調べる・考えるべきか……。というところで詰まっています。

 もちろん既存のタスクが何もかもダメという感じでもなく、2017年のEMNLP で発表された RACE のような人間の試験問題そのままのデータセットもあったりします。これをしっかり解けるようなモデルを考えるのも面白そうです。また、 SNLIMulti NLI のような比較的大きな含意関係認識のデータセットも出てきました。ただこれらの含意関係認識のデータセットはベースラインが高く、すでに state of the art も9割近い精度が出てるので、今から取り組むべきかというと微妙な気もします。精度で勝っても有意な差にならないでしょうし、そもそも人間の精度が9割くらいだったりするとあとの1割は一体何なんだという感じになります(エラーなのか真に難しいのかがわからない)。じゃあやっぱりタスク作りをすべきでしょうか。しかしどうやって問いを立てるのでしょう。

 あとは「読解や含意関係認識のデータセットで学習する」と言ったときにモデルが一体何を学習しているのかというのが気になります。他のタスクに応用可能な知識を得ているのでしょうか。それとも、似たような問題形式でのみ使えるマッチングやバイアスの発見の仕方を学習しているのでしょうか。ここまで書くと批判したいだけに見えてしまうのですが、そもそも我々が知識と呼ぶものとそうしたヒューリスティックっぽいものに明確な境界はあるのでしょうか。

結局何ができそうか

 何もわからなくなってきました。厳しい。ここでちょっと「研究として可能そうなこと」を列挙してみます。このあたりは話がまとまってきたら後で消すかも。

  • タスク側
    • 「マッチングやバイアスの発見」を定量的に扱うための何かを考える(そもそもこれが外部知識なしのベースラインなのでは?)
    • 既存のデータセットの有用な変形。その過程で前項についての示唆を得る
    • 新しいデータセットを考える。「情報の関係(知識を含む)」を捉えることができないと解けない問題が望ましい(抽象的に書きすぎですが、要は「ちゃんと難しい」問題が作りたい気がします)
    • 問いの分析。自分がこれまで提案した能力は一体何だったのか。どのような問いにどのような能力が出てくるか。あるいはある能力を専門的に問うためにはどのような問いが必要か
    • 前項に関係して、質問ベースの翻訳評価のためのイベント粒度など
    • 読解のための能力っぽいものだけでなく、言語知識への拡張
  • モデル側(あまり考えていないので気になることだけ)

うーん、いろんなことを同時に考えすぎてどれも論文が書ける程度まで成熟していないのかもしれません(いずれにせよ何もわかっていないのですが)。論文の単位としては(自分の経験では)「何らかの仮説を立てる(モデルでなくてもよい)・何らかの定量的な評価や分析を行う・仮説の信頼度について結論を与える」という感じなわけで、その仮説の粒度は「これが言語理解のモデルだぜ!」という大きさでなくとも「いや読解の能力と文章の読みやすさってあまり関係なさそうじゃね」くらいの細かさで十分な話題になります。それが「タスクを立ててモデルを作って評価する」と一連の流れのどこか部分的にでも貢献できればよいのです。しかし……しかし、「仮説」は何かの積み重ねで成り立っているわけですが、 NLP/CL はこれまで何を積み上げてきたのでしょう。論文を読んでも「何もわからん!!!」となることが多いのはまさにこの「積み重ねのわかりづらさ」にある気がします(私が何もわかっていない・わかろうとしていない・この記事を書くにあたって認識を誇張している、などの可能性があります)。仮説検証のプロセスが暗黙のうちに為されていたり、検証のスキーム自体を数値で簡素化しているために論文の貢献が何なのか見えづらいのです(規範がばりばりに入っており、あくまで個人的な嗜好であることに留意いただければと思います)(あと論文一本が短すぎる)。

 あとはそうした思いつきを速い周期で回していくことが大事です。複数の試案を同時に考えていると各々が飽和するまでの時間が長くなってしまうので、やっぱりどれかに絞ってがっと進めたほうがよいかもしれません。自分は手を動かすのが遅いので(普段から書いているわけではないのでコードを書くのは特に時間がかかりますし、full paper の論文を書くのもまるまる1ヶ月は欲しい)、ひとつの周期をより速く回せるように意識していく必要がありそうです。

 焦っても仕方ないですし、じっくりやりましょう(って言ってると無限に時間が溶けるので、進行管理をきっちりせねば……)。たまにこんな話で雑談をしていただける方が現れると喜ぶかもしれないです。終わり。