����λ�ã���ҳ > �����̳� > �̳� > ǿ��ѧϰ�ʼ�֮��ACE:Off-PolicyActor-CriticwithCausality-AwareEntropyRegularization��

ǿ��ѧϰ�ʼ�֮��ACE:Off-PolicyActor-CriticwithCausality-AwareEntropyRegularization��

��Դ������������|��ʱ�䣺2024-10-18 09:46:01 |���Ķ���137��|�� ��ǩ�� a T CTO AWA Ri rop Pyre S C ICY Causality AR �� |����������

2024��ICML���£�ACE:Off-PolicyActor-CriticwithCausality-AwareEntropyRegularization����

ǿ��ѧϰ�ʼ�֮��ACE:Off-PolicyActor-CriticwithCausality-AwareEntropyRegularization��


ǰ�ԣ�


���������廪��Ŀ�����ڲ�ʿʦ��д�����£���Ŀ��ҳΪ ACE (ace-rl.github.io) ����2024��7�·�����ICML�ڿ�

��Ϊ������ڣ���ʵֻ���ң���Ҫ���㿪ʼ��һ�������Ŀ��ǰ��ļ�ƪ���¶����̵�

������Ϊǿ��ѧϰ�ʼǵ�5ƪ

���ij��༭��2024.10.5�����������ʱ�䣬�����ˣ�ǰ��д������������

CSDN��ҳ�� https://blog.csdn.net/rvdgdsva

����԰��ҳ�� https://www.cnblogs.com/hassle

����԰�������ӣ�


����һ��

��ƪǿ��ѧϰ������Ҫ������һ����Ϊ ACE ���㷨����������Ϊ Off-Policy Actor-Critic with Causality-Aware Entropy Regularization ����ͨ�����������ϵ������������������������ģ���ڲ�ͬ����ά���ϵIJ�ƽ��̽�����⣬ּ�ڸĽ�ǿ��ѧϰ��ע��1����̽��Ч�ʺ�����Ч�ʵ����⣬�ر����ڸ�ά���������������еı��֡�

��ע��1��: ǿ��ѧϰ������һƪ�͹���


����ժҪ

��policy��ע��2��ѧϰ�����У���ͬԭʼ��Ϊ�IJ�ͬ���屻��ǰ��model-free RL �㷨�����ӡ�������һ���⣬����̽���˲�ͬ�ж�ά�Ⱥͽ���֮��������ϵ��������ѵ�������и���ԭʼ��Ϊ����Ҫ�ԡ�����������һ�������ϵ��֪�ء�ע��3���causality-aware entropy term������������Ч��ʶ�����ȿ��Ǿ��и�DZ��Ӱ�����Ϊ����ʵ�ָ�Ч��̽�������⣬Ϊ�˷�ֹ���ȹ�ע�ض���ԭʼ��Ϊ�����Ƿ������ݶ���������gradientdormancyphenomenon�������������������������û��ƣ��Խ�һ����ǿ���Ƿ�������Ч�ԡ�����ģ��RL������ȣ�����������㷨 ACE :Off-policy A ctor-criticwith C ausality-aware E ntropyregularization���ڿ�Խ7�����29�ֲ�ͬ����������������ʾ��ʵ���Ե��������ƣ���ǿ�������Ƿ�������Ч�ԡ��๦���Ժ͸�Ч������Ч�ʡ� ��׼���Խ������Ƶ����https://ace-rl.github.io/�ϻ�á�

��ע��2��: ǿ��ѧϰ�㷨��on-policy��off-policy

��ע��3��: ����� RL����Soft Q-Learning��SAC - ֪��


������Ҫ���ף�

��1�� �����ϵ���� ��ͨ�������������-�����ṹģ�ͣ�������ͬ����ά�ȣ���ԭʼ��Ϊ���Խ�����Ӱ���С����Ϊ�����Ȩ�ء�������ЩȨ�ط�ӳ��ÿ������ά���ڲ�ͬѧϰ�׶ε������Ҫ�ԡ�

���������Ľ���ԭ���ǣ�����һ���򵥵����ӣ�һ����е�����Ӧ��ѧϰ�����ֱ۲�ץס���壬Ȼ��ע����ת�Ƶ�ѧϰ�ֱ۳�������Ŀ����˶������ϡ���ˣ��ڲ���ѧϰ�IJ�ͬ�׶�ǿ��������Ҫ��ԭʼ��Ϊ��̽���� ������Ҫ�ġ���̽�������п����ע����ԭʼ��Ϊ�����Լ�����������ÿ���׶ζԻ���ԭʼ��Ϊ��ѧϰ���Ӷ�������������˶������Ч�ʡ�

�˴��ɹ�ѧϰ�����ϣ�

��2�� ��������� ���������ǿ��ѧϰ��ܵĻ����ϣ���SAC�㷨���������� �����Ȩ���������� ���봫ͳ�����򻯲�ͬ����һ����ݸ���ԭʼ��Ϊ�����Ȩ�ض�̬������ǿ������Ҫ��Ϊ��̽�������ٶԲ���Ҫ��Ϊ��̽����

