ANNベースの対話者:リカレントネットワーク

記事「ニューラルネットワークに基づく対話ロボット」の前半で、直接分散ニューラルネットワークを使用して対話ロボットを作成する方法を検討しました。 実験の結果、このようなネットワークを使用してテキストを生成することは悪い考えであることが明らかになりました。 Roman_Khdaiver19vladshowに、ネットワークの変更方法と移動方向を示してくれてありがとう。



次のテストフェーズは、リカレントLSTMネットワークです。



前と同様に、最近のダイレクトディストリビューションネットワークの実験では、Word2Vecツールを使用して、ベクトル空間で単語が均一に分布する辞書が作成されます。 各単語は長さベクトルで表されます。 D=50



シーケンス生成の準備



コーディングを提供する



リカレントネットワークはシーケンスを生成できるため、適切なコーディング方法を使用します。 ネットワークに対して、単語ごとの文の質問を求め、文の答えを生成します。

テキスト形式では、トレーニングベースは「Question = Answer」という文のセットとして保存されます。次に例を示します。



 1 HELLO = HELLO(2ワード)
 2長時間見ないで=ハローフレンド(5ワード)
 3良い日=素晴らしい日(4ワード)
 4今日とは何か=今日の最高の日(6ワード)
 5レッツフレンド=レッツビーフレンド(5ワード)
 6友達になる=多くの友達がいるとき(7ワード)
 7会合前=幸福前(4ワード)


シーケンスの生成を制御するために、次のサービスタグが使用されます。これらのタグは、Word2Vecと他の単語を使用してエンコードされます。





ニューラルネットワークをトレーニングするには、2つの行列TrainXとTrainYを次のように作成します。 各行列にはサイズがあります N\回T\回D どこで N -データベース内のオファーの数( N=7 この例では); T -この例では、文中の最大単語数+ 3(#GEN#、#BOS#、#EOS#) T=7+3=10 ; D ワードベクトルの長さ(50)です。



すべてのシーケンスは、単語数が最も長くなります。 この例では、最長のシーケンスは6です。これは、すべての文に7つの単語が追加され、最後の空のスペースが#EOS#で埋められることを意味します。



		 t = 0 t = 1 t = 2 t = 3 t = 4 t = 5 t = 6 t = 7 t = 8 t = 9				
 TrainX [0] [t] = HELLO#GEN##BOS#HELLO#EOS##EOS##EOS##EOS##EOS##EOS#
 TrainY [0] [t] = NULL#BOS#HELLO#EOS##EOS##EOS##EOS##EOS##EOS##EOS#

		 t = 0 t = 1 t = 2 t = 3 t = 4 t = 5 t = 6 t = 7 t = 8 t = 9 t = 10
 TrainX [1] [t] =ロングシーク#BOS#HELLO FRIEND#EOS##EOS##EOS##EOS##EOS#
 TrainY [1] [t] = NULL NULL NULL HELLO FRIEND#EOS##EOS##EOS##EOS##EOS##EOS#


NULL-ネットワーク応答は重要ではありません;ワードをエンコードする場合、ゼロで埋められます。



ネットワーク応答の生成



トレーニング後、すべての質問語と#GEN#タグがニューラルネットワークの入力に送信されます。 その後、ネットワークに、#EOS#タグが見つかるまで送信された前の単語から次の単語を予測するように依頼します。 応答からサービスタグを除外すると、答えが得られます。



アーキテクチャのテスト



現在、実験にはPython言語とKerasライブラリを使用しています。







オプション1. 1つのLSTMセル、65,450パラメーター



含まれる実験:





109の文を学習して覚えた後、これらの答えを得ることができます。



 -こんにちは
 -こんにちは

 -名前は何ですか?
 -私はネットワークです

 -ハローネットワーク
 -こんにちは

 -こんにちは、私を知っていますか?
 -私は学びます

 -あなたの名前はオレグですか?
 -ファミリアライズに最適

 -あなたはネットワークですか?
 -私はネットワークです

 -あなたは元気ですか?
 -どういたしまして

 -あなたは何が好きですか?
 -聞きたい

 -話したいですか?
 -おもしろい会話ができて嬉しいです

 -何?
 -レッツ・トーク・アバウト




オプション2. 2セルLSTM、93 150パラメーター



含まれる実験:





同じ質問をします:



 -こんにちは
 -こんにちは

 -あなたの名前は?
 -私はネットワークです

 -ハロー、ネットワーク
 -これは友達です

 -こんにちは、私を知っていますか?
 -私は学びます

 -あなたの名前はオレグですか?
 -私の名前

 -あなたはネットワークですか?
 -私はネットワークです

 -あなたは元気ですか?
 -私は学習を考える

 -あなたは何が好きですか?
 -音楽を聴きたい

 -話したいですか?
 -おもしろい会話ができて嬉しいです

 -何?
 -レッツ・トーク・アバウト




オプション3. 3つのLSTMセル、63,150パラメーター



含まれる実験:





そしてそのような対話:

 -こんにちは
 -こんにちは

 -名前は何ですか?
 -私はネットワークです

 -ハロー、ネットワーク
 -それはあなたです

 -こんにちは、私を知っていますか?
 -私は学びます

 -あなたの名前はオレグですか?
 -ミー・トゥ・ミー

 -あなたはネットワークですか?
 -私はネットワークです

 -あなたは元気ですか?
 -私は考える

 -あなたは何が好きですか?
 -音楽を聴きたい

 -話したいですか?
 -おもしろい会話ができて嬉しいです

 -何?
 -友達になりましょう


まとめ



テストでは、構築されたモデルの「合理性」をテストするために、トレーニングベースにない質問(最初の質問を除く)が特別に選択されました。 リカレントネットワークははるかにうまく機能しているように見えましたが、質問内のいくつかの単語の不在や文中の単語の順序の影響は大きくありません(「あなたの名前は何ですか?」、「あなたの名前は何ですか?」に対する答えは同じです)。 もちろん、この結果はまだ「良い」とはほど遠いです。

3つの最初のモデルがあいさつに最も適切に応答するのは興味深いことです;それは文中のそれ自身の名前によってノックダウンされません。 しかし、彼女はまだ自分の名前が正確にはわかりません。 反対に、2番目のモデルは、希望に応じてひどくひどく挨拶に応答します。 しかし、最初のモデルとは異なり、彼女は自分の名前に関する質問に正しく答えようとしました(「あなたの名前はオレグですか?」-「私の名前は」)。 この実装では、対話と以前の回答のコンテキストを記憶することは想定されていませんが、最初の2つのモデルでの会話のトピックの選択はより適切に見えます。



結論:テストベース全体から、最初のモデルは質問の一部に適切に回答し、残りのテストは完全に失敗します。 他のモデルは質問の2番目の部分に回答し、1番目の質問には見事に対処しません。 テストスイートのすべての質問に正しく答えることができるニューラルネットワークのセットを作成することが不可能なのは残念です...



したがって、次のタスクは、テストに合格するニューラルネットワークのモデルを構築するために、一定のトレーニングとテストセットを使用して、回答の品質に対するANNレイヤーの種類と数の影響を調べることです。








All Articles