ニューラルネットワークを使用して車両を運転する

注釈


ニューラルネットワークを使用して、障害物を避けて、車両が自分自身を制御するようにします。 適切な入力/出力を選択し、ニューラルネットワークを徹底的にトレーニングすることでこれを実現します。 車の周りの最も近い障害物に距離ネットワークを送り、人間のドライバーのビジョンをシミュレートします。 出力では、車両のステアリングホイールの加速度と回転を取得します。 また、さまざまなI / O戦略でネットワークをトレーニングする必要があります。 結果は、ほんの数個のニューロンでも印象的です! 車は障害物の周りを運転しますが、このソフトウェアツールがより具体的なタスクに対処するように、いくつかの変更を加えることができます。

はじめに


アイデアは、それ自体を運転し、仮想世界の障害物を回避する車両を持つことです。 環境に応じて速度と方向を変更する方法を決定するたびに。 これをよりリアルにするために、AIは人が運転している場合に見えるものだけを見る必要があるため、AIは車両の前にある障害物に基づいてのみ判断を下します。 リアルな入力で、AIは実際の車で使用でき、同様に機能します。
「AIを使用して車両を運転する」というフレーズを聞いたとき、私はすぐにコンピューターゲームについて考えます。 レースゲームの多くは、この手法を使用して車両を制御できますが、仮想世界または現実世界での輸送制御の手段を探している他のアプリケーションも数多くあります。
それでは、これをどのように行うのでしょうか? AIを実装するには多くの方法がありますが、車両を運転するために「脳」が必要な場合は、ニューラルネットワークで十分です。 ニューラルネットワークは脳のように機能します。 それらはおそらく正しい選択でしょう。 ニューラルネットワークの入力と出力を決定する必要があります。


ニューラルネットワーク


脳の構造を調べると、ニューラルネットワークが現れました。 私たちの脳は、互いに電気信号を送る10 11個のニューロン細胞で構成されています。 各ニューロンは、「結果を生成する」1つまたは2つの軸索と、入力電気信号を受け取る多数の樹状突起で構成されます。 ニューロンには、特定の入力信号強度が必要です。これは、アクティブ化するためにすべての樹状突起から加算されます。 活性化されると、ニューロンはその軸索を介して他のニューロンに電気信号を送信します。 接続(軸索と樹状突起)が頻繁に使用される場合、それらは強化されます。
この原則は、小規模なニューラルネットワークに適用されます。 現代のコンピューターには200億個のニューロンを作成する計算能力はありませんが、複数のニューロンがある場合でも、ニューラルネットワークは妥当な答えを与えることができます。
図1に示すように、ニューロンはレイヤーに編成されます 。 入力層には入力があり、次の層の各ニューロンとの接続の強度に応じて、入力信号は次のレベルに供給されます。 ジョイントの強度は重量と呼ばれます。 各層の各ニューロンの値は、接続の重みと前の層のニューロンの値に依存します。

図1
ドライバーは「関数」と比較できます。 多くの入力があります:ドライバーが見るもの。 このデータは機能として脳によって処理され、ドライバーの反応は機能から抜け出す方法です。
関数f(x)= yは、x(1次元)の値をy(1次元)に変換します。
ドライバーの脳には逆伝播ニューラルネットワークを使用します。そのようなニューラルネットワークは、いくつかの次元を持つ可能性のある定義と値の領域を持つ関数を近似できるためです: F(x1、x2、...、xn)= y1、y2、... 、yn
いくつかの入力と出力を処理する必要があるため、これがまさに必要なものです。
ニューラルネットワークが少数のニューロンのみで構成されている場合、許容可能な結果を​​得るために必要な重みを計算できます。 しかし、ニューロンの数が増えると、計算の複雑さが増します。 バックプロパゲーションネットワークは、必要な重みを確立するようにトレーニングできます。 目的の結果とそれに対応する入力を提供するだけです。
トレーニング後、ニューラルネットワークは応答して既知の結果を適用するときに必要な結果を生成し、トレーニングと一致しない入力に対して正しい答えを「推測」します。
実際の計算はこの記事の範囲外です。 後方伝搬ネットワークがどのように機能するかを説明する優れた本がたくさんあります。
この場合に使用されるニューラルネットワークには4つの層があります( 図2 )。 3〜6層のさまざまな組み合わせを試しました。 すべてが3つのレイヤーで完全に機能しましたが、22の入力/出力のセットでネットワークをトレーニングしたとき、関数の近似は十分に正確ではありませんでした。 5層と6層は完璧に機能しましたが、学習に多くの時間がかかり(PIIで20から30分)、プログラムを開始したときに計算に多くのプロセッサ時間がかかりました。
このネットワークでは、入力層に3つのニューロン、結果の層に2つのニューロンがあります。 理由は後で説明します。 それらの間には、それぞれ8つのニューロンからなる2つの層があります。 繰り返しますが、ニューロンの数を増やしたり減らしたりしてレイヤーをテストし、8で解決しました。この数では許容できる結果が得られるからです。
ニューロンの数を選択するときは、システムに追加された各レイヤーと各ニューロンが重みの計算に必要な時間を増やすことに注意してください。