���������Ľ���ԭ���ǣ�����������һ���������-�����ṹģ���������ж��ռ��ϵ����Ȩ��(causal weights)�����Ȩ�ػ�����agent���и���Ч��̽���� ���������Ȩ�ؽϴ�Ķ���ά�Ƚ���̽���������Խ�������Ҫ�Ը��󣬲����ٶ����Ȩ�ؽ�С����Ϊά�ȵ�̽ ����һ��������Ŀ��ȱ���Բ�ͬѧϰ�׶�ԭʼ��Ϊ֮���������Ҫ�Ե���ʶ�����ܵ��µ�Ч��̽����Ϊ�˽����һ���ƣ�����������һ�������Ȩ�ؼ�Ȩ�IJ�������Ϊ�����ϵ��֪�������Ŀ�꣬��Ч�ؼ�ǿ�˶���Ҫԭʼ��Ϊ��̽�����������˸���Ч��̽����

�˴��ɹ�ѧϰ�����ϣ�

��3�� �ݶȡ����ߡ�����Gradient Dormancy�� �����Ĺ۲쵽��ģ��ѵ��ʱ��Щ�ݶȻ���ijЩ�׶β���Ծ���������ߡ�����Ϊ�˷�ֹģ�͹��ȹ�עijЩԭʼ��Ϊ������������ �ݶ����ߵ�������û��� ���û���ͨ�������Եض�ģ�ͽ����Ŷ���reset��������ģ������ֲ����ţ��ٽ����㷺��̽����

���������Ľ���ԭ���ǣ��û���ͨ��һ�����ݶ����̶߳Ⱦ��������ؼ�Ъ�Եظ���������������硣�������ϵ��֪̽����������ӱ�����û������ϣ�ּ�ڴٽ�����Ч������Ч��̽�������������������������ܡ�

ͨ���ڶ���������������е�ʵ�飬ACE չʾ����������������ǿ��ѧϰ�㷨����SAC��TD3���ı��֣�

  • 29����ͬ�������������� ������ Meta-World��12�����ñ£©¡ï¿½DMControl��5�����ñ£©¡ï¿½Dexterous Hand��3�����ñ£©ºï¿½ï¿½ï¿½ï¿½ï¿½Ï¡ï¿½è½±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½6�����ñ£©¡ï¿½
  • ʵ���� ������ACE �����������ж��ﵽ�˸��õ�����Ч�ʺ͸��ߵ��������ܡ����磬�ڸ��ӵ�ϡ�轱�������У�ACE ƾ�������Ȩ��������̽�����ԣ�������Խ�� SAC �� TD3 �������㷨��

�����еĶԱ�ʵ��ͼ����ʾ�� ACE �ڶ��������µ��������ƣ��������� ϡ�轱���͸�ά������ �У�ACE ƾ����̽��Ч�ʵ��������ܸ���ﵽ���Ų��ԡ�


���Ĵ�����

��ACEԭ���ĵĵ�21ҳ���������Ӧ��д����ƪ�ģ������ҿ��˺þõĴ���ȥ������

����˵ʵ����α�����й����ģ���������е����һ����

����һ��ǿ��ѧϰ��RL���㷨�Ŀ�ܣ�������һ���������ƶϣ�Causal Discovery��������ԣ�Off-policy��Actor-Critic�����������Ƕ�ÿ��ģ�鼰�������˵����

1. ��ʼ��ģ��

  • Q���� ( \(Q_\phi\) ) �����ڹ��ƶ�����ֵ��(\phi) ��Ȩ�ز�����
  • �������� ( $\pi_\theta $) ���������ɶ������ԣ�(\theta) ����Ȩ�ء�
  • �طŻ����� ($ D$ ) ���洢�������������ݣ��Ա���в�����
  • �ֲ������� ( $D_c $) ���洢�����������ľֲ����ݡ�
  • ���Ȩ�ؾ��� ($ B_{a \rightarrow r|s} $) �����ڲ�׽�����뽱��֮��������ϵ��
  • �Ŷ����� ( \(f\) ) �����ڶԲ��Խ���΢С�Ŷ�������̽����

2. ��������

  • ÿ ( $$I$$ ) ������ ��
    • �������� ���Ӿֲ������� ( \(D_c\) ) ��� ( \(N_c\) ) ��ת�ơ�
    • �������Ȩ�ؾ��� ������ ($ B_{a \rightarrow r|s}$ )�����ڷ�ӳ��ǰ���Ժͽ���֮��������ϵ��

3. �������

  • ÿ���ݶȲ��� ��
    • �������� �����طŻ����� ( \(D\) ) ��� ($ N$ ) ��ת�ơ�
    • ���������ʶ�� ( \(H_c(\pi(\cdot|s))\) ) �������ڸ���״̬�²��Ե�����Ժ�ȷ���ԣ������޸IJ��ԡ�
    • Ŀ�� Q ֵ���� ������Ŀ�� Q ֵ������ѵ�� Q ���硣
    • ���� Q ���� ������Ԥ��� Q ֵ��Ŀ�� Q ֵ֮�����
    • ���²������� ����󻯵�ǰ״̬�µ� Q ֵ����������档

