今回も引き続き、ディープラーニングで対話できるコンピュータを作っていきましょう。ここでいったん、前回までの内容を簡単におさらいしておきます。

前回までのおさらい

目標としているのは、例えば次のようなやり取りができるコンピュータです。

     [人] 発話文「美味しいパンが食べたいね」
[コンピュータ] 応答文「昨日メロンパンが食べたかった」

ディープラーニングによって「文」を生成するには、(ディープラーニングに用いる)ネットワークで「文字」を扱わなければなりません。前回・前々回はまず、ネットワークで文字を入出力する方法について説明しました。

また、コンピュータは通常、文を「メロンパン」や「が」といった単語単位で扱います。そこで、次のような教師データを用意しました。

入力 出力
昨日 メロンパン
メロンパン
食べ
食べ たかった

これを学習させれば、「昨日」に対しては「メロンパン」を出力でき、「メロンパン」に対しては「が」を出力できるようになります。しかし、ここで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