学習システム

「学習システム」の編集履歴(バックアップ)一覧に戻る

学習システム - (2011/11/09 (水) 10:49:57) の編集履歴(バックアップ)


人間は成功から効果的な手段を、失敗から悪い手段を学習して、同じ成功を増やし同じ失敗を減らせるが、
コンピューターはプログラムで決められた通りにしか動くことができないため、効果的な手段をプログラム通りにしか使えず、
悪い手段ばかり使ってしまって同じ失敗を繰り返し、悪いパターンにハマってしまうことが珍しくない。
そこで成功や失敗を記録し効率的な手段や逆効果な手段を判断させて、悪い手段を減らすといったプログラムを組み、
同じ失敗でハメられるといったことを回避しつつ、効果的な手段を用いさせるのがコンピューターの学習システムである。


MUGENでは

失敗などを記録して同じ失敗を減らしたりするためのAIのシステムを指す。
学習システム以外にも、擬似学習、学習機能、学習ロジック、学習装置、記憶システム、記憶装置など
様々な呼び方をされているが、基本的に全て同じものである。特に学習システムが使われているAIは学習型AIとも呼ばれる。
このページではプログラム上の学習・記憶を 記録 と、プログラム自体は 学習システム 、あるいは ○○学習 と表記して統一する。
(一応、失敗記録以外も学習システムといえば学習システムである)

様々なキャラの入り乱れるMUGENでは色々な相手と対戦することになるが、
AIは相手の情報をあまり知ることができず、AI殺しなど対応しきれない部分が多く出てくる。
しかし相手に合わせて予め情報を入力することも難しいため、失敗などをVarに記録することで
相手に合わせて対応を変更するという学習システムを備えたAIも多く存在している。
例えば技の失敗回数を数えてその行動を減らすという程度のものも、一応学習システムの一種である。
複雑なものだと 対攻撃学習システム で相手の攻撃を記録して、より早い攻撃や無敵技で潰しにかかったり、
的確に当て身投げをしてくるAIも存在する。流石に大抵設定で自重させることもできるが。

ただ便利な学習システムも記憶を保持できるのが その試合中のみかそのラウンド中のみ で、
一試合毎か1ラウンド毎に 記録がリセットされてしまう といった欠点があり、
記録Var数の問題もあってなんでも記憶できるというわけではない。

Helperとラウンド引き継ぎについて

Varや処理の関係上、複雑な学習システムにはHelperを使うことが多い。
複雑な記録には相応にVarを多数必要とするので本体の空きVarだけでは足りないほど多くの記録を行うために。
またVarだけでなく、記録内容と処理の関係でHelperでしか記録できない場合もある。

しかしHelperはラウンドをまたぐと消滅するため、Helperだけで引き継ぐことはできない。
1キャラがラウンドをまたいで引き継げるVarは本体のVarの計100個までなので、
本体側に移して引き継ぐにしても引き継げる情報量には限界があり、
ラウンドをまたぐと記録がリセットされてしまうのはしかたないのである。

学習システムにおける注意点

複雑な学習システムを作って導入することは難しく手間がかかる。
汎用的なシステムは一度作ってしまえば流用できるものの、複雑な学習システムを
1から作るとなると簡単なAIを1つ作るくらいの知識と労力が必要になることもあるほど。
その上、相手の処理が特殊であったり、記述が甘かったりすると誤作動を起こす危険もあり、
しかも同じ状況が来ることが前提であるため、同じ状況が来ない場合は宝の持ち腐れとなる。
相手の攻撃を記憶する学習システムだと必殺技の強弱などの違いを認識できない場合があったり、
それ以外にもタッグ戦などでは攻撃が入り乱れるためほとんど役を成さないことも多い。

学習システムあくまで通常の記述では至らない部分を補うだけで 万能のシステムではない のだ。
いくら学習システムを積んだからといってAI全体を補うことはとてもできないし、 複雑な学習システムが無くとも十分に優秀なAIもある
学習システムが無くとも多彩な動作をさせておけば悪いパターンにハマることを減らすことはできる。

動画的には単純なミスを何度も繰り返すよりはミスを修正して上手く戦っている方が見ていて楽しいですし、
対攻撃学習システムも記憶の溜まった後半から逆転するといった魅せプレイをしてくれることがあります。
もちろん、ガードの後相手を封殺するといった場合もありますが、それでつまらないと感じても学習システム自体が悪いのではなく、
学習とは関係無く単純に両者の強さが合っていない試合は他に面白いことがなければつまらないだけです。
特に対攻撃学習などは強さを跳ね上げることもできるので、制作者も使う側も思い込みに囚われず実際の強さに注意しましょう。


