Осуществление обучения с подкреплением свободной энергии

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

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

введите описание изображения здесь

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

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

Обзор большой задачи:

введите описание изображения здесь

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

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

Важные пропущенные сведения:

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

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

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

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

  • softmax скрытые блоки
  • импульс 0,9 (0,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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Я прошу:

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

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

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


comment
быстрое примечание: я понимаю, что этот вопрос относительно велик по сравнению со средним исправлением ошибки переполнения стека. Таким образом, я пожертвую всю возможную репутацию (650?) Любому, кто ответит на него удовлетворительно (даже если вы ответите в течение первых 2 дней с момента публикации).   -  person zergylord    schedule 31.05.2012
comment
Кроме того, предоставленный код, написанный на Matlab, следует рассматривать как псевдокод, поскольку он не будет работать без моих вспомогательных функций и настроек. Если вы считаете рабочую версию моей сети и задачу большого действия, я могу предоставить ее по запросу.   -  person zergylord    schedule 31.05.2012
comment
Попробуйте опубликовать сообщение на metaoptimize.com/qa   -  person Ansari    schedule 01.06.2012
comment
попробуйте опубликовать № 2 - на codereview.stackexchange.com   -  person Eliran Malka    schedule 02.06.2012
comment
meta.stackexchange.com/a/129787   -  person Eitan T    schedule 04.06.2012
comment
@zergylord простите меня за то, что я не уточнил это в моем предыдущем комментарии, но кажется, что ваш вопрос слишком описательный.   -  person Eitan T    schedule 04.06.2012
comment
Если вы не возражаете против вопроса, каков ваш вариант использования? Кроме того, это единственное, что вы пробовали? Вы пробовали это с точки зрения моделирования неориентированного графа?   -  person smartcaveman    schedule 08.06.2012
comment
@smartcaveman Я разрабатываю агент, который учится реагировать на визуальные стимулы с помощью движений курсора (например, на экране появляется blob, переместите курсор на blob). Эти алгоритмы кажутся лучшими из всех, с которыми я когда-либо сталкивался, для работы с большим пространством состояний, влекущим за собой рассмотрение всех возможных перемещений курсора.   -  person zergylord    schedule 08.06.2012
comment
@smartcaveman Я не совсем понимаю, что вы имеете в виду в отношении вашего второго вопроса. Алгоритм действительно работает с rbm, который представляет собой неориентированную графическую модель определенного вида, но я до сих пор не уверен, что означает моделирование неориентированного графа в этом контексте. Я, вероятно, упускаю что-то очевидное, но если бы вы могли уточнить, это было бы признательно.   -  person zergylord    schedule 08.06.2012
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что это просьба о работе   -  person ivan_pozdeev    schedule 06.08.2018


Ответы (1)


  1. Алгоритм в статье выглядит странным. Они используют своего рода хеббовское обучение, которое увеличивает прочность контуров, но не использует механизм их разложения. Напротив, обычный компакт-диск подталкивает вверх энергию неправильных фантазий, уравновешивая общую активность. Я бы предположил, что вам понадобится сильная регулировка разреженности и / или снижение веса.
  2. предвзятость никогда не помешала бы :)
  3. Импульс и другие причудливые вещи могут ускориться, но обычно не обязательно.
  4. Почему softmax на хидденсах? Должен ли он быть просто сигмовидной?
person kir    schedule 20.07.2013