私はここで説明されているアルゴリズムを実装しようとしていて、同じ論文で説明されている「大規模なアクションタスク」でそれをテストしています。
アルゴリズムの概要:
簡単に言うと、アルゴリズムは以下に示す形式のRBMを使用して、ネットワーク構成の自由エネルギーがその状態アクションペアに与えられた報酬信号と等しくなるように重みを変更することにより、強化学習の問題を解決します。
アクションを選択するために、アルゴリズムは状態変数を固定したままギブスサンプリングを実行します。十分な時間があれば、これにより、自由エネルギーが最も低く、特定の状態に対して最も高い報酬が得られるアクションが生成されます。
大規模アクションタスクの概要:
実装に関する作成者のガイドラインの概要:
13個の隠れた変数を持つ制限付きボルツマンマシンは、12ビットの状態空間と40ビットのアクション空間を持つ大規模なアクションタスクのインスタンス化でトレーニングされました。13の主要な州がランダムに選択されました。ネットワークは12,000のアクションで実行され、トレーニングの過程で学習率は0.1から0.01になり、温度は1.0から0.1に指数関数的に変化しました。各反復はランダムな状態で初期化されました。各アクションの選択は、ギブスサンプリングの100回の反復で構成されていました。
重要な省略された詳細:
- バイアスユニットが必要でしたか?
- 体重減少が必要でしたか?もしそうなら、L1またはL2?
- ウェイトやアクティベーションにスパース性の制約が必要でしたか?
- 最急降下法の変更はありましたか?(例:勢い)
- これらの追加メカニズムにはどのようなメタパラメータが必要でしたか?
私の実装:
当初は、作者がガイドラインに記載されている以外のメカニズムを使用していないと想定していたため、バイアスユニットなしでネットワークをトレーニングしてみました。これはほぼ偶然のパフォーマンスにつながり、使用されたいくつかのメカニズムが作者によって「自明」であると見なされ、したがって省略されたに違いないという事実への私の最初の手がかりでした。
上記のさまざまな省略されたメカニズムを試してみて、次を使用して最良の結果を得ました。
- softmax隠しユニット
- .9の勢い(.5から5回目の反復まで)
- 隠れ層と可視層のバイアス単位
- 著者によってリストされたものの1/100の学習率。
- .0002のl2重量減衰
しかし、これらすべての変更を加えても、タスクでの私のパフォーマンスは、12000回の反復後の平均報酬が約28でした。
各反復のコード:
%%%%%%%%% START POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data = [batchdata(:,:,(batch)) rand(1,numactiondims)>.5];
poshidprobs = softmax(data*vishid + hidbiases);
%%%%%%%%% END OF POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
hidstates = softmax_sample(poshidprobs);
%%%%%%%%% START ACTION SELECTION PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if test
[negaction poshidprobs] = choose_factored_action(data(1:numdims),hidstates,vishid,hidbiases,visbiases,cdsteps,0);
else
[negaction poshidprobs] = choose_factored_action(data(1:numdims),hidstates,vishid,hidbiases,visbiases,cdsteps,temp);
end
data(numdims+1:end) = negaction > rand(numcases,numactiondims);
if mod(batch,100) == 1
disp(poshidprobs);
disp(min(~xor(repmat(correct_action(:,(batch)),1,size(key_actions,2)), key_actions(:,:))));
end
posprods = data' * poshidprobs;
poshidact = poshidprobs;
posvisact = data;
%%%%%%%%% END OF ACTION SELECTION PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if batch>5,
momentum=.9;
else
momentum=.5;
end;
%%%%%%%%% UPDATE WEIGHTS AND BIASES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
F = calcF_softmax2(data,vishid,hidbiases,visbiases,temp);
Q = -F;
action = data(numdims+1:end);
reward = maxreward - sum(abs(correct_action(:,(batch))' - action));
if correct_action(:,(batch)) == correct_action(:,1)
reward_dataA = [reward_dataA reward];
Q_A = [Q_A Q];
else
reward_dataB = [reward_dataB reward];
Q_B = [Q_B Q];
end
reward_error = sum(reward - Q);
rewardsum = rewardsum + reward;
errsum = errsum + abs(reward_error);
error_data(ind) = reward_error;
reward_data(ind) = reward;
Q_data(ind) = Q;
vishidinc = momentum*vishidinc + ...
epsilonw*( (posprods*reward_error)/numcases - weightcost*vishid);
visbiasinc = momentum*visbiasinc + (epsilonvb/numcases)*((posvisact)*reward_error - weightcost*visbiases);
hidbiasinc = momentum*hidbiasinc + (epsilonhb/numcases)*((poshidact)*reward_error - weightcost*hidbiases);
vishid = vishid + vishidinc;
hidbiases = hidbiases + hidbiasinc;
visbiases = visbiases + visbiasinc;
%%%%%%%%%%%%%%%% END OF UPDATES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
私が求めているもの:
したがって、このアルゴリズムを適切に機能させることができれば(著者は、12000回の反復後に平均で最大40の報酬を得ると主張しています)、私は非常に感謝しています。
私のコードが明らかに間違ったことをしているように見える場合は、それに注意を向けることも素晴らしい答えになります。
著者が省略したことは、私よりもエネルギーベースの学習の経験が豊富な人にとって確かに明白であることを願っています。その場合、実際の実装に含める必要があるものを単に指摘します。