「AI個別技術と関連理論 12」の「確率5」の記事で触れた音声言語認識、特に言語認識の部分について少し補足します。言葉を統計的に処理する方法と手順についてです。以下のような手順で行います。
単語に切り分ける
まずは言葉の最小単位に切り分けていきます。
たとえば、「すもももももももものうち」という文を解析して、
・すもも(名詞)
・も(副助詞)
・もも(名詞)
・も(副助詞)
・もも(名詞)
・の(格助詞)
・うち(名詞)
と切り分けます。このように切り分けることを形態素解析と言います。
単語を多次元ベクトル化する
コンピュータは数値しか受け取れないので、単語に数百~1000次元のベクトルをひも付けしてやります。フラグを立てる場所を、ひとつの単語に数百から1000個持たせる感じです。
そのベクトルを使って、たとえば、
king – man + woman = queen
Paris – France + Japan = Tokyo
とするような演算によって単語と単語の関係をマシンに学ばせていきます。これはWord2Vecというソフトウェア・モデルが実現した方式です。
この方式だと、「スリランカの首都は?」といった質問に、マシンが答えられるようになります。つまりこうです。
Tokyo – Japan + Sri Lanka = Sri Jayawardenepura Kotte
マシンは「スリ・ジャヤワルダナプラ・コッテって街だよ」と教えてくれます。
こうしたベクトルをひとつひとつの単語に与えていくのは大変なのではないかという気がしますが、ニューラルネットワークによるディープラーニングで自動的にやってくれる世の中になっています。テキストは画像や音声に比べれば複雑さの程度が低いので、大量のテキストデータ(コーパス)を与えてやればマシンはかなりしっかりと単語と単語の関係を習得し、確率統計的に整理していけます。
このベクトル設定を行うディープラーニングの方式がふた通りあります。CBoW、Skip-gramと呼ばれる方式です。
「条件付き確率を最大化する」という学習 CBoW
ある単語について、意味や用法が自然で間違わずに出力できるようにするため、その周辺で用いられているいくつかの単語を条件とした、その単語が現れる条件付き確率を最大にすることで学習する方式です。CBoWは Continuous Bag of Words の略で、直訳すれば「言葉のつながったかたまり」。文脈からある単語の自然な使い方を確率的に把握します。
たとえば、株式市場の動きを報じるニュースでよく使われる「下落」という単語の機械学習を考えます。そのために、「下落」を含むフレーズをたくさん集めたコーパスをマシンに与えてやります。
「今日の日経平均は、全体的に利益確定売りに押され、小幅に下落した」
「今日の日経平均は、地政学リスクによる円高が嫌気され、大幅に下落した」
「今日の日経平均は、前日のNY市場ダウ平均の続落を受け、下落した」……などなど。
そして、「日経平均」、「利益確定売り」、「押され」、「小幅に」、「地政学リスク」、「円高」、「嫌気され」、「大幅に」、「前日の」、「NY市場」、「ダウ平均」、「続落」、「受け」といったような単語が使われているときに、「下落」という単語が出現する条件付き確率を学ばせていきます。上記のような「文脈を作っている単語」をニューラルネットワークに入力し、「下落」が出現する条件付き確率が最大になるように重み付けを調整し、ベクトル内の値を決めていくのです。
「文脈予測のエラー率を最小化する」という学習 Skip-gram
もうひとつの方法がSkip-gramです。CBoWとは反対に、ある単語が出現したときに、周辺にどんな単語が登場しているかを予測させ、その予測のエラー率の合計が最小になるように学習させます。
CBoWの反対、逆ですから、Skip-gramでは「下落」が出現したときに、「日経平均」、「利益確定売り」、「押され」、「小幅に」、「地政学リスク」、「円高」、「嫌気され」、「大幅に」、「前日の」、「NY市場」、「ダウ平均」、「続落」、「受け」などの単語が使われるだろうと予測するわけです。
そして、CBoWとは反対に、「下落」の方ではなくて上記のような単語が持っているベクトル内の値を、予測エラー率が最小になるように調整していきます。
実験によると、CBoWよりもSkip-gramの方が少ない学習データでも精度が出せるため、効率が良いようです。
結局、「意味」は理解していない
単語に多次元ベクトルのラベルを持たせることで、演算を通じて類縁性のある単語同士の関係をマシンが把握できるようになり、また、Aというフレーズが現れたときにBというフレーズが現れる条件付き確率を統計的に把握していくことで、単語の自然な用法をマシンが学べるようになった――これが現在行われている自然言語処理です。
結局、言葉の「意味」を概念としてマシンが理解しているわけではないことがおわかりいただけると思います。実際、ベクトル演算では「類縁性のある単語同士の関係」は把握できるものの、「対義語」の把握はむずかしいことが知られています。株式市場の「下落」の反対語である「上昇」という語をマシンに学ばせるには、「下落」という単語との関係から直接学習させることはできず、「円安」、「値頃感」、「地政学リスクの後退」、「金利の下落」など、平均株価が上がる要因になりがちな事象を示す単語との結びつきを統計的に把握していくことによってしか学習できません。マシンが単語の意味を概念把握していないことは明らかです。
やはり、「中国語の部屋」なんですね。
機械翻訳への応用
テキストデータのコーパスを学習することで、マシンは統計的に単語や文を扱い、適切で自然な反応のパターンを学習します。これは2つの言語の間での機械翻訳へも応用されます。
人工知能研究がはじまったばかりの頃、1950年代から、けっこう最近の2000年頃まで、機械翻訳の主流はルールベース機械翻訳 Rule-Based Machine Translation でした。すなわち、それぞれの言語の辞書、文法知識、構文変換ルールにもとづいて、人間が翻訳するのと同じ作業をマシンにもさせる方向です。しかし、すべてのルールをマシンに理解させるように書き下すことは困難ですし、ルール化できない「暗黙知」もあります。
そちらの方向を捨てたのが、ここで紹介したような統計的機械翻訳 Statistical Machine Translation です。「テキスト読解に統計で取り組む」という発想そのものは実はけっこう古く、文字をずらしたり(IBM→HALのように)、別の記号や文字で置き換えたり(シャーロック・ホームズの「踊る人形」みたいに)といった単純な手法による暗号に対して、文字の出現頻度の統計をあてはめて解読する方法がとられることがありました。また、ルールベースの機械翻訳が主流だった時代でも、補助的には統計が駆使されていたのです。
それが今や、統計的手法が主流になっています。Google翻訳など、ネットで利用できる機械翻訳はお使いになったことがあるでしょう。以前に比べると、かなり精度が上がっていると実感できます。まだまだ笑えることもありますけど。
チャットボットへの応用
人間が話しかけた言葉を理解し(ているように見せ)、意味のある返事を返す(ように見せる)マシンがチャットボットです。LINEのような文字ベースでのチャットでも、以前の記事で触れたSiriやKetooのような音声ベースでもいいのですが、簡単な会話ならそこそこ成り立つようになってきました。昔は「人工無脳」というジョークソフトがありましたが、統計的データを持つチャットボットは、もちろん人工無脳よりもはるかに有能です(「有脳」ではないのですが)。
さて、この記事では補足として「マシンによる自然言語処理」の内容を紹介しました。かなり精度が上がってきた理由がおわかりいただけたと思います。
今後はおそらく、細かいジャンルごとにコーパスを蓄積して機械学習させていき、それぞれの現場でより自然な受け答えができるマシンに仕上げていく方向で研究が進むと思われます。