主な学習システムの種類

専門的な話は割愛。

攻撃失敗学習システム
攻撃が上手く当たらなかった場合や潰されたことを記録し、
同じ攻撃を繰り返して同じ失敗を繰り返さないようにするための、比較的簡単な学習システム。
学習システムと呼ばれることは少ないかもしれないが、一応一種の学習システムである。
全ての技で記録することは面倒であるため記録する対象は主に投げ技やコンボで
投げ技の入らない相手へ投げ技を繰り返させないようにしたり、うまくいかったコンボルートを止め別のルートを選ぶというもの。
(コンボルートの変更はコンボルートを複数用意できるキャラに限るが。)
基本的な手順は
  1. どの攻撃をしているか確認する。
  2. その攻撃からくらい状態になる、あるいは攻撃が当たらなかったら失敗を記録する。
  3. 失敗記録のある攻撃を控える。失敗回数が多ければ使わない。
全ての技を調べずとも、直前に潰された技を記録してその技を控えるだけでも単純なパターンなら多少抑えることができる。
ちなみに成功回数を記録して効果的な手段を増やすことも一応できるが、パターンが顕著になってしまいやすいので、
通常投げの決まる相手に超必殺技の投げを使うようにするといった程度の判断に留めるべきである。

ガード失敗学習システム
ガード失敗時に自分の状態と相手の技を記録して同じ技で崩されないようにする学習システム。
AIは立ち・空中下段や屈み中段、ガード不可技などへの対応が困難なためよく使われている。
基本的な記録の手順は以下のとおり
  1. 相手のStateNoを記録、監視する。
  2. ガードしているかどうかとガードの立ち屈みのどちらかを記録する。
  3. 相手の攻撃を受けて、自分がガード食らいであるかどうか確認する。
  4. ガード食らいでない場合は相手のStateNoと立ち屈みのどちらかだったかを記録する。
  5. 記録した攻撃と現在の攻撃のStateNoが同じ場合、その時のガードとは別のガードをする。
  6. 再びガードからガードくらいになった場合、ガード不可として記録する。
  7. ガード不可の場合、ガードをさせない。
ただしヘルパーでの攻撃やガードクラッシュなど処理が特殊な場合の記録はかなり難しく、
その他ガード不可を認識するためには2回も崩される必要があるなどの欠点がある。
火力の高い相手だとその2回が致命的になってしまうのだが…

対当て身投げ学習システム
当て身投げを受けた時に相手の技を記録して、同じ技にかからないようにするやや珍しい学習システム。
AIは通常相手の当て身投げを認識することができないため使われることがある。
基本的な手順は
  1. 相手のStateNoを記録、監視する。
  2. 自分の攻撃をReversaldefで取られた直前の相手のStateNoを記録する。
  3. 同じStateNoの攻撃を相手がしてきたら、攻撃をしないようにする。
  4. できるなら当て身投げ動作の終了直前(受付が終わった後)を狙った攻撃を仕掛ける。
回数の少ない超必殺技の当て身投げや攻撃に反応しての当て身投げには機能しにくいが、
露骨な当て身投げに当て身投げ見てから攻撃余裕でしたと言うことを減らすことはできる。

対投げ学習システム
投げ技を受けた時に相手の技などを記録して、同じ投げにかからないようにする珍しい学習システム。
投げ技は基本的にガード不可だが通常EnemyNear,HitDefAttr=SCA,ATなどに超反応で避ける以外に確実な回避方法がないし、
攻撃判定の発生が遅くてもHitDefの発生が最初からの場合、最初から反応してしまう。
それに攻撃の発生が0-1Fの場合は反応が非常に難しいため回避すること難しい。そこで、
  1. 発生の非常に早い投げ技を受けた時にその技の距離を記録する。
  2. 相手と距離を取ってその間合いには無闇に入らないようにする。
といった方法であれば自分も近づきにくいが、投げられにくくはなる。
またHitDefのタイミングが違うことで反応がバラつくのは
  1. 相手のStateNoと始動からの時間を記録、監視する。
  2. 相手の投げ技を受けた時にStateNoと発生フレームを記録する。
  3. 相手が同じ投げ技をしてきた場合、発生フレームに合わせて無敵技を出す。
という方法なら安定して相手の投げ技に切り返すことができる。
もちろん早い投げ技まで確実に切り返すと凶悪な超反応になってしまうが、
相手の動作時間も確率に含めて適度に切り返すようにしている場合もある。