4. ���û���ģ��

  • ÿ�����ü�� ��
    • �����ݶ������� ( $\beta_\gamma $) �������������Ը��µ�Ӱ��̶ȡ�
    • ��ʼ��������� ��Ϊ�µIJ��Ը���׼����ʼȨ�� ( $\phi_i $)��
    • �����ò��Ժ� Q ���� ���������Ȩ�ؽ���ƽ�����£�����ʵ�ָ��ȶ����Ż���
    • ���ò��Ժ� Q ���� ��������ʱ���״̬���Ա�����µ�ѧϰ���̡�

����Դ��������

Դ������ǧ���أ�����ֻ������main_casual����IJ��ִ��룬����ɾ���˺ܴ�һ���ִ����Ա������������

def train_loop(config, msg = "default"):
    # Agent
    agent = ACE_agent(env.observation_space.shape[0], env.action_space, config)

    memory = ReplayMemory(config.replay_size, config.seed)
    local_buffer = ReplayMemory(config.causal_sample_size, config.seed)

    for i_episode in itertools.count(1):
        done = False

        state = env.reset()
        while not done:
            if config.start_steps > total_numsteps:
                action = env.action_space.sample()  # Sample random action
            else:
                action = agent.select_action(state)  # Sample action from policy

            if len(memory) > config.batch_size:
                for i in range(config.updates_per_step):
                    #* Update parameters of causal weight
                    if (total_numsteps % config.causal_sample_interval == 0) and (len(local_buffer)>=config.causal_sample_size):
                        causal_weight, causal_computing_time = get_sa2r_weight(env, local_buffer, agent, sample_size=config.causal_sample_size, causal_method='DirectLiNGAM')
                        print("Current Causal Weight is: ",causal_weight)
                        
                    dormant_metrics = {}
                    # Update parameters of all the networks
                    critic_1_loss, critic_2_loss, policy_loss, ent_loss, alpha, q_sac, dormant_metrics = agent.update_parameters(memory, causal_weight,config.batch_size, updates)

                    updates += 1
            next_state, reward, done, info = env.step(action) # Step
            total_numsteps += 1
            episode_steps += 1
            episode_reward += reward

            #* Ignore the "done" signal if it comes from hitting the time horizon.
            if '_max_episode_steps' in dir(env):  
                mask = 1 if episode_steps == env._max_episode_steps else float(not done)
            elif 'max_path_length' in dir(env):
                mask = 1 if episode_steps == env.max_path_length else float(not done)
            else: 
                mask = 1 if episode_steps == 1000 else float(not done)

            memory.push(state, action, reward, next_state, mask) # Append transition to memory
            local_buffer.push(state, action, reward, next_state, mask) # Append transition to local_buffer
            state = next_state

        if total_numsteps > config.num_steps:
            break

        # test agent
        if i_episode % config.eval_interval == 0 and config.eval is True:
            eval_reward_list = []
            for _  in range(config.eval_episodes):
                state = env.reset()
                episode_reward = []
                done = False
                while not done:
                    action = agent.select_action(state, evaluate=True)
                    next_state, reward, done, info = env.step(action)
                    state = next_state
                    episode_reward.append(reward)
                eval_reward_list.append(sum(episode_reward))

            avg_reward = np.average(eval_reward_list)
          
    env.close() 

�������̽���

  1. ��ʼ�� :

    • ͨ�������ļ� config ���û�����������ӡ�
    • ʹ�� ACE_agent ��ʼ��ǿ��ѧϰ�����壬����������ں���������ѧϰ����ڻ������ж���
    • �����洢����ͼ����Ŀ¼��ȷ��ѵ�������е����ú����Ȩ�ػᱻ��¼������
    • ��ʼ���������طŻ������� memory ���ڴ洢���е���ʷ���ݣ� local_buffer ���������Ȩ�صĸ��¡�
  2. ��ѵ��ѭ�� :

    • �������� ������ܲ�����С����ӻ����������������������Ӳ�����ѡ������ͨ�����ַ�ʽ��ȷ������̽���ͺ������á�

    • �������Ȩ�� �����ض�����ڣ��Ӿֲ��������в������ݣ�ͨ�� get_sa2r_weight ����ʹ��DirectLiNGAM�㷨����Ӷ��������������Ȩ�ء����Ȩ�ػ���Ϊ������Ϣ�������������Ż����ԡ�

    • ����������� ���� memory �е������㹻��ʱ����ʼͨ����������Q����Ͳ������磬ʹ�ü���������Ȩ����������ʧ������

    • ��¼�뱣��ģ�� ��ÿ��һ���IJ������㷨����Ե�ǰ���Ե����ܣ���¼���ȽϽ����Ƿñ³¬¹ï¿½ï¿½ï¿½Ê·ï¿½ï¿½ï¿½Öµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç£ï¿½ï¿½ò±£´ï¿½Ä£ï¿½ÍµÄ¼ï¿½ï¿½ã¡£

    • ʹ�� wandb ��¼ѵ�������е�ָ�꣬������ʧ���������������Ȩ�صļ���ʱ�䣬��Щ��Ϣ���԰������Ժͷ���ѵ�����̡�


����ģ����뼰ʵ��

��������

�������ģ�� ��Ҫͨ�� get_sa2r_weight ����ʵ�֣������� DirectLiNGAM ģ�ͽ�ϣ�����������Ȩ�ء����������ѵ��ѭ�������£�

causal_weight, causal_computing_time = get_sa2r_weight(env, local_buffer, agent, sample_size=config.causal_sample_size, causal_method='DirectLiNGAM')

���������Σ� get_sa2r_weight ��������ڵ�ǰ�������������ݣ� local_buffer �������ģ�ͣ�����ʹ�õ��� DirectLiNGAM �����������ж���ص����Ȩ�أ� causal_weight ������ЩȨ�ػ�Ӱ������IJ����Ż��Ͳ������¡��ؼ��߼�������

  1. ������� ������������� total_numsteps % config.causal_sample_interval == 0 ʱ������ȷ��ֻ��ָ���IJ�������ڼ������Ȩ�أ�����ÿһ��������������㣬������㸺����
  2. �ֲ������� �� local_buffer �д洢���㹻�������� config.causal_sample_size ������Щ�������������ϵ�ķ��֡�
  3. ������� �� DirectLiNGAM ��ѡ������ģ�ͣ����ڴ�״̬���ж��ͽ���֮���Ƶ��������ϵ��

���Ȩ�ؼ�����ɺ󣬳���Ὣ��ЩȨ��Ӧ�õ������Ż��У����Ҽ�¼Ȩ�ؼ�����ʱ�����Ϣ��

def get_sa2r_weight(env, memory, agent, sample_size=5000, causal_method='DirectLiNGAM'):
    ������������
    return weight, model._running_time

�������ĺ���������DirectLiNGAMģ�ͼ������״̬�������ͽ���֮������Ȩ�ء�����������LaTeX��ʽ��ϸ�����������Ȩ�صĹ��̣�

  1. ����Ԥ���� ��
    ���� memory �в����� states ��״̬���� actions ���������� rewards ������������ƴ�ӣ������������ݾ��� \(X_{\text{ori}}\) ��

    ���У� \(S\) ����״̬�� \(A\) ���������� \(R\) �������������ţ��������ݿ� \(X\) ���������������

  2. ������� ��

    �� X_ori ת��Ϊ X ��Ϊ������ pandas ���ݿ�ı����Ժ������

    ʹ�� DirectLiNGAM ģ�ͶԾ��� \(X\) ������ϣ��õ������ϵ���ڽӾ��� \(A_{\text{model}}\) ��

    ���ڽӾ����ʾ״̬������������֮�������ṹ���ر��ǴӶ�����������Ӱ���ϵ��

  3. ��ȡ�����Խ��������Ȩ�� ��
    ͨ���ڽӾ�����ȡ�����Խ��������Ȩ�� \(w_{\text{r}}\) ����Ȩ�ش��ڽӾ�������һ����ѡ���붯����Ӧ��Ԫ�أ�

    ���У� \(d_s\) ��״̬��ά�ȣ� \(d_a\) �Ƕ�����ά�ȡ�

  4. ���Ȩ�صĹ�һ�� ��
    �����Ȩ�� \(w_{\text{r}}\) ����Softmax��һ����ȷ�����ǵ��ܺ�Ϊ1��

  5. ����Ȩ�صij߶� ��
    ������Ȩ�ظ��ݶ����������������ţ�

���������Ȩ�� \(w\) ��ʾÿ�������Խ��������Ӱ�죬������һ�������Ŵ������������ڽ�һ���IJ��Ե����������

�������

�����ǶԺ�������ԭ�����𲽽��ͣ�

�����Ż�ģ�� ��Ҫ�� agent.update_parameters ����ʵ�֡� agent.update_parameters �����������ҪĿ������ǿ��ѧϰ�и��²��� ( policy ) �ͼ�ֵ���磨critic���IJ���������������������ܡ��������ʵ����һ����������Ա���ۼң�SAC, Soft Actor-Critic���ĸ��»��ƣ����Ҽ��������Ȩ����"����"��Ԫ��dormant neurons���Ĵ����������ģ�͵�³���Ժ��ȶ��ԡ�

critic_1_loss, critic_2_loss, policy_loss, ent_loss, alpha, q_sac, dormant_metrics = agent.update_parameters(memory, causal_weight, config.batch_size, updates)

