AIによるチャットボットの作り方 - 2019-11-11 更新
AIによるチャットボットの作り方へようこそ
AIゆめ
本サイトの目的はAI(Artificial Intelligence:人工知能)を使用した廉価で実用的なチャットボットを一から作成することができるような情報を提供することです。ここで、チャットボットとはチャット(会話)できるボット(ロボット)のことであり、私自身、夢占いに特化したチャットボットである
AIゆめの夢占いチャット を提供しています。
また、チャットボットばかりではなく、TensorFlow/Kerasを利用した
AIの応用例 や、下記画像に示す通り生成系AI ウェブアプリ
AIサービスHome なども開示していますので、製造業・非製造業に拘わらず、「自社の問題解決に応用できるのではないか?」と思われた方は、
ネオラクス・メール送信フォーム からお気軽にご相談ください。AI技術を用いて、世の中にある様々な問題の解決に貢献して行きたいと思います。
書籍やウェブサイトを使用して
ニューラルネットワーク の勉強をしながら「AIゆめの夢占いチャット」を約2か月間で構築することができましたし、その他の様々な新たなAI技術を開発・導入を行っています。近年、GPU も手軽に導入できるようになってきていますので、本サイトが、チャットボットや生成系AIなどの AI を活用したいけれども一から構築するのはハードルが高いという方のお役に立てれば幸です。
また、既に市販のAIを使っている方は多いと思いますが、チャットボットを日々進化させるためには機械学習が必要です。
そして、実用レベルで機械学習を行って行くにはCPU(Central Processing Unit:中央処理装置)ではなくGPU(Graphics Processing Unit:グラフィック処理装置)環境を構築しておく必要があるでしょう。
しかし、市販のGPU環境は意外に高価であるため簡単には利用できませんし、GPU環境を構築する際には、意外な落とし穴に嵌ってしまう可能性もあります。
本サイトでは、そのようなお悩みを抱えている方に十数万円で構築できる実用的なGPU環境の作り方もご紹介して行きます。
チャットボットの作り方の目次
AIの歴史
AI(Artificial Intelligence:人工知能)という言葉は1956年のダートマス会議ではじめて使われて以来、何度かブームを巻き起こしました。
特に、1980年代~1990年代にブームを巻き起こしたエキスパートシステムは有名ですが、結局、
ルールの構築やパラメータの調整のコストが膨大にかかってしまうということから一時的なブームに終わってしまいました。
自然言語処理用AIの歴史
word2vecとは
チャットボットは言語を扱いますので、自然言語処理用AIの歴史についても触れておきましょう。自然言語処理用AIの分野で長年研究されているのがword2vecという技術です。
word2vecは主に文章の中で空欄になった部分を埋めるような試験問題を解決する手段として使用されることが多いようです。
例えば、下記の文章で、赤の「挨拶 」や緑の「こんにちは 」などのウィンドウが空欄になっていた場合に、
前後の文脈から空欄を予測するようなニューラルネットワークモデルがCBOW(Continuous Bag-Of-Words)モデルです。
CBOWモデルとは、多数の単語が詰まった袋の中から空欄に入る確率が最も高い単語を選び出すという課題の解決手段でありword2vec技術の一つです。
「今日、鈴木さんに会って挨拶 しました。彼は元気にこんにちは と言ってくれました。」
word2vecとその実用性
CBOWモデルを始めとするword2vec技術では、単語の分散表現(Distributed Representation)が使用されます。
単語の分散表現とは、単語の意味を的確に表す多次元ベクトルで単語を表現する方法であり、この単語の分散表現がword2vec技術です。
色が光の三原色であるRGBベクトルとして表現されていることから連想すれば、単語の意味を多次元ベクトルを表現することも理解しやすいでしょう。
そして、全てのword2vec技術は、単語の意味は周囲の単語(文脈:Context)により決まるという「分布仮説(Distributional Hypothesys)」に基づいていると言っても過言ではないでしょう。
しかし、この分布仮説は、文章の穴埋め問題などの試験問題を解決する手段としてはある程度有効でしょうが、新たな文章を創造するなどといった実用性には乏しいと考えています。
分布仮説は、CBOWモデルをはじめとするword2vec技術を構築する際に設けられた都合の良い仮説であり、実用に耐えうる汎用性はないと言えるでしょう。
子供が文章を学習して行く過程で、単語の意味を理解しなければ文章を理解できなかったり、誤解してしまったりするという事象は数多く発生しますので、
CBOWモデルでもそのような事象は多く発生して当然でしょう。
CBOWモデルを新たな文章を創造するという課題を解決する用途に発展させたモデルが言語モデルです。
即ち、CBOWモデルは前後の文脈からその中間に入る単語を統計的に予測する課題を解決していましたが、言語モデルでは前の文脈から次に来る単語を統計的に予測する課題を解決することになります。
そして、word2vec技術の実力を知るため、言語モデルを使用して自分のサイトを学習させて文章を創作してみました。
その結果、一見するとまともな文章に見える部分もありましたが、意味が通じない部分や全く逆の意味になっている部分も数多く発生しました。
言語モデルでは、次に来る単語として最大確率を持つ単語を選ぶよう設定すれば学習した文章と同一文章になってしまいますし、
ある程度のバラツキを持たせて次に来る単語を選べばまともな文章になる部分もあれば、意味不明になったり、学習した文章とは全く逆の意味になったりする部分も発生します。
言語モデルでは、単語の意味の類似性は理解できているのでしょうが、単語の本来の意味を理解できていませんので、この結果は当然の結果と言えるでしょう。
なお、word2vecでは大量の文章が与えられるだけで特別な教師データが不要であることから教師なし学習と呼ばれることもあります。
本サイトでは、AIによるチャットボットの実現という目的を持っていますので、Encoder-Decoderモデルとも呼ばれるニューラルネットワークの中でもAttentionという技術に注目しますので、
入力に対応する教師データが与えられる教師あり学習に限定して解説して行きます。
AIの用語説明
ニューラルネットワーク(Neural Network:神経網)
ニューラルネットワークは、知的な問題解決能力を持った脳のニューロン(neuron:神経細胞)内の計算情報の流れを模擬した図1のようなシステムであり、
AIと同義語と考えても良いでしょう。
下記で解説するRNNと比較して図1のようなニューラルネットワークは、FF(Feed Forward:フィードフォワード)ニューラルネットワークと呼ばれることもあります。詳細は、
AIとは - ニューラルネットワーク
をご覧ください。
図1 三層ニューラルネットワーク
ディープラーニング(Deep Learning:深層学習)
ニューラルネットワークは入力層、隠れ層(中間層と呼ばれることもあります)、出力層で構成されています。
そして、人間の脳と同様、ニューラルネットワークの層を深くすることにより、より複雑な課題に柔軟に対応できることが知られています。
深いニューラルネットワークの最適な重みやバイアスなどのパラメータを決定する行為がディープラーニング(Deep Learning:深層学習)と呼ばれています。
RNN(Recurrent Neural Network:再帰ニューラルネットワーク)
LSTM(Long Short-Term Memory:長期の短期記憶を備えたニューラルネットワーク)
RNNの課題 の一つである
長期依存性のある言語モデルの学習における勾配消失を解決するために導入されたモデルであり、ゲート付きRNNモデルの一種です。
シンプルなRNNに記憶セルを設け、inputゲート、forgetゲート、outputゲートという3種類のゲートにより、記憶セルと隠れ層状態との情報交換をコントロールする方法です。
LSTMの詳細は、
LSTMによる勾配消失の解決法
をご覧ください。
GRU(Gated Recurrent Unit:ゲート付き再帰ユニットによるニューラルネットワーク)
学習を効率的に行うことを目的に開発されたモデルであり、LSTMよりも少ないパラメータを用いたゲート付きRNNモデルの一種です。
しかし、GRUではLSTMと同様、
活性化関数
としてtanh関数を使用していますが、近年の研究では活性化関数としてReLU関数(Rectified Linear Unit)を用いる研究が増えていますので、本サイトではこれ以上の解説は行いません。
CNN(Convolutional Neural Network:畳み込みニューラルネットワーク)
畳み込み演算を備えたニューラルネットワークであり、画像処理などで実用的に広く使用されています。
ここで、畳み込み演算とは、例えば、原画像に一定のフィルターウィンドウを適用することにより特徴を抽出する演算であり、フィルターウィンドウのパラメータが学習すべき重みとなります。
また、CNNでは、
活性化関数
として単純なReLU関数(Rectified Linear Unit)を使用することが標準となっています。
ただし、自然言語処理の分野ではあまり使用されることはありませんので、本サイトではこれ以上の解説は行いません。
誤差逆伝播法(Back-propagation of Errors)
ニューラルネットワークの各層の状態変数の変化を表す勾配(偏微分)が、掛け合わせることにより上流に逆伝播しているように振舞う原理のことであり、
ディープラーニング(Deep Learning:深層学習)では、出力層の誤差から重みやバイアスを逐次修正して行く手法として活用されています。
誤差逆伝播法の詳細は、
誤差逆伝播法
をご覧ください。
参考文献および参考サイト
全般的に参考にさせて頂いた参考書籍を以下に示します。
特定の個所で参考にさせて頂いた参考論文や参考サイトについては、本文中にリンクして示します。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
・・・とても分かりやすくまとめていますので初心者がDeep Learningを学習する書籍として適しているように思います。
チャットボットをターゲットにしてDeep Learningを学習している方は、この下の「ゼロから作るDeep Learning② ―自然言語処理編」だけで十分かも知れません。
ゼロから作るDeep Learning② ―自然言語処理編
・・・とても分かりやすくまとめていますので初心者が自然言語処理のDeep Learningを学習する書籍として適しているように思います。
ただ、チャットボットをすぐに作成したいという目的を持った初心者が読み進めて行く場合には、活用できる部分が最後の7章、8章だけなので、少しガッカリしたり、イラっとしたりします。
Pythonのサンプルコードも公開されていますので、とても重宝しています。
入門 Python 3
・・・分かりやすいのですが、喋り好きの方が書いた洋書の翻訳ですので、蛇足部分が多く分厚い本の割に内容が薄いという印象です。
Python3を短期間で学習したい方は別の書籍をお勧めします。