対攻撃学習システム
冒頭でも話題にしていた、相手の攻撃を記録して当て身投げや無敵技を出す凶悪な学習システム。
他の学習システムが基本的に失敗を記録するのに対してこのシステムだけは
失敗していなくても(ガードしても)作動し 相手を圧倒することも可能になる というシステムである。
基本的な手順は対投げ学習のタイミングによる学習と同様
  1. 相手のStateNoなどの情報を記録、監視する。
  2. 相手の攻撃を受けた時、相手の攻撃の情報を記録する。
  3. 同じ攻撃がきた場合、発生までのフレームに合わせて技を振る。
距離も記録して判別すれば、遠くから突進してくるタイプを近くでやられ、タイミングをズラされるといった危険を少なくできる。
こちらも確実に反応すると凶悪な超反応になってしまう。
実際のAIでは動作時間などでの確率が調整されている場合もあるが、AI設定を最大にすると容赦無く返してくることも。
正確に数値を記録できていれば、受付が1Fの当て身投げでも成功させることができるが、
技によっては反応しても当て身投げできなかったり無敵技での回避もできなかったりすることもある。
対攻撃学習と対投げフレーム学習の実演動画。
容赦無く反応する実践に上手くいかない実践もあり。

  • 対投げ学習・対攻撃学習: HitDefAttr認識型
対投げ学習や対攻撃学習を、攻撃を受けずとも記録できる方式。
慣例的に攻撃判定が出るタイミングでHitDefも出されていることを利用し、
Enemy(x),HitDefAttr=SCA,AAなどで相手のHitDefの出たタイミングを認識することによって、相手の攻撃発生を記録する。
これならば攻撃を受けることなく発生タイミングを知ることもできるのだが、対投げ学習のところにも書いているように
HitDefの発生が最初からだったり、攻撃判定発生前の途中からだったりすると正確な認識ができない。
一応慣例から見れば最初からか攻撃判定と同時かのどちらかなので、途中からの場合のみ記録すれば大体正確な記録になるが、
攻撃の距離などは分からないため、突進するタイプの技が自分に届くタイミングなどまでは分からない。


記録の難しいものなどについて

記録できれば人間では不可能な性能を引き出すこともできるが、参照の難しいものは記録が難しく、学習システムも作りにくい。
特に飛び道具はただでさえ参照することが難しく、性質が多彩であるため記録が非常に困難。
そのため飛び道具反射技を的確に使いこなせるのは人工AIくらいなものとも言える。
ちなみに上記のような学習システム以外にも、相手の立ち回りを記録する学習システムも不可能ではない。
効果がその労力に見合うかは別だが、傾向程度の簡単な記録なら丁度いいかもしれない。


対学習システムキャラ

学習システムを作るう上で気をつけておきたいものは、 学習システム殺し である。
攻撃を学習する学習システムを騙すことは意外と単純なことで特殊な技術を使わなくても騙せる。
1つの技のステートを別々の番号で20個ほど用意 して順番に使っていけば、
相手の攻撃を記録する学習システムは全て 別々の技だと記録 してしまい、ほとんど反応できなくなる。
Animで記録していることを想定するなら別々のAnimも用意すればいい。
それ以外にもちょっと面倒で技術が必要だが、下段の技と中段の技を 同じStateNo で処理させれば、
単純なガード失敗学習システムもガードの判断を誤り、やがてガード不可だと判断してしまう。
中下段だけでなく別々の技を 同じStateNo で処理されると、
相手の攻撃を記録する学習システムは全て 同じ技だと判断 し、正確な反応ができなくなる。

ちょっと大げさかもしれないが、もし無思慮で凶悪な学習システムが氾濫した場合、
学習システムをキャラ側の調整で 無効化させられる 可能性もありえるということを肝に命じておこう。
とはいえ、あくまで学習システムも単に強さの一部なだけで、強さを見誤らなければそれほど酷い試合は繰り返されないだろうが。

ちなみに特殊な処理で学習システムが判断を間違えるということはそこまで珍しくない。
と言うのも強弱のある必殺技は同じステートで処理をしている場合があり、その強弱の判別は難しく、
それ以外にも溜められる攻撃を1つのステート内で処理している場合などは、溜め時間を認識できない。
そうしたちょっとした違いによって、反応を間違えることもあるため、記録する側は反応の失敗回数も記録させておくほうが無難。
そうした技がなくても多種類の技を使っていけば学習システムの容量を限界に達することもあるので、技が多けば対抗できる可能性はある。