ͨ�� agent.update_parameters �����������������¼������֣�

  1. Critic���磨��ֵ���磩 �� critic_1_loss �� critic_2_loss �ֱ������� Critic �������ʧ������������ǰ���Եļ�ֵ��
  2. Policy���磨�������磩 �� policy_loss ��ʾ�����������ʧ�������Ż� agent ���ж�ѡ��
  3. Entropy��ʧ �� ent_loss �������ڲ��Ե�����ԣ����� agent ��̽��������֮���ҵ�ƽ�⡣
  4. Alpha ����ʾ����Ӧ����ϵ�������ڵ���̽��������֮���Ȩ�⡣

��Щ�����ĸ�����ÿ��ѵ��ѭ���б����ã���ʹ�� wandb.log ��¼��ʧ��������ص�ѵ�����ݡ�

update_parameters �� ACE_agent ���е�һ���ؼ����������ڸ��ݾ���طŻ������е���������������ģ�͵IJ����������Ƕ��乤��ԭ������ϸ���ͣ�

1. ������������

���ȣ������� memory �в���һ�������� state_batch �� action_batch �� reward_batch �� next_state_batch �� mask_batch �������а���״̬����������������һ��״̬�Լ����룬���ڱ�ʾ�Ƿ�Ϊ��ֹ״̬��

state_batch, action_batch, reward_batch, next_state_batch, mask_batch = memory.sample(batch_size=batch_size)
  • state_batch ����ǰ��״̬��
  • action_batch ���ڵ�ǰ״̬��ִ�еĶ�����
  • reward_batch ��ִ�иö������õĽ�����
  • next_state_batch ��ִ�ж����󵽴����һ��״̬��
  • mask_batch �����룬���ڱ�ʾ�Ƿ�Ϊ��ֹ״̬��1 ��ʾ����ֹ��0 ��ʾ��ֹ����

2. ����Ŀ�� Q ֵ

���õ�ǰ���ԣ�policy�����磬������һ��״̬�Ķ��� next_state_action �����Ӧ�ĸ��ʷֲ����� next_state_log_pi ��Ȼ������Ŀ�� Q ���� critic_target ������һʱ�̵���С Q ֵ������Ͻ������ۿ����� \(\gamma\) ������һ�� Q ֵ��

with torch.no_grad():
    next_state_action, next_state_log_pi, _ = self.policy.sample(next_state_batch, causal_weight)
    qf1_next_target, qf2_next_target = self.critic_target(next_state_batch, next_state_action)
    min_qf_next_target = torch.min(qf1_next_target, qf2_next_target) - self.alpha * next_state_log_pi
    next_q_value = reward_batch + mask_batch * self.gamma * (min_qf_next_target)
  • ͨ���������� self.policy Ϊ��һ��״̬ next_state_batch �������� next_state_action ����Ӧ�IJ����� next_state_log_pi ��

  • ʹ��Ŀ�� Q ������� qf1_next_target �� qf2_next_target ����ȡ���ߵ���Сֵ�����ٹ���ƫ�

  • ����ʹ�ñ��������̼��� next_q_value ������ǰ�Ľ��������ۿ����� \(\gamma\) ������һ��״̬�� Q ֵ��

  • ��� \(\alpha\) �������Ȩ�أ�����ƽ��̽�������õ�Ȩ�⣬�� mask_batch ��Ϊ�˴�����ֹ״̬�������

    ʹ����ƫ����������Ŀ�� Q ֵ��ͨ��Ŀ������ ( critic_target ) �������һ��״̬�Ͷ����� Q ֵ����ʹ�ý�����������µ�ǰ Q ֵ

3. ���� Q ����

���ţ�ʹ�õ�ǰ Q ���� critic ���Ƶ�ǰ״̬�Ͷ����µ� Q ֵ \(Q_1\) �� \(Q_2\) ��������������Ŀ�� Q ֵ�ľ��������ʧ��

���� Q ���������ʧ������ Q ������ʧ֮�ͣ�

Ȼ��ͨ�����򴫲� qf_loss ������ Q ����IJ�����

qf1, qf2 = self.critic(state_batch, action_batch)
qf1_loss = F.mse_loss(qf1, next_q_value)
qf2_loss = F.mse_loss(qf2, next_q_value)
qf_loss = qf1_loss + qf2_loss

self.critic_optim.zero_grad()
qf_loss.backward()
self.critic_optim.step()
  • qf1 �� qf2 ������ Q �������������ڼ����������ƫ�
  • ��ʧ������ Q ֵ�ľ�����MSE���� qf1_loss �� qf2_loss �ֱ�������� Q �����������������Ϊ�ܵ� Q ��ʧ qf_loss ��
  • ͨ�� self.critic_optim �Ż�������ʧ���з��ò´«²ï¿½ï¿½Í²ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Â¡ï¿½

4. �����������

ÿ�����ɲ���ͨ�� target_update_interval ���ƣ�����ʼ���²������� policy �����ȣ����²�����ǰ״̬�µIJ��� \(\pi(a|s)\) �������� Q ֵ����Ȩ���µIJ�����ʧ��

�����ʧͨ�����򴫲����²������硣

if updates % self.target_update_interval == 0:
    pi, log_pi, _ = self.policy.sample(state_batch, causal_weight)
    qf1_pi, qf2_pi = self.critic(state_batch, pi)
    min_qf_pi = torch.min(qf1_pi, qf2_pi)
    policy_loss = ((self.alpha * log_pi) - min_qf_pi).mean()

    self.policy_optim.zero_grad()
    policy_loss.backward()
    self.policy_optim.step()
  • ͨ����������Ե�ǰ״̬ state_batch ���в������õ����� pi �����Ӧ�IJ����� log_pi ��
  • ���������ʧ policy_loss ���� \(\alpha\) ���IJ����ؼ�ȥ��С�� Q ֵ��
  • ͨ�� self.policy_optim �Ż����Բ�����ʧ���з��ò´«²ï¿½ï¿½Í²ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Â¡ï¿½

5. ����Ӧ�ص���

����������Զ���������� automatic_entropy_tuning ��������һ���������� \(\alpha\) ����ʧ��

��ͨ���ݶ��½����� \(\alpha\) ��

��� automatic_entropy_tuning Ϊ�棬���������

if self.automatic_entropy_tuning:
    alpha_loss = -(self.log_alpha * (log_pi + self.target_entropy).detach()).mean()
    self.alpha_optim.zero_grad()
    alpha_loss.backward()
    self.alpha_optim.step()
    self.alpha = self.log_alpha.exp()
    alpha_tlogs = self.alpha.clone()
else:
    alpha_loss = torch.tensor(0.).to(self.device)
    alpha_tlogs = torch.tensor(self.alpha) # For TensorboardX logs
  • ͨ������ alpha_loss ���� self.alpha ���������Ե�̽��-����ƽ�⡣

6. ����ֵ

  • qf1_loss , qf2_loss : ���� Q �������ʧ
  • policy_loss : �����������ʧ
  • alpha_loss : ��Ȩ�ص���ʧ
  • alpha_tlogs : ������־��¼����Ȩ��
  • next_q_value : ƽ����һ�� Q Öµ
  • dormant_metrics : ������Ԫ����ض���

���û���ģ��

���û���ģ���ڴ�������Ҫ������ update_parameters �����У���ͨ�� �ݶ������� (dominant metrics) �� �Ŷ����� (perturbation functions) ʵ�ֶԲ�������� Q ��������á�

�����߼�

���������趨�� reset_interval �ж��Ƿ���Ҫ�Բ�������� Q ��������Ŷ������á�����ʹ����"����"��Ԫ�ĸ����һЩ���ݶȸ�����Ӱ���С����Ԫ�����ܻᱻ���������á�

�������������߶��� dormant_metrics �����Ȩ�ز��� causal_diff ��ͨ���Ŷ����� perturb_factor �������Ƿ��������в��ֻ�ȫ�����Ŷ������á�

���û���ģ���ԭ��

���û�����Ҫ�����²�����ɣ�

1. �����ݶ������� ( $\beta_\gamma $)

�ڸ��²���ʱ������ �����ݶ� ����ijЩ�ض���Ԫ������ڸ������������õı��ʡ�������ͨ������ cal_dormant_grad(self.policy, type='policy', percentage=0.05) ʵ����һ���㣬������ȡ�� 5% �������ݶ�����Ϊ�ж����ӡ�

dormant_metrics = cal_dormant_grad(self.policy, type='policy', percentage=0.05)

���������� ($ \beta_\gamma$ ) ��Ȩ�� ($ w$ )�����Եõ����ЧӦ�IJ��졣�������� causal_diff ����ʾ������죺

2. �����ò��Ժ� Q ����

�����û���ͨ��ƽ�����²�������� Q ���磬��������Ȩ�ظ��µ��µ����粻�ȶ������ڴ������� soft_update ʵ�֣�

soft_update(self.critic_target, self.critic, self.tau)

������˵�������µĹ�ʽΪ��

���У�( \(\tau\) ) ��һ����С�ij�����ͨ������ ( [0, 1] ) ֮�䣬ȷ��Ŀ������ĸ����ǻ����ģ������ѧϰ���ȶ��ԡ�

3. ���Ժ� Q �Ż���������
4. ���û���ģ���Ӧ��

ÿ������һ�������ü��ʱ���ж��Ƿ���Ҫ�Ŷ����Ժ� Q ���硣ͨ������ perturb() �� dormant_perturb() ʵ�ֶ�������Ŷ���perturbation�����Ŷ��������ݶ������Ⱥ�������칲ͬ������

������ Q ������Ŷ�����������������·�����

a. ���ü�����ʱ

������ÿ�����´��� updates �ﵽ�趨�����ü�� self.reset_interval ������ updates > 5000 ʱ���Żᴥ�������� Q ����������߼�������Ϊ��ȷ���Ŷ�����Ƶ�������������ھ���һ�νϳ���ѵ��ʱ�����С�

�����������

if updates % self.reset_interval == 0 and updates > 5000:
b. �����ݶȻ����ЧӦ������������ʱ

�ڴﵽ�����ü�������Ȼ���� �ݶ������� �� ���ЧӦ�IJ��� �������ͨ������������� causal_diff ���ݶ������� dormant_metrics['policy_grad_dormant_ratio'] �������Ƿ���Ҫ�Ŷ���

  • �ݶ������� ���㷽ʽͨ�� cal_dormant_grad() ����ʵ�֣�����ݶ������Ƚϵͣ���ζ�������е�ijЩ��Ԫ���·��ȹ�С������Ҫ����������Ŷ���

  • ���ЧӦ���� ͨ������ causal_diff = np.max(causal_weight) - np.min(causal_weight) �õ��������������������Ҫ���á�

Ȼ�������Щֵͨ���Ŷ����� factor �����жϣ�

factor = perturb_factor(dormant_metrics['policy_grad_dormant_ratio'])

����Ŷ����� ( \(\text{factor} < 1\) )�����������Ŷ���

if factor < 1:
    if self.reset == 'reset' or self.reset == 'causal_reset':
        perturb(self.policy, self.policy_optim, factor)
        perturb(self.critic, self.critic_optim, factor)
        perturb(self.critic_target, self.critic_optim, factor)
c. �ܽ�
  • ���´����ﵽ�趨�����ü�� ���Ҿ�����һ��ʱ���ѵ���� updates > 5000 ����
  • �ݶ������� �ϵͻ� ���ЧӦ���� ���󣬵��¼�������Ŷ����� ( $\text{factor} < 1 $)��

����������ͬʱ����ʱ�����Ժ� Q ���罫���Ŷ������á�

�Ŷ����ӵļ���

����δ����У� factor �ǻ����������ݶ������Ȼ������ЧӦ�������������Ŷ����ӡ��Ŷ�����ͨ������ perturb_factor() ���м��㣬�ú����������Ԫ���ݶ������ȣ� dormant_ratio �������ЧӦ���죨 causal_diff �������� factor �Ĵ�С��

�Ŷ����ӣ�factor��

�Ŷ����� factor �ļ��㹫ʽ���£�

����

  • ( \(\text{dormant\_ratio}\) ) ���������ݶ������ȣ�����ʾ�ж�����Ԫ���ݶȱ仯��С�����߽ӽ��㣩�����ڡ����ߡ�״̬��

  • ( \(\text{min\_perturb\_factor}\) ) ����С�Ŷ�����ֵ���������趨Ϊ 0.2 ��

  • ( \(\text{max\_perturb\_factor}\) ) ������Ŷ�����ֵ���������趨Ϊ 0.9 ��

  • dormant_ratio :

    • ��ʾ�����д��ڡ�����״̬�����ݶȱ������������ͨ��ͨ���������������ݶȷ���С��ij����ֵ����Ԫ��������á� dormant_ratio Խ�󣬱�ʾԽ����Ԫ���ݶȱ仯��С��˵��������²���֣���Ҫ�Ŷ���
  • max_perturb_factor :

    • ����Ŷ�����ֵ�����������Ŷ����ӵ����ޣ��������趨Ϊ 0.9����ζ������Ŷ����Ȳ��ᳬ�� 90%��
  • min_perturb_factor :

    • ��С�Ŷ�����ֵ�����������Ŷ����ӵ����ޣ��������趨Ϊ 0.2����ζ�ż�ʹ������Ԫ�����ܵͣ��Ŷ�����Ҳ����С�� 20%��

�ڼ������ЧӦ�IJ��֣��Ŷ����� factor ����������ЧӦ���� causal_diff �������� causal_diff ��ͨ���������ЧӦ�����ֵ����Сֵ�IJ�������õģ�

������� causal_diff ��Ӱ�� causal_factor ������һ���� factor ���е�����

����Ŷ����ӵĹ�ʽ

������ѡ����������ã� causal_reset �����Ŷ����ӽ�ʹ��������������� causal_factor ���ж��ε�����

���������� factor ������ֵ�����ݶ������Ȼ����ЧӦ���������Ƶģ���������Ԫ�����ϴ�����ЧӦ����ϴ�ʱ�� factor ���С��������������Ŷ���

��������

��δ�����Ҫʵ������ǿ��ѧϰ��RL��ѵ�������У��������������壨agent�������ܣ�����ijЩ�����±������ģ�͵ļ��㡣���ǿ��Էֶν��͸ô��룺

1. ������������

if i_episode % config.eval_interval == 0 and config.eval is True:

�ⲿ�ִ��������ж��Ƿ�Ӧ��ִ�������������������Ϊ��

  • i_episode % config.eval_interval == 0 ����ʾÿ�� config.eval_interval ��ѵ���غϣ� i_episode �ǵ�ǰ�غ���������һ��������
  • config.eval is True ��ȷ�� eval ����Ϊ True ��Ҳ����˵���������ܿ�����

