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

前置き

 最近やっていたことが一段落したので、博論に向けて考えをまとめたいと思います。ここ半年で取り組んでいた論文は投稿中・準備中という感じで今年はまだ結果が出ていないのですが、テーマ的にだんだん思想バトル感が出てきており、あまりすんなり論文が通る・業績が増えるような雰囲気ではなくなっています(言い訳です)。もう少し目線を下げたほうがよいかもしれないです。

あらすじ

 ここに至るまでの細かい話は前回や前々回の記事をご覧いただければと思うのですが、以下に簡単にまとめます。おそらく本質的には大きな変化があるわけではないので読み飛ばしていただいてもたぶん大丈夫です。

 自然言語処理におけるひとつの目標として「言語を理解するシステムを作る」ことが挙げられると自分は考えています。そうしたシステムの振る舞いをテキスト上で評価するタスクのひとつに「機械読解(machine reading comprehension)」があります。2019年の言語処理学会の年次大会でチュートリアルがあったりもして、国内での知名度もだんだん上がっているのかなと思います。このタスクは国語の文章題のような形式をしており、文脈文について問いに(選択肢か抜き出しで)答えてもらうことで言語理解を評価するものです。たとえば2016年に発表された SQuAD というデータセットは、Wikipedia のパラグラフをもとにクラウドソーシングで問題を作成し、 10 万問の規模で機械学習的なシステムを訓練し解かせます。いろんな大学・企業の人たちがこぞってシステムを提案して、ついに2018年(だったかな?)には人間の精度をシステムが超えました。しかしその一方で「それってちゃんと言語がわかったことになっているの?」と疑問を呈する研究が同時期に出てくるようになりました。「入力をこう変えても解けてほしいよね」という状況を作るとシステムが途端に解けなくなってしまったり、「入力をこう変えたら解けなくなってほしいよね」という状況でもシステムがうまく解けてしまったりなど、「思ったよりもちゃんと理解しているわけではないのでは?」と言えてしまいそうな状況が指摘されています。既存の多くのデータセットで要求される言語理解は人間らしい理想的な意味での理解と比べるとおそらく簡単だと言いたくなるのですが、それがどう簡単なのか定量化する手段はまだ確立していませんし、「人間らしい・難しい言語理解」を評価するためのデータセットを作ったりシステムとして実現したりするためにどうすればよいのかは自明ではありません。

 本記事ではタスク設計やデータセットについて考えをまとめてみることにします(ちなみに「データセット」は「タスク」のインスタンスの意味で書いています)。システムよりもタスクに注目する理由は、現状の言語理解まわりのタスクでは「そのデータセットでよい性能が出せることで何ができるようになったのか」を説明することがあまり強く意識されていないように思われるからです(個人の意見です)。仮説を立てて(=システムを作って)検証する(データセットで評価する)という構図で見たとき、本来やられるべきなのは「X というシステムで Y という振る舞い・能力を実現させたい。 Z というデータセットを使うことで Y を適切に評価できる。というわけで X を Z で評価する」ということです。しかしここで Y についてあまり何も考えないと、最後の「X を Z で評価しました!」しか主張されないことになります。いま私たちは(少なくとも私は)あと付けの解釈として「ここにおける Y は何だったのか」を考えていることになります。もちろん一度できれいに Y が析出されるわけではないので、「X を Z で評価する」と「Y は何だったのか」を交互にやらざるを得ないでしょう。今回はその後者の話です。

 ちなみにこのあたりの「評価」の一般論として『測りすぎ』(原題: The Tyranny of Metrics のセンスが好み)という最近出た本が読み物としておすすめです( https://www.amazon.co.jp/dp/4622087936 )。

タスクを作る目的とその評価

 まずタスクの目的についてどのような区別がありうるか述べます。基本的には、既存の多くのデータセットは上で述べたように「言語理解を実現・評価すること」を目的としたタスクのインスタンスとして提案されることが多いように見えます。ただ現実には「出来上がったものをこういうアプリケーションで使いたい」という明示的な目的もかなりありえます。その目的における振る舞いを網羅できるようなデータセットを作り、そのデータセット上でよい性能が出るのであれば、前者のような理想的な意味での言語理解とは関係なく目的が達成されたと言えることになります。たとえばもし SQuAD の目的が「Wikipedia のパラグラフについて(インターネット上で)人間に出してもらった問いに答えてもらうシステムを作る」だったのであれば、 すでに人間並みの精度が出てしまっているので目的達成ということになります(論文を読む限りたぶん実際はそういう目的ではないわけですが……)。一方で Chen+ (2017) https://arxiv.org/abs/1704.00051 のように文脈文を( Wikipedia 上の特定のパラグラフではなくすべてのパラグラフという)オープンドメインなタスクにするとわりかし現実味があるアプリケーションになりそうです。この場合も同様に、実際に使いたい状況を模して集めたデータセットで良い性能が出てくれれば目的の達成に近づいていると言えることになります。ただしこの例だと、単なるシステムの出力と与えられた答えとの一致よりはユーザーが満足できる情報に到達できたかを評価基準にすべきように感じるので(答えの与え方が一通りではないかもしれないし、需要にも依存する)、情報抽出における評価の問題と同様の議論が必要になりそうです(詳しくないのでここでは言及できません)。つまるところそういった現実のアプリケーションが想像でき、そのアプリケーションが「言語理解をしているような振る舞いを部分的に要求する」だけなのであれば、とくに「正確に理解した」と言えるようなシステムでなくても構わないわけです(ここでは「正確な理解」を定義していないので話としてちょっとぼやけていますが……)。

 もちろんこれは一例で、他にも様々にアプリケーションを考えることができると思います(たとえば対話システムや機械翻訳でも根本的なところはおそらく同じであると考えています)。より多様なユーザー・入力がありえるとき、運用上システムをどう評価して性能保証をするかということは容易に起こりうる課題だと感じます。これは社会へのコミットメントが大きければ大きくなるほど重要性が上がるものだと思っています。そのときにただデータを闇雲に集めるだけでは「汎用的な評価ができます!」と保証することはできないでしょうし、システムのエラーやデータの不備を説明することは難しいままだと思われます(これは研究者・開発者にとっての説明(再現性・解釈性の向上)であり、ユーザーに対しての説明(コミュニケーション?)とは目的が異なるのではないかなと考えています。要検討ですが……)。

 したがって、理想的な言語理解を評価するための適切なタスクにおいて何らかの形での説明性が重要になるのと同様に、アプリケーション的な利用を考えるにあたっても説明性の問題は避けられない気がしています。ということで、目的が言語理解の学術的な研究であっても社会的な応用であっても、言語理解についてある程度細分化された説明の単位が必要っぽい、という話になります。(ここで「説明」とは、言語理解っぽいものについて情報を増やした・反証可能性の上がった記述を作ることの意味で使っています。)読み直してちょっと天下り的かなぁという気がするのですが、そんなに変な話ではないと信じたいです。

複雑な振る舞いを説明するための単位

 中身がわかりづらいものについて説明を与える、というのは機械学習分野でも最近よく耳にする話題です。その中の解釈性の文脈( https://arxiv.org/abs/1702.08608 )では cognitive chunks という概念が提示されており、モデルの振る舞いを説明するための認知的な単位の重要性が議論されています。では読解に対してはその説明の単位として何を使うのがよいでしょうか。自然言語処理の言語理解系のタスクとしては含意関係認識(今は natural language inference (NLI)と呼ばれることのほうが多いです)のほうがもう少し歴史が長く、言語現象を分類してデータセット・モデルを分析している研究がいくつかあります( https://aclweb.org/anthology/papers/P/P10/P10-1122/ とか)。同じような仕方で機械読解のデータセットについても分析できるはず、という感覚で取り組んでいたのが私自身の2017年頃の論文( https://aaai.org/ocs/index.php/AAAI/AAAI17/paper/view/14614/14802https://www.aclweb.org/anthology/P/P17/P17-1075 )で、読解に必要になるような能力を定義して分析の単位にするということをしていました。ここでの能力は処理としてなるべく想像しやすく合意が得られるものが良いと考えていたので、自然言語処理の既存の基礎的なタスク(たとえば照応解析、談話関係認識)に対応させる形で提示しました。ただしこれらの個々のタスク自体はさらに人間の文章理解の部分的な振る舞いと対応付けができるはずという気持ちはあり、しかし結局のところ人間の振る舞いについてもここまでの議論と同質の話を踏んでいくことになる気がしています(最終的には認知科学における Marr’s tri-level analysis みたいな感覚が必要になるのかな、と思います(正確な引用先を知らず単に教訓として書いています)。どのレベルの分析が実践的に良いのかを考えることはできると思いますが、いずれにせよ研究としてはすべてを考える必要がありそうです)。そうして「この問いを解くことでこの能力やこの能力が評価できる」と言えるように(読解の、あるいは言語理解一般の)タスクを設計することで、評価対象のシステムについて能力の単位で良し悪しが言えるようになるわけです。このあたりの話は cognitive diagnostic model や Q-matrix の利用とモチベーションが近いと思います。不勉強ですが……。

 だた話はそんなに単純ではなく、ひとつ大きな課題がありました。ある読解の問いについて「この問いはこの能力で解ける」と人間が思ってアノテーションしたとしても、必ずしもシステムが同じように解いているとは限らず、システムにとって見つけやすいような別解が存在する可能性がそこそこありそう、という点です。これはあらすじの段落の「思ったよりもちゃんとわかっているわけではないのでは?」のくだりに対応します。 Jia and Liang (2017) https://arxiv.org/abs/1707.07328 や自分の2018年の論文 http://aclweb.org/anthology/D18-1453 がその話でした。 NLI 系のタスクについても同様の分析があります(後述)。最近だと HotpotQA https://hotpotqa.github.io/ について「そんなに multi-hop reasoning 必要じゃなくない?」と言ってる分析の論文がありました( https://arxiv.org/abs/1904.12106 / https://arxiv.org/abs/1906.02900 )。つまるところ、評価したい能力を使わなくても良い成績が取れてしまうのなら評価としては意味をなさないわけです。ではそうした「意図しない解法」を避け、「意図した解法」を導くには、どうすればよいのでしょうか。

どうやって「意図した振る舞い」を導くのか

 タスクの形式とデータの質というふたつの側面から考えられそうです。まずタスクの形式について。意図しない解法の存在を許してしまう理由として、タスクの形式が「答え」のみを出力させることをシステムに要求していることが挙げられるかもしれません。つまり、出力として答えだけでなく推論の過程まで求めることにして、その両方が意図した通りであれば正解、とするタスク形式を定義することが考えられます。たとえば上で言及した HotpotQA については、正答に至るための根拠となる文を出力させるというサブタスクがあります。もちろん根拠となる文だけだと推論過程の妥当性を評価するには弱いかもしれないので(正答の導出と文選択がどの程度結びついているかわからない)、文よりも細かい情報を出力させる形式のほうがより正確な評価になると思います。

 ただしこのアプローチには今思いつく限りでふたつの課題があります。ひとつは推論過程そのものを評価する方法が自明ではないこと。その推論過程をどのような表現で与えて評価するか・どの程度の粒度で記述するかという形式と内容のそれぞれを決める必要があります(逆にここをうまくできれば良い話になりそう)(でも形式を絞ってしまうとモデルの汎用性がなくなりそう)。もうひとつはデータを集めるコストが大きくなること。これは想像に難くないですが、しかし評価タスクとして質の高いものを作るならそれくらい手間をかけるべきなのかもしれません(ただし形式の特殊さから訓練データを作ることまで考えるともう少し大変かもしれないです)。メリットとしてはやはり目で見てわかる根拠が出てくるように誘導できるのが大きいと思います。

 一方のデータの質の話です。解き方を明示させることで制約を作るような形式の工夫に対して、問いそのものがなるべく別解を許さない・意図した通りの解法のみを許すようにデータセットを構築するというわりと愚直な方針がありえます。簡単な heuristics の使用やバイアスを探知で解けるものを簡単なモデルを使ってフィルタしつつ、意図した能力がないと解けない・能力を使ったときにのみ解けるような問いを作ることになります。そのためには、ちょっと飛躍があるのですが、 (1) 「意図した能力に対応する言語現象が欠落している状況」では人間にもシステムにもその問いは解けない (2) 「意図した能力に対応する言語現象が欠落していない状況」で人間に解け、システムに解けない(解けてもよいが、解けない問いを集めたい)というふたつの要件が満たされなければならない気がしています。ここで「能力に対応する言語現象」とはその能力を特徴づける表現や関係のことを指しています。たとえば代名詞の照応先がわからないと解けないよ!という問いについて「対応する言語現象が欠落している状況」は「その代名詞が隠されている or ダミーの照応先が代入されている」を意味します。多段階の推論ができないと解けないよ!という問いなら「中間の結果に到達できないように情報を隠してしまう」などがありえます。こういった工夫をすることで「意図した能力が必要になる」ことを保証して質を高めていく、という方針です。

 もちろんそんなに簡単にいく話ではなく、たとえばその「対応する言語現象」がうまく決められないこともありえる気がします。知識推論・常識推論で「能力に対応する言語現象」は何でしょうか。ある特定のクラスの表現に限定できない語彙依存な推論に対して、その情報を欠落させることはできるでしょうか。もう少し考えないといけませんが、すべてがわかりやすく落ちる気はあまりしません。「必要な情報を落とす」過程で逆に新しいバイアスを作ってしまう可能性もあります。また形式の話と同様に (1) (2) を満たすように問いを作るにはそれなりに大変なコストがかかりそうです(これも説明性のためには仕方ないのかなという気はするのですが)。なお愚直に「強いモデルで解けない問いだけを集める」という方針もありえるのですが(たとえば https://arxiv.org/abs/1905.07830 )、こうして出来上がったものに対する特徴付けがモデル依存でよくわからないままになってしまう気がしており、もうちょっと説明性の高さを期待したい気がします(でも論文冒頭の例は非ネイティブにはだんだんつらそうな難易度になっており説得力が微妙にある)。

 ここで触れたふたつの方針は、どちらかだけを選ばなければならないというわけではなく、両立する話です。もちろん利用可能な言語資源や予算に応じて決めていくことになるでしょう。いずれにせよきっちりやるのはそんなに簡単ではなさそうだなというのが感想です。

評価だけを行うデータセットであるということについて

 最近の NLI 界隈では、かなり統制された評価用のデータセットがいくつか提案されています(たとえば https://arxiv.org/abs/1904.11544 / https://arxiv.org/abs/1902.01007 / https://arxiv.org/abs/1806.00692 )。これらは「みんな使っているデータセットで訓練したモデルは実はこんな簡単な例でも解けなかったりするんだよ」と検証する目的で使用され、この評価用のデータセットそれ自体は何らかのバイアスが含まれていても構わない(新たにそこから学習するわけではないので)というスタンスです(たぶん)。こうした評価用データセットで良い性能が出ない解釈としては次が考えられます。まず「評価用データセットで意図されている能力を訓練元のデータセットが問えていない(異なる分布のデータである)ないし特定の heuristics に偏っている」こと。さらにその評価用データで訓練しても解けるようにならない場合は「評価用データそのものが難しく、モデルの性能が足りない」と言えることになります(これを指摘しているのは https://arxiv.org/abs/1904.02668 という論文です(それはそう感は強いのですが))。

 自分が気になっているのは、こうした評価用のデータセットの扱いを結局どう考えるべきなのかという点です。こうしたデータセットは直感的で簡単なテンプレートで作られたものが多く、バイアスが大きいため訓練データとして使うことはあまり望ましくないように思います。となるとこれらを評価時に解けるようにするためには、また新しいデータセットを作る際に工夫するか、既存のデータセットのままでも inductive bias のようなもの(使い方合ってるでしょうか……)をうまくモデルに入れるか、というふたつの手段がありそうです。と言っても後者のようにモデルにがりがり制約を入れていくのはあまり現実的ではないでしょうから、やはりデータセット側の工夫、つまりなるべく自然な分布のままバイアスが強くない形でさまざまな能力が問えるようにすること、が重要になるように思われます。

 ついでに言うと、よく言われる「データの分布」という概念も正直よくわかっていません。機械学習的に言えばデータセットの理想的な分布があって個々のインスタンスがそこから出てくる確率分布という感覚なのだと思うのですが、これについてもう少しコーパス・タスク的な観点から特徴付けをしたいなぁと思い続けています(でないと reproducibility of findings ( http://proceedings.mlr.press/v97/bouthillier19a.html )が確保できない……?)。もう少しデータセット間・タスク間の「距離」みたいなものについてどういう手段がありうるのか知りたいところです。自然言語処理というコーパス・データセットを基軸とせざるをえない分野においてはこの点はなかなかクリティカルではないでしょうか。

 蛇足ですが、 NLI ではなく読解というタスクにしている意義は「読解で要求される能力」を対象とする点にあると言えると思います。それを言語理解一般の評価用タスクとして据えるのであれば、 NLI についてこの節の冒頭で引用したような論文で指摘されているような言語知識や文単位の理解を読解にも含める必要がでてくるかもしれません。統合することを考えないなら、両者が別のタスクとしてどのように棲み分けるべきかをきっちり線引きしていくことが望ましいように感じます。

言語理解(読解)をテキスト上でちゃんと評価するためにデータセットが備えるべき要件

 Levesque (2013) https://www.cs.toronto.edu/~hector/Papers/ijcai-13-paper.pdf の議論では、「Google proof であること」「単純なパターンマッチでは解けないこと」「問いや答えにバイアスが含まれないこと」のみっつが言語理解評価のための要件として挙げられていました。これに沿ってここまでの議論を要件の形で整理したいと思います。

 まず「Google-proof であること」は「外部知識を使えば文脈文を見なくても答えられるような問いが存在しないこと」です。これが満たされないと文脈文を使って答えてもらうことで評価するというタスクの趣旨が損なわれてしまうので仕方なさそうです。あまりすっきりした単語が見つからないので文脈依存性と呼ぶことにします(紛らわしいかしら)。2点目の「パターンマッチで解けないこと」は、説明の単位として能力云々を言っていたのでそう読み替えて「人間の読解で必要になるような能力で解けること」とします。最後の「問いや答えにバイアスが含まれないこと」は直前の要件を受けて「人間の読解で必要になるような能力を適切に要求すること」と言うことにします(あまり意図しない解かれ方を許したくない、というくだりです)。ということで次の3点が大事そうだなというまとめです。

  1. 文脈依存性があること  究極的には、文脈文が創作であったり匿名化されていたりすることで世界知識が使えない状況であるほうがよいかもしれません。たぶん心理学では言語理解に関わる実験でこのあたりをきっちりさせているものがあった気がします。

  2. 能力を説明の単位とすること  個々の能力は自然言語処理の基礎的なタスクに対応させるのが基本的な思想ですが、あまり単純ではないのでちょっとどうなのかわかりません。

  3. 意図された能力を適切に要求すること  推論過程まで出力することを要求する形式にするか、能力に対応する言語現象を同定してそれが正答に必ず寄与するような問いであるように保証するか、などが手段として考えられます。

結局なにが難しいのか

 気持ちとしてはやっぱり「うまくタスク・データセットを作るのが難しい」という気がしています。最近はデータセットが多すぎてよくわからなくなっていますが、今まで書いてきたことを踏まえて「これだ!」と思えるものはまだ出ていない印象です(ハードルが高すぎる?)(じゃあやってみろという話ではあるんですが、だいたいどのデータセットについても早々に性能がサチってしまいそうな気がする)。単独のデータセットについて「モデルを変えたら・データを増やしたら精度が上がりました!」という結果を見たとしても、得られる知見は弱いままという問題もあります。機械学習モデルを考えるならやはり汎化性能として transfer learning とか domain adaptation とか考えることになるのだと思いますが、やっぱりデータセット側に説明可能な特徴付けが入らないと知見として腑に落ちない気がどうしてもしてしまう感じです(あまり関係ないですがEMNLP-IJCNLP2019 のワークショップは楽しみですね https://mrqa.github.io/ shared task がデータセットたくさんの話なので、気になる人は覗いてみてください)。

持続的な研究活動にするために

 自分は卒業したらどこに行くのかまだ決まっていないのでこんなことを書いても仕方ないかもしれないのですが、上のようなことを研究者として持続的にやっていくには何を考える必要があるでしょうか。時代的に完全に社会的に接点を持たずにやっていくのは難しいですし、そうするつもりもあまりないので、私たちの研究はこういうことに使えるよとなにかしら言えたほうがおそらく良いでしょう。

 この記事で書いてきたのはおそらく言語理解を評価するための一種の方法論です(知性的な主体についてのより一般的な論としては The Measure of All Minds https://www.amazon.com/dp/1107153018 あたりが有名?)。それが完全なものからまだまだ程遠いとしても、そうした方法論を応用することで巷の自然言語をインターフェースとするシステムについて「今できること・できないこと」を分析する手段が提供できるかもしれません。ただシステムによって入出力の形式もドメインも目的も違うでしょうから、「このツールを使ってください!」と大々的に提示して使ってもらうのはなかなか難しいかもしれません。個人の生存戦略レベルで言えば、そうしたシステムを研究開発する人と関わりを持って何か力添えできないか考える立場を目指すことが考えられそうです(自分が必ずしもそうしたいというわけではなく、一例として)。研究に寄ったことをするなら、より一般性のある形で能力の定義をまじめに考える・その能力に応じてタスクを組み立てる・データセットの効率的な構築方法を考える・データセットの特徴付けについて知見を増やす、などやらなければならないことがたくさんあります(静的なテキストのみというのもある程度のところでやめたほうがよく、対話システムなりロボティクスなりとの動的な文脈での言語理解にも目を向けなければなりません)。ちょっとまとまりがなくなってきたので、とりあえずこのあたりで終わりにします。ありがとうございました。ご意見ご感想等なんでもどうぞという感じでよろしくお願いします。