今回からは、ディープラーニングを使って対話ができるコンピュータを作ることを目標にしながら、ディープラーニングについてさらに深掘りしていきたいと思います。ここで言う「対話」とは、「発話文(入力文)に対して応答文(出力文)が出力されること」だと考えてください。人が入力した発話文に対して、応答文を出力できるコンピュータを作るイメージです。このコンピュータは、例えば次のようなやり取りができます。

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

しかし、いきなりディープラーニングを用いた対話について理解するというのは難易度が高すぎます。そこで、まずは対話を行う際に必ず必要になる「応答文」、これをディープラーニングで生成する方法について考えてみましょう。

ディープラーニングを軽く復習

その前に、少しだけディープラーニングの復習です。

本連載では、第11回から第14回の4回にわたってディープラーニングについて解説しました。ディープラーニングの基礎は「パーセプトロン」と呼ばれる機構だったのを覚えていますか? パーセプトロンは、複数の入力(図1のAやB)を受け取り、それぞれの矢印に記されている「重み」の影響を受けて、1つの出力を返す(図1のC)という構造になっています。

図1:A、Bの入力値にそれぞれ「重み」が掛け算された上で合算され、その合計値がCで判定されて0または1が出力される

出力される値は0から1の間の数で、重みによって変化した入力値によって出力される値は変化します。その出力値を調整するために、「バイアス」と呼ばれる箇所(上図で「1」と書かれた黄色の丸)もありました。

このA、B、バイアスから成る小さな塊が幾重にも繋がり、ネットワークを形成しているものを「ニューラルネットワーク」と呼び、そのネットワークが何層にも深く重なっているものをディープラーニングと呼ぶと説明しました。

例えば、次の図は1層のニューラルネットワークの例です。

図2:1層のニューラルネットワーク

ディープラーニングで文字を扱うには?

ここまで思い出していただいたところで、いよいよディープラーニングを使って文を生成する方法について考えてみましょう。生成したい文は、「昨日メロンパンが食べたかった」です。

しかし先ほど復習したように、ネットワークから出てくるのが0から1の間の数字だけなのであれば、とても文字など出力できそうにありません。

では、ディープラーニングにおいて、文字はどのように扱えば良いのでしょうか。

一般的に、コンピュータが文字を扱う場合は、文字を数字に変換することが必要です。つまり、「昨日メロンパンが食べたかった」という文章を「1」という数字に置き換える、というようなイメージです。ただし、ディープラーニングの場合は「1」という数字ではなく、入力層にある入力の数に合うように設定します。

例えば、図2では入力層にはAとBという2つの入力がありますから、「昨日メロンパンが食べたかった」という文は2つの数字で のように表現されます。そして、この2つの数字を1つずつ、AとBに入れるのです。つまり、Aには0.5、Bには0.2を入れます。

図3:「昨日メロンパンが食べたかった」という文を表した2つの数字をAとBに入れる

数字に置き換えることで「昨日メロンパンが食べたかった」を入力することはできそうです。しかし、このやり方には大きな問題があります。

一文に対して1つの数字を与えていく方式では、「昨日メロンパンが食べたかった」だけでなく「昨日あんパンが食べたかった」にも「昨日メロンパンを食べた」にも、全て別の数字を与える必要が出てきます。こういった文は大量にありますから、それら全てに違う数字を振らなくてはならないというのは非効率的ですし、非現実的です。せっかく似たような文章なのですから、何か工夫はできないでしょうか。

※ 数字は人が適当に割り振ります。また、入力の数だけ(10個あれば10個)括弧の中に数字が縦に並びます。

「形態素解析」で効率良く文を数字で表す

一般的にコンピュータが文を扱う場合は、まず文に対して「形態素解析」と呼ばれる解析を行い、文を単語単位に分割して取り扱います。形態素解析とは、文を最小単位の単語に分割し、その単語の品詞などを判別する作業のことです。

例えば、「昨日メロンパンが食べたかった」という文であれば、次のように分割されます。

昨日 メロンパン が 食べ たかった

形態素解析を行えば通常、単語分割だけでなく、「昨日」や「メロンパン」に対しては「名詞」、「食べ」に対しては「動詞」といったような品詞情報が、全ての単語に対して付与されます。ただし、今回の説明では品詞情報を使わないので、「昨日 メロンパン が 食べ たかった」と分割されているところにだけ注目してください。また、形態素解析をせずに文字単位(「メ」「ロ」……「が」「食」……など)で扱うこともありますが、文内における区切り方が異なるだけでやっていることは同じです。

このように文を単語に分割し、空白を入れて記述することを「分かち書き」と呼びます。つまり、「昨日 メロンパン が 食べ たかった」は「昨日メロンパンが食べたかった」を分かち書きした文です。

形態素解析がどのように行われるかについては本連載では割愛しますが、無料で使用できる形態素解析器もありますので、形態素解析自体は比較的容易に行うことができます。

なお、分かち書きの結果は使用する形態素解析器によって異なりますし、同じ解析器でも使用する辞書(形態素解析器が使用する単語情報データが入っているもの)によって異なる点にご注意ください。

最初は一文に対して1つの数字を割り振っていましたが、形態素解析によって「昨日 メロンパン が 食べ たかった」と分かち書きすることができたので、この分かち書きされた文に含まれる単語ごとに数字を割り振ってあげましょう。

入力数はAとBの2つなので、1つの単語に対して2つずつ数字を割り振ります。例えば次のようになります。

図4:1つの単語に2つの数字を割り振る

こうしておけば、「昨日あんパンが食べたかった」という文についても「あんパン」に対してだけ新しい数字を与えてやれば、コンピュータで扱うことができます。

図5:どんな文だとしても、「昨日」は0.3と0.1で表せる

文は単語の組み合わせから成り立ちます。そのため、よく使われる単語に数字を与えておけば、それらの組み合わせによりさまざまな文を表現することができるというわけです。

これで文をネットワークに入力することができるようになりました。次回はこのような入力を受けて、ネットワークがどのようにして文を生成するのかについて説明したいと思います。

著者紹介


国立研究開発法人 情報通信研究機構
ユニバーサルコミュニケーション研究所
データ駆動知能システム研究センター 研究員
大西可奈子

2012年お茶の水女子大学大学院博士後期課程修了。 博士(理学)。同年、大手通信会社に入社。2016年より現職。
一貫して自然言語処理、特に対話に関する研究開発に従事。
人工知能(主に対話技術)に関する講演や記事執筆も行う。
twitter:@WHotChocolate