����������������������뽫��ʼִ������������

2. ��ʼ�������б�

eval_reward_list = []

���ڴ洢ÿ�������غϣ�episode�����ۼƽ������Ա�֮�����ƽ��������

3. ��������

for _ in range(config.eval_episodes):

�����׶ν����ж���غϣ��� config.eval_episodes ָ���Ļغ��������Ի��������ı��֡�

3.1 �غϳ�ʼ��
state = env.reset()
episode_reward = []
done = False
  • env.reset() �����û�������ó�ʼ״̬ state ��
  • episode_reward ����ʼ��һ���б������ڴ洢��ǰ�غ����������õ����н�����
  • done = False ���� done �����ٵ�ǰ�غ��Ƿ������
3.2 ִ�������嶯��
while not done:
    action = agent.select_action(state, evaluate=True)
    next_state, reward, done, info = env.step(action)
    state = next_state
    episode_reward.append(reward)
  • ����ѡ�� �� agent.select_action(state, evaluate=True) ������ģʽ�¸��ݵ�ǰ״̬ state ѡ������ evaluate=True ��ʾ��ѡ����������ģʽ�£�ͨ����ζ��̽����Ϊ���رգ������������̽��������ѡ�����Ŷ�������

  • �������� �� next_state, reward, done, info = env.step(action) ͨ��ִ�ж��� action ������������һ��״̬ next_state ����ǰ���� reward ���غ��Ƿ�����ı�־ done ���Լ�������Ϣ info ��

  • ״̬���� ����ǰ״̬������Ϊ next_state ��������õĽ��� reward �洢�� episode_reward ���

ѭ��������ֱ���غϽ������� done == True ����

3.3 �洢�غϽ���
eval_reward_list.append(sum(episode_reward))

��ǰ�غϽ������ۼƽ����� sum(episode_reward) �������ӵ� eval_reward_list �����ں�������ƽ��������

4. ����ƽ������

avg_reward = np.average(eval_reward_list)

�����������غϽ����󣬼��� eval_reward_list ��ƽ��ֵ avg_reward �����ǵ�ǰ�����׶�������ı���ָ�ꡣ

5. ��������

if config.save_checkpoint:
    if avg_reward >= best_reward:
        best_reward = avg_reward
        agent.save_checkpoint(checkpoint_path, 'best')
  • ��� config.save_checkpoint Ϊ True �����ʾ��Ҫ����Ƿñ±£´ï¿½Ä£ï¿½Í¡ï¿½
  • ͨ���ж� avg_reward �Ƿñ³¬¹ï¿½ï¿½ï¿½Ö®Ç°ï¿½ï¿½ï¿½ï¿½Ñ½ï¿½ï¿½ï¿½ best_reward ������ǣ������ best_reward �������浱ǰģ�͵ļ��㡣
agent.save_checkpoint(checkpoint_path, 'best')

���д���Ὣ�������״̬���浽ָ����·�� checkpoint_path �������Ϊ "best" ����ʾ����������ѵ�ģ�͡�

���ĸ��ֽ��

�ȿȣ����Է��ֳ���ֻ��¼�� 0~1000 �����ݣ��� 1001 ��ʼ��ÿһ�����ݶ���ʾ�������Ա��������ˡ�

��������������github�������������ͬ���ı�����Ϣ

������Ϣ�ǣ����� X+1 �ִ��г��Լ��� X �ִ��е���Ϣ������������ݱ���������

���������������������ɣ����Լ�Ҳû�� bug

���������Ŀ�����ˣ���Ҫ���������Ŀ�IJ�ʿʦ��Ҳ��ҵ�ˣ�Ҳ����˵Щʲô����Ȼ������΢�ţ����������������ģ��ͦ���õİ����ֶ�������

С���Ƽ��Ķ�

�������������Ľ�Ϊ������Ϣ����������������ͬ���޹۵��֤ʵ��������

a 1.0
a 1.0
���ͣ���������������Ӫ״̬����ʽ��Ӫ�������ԣ����� ����

��Ϸ����

��Ϸ���

��Ϸ��Ƶ

��Ϸ����

��Ϸ�

��alittletotheleft������������һ��ܻ�ӭ����������������Ϸ����ҵ������Ƕ��ճ������еĸ���������
AWA 1.40
AWA 1.40
���ͣ���������������Ӫ״̬��δ֪�������ԣ����� ����

��Ϸ����

��Ϸ���

��Ϸ��Ƶ

��Ϸ����

��Ϸ�

��AWA����׿�����ɿ�����MentalLab�з���һ��������ɫ�ʵ������Թ�ð����Ϸ����������������Ϸ���棬��

�����Ƶ����

����

ͬ������

����

ɨ��ά�����������ֻ��汾��

ɨ��ά����������΢�Ź��ںţ�

��վ�������������������ϴ��������ַ���İ�Ȩ���뷢�ʼ�[email protected]

��ICP��2022002427��-10 �湫��������43070202000427��© 2013~2025 haote.com ������