図2
ニューロンの追加:
i個のニューロン持つ入力レイヤーIと、 o個のニューロンを持つ結果レイヤーOがあります。 中間層Mにニューロンを1つ追加します 追加するニューロン間の接続の数は(i + o)です。
レイヤーの追加:
i個のニューロン持つ入力レイヤーIと、 o個のニューロンを持つ結果レイヤーOがあります。 それぞれにm個のニューロンを持つM層を追加します。 追加するニューロン間の接続の数は(m *(i + o))です。
「脳」がどのように機能するかを調べたので、ニューラルネットワークの入力と出力を決定する方法を理解する必要があります。 ニューラルネットワークは、仮想世界からの情報を提供し、ネットワークレスポンスを車両コントローラーに送信しない場合、それ自体は何もしません。

ログイン


運転にはどのような情報が重要ですか? まず、私たちとの関係で障害物の位置を知る必要があります。 この位置は右側、左側、または前方ですか? 道路の両側に建物があり、前方に何もない場合は、スピードアップします。 しかし、車が目の前で止まったら、ブレーキをかけます。 次に、自分の位置からオブジェクトまでの距離を知る必要があります。 オブジェクトが遠い場合は、オブジェクトが近づくまで動き続けます。その場合、減速または停止します。
これはまさに、ニューラルネットワークに使用する情報です。 簡単にするために、左、前、右の3つの相対的な方向を紹介します。 障害物から車両までの距離だけでなく。

図3
AIドライバーの視野を定義し、彼が見るオブジェクトのリストを作成します。 簡単にするために、この例では円を使用しますが、6つの交差する平面で切り取られた実際の円錐を使用することもできます。 次に、この円の各オブジェクトについて、それが左の視野にあるか、右にあるか、中央にあるかを確認します。
配列がニューラルネットワークの入り口に提供されます: float Vision [3] 。 車両の左側、中央、右側の最も近い障害物までの距離は、それぞれVision [0]Vision [1]Vision [2]に保存されます。 図3は、この配列の外観を示しています。 左側の障害物は最大距離の80%、右側の障害物は40%で、中央に障害物はありません。
これを計算するには各オブジェクトの位置(x、y)、車の位置(x、y)、および車両の角度が必要です。 また、 r (円の半径)とd rightd left-車とラインL rightおよびL leftの間のベクトルも必要です。 これらの線は、車の移動方向に平行です。 両方のベクトルは線に垂直です。
これは3Dの世界ですが、すべての数学は2次元です。車は飛行しないため、3次元で移動できないためです。 すべての方程式にはxyのみが含まれ、 zは含まれません。
まず、ラインL rightL leftの方程式を計算します。これは、障害物が車両の右、左、または中央にあるかどうかを判断するのに役立ちます。
図4は、すべての計算の図です。

図4

どこで

次に、線上の点の座標を計算します

ここで、V xとVは車両の位置です。
これで最終的にc rを計算できます

同様に、ベクトルd leftを使用して、線L leftの方程式を見つけます。
次に、円の中心を計算する必要があります。 円の中のすべてがAIによって表示されます。 車両V(x、y)の位置から距離rにある円C(x、y)の中心。


ここで、 V xV yは車両位置、 C xC yは円の中心です。
次に、世界の各オブジェクトが円内にあるかどうかを確認します(オブジェクトがクアッドツリーまたはオクツリーで構成されている場合、このプロセスはリンクリストよりもはるかに高速です)。
もし 、オブジェクトは円の中にあります。ここで、 O xO yは障害物の座標です。
円内の各オブジェクトについて、それが車両の右、左、または中央にあるかどうかを確認する必要があります。
もし 、オブジェクトは円の右側にあります
そうでなければ その後、左側に
それ以外の場合は中央にあります。
オブジェクトから車までの距離を計算します

