簡體   English   中英

自由能源強化學習實施

[英]Free Energy Reinforcement Learning Implementation

我一直在嘗試實現此處描述的算法,然后對同一篇論文中描述的“大型行動任務”進行測試。

算法概述:

在此處輸入圖片說明

簡而言之,該算法使用以下所示形式的RBM通過更改權重來解決強化學習問題,以使網絡配置的自由能等於為該狀態動作對提供的獎勵信號。

為了選擇動作,算法在保持狀態變量固定的同時執行gibbs采樣。 如果有足夠的時間,這將產生具有最低自由能的動作,從而為給定狀態帶來最高的回報。

大型動作任務概述:

在此處輸入圖片說明

作者實施指南概述:

在實例化具有12位狀態空間和40位動作空間的大型動作任務時,對具有13個隱藏變量的受限Boltzmann機器進行了訓練。 隨機選擇了13個關鍵狀態。 在訓練過程中,該網絡運行了12 000個動作,學習率從0.1到0.01,溫度從1.0到0.1呈指數增長。 每次迭代均以隨機狀態初始化。 每個動作選擇均包含100次Gibbs采樣迭代。

重要的省略細節:

  • 是否需要偏置單位?
  • 是否需要減肥? 如果是,是L1還是L2?
  • 權重和/或激活是否需要稀疏約束?
  • 梯度下降有修改嗎? (例如動量)
  • 這些額外的機制需要哪些元參數?

我的實現:

最初,我認為作者除了指南中所描述的機制外沒有使用其他機制,因此我嘗試在沒有偏差單位的情況下訓練網絡。 這導致了近乎偶然的表現,這是我發現以下事實的第一個線索,即所使用的某些機制必須被作者視為“顯而易見”,因此被省略。

我嘗試了上述各種省略的機制,並通過使用以下方法獲得了最佳效果:

  • softmax隱藏的單位
  • 動量為.9(.5直到第5次迭代)
  • 隱藏層和可見層的偏差單位
  • 學習率是作者列出的學習率的1/100。
  • l2重量衰減為.0002

但是即使進行了所有這些修改,我在任務上的表現通常還是經過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獎勵),我將非常感激。

如果我的代碼似乎做錯了明顯的事情,那么引起人們的注意也將是一個很好的答案。

我希望作者遺忘的東西對於那些比我有更多基於能量學習經驗的人來說確實是顯而易見的,在這種情況下,只需指出需要在工作中實現的內容即可。

  1. 本文中的算法看起來很奇怪。 他們使用一種hebbian學習來增加連接強度,但是沒有機制可以削弱它們。 相比之下,常規CD會增加錯誤幻想的能量,從而平衡總體活動性。 我推測您將需要強大的稀疏調節和/或重量衰減。
  2. 偏見永遠不會傷害:)
  3. 動量和其他奇特的東西可能會加快速度,但通常不是必需的。
  4. 為什么在藏身處使用softmax? 應該只是乙狀結腸嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM