前回は、時系列データや可変長データを扱うのに便利なRNN(Recurrent Neural Network)というネットワークについて説明しました。RNNを用いることにより、「昨日」という単語を起点に、応答文「昨日メロンパンが食べたかった」を間違えずに生成することができるようになりました。

前回までの説明を踏まえ、いよいよ今回は当初の目標である「美味しいパンが食べたいね」という入力に対して、「昨日メロンパンが食べたかった」と出力することができるディープラーニングの手法をご紹介しましょう。

単語ではなく、文を入力したい!

前回説明した通り、RNNでは隠れ層に直前以外の単語の情報も保持しておくことができます。図1のように「が」まで出力した際には、隠れ層に「昨日」「メロンパン」の情報を保持しているので、次に「が」を入力した際にはそれらも考慮され、「食べ」を出力できるわけです。

図1:「が」を出力する際には直前の「メロンパン」だけでなく、保持されている単語「昨日」も考慮されている

こうして単語を1つずつ出力していき、最終的に「昨日メロンパンが食べたかった」を出力することができました。

ここで説明の都合上、図を横向きに描き直します。

図2:図1では「食べ」を出力したところまでだったが、図2では「たかった」を出力したところまで描き足した

ディープラーニングに関する説明がなされる場合、入力から出力までの流れが簡易的な図で描かれることがしばしばあります。しかし描き方に明確なルールがあるわけではないので、縦向きに描く人もいれば横向きに描く人もいます。横向きと縦向きでは一見、異なるものを見ているように感じるかもしれませんが、実際には同じことなので混乱しないようにしましょう。

図2で、最後に「たかった」を入力としたときに出力されている「<EOS>」という特殊な文字列は、文の終端を表しています。簡単に言うと、単語を出力しているネットワークに”文の最後まで出力したから、もう出力をやめていいよ”と教えてあげるマークです。ネットワークはこの文字を出力した時点で出力をやめます。詳細は割愛しますが、そういうものがあるんだ、ということだけ覚えておくと良いでしょう。

これまでやってきたのは、RNNを使い、「昨日」という”単語”の入力を起点に単語を順に出力していくものでした。これに対して、今やりたいことは「美味しいパンが食べたいね」という”文”を入力にして、「昨日メロンパンが食べたかった」という文を出力することです。

ただし、第19回でも説明したように、コンピュータでは文字を数字に変換して扱います。そして、出力と同様に入力に際しても、1つの文を1つの数字に置き換えるやり方では汎用性がありません。

そこで「美味しいパンが食べたいね」を「美味しい」「パン」という具合に単語に分割して(各単語に数字を割り当て)、RNNと同じように再帰的に入力していくことで、発話文をコンピュータが扱えるかたちにします。図で表現すると次のようになります。

図3:隠れ層に単語の情報を溜めていくようなイメージ。図ではわかりやすいように単語で描いているが、実際には単語に割り当てた数字を入力している

この図は「美味しい」という言葉がまず隠れ層(黄色の四角)に入り、「美味しい」の情報を保持した隠れ層に、次の入力「パン」が入ることによって、新たな隠れ層の状態が作られることを示しています。これを文の終端まで繰り返すと、最終的には「美味しいパンが食べたいね」という文の情報が入った状態の層が出来上がります(右端の赤い四角)。

この層を、先ほどの「昨日メロンパンが食べたかった」を出力するRNNの入力にしてやれば良いのです。図示すると、次のようになります。

図4:「美味しいパンが食べたいね」が入った層をRNNの「入力」として渡す

「美味しいパンが食べたいね」を入力する部分と、「昨日メロンパンが食べたかった」を出力する部分の間は、先に説明した「<EOS>」で結んでいます。これは、どこまでがひたすら入力される部分で、どこから出力を始めないといけないのかを、ネットワークに教えるためです。この記号が入力されることで、「美味しいパンが食べたいね」という情報を持った隠れ層を入力だと判断し、最初に「昨日」が出力されます。以降はRNNによって「昨日メロンパンが食べたかった」が出力されるわけです。

このようなネットワークは「Encoder-Decoder」と呼ばれます。図4の左半分が「Encoder」、右半分が「Decoder」です。自然言語処理の世界ではしばしば「Sequence-to-Sequence(seq2seq)」とも呼ばれます。

Encoder-Decoderを用いることにより、「美味しいパンが食べたいね」という入力に対して、「昨日メロンパンが食べたかった」を出力することができました。もちろん、本格的に対話システムを開発しようと思った場合、「美味しいパンが食べたいね」に対する応答として「昨日メロンパンが食べたかった」以外のパターンも大量に集め、それらをネットワークに学習させることになります。

Encoder-Decoderは非常に便利なモデルです。近年、性能向上が著しい機械翻訳の分野でも、よくこのネットワークが利用されています。今もさまざまな進化を続けているニューラルネットワーク(ディープラーニング)ですが、まずはここで説明したような基礎的なネットワークの知識をしっかり理解することが大切です。

著者紹介


株式会社NTTドコモ
R&Dイノベーション本部 サービスイノベーション部
大西可奈子

2012年お茶の水女子大学大学院博士後期課程修了。博士(理学)。同年、NTTドコモに入社。2016年から国立研究開発法人 情報通信研究機構 研究員(出向)。2018年より現職。一貫して自然言語処理、特に対話に関する研究開発に従事。人工知能(主に対話技術)に関する講演や記事執筆も行う。
著書に『いちばんやさしいAI〈人工知能〉超入門』(マイナビ出版)。
twitter:@WHotChocolate