この質問は、Encog リポジトリで取得したC# の Lunar Lander Exampleを参照したものです。例が示すように、NeuralSimulatedAnnealing を使用して多層フィードフォワード ネットワーク (50 エポック) をトレーニングしています。
BasicNetwork network = CreateNetwork();
IMLTrain train;
train = new NeuralSimulatedAnnealing(network, new PilotScore(), 10, 2, 100);
_
public static BasicNetwork CreateNetwork() {
var pattern = new FeedForwardPattern {InputNeurons = 3};
pattern.AddHiddenLayer(50);
pattern.OutputNeurons = 1;
pattern.ActivationFunction = new ActivationTANH();
var network = (BasicNetwork) pattern.Generate();
network.Reset();
return network;
}
この例はうまく機能し、ニューラル パイロットは与えられた条件で宇宙船を着陸させる方法を正確に学習しますが、私はそれをさらに活用したいと考えています。
そのために、以下のようなグローバル クラスを作成し、LanderSimulator クラスの行も変更しました。
namespace Encog.Examples.Lunar
{
class globals
{
public static int fuelConsumption { get; set; }
}
}
_
public void Turn(bool thrust){
Seconds++;
Velocity -= Gravity;
Altitude += Velocity;
if (thrust && Fuel > 0)
{
Fuel-= globals.fuelConsumption; //changed instead of Fuel--;
Velocity += Thrust;
}
Velocity = Math.Max(-TerminalVelocity, Velocity);
Velocity = Math.Min(TerminalVelocity, Velocity);
if (Altitude < 0)
Altitude = 0;
}
これで、 fuelConsumption変数に応じて、推力ごとに燃料が消費されます。次に、fuelConsumption の 3 つの異なる値を試してみました。以下は、個々のネットワークのそれぞれの最高スコアです。
//NETWORK 1
globals.fuelConsumption = 1;
bestScore: 7986
//NETWORK 2
globals.fuelConsumption = 5;
bestScore: 7422
//NETWORK 3
globals.fuelConsumption = 10;
bestScore: 6921
これらのネットワークを相互にテストしたところ、結果は期待外れでした。
- ネットワーク 1 は、fuelConsumed がそれぞれ 5 と 10 のときに -39591 と -39661 のスコアを示しました。
- ネットワーク 2 は、fuelConsumed が 1 と 10 の場合、それぞれ -8832 と -35671 のスコアを示しました。
- ネットワーク 3 は、fuelConsumed が 1 と 5 の場合、それぞれ -24510 と -19697 のスコアを示しました。
そこで、以下のように 3 つのシナリオすべてに対して 1 つのネットワークをトレーニングしようとしました。
int epoch;
epoch = 1;
globals.fuelConsumption = 1;
for (int i = 0; i < 50; i++){
train.Iteration();
Console.WriteLine(@"Epoch #" + epoch + @" Score:" + train.Error);
epoch++;
}
Console.WriteLine("--------------------------------------");
epoch = 1;
globals.fuelConsumption = 5;
for (int i = 0; i < 50; i++){
train.Iteration();
Console.WriteLine(@"Epoch #" + epoch + @" Score:" + train.Error);
epoch++;
}
Console.WriteLine("--------------------------------------");
epoch = 1;
globals.fuelConsumption = 10;
for (int i = 0; i < 50; i++){
train.Iteration();
Console.WriteLine(@"Epoch #" + epoch + @" Score:" + train.Error);
epoch++;
}
Console.WriteLine(@"The score of experienced pilot is:");
network = (BasicNetwork) train.Method;
var pilot = new NeuralPilot(network, false);
globals.fuelConsumption = 1;
Console.WriteLine("@1: " + pilot.ScorePilot());
globals.fuelConsumption = 5;
Console.WriteLine("@5: " + pilot.ScorePilot());
globals.fuelConsumption = 10;
Console.WriteLine("@10: " + pilot.ScorePilot());
しかし、結果は再び同じです
The score of experienced pilot is:
@1: -27485
@5: -27565
@10: 7448
3 つのシナリオすべてで最高のスコアを提供するニューラル パイロットを作成するにはどうすればよいですか?