[英]Free Energy Reinforcement Learning Implementation
我一直在嘗試實現此處描述的算法,然后對同一篇論文中描述的“大型行動任務”進行測試。
算法概述:
簡而言之,該算法使用以下所示形式的RBM通過更改權重來解決強化學習問題,以使網絡配置的自由能等於為該狀態動作對提供的獎勵信號。
為了選擇動作,算法在保持狀態變量固定的同時執行gibbs采樣。 如果有足夠的時間,這將產生具有最低自由能的動作,從而為給定狀態帶來最高的回報。
大型動作任務概述:
作者實施指南概述:
在實例化具有12位狀態空間和40位動作空間的大型動作任務時,對具有13個隱藏變量的受限Boltzmann機器進行了訓練。 隨機選擇了13個關鍵狀態。 在訓練過程中,該網絡運行了12 000個動作,學習率從0.1到0.01,溫度從1.0到0.1呈指數增長。 每次迭代均以隨機狀態初始化。 每個動作選擇均包含100次Gibbs采樣迭代。
重要的省略細節:
我的實現:
最初,我認為作者除了指南中所描述的機制外沒有使用其他機制,因此我嘗試在沒有偏差單位的情況下訓練網絡。 這導致了近乎偶然的表現,這是我發現以下事實的第一個線索,即所使用的某些機制必須被作者視為“顯而易見”,因此被省略。
我嘗試了上述各種省略的機制,並通過使用以下方法獲得了最佳效果:
但是即使進行了所有這些修改,我在任務上的表現通常還是經過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獎勵),我將非常感激。
如果我的代碼似乎做錯了明顯的事情,那么引起人們的注意也將是一個很好的答案。
我希望作者遺忘的東西對於那些比我有更多基於能量學習經驗的人來說確實是顯而易見的,在這種情況下,只需指出需要在工作中實現的內容即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.