Внедрение обучения энергетическому усилению

Я пытался реализовать описанный выше алгоритм здесь, а затем проверить его на "большой задаче действия", описанной в том же бумага.

Обзор алгоритма:

enter image description here

Вкратце, алгоритм использует RBM формы, показанной ниже, для решения проблем обучения подкрепления путем изменения его весов, так что свободная энергия конфигурации сети соответствует сигналу вознаграждения, данному для этой пары действий состояния.

Чтобы выбрать действие, алгоритм выполняет выборку гиббсов, фиксируя фиксированные переменные состояния. При достаточном времени это дает действие с наименьшей свободной энергией и, таким образом, высшую награду за данное состояние.

Обзор задачи большого действия:

enter image description here

Обзор авторских рекомендаций для реализации:

Ограниченная машина Больцмана с 13 скрытыми переменными была обучена при создании большая задача действия с 12-разрядным пространством состояний и 40-битным пространством действий. Тринадцать ключевых состояний были случайно выбран. Сеть была запущена на 12 000 действий со скоростью обучения от 0,1 до 0,01, а температура - от 1,0 до 0,1 экспоненциально в ходе обучения. каждый итерация была инициализирована случайным состоянием. Каждый выбор действия состоял из 100 итераций Выборка Гиббса.

Важные пропущенные подробности:

  • Необходимы ли единицы измерения смещения?
  • Требуется ли снижение веса? И если да, L1 или L2?
  • Было ли ограничение разреженности для весов и/или активаций?
  • Было ли изменение градиентного спуска? (например, импульс)
  • Какие мета-параметры необходимы для этих дополнительных механизмов?

Моя реализация:

Первоначально предполагалось, что авторы не использовали никаких механизмов, кроме тех, которые описаны в руководящих принципах, поэтому я попытался обучить сеть без уклонов. Это привело к почти случайным результатам, и я был первым ключом к тому, что некоторые используемые механизмы должны были считаться "очевидными" авторами и, таким образом, опущены.

Я играл с различными опущенными механизмами, упомянутыми выше, и получил лучшие результаты, используя:

  • скрытые блоки softmax
  • импульс .9 (.5 до 5-й итерации)
  • единицы смещения для скрытых и видимых слоев
  • уровень обучения 1/100-й из числа, перечисленных авторами.
  • l2 распад массы 0,0002

Но даже при всех этих модификациях моя производительность по задаче обычно составляла среднюю награду в размере 28 после 12000 итераций.

Код для каждой итерации:

    %%%%%%%%% 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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Что я прошу:

Итак, если кто-то из вас может заставить этот алгоритм работать должным образом (авторы утверждают, что в среднем ~ 40 вознаграждение после 12000 итераций), я был бы чрезвычайно благодарен.

Если мой код, кажется, делает что-то явно неправильное, то привлечение внимания к этому также будет отличным ответом.

Я надеюсь, что то, что оставили авторы, действительно очевидно для кого-то, у кого больше опыта в обучении на основе энергии, чем я, и в этом случае просто укажите, что нужно включить в рабочую реализацию.

Ответ 1

Я не мог заставить это работать правильно, но я узнал, что первый автор, Брайан Салланс, в настоящее время связан с ARC Seibersdorf Research GmbH, Information Technologies, Зайберсдорф, Австрия, и я думаю, что у меня есть его адрес электронной почты, хотя Я не уверен, что я должен опубликовать его прямо на SO - но вы можете найти его на этой странице - http://publik.tuwien.ac.at/files/pub-et_11432.pdf

надеюсь, что это поможет.

Ответ 2

  • Алгоритм в работе выглядит странно. Они используют своеобразное обучение, основанное на геббсах, которое увеличивает степень conectonstrength, но никакого механизма для их распада. Напротив, обычный CD подталкивает энергию неправильных фантазий, балансируя общую активность. Я бы предположил, что yuo будет нуждаться в сильном регулятивном режиме и/или расходе веса.
  • смещение никогда не повредит:)
  • Момент и другие причудливые вещи могут ускориться, но обычно не нужны.
  • Почему softmax на hiddens? Должно быть, это просто сигмоид?