次に、配列の対応する部分に距離を保存します( Vision [0]Vision [1]またはVision [2] )。ただし、以前に保存した距離が計算した距離よりも大きい場合に限ります。 最初に、Vision配列を2r値で初期化する必要があります。
各オブジェクトをチェックした後、車の右側、中央、および左側に最も近いオブジェクトまでの距離を持つビジョンの配列があります。 この視野にオブジェクトが見つからなかった場合、配列要素にはデフォルト値が設定されます。 、つまり、「視界内に単一のオブジェクトはありません。」
ニューラルネットワークはシグモイド関数を使用するため、入力は0.0から1.0の間でなければなりません。 0.0はオブジェクトが車両に触れていることを意味し、 1.0は視界内にオブジェクトがないことを意味します。 AIドライバーが見ることができる最大距離を設定するので、すべての距離を0.0から1.0の範囲に簡単に移動できます。


出口


出口で、車の速度と方向を変更するための指示を受け取る必要があります。 加速、ブレーキング、およびステアリング角度があります。 したがって、2つの出口が必要です。 1つは加速/減速値(ブレーキは単なる負の加速)で、もう1つは方向の変化を示します。
入力と同じ理由で、結果は0.0〜1.0です。 加速の場合、 0.0は「フルブレーキ」を意味します。 1,0- 「フルスロットル」および0.5-ブレーキまたは加速なし。 ステアリングの場合、 0.0は「完全に左」、 1.0は「完全に右」、 0.5は方向なしを意味します。 そのため、結果を使用可能な値に変換する必要があります。


「負の加速」とは、車両が前進している場合にブレーキをかけることを意味しますが、車両が停止している場合は反対方向に動くことも意味します。 さらに、「正の加速」とは、車両が反対方向に走行している場合にブレーキをかけることを意味します。

トレーニング


前述したように、最初にニューラルネットワークをトレーニングする必要があります。 入力とそれに対応する出力のセットを作成する必要があります。
ニューラルネットワークをトレーニングするために適切なI / Oを選択することは、おそらく最も難しい作業です。 大量のデータを使用してネットワークをトレーニングし、環境内で車がどのように動作するかを観察し、必要に応じてレコードを変更する必要がありました。 ネットワークのトレーニング方法によっては、車両が状況によって「ぐらつき」、動かなくなることがあります。
車両に対する障害物のさまざまな位置と、希望するAI応答の表( 表1 )を作成します。
表1
入力ニューロン
障害物までの相対距離
出力ニューロン
左側に中央に右へ加速方向
障害物なし障害物なし障害物なしフルスロットルストレート
途中障害物なし障害物なしわずかな加速少し右
障害物なし障害物なし途中わずかな加速左へ
障害物なし途中障害物なし制動左へ
途中障害物なし途中加速ストレート
オブジェクトタッチオブジェクトタッチオブジェクトタッチ戻りストローク左へ
途中途中途中変化なし左へ
オブジェクトタッチ障害物なし障害物なし制動完全な権利
障害物なし障害物なしオブジェクトタッチ制動左いっぱい
障害物なしオブジェクトタッチ障害物なし戻りストローク左へ
オブジェクトタッチ障害物なしオブジェクトタッチフルスロットルストレート
オブジェクトタッチオブジェクトタッチ障害物なし戻りストローク完全な権利
障害物なしオブジェクトタッチオブジェクトタッチ戻りストローク左いっぱい
オブジェクトを閉じるオブジェクトを閉じるオブジェクトは非常に近い変化なし左へ
オブジェクトは非常に近いオブジェクトを閉じるオブジェクトを閉じる変化なし右へ
オブジェクトタッチオブジェクトは非常に近いオブジェクトは非常に近い制動完全な権利
オブジェクトは非常に近いオブジェクトは非常に近いオブジェクトタッチ制動左いっぱい
オブジェクトタッチオブジェクトを閉じる遠いオブジェクト変化なし右へ
遠い物体オブジェクトを閉じるオブジェクトタッチ変化なし左へ
オブジェクトは非常に近いオブジェクトを閉じる被写体は中途半端より近い変化なし完全な権利
被写体は中途半端より近いオブジェクトを閉じるオブジェクトは非常に近い制動左いっぱい

これで、これを表2の数値に変換できます。
表2
入力ニューロン出力ニューロン
左側に中央に右へ加速方向
1,01,01,01,00.5
0.51,01,00.60.7
1,01,00.50.60.3
1,00.51,00.30.4
0.51,00.50.70.5
0,00,00,00.20.2
0.50.50.50.50.4
0,01,01,00.40.9
1,01,00,00.40.1
1,00,01,00.20.2
0,01,00,01,00.5
0,00,01,00.30.8
1,00,00,00.30.2
0.30.40.10.50.3
0.10.40.30.50.7
0,00.10.20.30.9
0.20.10,00.30.1
0,00.30.60.50.8
0.60.30,00.50.2
0.20.30.40.50.9
0.40.30.20.40.1


ログイン:
0.0:車両にほとんど接触しているオブジェクト。
1.0:車両から最大距離にあるか、視野内にないオブジェクト
出力:
加速
0.0:最大の負の加速度(ブレーキまたはその逆)
1.0:最大の正の加速度
方向
0.0:左いっぱい
0.5:ストレート
1.0:完全な権利

結論/改善する方法


バックプロパゲーションニューラルネットワークの使用は、この目的には適していますが、テスト中に特定されたいくつかの問題があります。 いくつかの変更は、プログラムの信頼性を高め、他の状況に適応させることができます。 ここで、あなたが解決について考えるかもしれないいくつかの問題について説明します。

図5
車両はしばらくの間「行き詰まり」ます。これは、左に進むか右に進むかを決めるのをためらうからです。 これは予想されることでした:時には人々は同じ問題を抱えています。 ニューラルネットワークの重みを調整しようとして、これを修正するのはそれほど簡単ではありません。 ただし、次のようなコード行を追加できます。
「(車両が5秒間動かない場合)(コントロールを取り、右に90度回転します)」
このようにして、私たちは何をすべきかを知らずに車が止まらないことを保証できます。
図5に示すように、車両には2つの家の間に小さな隙間はありません。 視覚の精度が高くないため(左、中央、右)、互いに近い2つの建物は人工知能の壁のように見えます。 AIをより明確に表示するには、ニューラルネットワークの入り口で5レベルまたは7レベルの精度が必要です。 「右、中央、左」の代わりに、「右端、右端近く、中央、左端近く、左端」を使用できます。 ニューラルネットワークの適切なトレーニングにより、人工知能はギャップを認識し、ギャップを通過できることを理解します。
2Dの世界で機能しますが、車両が洞窟を飛ぶことができるとしたらどうでしょうか? この手法にいくつかの変更を加えることで、乗車せずにAIを飛行させることができます。 最後の問題との類推により、視線の精度が向上します。 ただし、「権利」と「ライオン」を追加する代わりに、 表3に示すように行うことができます。
表3
左上右上
左側にセンター右へ
左下階下右下

ニューラルネットワークで世界を3Dで表示できるようになったので、制御と車両の世界に対する反応を変更するだけです。
車両は特定の目的なしに「さまよう」だけです。 障害物を避けること以外は何もしません。 行きたい場所に応じて、必要に応じて脳を「調整」できます。 多くの異なるニューラルネットワークを使用し、特定の状況で適切なニューラルネットワークを使用できます。 たとえば、目の前の車を追いかけることができます。 別の車両に追従するように訓練された別のニューラルネットワークを接続し、入力として2番目の車両の位置を受け取るだけです。
先ほど見たように、この方法はさまざまな分野で改善および適用できます。 有用な目的で使用されていなくても、人工知能システムが環境内でどのように動作するかを観察することは興味深いことです。 十分に長い時間観察すると、困難な状況では、ニューラルネットワークの性質による解のわずかな違いにより、車両が常に同じ経路をたどることはないことがわかります。 車は時々建物の左に、時には同じ建物の右に運転します。

文学


  1. Joey Rogers、オブジェクト指向ニューラルネットワーク、C ++、アカデミックプレス、カリフォルニア州サンディエゴ、1997
  2. MT Hagan、HB DemuthおよびMH Beale、Neural Network Design、PWS Publishing、マサチューセッツ州ボストン、1995

Source: https://habr.com/ru/post/J101789/


All Articles