今回も引き続き、ディープラーニングで対話できるコンピュータを作っていきましょう。ここでいったん、前回までの内容を簡単におさらいしておきます。
前回までのおさらい
目標としているのは、例えば次のようなやり取りができるコンピュータです。
[コンピュータ] 応答文「昨日メロンパンが食べたかった」
ディープラーニングによって「文」を生成するには、(ディープラーニングに用いる)ネットワークで「文字」を扱わなければなりません。前回・前々回はまず、ネットワークで文字を入出力する方法について説明しました。
また、コンピュータは通常、文を「メロンパン」や「が」といった単語単位で扱います。そこで、次のような教師データを用意しました。
入力 | 出力 |
---|---|
昨日 | メロンパン |
メロンパン | が |
が | 食べ |
食べ | たかった |
これを学習させれば、「昨日」に対しては「メロンパン」を出力でき、「メロンパン」に対しては「が」を出力できるようになります。しかし、ここで1つ問題が発生しました。もし教師データに次のようなデータも含まれていた場合、「が」の次に出力する単語が「食べ」なのか「したい」なのかわからなくなってしまうのです。
入力 | 出力 |
---|---|
スポーツ | が |
が | したい |
このような問題が起きるのは、「食べ」を出力するのか「したい」を出力するのかを判定する際、直前に出力された単語「が」しか見ていない(考慮していない)ことが原因――というところまで、前回お話しました。
今回は、こうした課題を解決する方法の1つとして「RNN(Recurrent Neural Network:再帰型ニューラルネットワーク)」を紹介します。
RNNってなあに?
再帰型……と言っても、そんなに難しい話ではありません。
RNNを使うと、直前の単語「が」に対して次の単語を予測するのではなく、単語の連続「昨日 メロンパン が」に対して単語を予測(出力)できるようになります。これまでの説明で登場したネットワークでは、単語を1つずつ入力することしかできませんでしたが、RNNでは複数の単語を順番に入力することができるというわけです。
なお、ここではRNNで自然言語を扱いますが、RNNは自然言語のためだけに生まれたネットワークではありません。もともとRNNは、「ある間隔ごとに順を追ってデータが存在し、そのデータが各々何かしら関連のあるようなデータ(時系列データ)を処理するためのネットワーク」です。
加えて、RNNは「長さの決まっていないデータ(可変長データ)」を扱うことができます。そして自然言語はまさに、時系列データであり、可変長データでもあります。そのため、RNNとの親和性が非常に高いというわけです。
例えば「昨日メロンパンが食べたかった」という文は、「昨日 メロンパン が 食べ たかった」というように、ある規則に基づいた間隔ごとにデータ(単語)が5つ、文が成り立つ順に存在しています。そして、これら5つのデータは各々に関連があります。
まず「昨日」という時制を表す単語があるために、「たかった」という過去形が出現していますし、「メロンパン」という食べ物を表す単語があるために、「食べ」という動詞が出現しています。したがって、これは時系列データと見なすことができます。
また、これは「長さ5(単語を5つ含む)」の文ですが、「メロンパン が 食べ たかった」という文にすると「長さ4(単語を4つ含む)」になるように、学習データに含まれる文の長さはまちまちですし、そのような学習データを基に生成される文の長さもまちまちです。すなわち、可変長データでもあります。
RNNを使ってみよう!
それでは、RNNを用いて「昨日メロンパンが食べたかった」という文を出力することを考えてみましょう。
RNNは”再帰型”と言われる通り、ネットワークの隠れ層の情報を再帰的に用います。まず、「昨日」を入力とし、「メロンパン」を出力する際のネットワークは、次のような図で表されます(この簡略化した図の描き方については、前回説明した通りです)。
「昨日」を入力とし、「メロンパン」を出力するネットワーク |
隠れ層(黄色の部分)には、学習過程で「昨日」に関する情報も入っています。この情報を、「メロンパン」を入力して「が」を出力する際にも利用するために、RNNでは次のように情報を遷移させます。
隠れ層が持っている情報を遷移させる |
これで「昨日」から「が」までは文全体を考慮しながら出力できるようになりました。今、隠れ層には「昨日」と「メロンパン」の情報も含まれた状態になっていますから、これをさらに遷移させます。
「昨日」と「メロンパン」の情報も遷移させる |
このようにすれば、次の単語を出力する際、直前の「が」だけでなく「メロンパン」という単語も考慮されるため、「したい」ではなく「食べ」を出力することができます。これを文の終端まで続ければ、「昨日」という入力から「昨日メロンパンが食べたかった」という文を出力することができるのです。
RNNを用いることによって、直前よりも前の単語を考慮した上で、さまざまな文を出力できるようになりました。
しかし、ここで本来の目標を思い出してみてください。目標としているのは、「昨日」という入力から「昨日メロンパンが食べたかった」を出力することではなく、対話できるコンピュータを作ることです。つまり、人が発話した「美味しいパンが食べたいね」に対して、「昨日メロンパンが食べたかった」を出力できるようにしなければなりません。
これを実現するために有用な手法について、次回ご説明します。
著者紹介
株式会社NTTドコモ
R&Dイノベーション本部 サービスイノベーション部
大西可奈子
2012年お茶の水女子大学大学院博士後期課程修了。博士(理学)。同年、NTTドコモに入社。2016年から国立研究開発法人 情報通信研究機構 研究員(出向)。2018年より現職。一貫して自然言語処理、特に対話に関する研究開発に従事。人工知能(主に対話技術)に関する講演や記事執筆も行う。
著書に『いちばんやさしいAI〈人工知能〉超入門』(マイナビ出版)。
twitter:@WHotChocolate