1. 博客(Inverse Reinforcement Learning)

  • IRL is a paradigm relying on Markov Decision Processes (MDPs), where the goal of the apprentice agent is to find a reward function from the expert demonstrations that could explain the expert behavior.(学徒的目标是从专家策略中学到可以解释专家行为的奖励函数)
  • The main problem when converting a complex task into a simple reward function is that a given policy may be optimal for many different reward functions. That is, even though we have the actions from an expert, there exist many different reward functions that the expert might be attempting to maximize.(同一个专家策略可能对应着多个优化目标,也就是需要多个奖励函数)
  • The biggest motivation for IRL is that it is often immensely difficult to manually specify a reward function for a task.(手动指定一个好的奖励函数是非常困难的)
  • Human actions depend both on their preferences and their beliefs.(人类的行为取决于偏好,也取决于信念。e.g. go to restaurant without knowing closed{for a walk in IRL’s mind}; reset password because of forgetting{intend in IRL’s mind})
  • IRL seeks the reward functions that ‘explains’ the demonstrations. Do not confuse this with Apprenticeship learning (AL) where the primary interest is a policy which can generate the seen demonstrations.(学徒学习的目的是生成见过的示例)

2. 动手学强化学习

2.1 动态规划算法

2.2 时序差分

  • 动态规划算法要求马尔科夫决策过程是已知的,(即与智能体交互的环境是完全已知的,如迷宫和给定规则的网格世界),在这种条>件下,智能体并不需要和环境交互来采样数据,直接用动态规划算法就可以解得最优价值或策略. 但大部分现实环境中,其马尔科夫>决策过程的状态转移概率无法直接写出,也就无法进行动态规划. 所以只能通过智能体与环境交互来采样数据进行学习,这类方法统称为无模型的强化学习(model-free reinforcement learning).

  • 不同于动态规划算法,无模型的方法不需要事先知道环境的奖励函数和状态转移函数,而是通过采样数据来学习. 基于时序差分(Temporal differencee, TD)算法的SarsaQ-learning算法都是通过这种方式来进行模型更新的.

  • 在线策略学习是使用当前策略下采样的数据进行学习,当模型更新后,采样的数据被丢弃,类似于在自来水龙头下洗手; 离线策略>学习是使用经验回放池中的数据进行学习,类似于用脸盆接水洗手.离线策略具有对数据更高的利用率,因此被广泛使用.

  • Sarsa 算法

    • 策略评估已经可以通过时序差分算法实现,那么在不知道奖励函数和状态转移函数的情况下该如何进行策略提升呢? 答案是可>以直接使用时序差分来估计动作价值函数Q,然后我们用贪婪算法来选取在某个状态下动作价值最大的那个动作,这样似乎已经形成>了一个完整的强化学习算法:用贪婪算法选取动作价值最大的动作来和环境交互,再根据得到的数据用时序差分算法更新动作价值估计.
    • 环境不需要提供奖励函数和状态转移函数,而需要提供一个和智能体进行交互的函数step(),该函数将智能体的动作作为输入,>输出奖励和下一个状态给智能体.然后我们来实现Sarsa算法,主要维护一个表格Q-table(),用来存储当前策略下所有状态动作对>的价值.
      Q-learning update function:
      def update(self, s0, a0, r, s1):
      td_error = r + self.gamma * self.Q_table[s1].max() - self.Q_table[s0, a0]
      self.Q_table[s0, a0] += self.alpha * td_error

      whereas Sarsa update funciton is:

      def update(self, s0, a0, r, s1, a1):
      td_error = r + self.gamma * self.Q_table[s1, a1] - self.Q_table[s0, a0]
      self.Q_table[s0, a0] += self.alpha * td_error

      So in Sarsa, a1 is from epsilon-greedy policy, while in Q-learning, a1 is from the current policy. In a word, Sarsa’s behavior policy and target policy is the same (both is epsilon-greedy policy); Q-learning’s hebavior policy is epsilon-greedy policy, but its target policy is not epsilon-greedy policy. So Sarsa is a kind of on-policy, Q-learning is a kind of off-policy.

      2.3 DQN

  • Q-learning 算法中,我们以矩阵的方式建立了一张存储每个状态下所有动作 Q 值的表格。表格中的每一个动作价值 Q(s,a) 表示在状态 s 下选择动作 a 然后继续遵循某一策略预期能够得到的期望回报。然而,这种用表格存储动作价值的做法只在环境的状态和动作都是离散的,并且空间都比较小的情况下适用,我们之前进行代码实战的几个环境都是如此(如悬崖漫步)。当状态或者动作数量非常大的时候,这种做法就不适用了。我们需要用函数拟合的方法来估计 Q 值,即将这个复杂的 Q 值表格视作数据,使用一个参数化的函数 \(Q_{\theta} \)来拟合这些数据。很显然,这种函数拟合的方法存在一定的精度损失,因此被称为近似方法。

  • 考虑cartPole的环境,动作空间是离散的,只有向左和向右;状态空间是连续的,分别是四个维度,车的位置,车的速度,杆的角度,杆尖端的速度。这四个维度上的值都是连续的。这种情况下,二维表格已经无法表示 Q 值,所以考虑使用函数来近似 Q 值,拟合方法可以使用神经网络,那么输入和输出分别是什么呢?可以这样设计:令 state(这个例子是4维的) 为输入, Q值 (这个例子是2维的离散值,分别对应2个的动作)为输出,网络的学习目标是建立从 state 到采取某个 action 的 Q 值的映射,这个网络记为 \( Q_{\omega}(s,a) \)。此外我们还需要定义网络的损失函数,目的是为了缩小这两个表示之间的距离:TD_target \( r + \gamma max_{a’}Q_{\omega}(s’,a’) \) 与 \( Q_{\omega}(s,a) \)。

  • 强化学习的数据是从智能体与环境的交互中来,所以为了提升神经网络学习的效率,需要一个 buffer 来记录智能体和环境交互产生的历史数据,当达到一定数据量(minimal_size)时再从buffer中采样batch_size个数据进行梯度下降进行训练。这里的损失函数是建立在时序差分的基础上的,就是说 behaviortarget 都用到了同一个神经网络,但是区别在于时间点不同,因此分别称作 train networktarget networktarget network 不是随着智能体探索环境的步调来更新的,而是设置了 target_update_frequencytrain_count 这两个参数来控制的,每当 train_network 梯度下降一次,train_count 自动加一,每当达到 target_update_frequency 个累积时才令 target_network 的参数和 train_network 一致。容易混淆的是 train_network 的更新和智能体探索环境的步调一致的(当buffer_size大于minimal_size时)。

  • 在强化学习中,都需要分别建模环境智能体。智能体根据当前state发出action和环境交互(take_action函数),环境回应其action(reward, next_state, done, other_info)replay_buffer 收集这些浮现出来的数据。智能体再利用这些数据计算 return 相应的表示(state_value、action_value)来更新train_network(update函数)。

  • 每个episode是一个迭代步, 在DQN中,当buffer_size大于minimal_size后,agent 每和环境交互一次,train_network就会更新一次,直到done,形成了一个 trajectory,继而进入下一个 episode。episode_return 记录下每个 episode 的累积 reward,最后的评价指标就是每个episode_return。

  • 训练结束后,可以得到一系列的 episodes, 问题是如何将训练好的模型部署应用?应用的是 train_network 还是 target_network,应用过程中是否需要训练,是否还需要探索利用的balance?如何恢复最优策略?【答:应该是在每个状态都采取使得Q最大的那个action吧】

    2.4 策略梯度算法

  • Q-learning、DQN 及 DQN 改进算法都是基于价值(value-based)的方法。在强化学习中,除了基于值函数的方法,还有一支非常经典的方法,那就是基于策略(policy-based)的方法。对比两者,基于值函数的方法主要是学习值函数,然后根据值函数导出一个策略,学习过程中并不存在一个显式的策略;而基于策略的方法则是直接显式地学习一个目标策略。策略梯度是基于策略的方法的基础。

  • 基于策略的方法首先需要将策略参数化。假设目标策略 \(\pi _{\theta}\) 是一个随机性策略,利用神经网络模型来为这个策略建模,输入是某个状态,输出是一个动作的概率分布,我们的目标是要寻找一个最优策略并最大化这个策略在环境中的期望回报。策略学习的目标函数定义为:

    \( J(\theta) \mathbf {E} _{s_0}[V^{\pi_0}(s_0)] \)

    其中,表示初始状态。现在有了目标函数,我们将目标函数对策略求导,得到导数后,就可以用梯度上升方法来最大化这个目标函数,从而得到最优策略。策略 \( \pi \)下的状态访问分布表示为 \(\nu^{\pi} \)。然后我们对目标函数求梯度,可以得到如下式子

    \(\begin{aligned} \nabla_\theta J(\theta) & \propto \sum_{s \in S} \nu^{\pi_\theta}(s) \sum_{a \in A} Q^{\pi_\theta}(s, a) \nabla_\theta \pi_\theta(a \mid s) \\ & =\sum_{s \in S} \nu^{\pi_\theta}(s) \sum_{a \in A} \pi_\theta(a \mid s) Q^{\pi_\theta}(s, a) \frac{\nabla_\theta \pi_\theta(a \mid s)}{\pi_\theta(a \mid s)} \\ & =\mathbb{E}_{\pi_\theta}\left[Q^{\pi_\theta}(s, a) \nabla_\theta \log \pi_\theta(a \mid s)\right]\end{aligned}\)

    这个梯度可以用来更新策略。需要注意的是,因为上式中期望的下标是 \( \pi _{\theta}\),所以策略梯度算法为在线策略(on-policy)算法,即必须使用当前策略 \( \pi _{\theta}\) 采样得到的数据来计算梯度。

  • 在计算策略梯度的公式中,我们需要用到 \( Q^{\pi_{\theta}}(s,a) \),可以用多种方式对它进行估计。REINFORCE 算法便是采用了蒙特卡洛方法来估计 \( Q^{\pi_{\theta}}(s,a) \)

  • REINFORCE 算法在采样完整的 episode 后才开始更新神经网络,因为不同于基于时序差分的DQN,Sarsa,Q-learning,REINFORCE采用了蒙特卡洛方法。【后面的Actor-Critic算法可以看到采样完整的episode后也可以使用时序差分来估计值函数】看代码:
    在一个episode中:agent的update 在 while done外面执行。

    for i_episode in range(int(num_episodes / 10)):
    episode_return = 0
    transition_dict = {
        'states': [],
        'actions': [],
        'next_states': [],
        'rewards': [],
        'dones': []
    }
    state = env.reset()
    done = False
    while not done:
        action = agent.take_action(state)
        next_state, reward, done, _ = env.step(action)
        transition_dict['states'].append(state)
        transition_dict['actions'].append(action)
        transition_dict['next_states'].append(next_state)
        transition_dict['rewards'].append(reward)
        transition_dict['dones'].append(done)
        state = next_state
        episode_return += reward
    return_list.append(episode_return)
    agent.update(transition_dict)

    Agent的完整代码:这里的疑惑是损失函数是怎么定义的?

    class REINFORCE:
    def __init__(self, state_dim, hidden_dim, action_dim, learning_rate, gamma,
                 device):
        self.policy_net = PolicyNet(state_dim, hidden_dim,
                                    action_dim).to(device)
        self.optimizer = torch.optim.Adam(self.policy_net.parameters(),
                                          lr=learning_rate)  # 使用Adam优化器
        self.gamma = gamma  # 折扣因子
        self.device = device
    
    def take_action(self, state):  # 根据动作概率分布随机采样
        state = torch.tensor([state], dtype=torch.float).to(self.device)
        probs = self.policy_net(state)
        action_dist = torch.distributions.Categorical(probs)
        action = action_dist.sample()
        return action.item()
    
    def update(self, transition_dict):
        reward_list = transition_dict['rewards']
        state_list = transition_dict['states']
        action_list = transition_dict['actions']
    
        G = 0
        self.optimizer.zero_grad()
        for i in reversed(range(len(reward_list))):  # 从最后一步算起
            reward = reward_list[i]
            state = torch.tensor([state_list[i]],
                                 dtype=torch.float).to(self.device)
            action = torch.tensor([action_list[i]]).view(-1, 1).to(self.device)
            log_prob = torch.log(self.policy_net(state).gather(1, action))
            G = self.gamma * G + reward
            loss = -log_prob * G  # 每一步的损失函数
            loss.backward()  # 反向传播计算梯度
        self.optimizer.step()  # 梯度下降

2.5 Actor-Critic 算法

  • Actor-Critic 是囊括一系列算法的整体架构,目前很多高效的前沿算法都属于 Actor-Critic 算法,需要明确的是,Actor-Critic 算法本质上是基于策略的算法,因为这一系列算法的目标都是优化一个带参数的策略,只是会额外学习价值函数,从而帮助策略函数更好地学习。REINFOCE 算法用蒙特卡洛方法来估计 \(Q(s,a)\),能不能考虑拟合一个值函数来指导策略进行学习呢?这正是 Actor-Critic 算法所做的。在策略梯度中,可以把梯度写成下面这个更加一般的形式:

    \(g=\mathbf{E}\left[\sum_{t=0}^T \psi_t \nabla_\theta \log \pi_\theta\left(a_t \mid s_t\right)\right]\)

    其中,\(\psi_{t}\) 可以有很多种形式:

    • \(\sum_{t’=0}^{T}\gamma^{t’}r_{t’}\):轨迹的总汇报。
    • \(\sum_{t’=t}^{T}\gamma^{t’-t}r_{t’}\):动作 \(\alpha\) 之后的回报。
    • \(\sum_{t’=t}^{T}\gamma^{t’-t}r_{t’}-b(s_t)\):基准线版本的改进。
    • \(Q^{\pi_{\theta}}(s_t,a_t)\): 动作价值函数。
    • \(A^{\pi_{\theta}}(s_t,a_)\): 优势函数;
    • \(r_t + \gamma V^{\pi_{\theta}}(s_{t+1})-V^{\pi_{\theta}}(s_t)\): 时序差分残差。
  • REINFORCE 通过蒙特卡洛采样的方法对策略梯度的估计是无偏的,但是方差非常大。我们可以用形式(3)引入基线函数(baseline function)\(b(s_t)\)来减小方差。此外,我们也可以采用 Actor-Critic 算法估计一个动作价值函数 Q,代替蒙特卡洛采样得到的回报,这便是形式(4)。这个时候,我们可以把状态价值函数 V 作为基线,从 Q 函数减去这个 V 函数则得到了 A 函数,我们称之为优势函数(advantage function),这便是形式(5)。更进一步,我们可以利用 \(Q = r + \gamma V\) 得到形式(6)。

  • 这里来看形式(6),即通过时序差分残差 \(\phi _{t} = r_t + \gamma V^{\pi}(s_{t+1})-V^{\pi}(s_t)\) 来指导策略梯度进行学习。事实上,用Q值或者V值本质上也是用奖励来进行指导,但是用神经网络进行估计的方法可以减小方差、提高鲁棒性。除此之外,REINFORCE 算法基于蒙特卡洛采样,只能在序列结束后进行更新,这同时也要求任务具有有限的步数,而 Actor-Critic 算法则可以在每一步之后都进行更新,并且不对任务的步数做限制。

  • Actor-Critic 算法用到了 policy_networkvalue_networkpolicy_network和REINFORCE算法一致,输入是某个状态,输出是采取某个动作的概率分布;value_network和 DQN不一样的是这里的输出定义为一个维度,表示输入 state 对应的价值。

  • agent中的take_action函数和REINFORCE的一样,update 部分应该是精华,看代码:【transition_dictreplay_buffer的区别是:replay_buffer是全局的,包括不同 episode 里的数据,但transition_dict是局部的,只保存自己 episode 里的数据;并且在更新时,从replay_buffer中采样batch_size个数据,而transition_dict里的所有数据都要参与计算。所以replay_buffer中采样得来的数据来自不同的 episode,生成不同 episode 的策略肯定有所区别(因为策略在更新),那么是否说明 replay_buffer只出现在 off-policy 的情景下?】

class ActorCritic:
    def __init__(self, state_dim, hidden_dim, action_dim, actor_lr, critic_lr,
                 gamma, device):
        # 策略网络
        self.actor = PolicyNet(state_dim, hidden_dim, action_dim).to(device)
        self.critic = ValueNet(state_dim, hidden_dim).to(device)  # 价值网络
        # 策略网络优化器
        self.actor_optimizer = torch.optim.Adam(self.actor.parameters(),
                                                lr=actor_lr)
        self.critic_optimizer = torch.optim.Adam(self.critic.parameters(),
                                                 lr=critic_lr)  # 价值网络优化器
        self.gamma = gamma
        self.device = device

    def take_action(self, state):
        state = torch.tensor([state], dtype=torch.float).to(self.device)
        probs = self.actor(state)
        action_dist = torch.distributions.Categorical(probs)
        action = action_dist.sample()
        return action.item()

    def update(self, transition_dict):
        states = torch.tensor(transition_dict['states'],
                              dtype=torch.float).to(self.device)
        actions = torch.tensor(transition_dict['actions']).view(-1, 1).to(
            self.device)
        rewards = torch.tensor(transition_dict['rewards'],
                               dtype=torch.float).view(-1, 1).to(self.device)
        next_states = torch.tensor(transition_dict['next_states'],
                                   dtype=torch.float).to(self.device)
        dones = torch.tensor(transition_dict['dones'],
                             dtype=torch.float).view(-1, 1).to(self.device)

        # 时序差分目标
        td_target = rewards + self.gamma * self.critic(next_states) * (1 -
                                                                       dones)
        td_delta = td_target - self.critic(states)  # 时序差分误差
        log_probs = torch.log(self.actor(states).gather(1, actions))
        actor_loss = torch.mean(-log_probs * td_delta.detach())
        # 均方误差损失函数
        critic_loss = torch.mean(
            F.mse_loss(self.critic(states), td_target.detach()))
        self.actor_optimizer.zero_grad()
        self.critic_optimizer.zero_grad()
        actor_loss.backward()  # 计算策略网络的梯度
        critic_loss.backward()  # 计算价值网络的梯度
        self.actor_optimizer.step()  # 更新策略网络的参数
        self.critic_optimizer.step()  # 更新价值网络的参数

2.6 TRPO 算法

2.7 PPO 算法

2.8 DDPG 算法

2.9 SAC 算法

3. 博客(自动驾驶算法/规划决策控制算法面经汇总)

  • 自动驾驶算法主要包括感知、预测、规划和控制模块。"我"主要集中在规划和控制部分,一般机械方向、计算机方向和控制科学与工程方向、机器人方向以及一些其他方向转自动驾驶的研究生或优秀本科生会投递这个岗位。常见的自动驾驶公司如下:

    • Tier1:
      华为、博世、百度、大疆、中兴、腾讯、
      智驾科技 、宏景智驾、MINEYE
    • Robotaxi:
      百度、小马智行、文远知行、元我启行、滴滴自动驾驶momenta、Autox、轻舟智航 、驭势科技、智行者
    • Robotruck:
      图森未来、智加科技、赢彻科技、小马智行(小马+三一重工)、主线科技、斯年智驾西并科技、飞步科技、牧月科技(文远知行)、挚途科技、畅行智能、环宇智行、 阿里达摩院、希迪智驾
    • Robobus:
      轻舟智航、百度、文远知行、商汤易成
    • 物流配送:
      美团、阿里达摩院、京东、苏宁、中国邮政、百度Apollo、毫未智行(长城)、威盛电子、新石器、白犀生、智行者、驭势科技 、行深智能、一清创新、伽智科技、小狮科技、易成、高仙机器人、普渡科技、擎朗智能、矩阵数据
    • 新势力车企:
      蔚来、小鹏 、理想、集度、小米、极氤、爱驰、零跑、哪吒、智己、上汽、滴滴、威马、特斯拉
    • 主机厂:
      上汽、广汽、北汽、一汽、长城、(毫末智行)、比亚迪、长安、吉利、(福瑞泰克)东风
    • 农用自动驾驶:
      丰疆智能、中联重科、中国一拖、悟牛智能、中科原动力、雷沃重工、超是智能
    • 矿区自动驾驶:
      易控智驾 、踏歌智行、慧拓智能、路凯智行、伯镭科技、盟识科技、希迪智驾
    • 环卫自动驾驶:
      智行者、酷哇 、仙途、挚途、高仙机器人、深兰科技、浩睿智能、于万智驾

4. 博客(万字长文解读深度学习算法在自动驾驶规控中的应用 2022)

  • 自动驾驶分为感知、定位、决策、规划、控制这几大模块。

  • 所有已经发生的既定事实我们可以称之为T0+,感知就是已经发生过的既定事实。例如车辆未来应该怎么走、别人可能会怎么等都属于未来将要发生的事情,我们可以称之为T0-。

  • 自动驾驶公司内部通常都会有一个PNC组,其主要任务就是负责规控方面的工作,包括预测、决策、规划、控制。

  • 数据驱动的深度学习算法仍主要应用在感知模块,而在规控中应用的却很少——目前,行业内的规控相关算法主要还是基于规则驱动。

  • 使基于规则的规控算法暴露出短板的,主要是非确定性场景强交互场景强主观场景这三个大类的corner case:

    • 非确定性场景是相对于确定性场景而言的,最简单的确定性场景就是红灯停绿灯行、可以在白色虚线变道、不能在白色实线变道,除此类的场景则都可视为“非确定性场景”。例如,大部分情况下车都在有车道线的道路开,但有一种情况是当前的道路是三条干道加一条辅路,而辅路与干道间只有车道线没有绿化带,这也就意味着辅路的车辆在任何情况下都有可能并线进入主路,这就是一个典型的非确定性场景。因为大多数司机根本不会管实线虚线,你根本不知道周边什么时候会突然出现一辆车,它有多大的概率会直接变道。因为道路中其他车辆的轨迹带有概率,基于规则的算法很难处理。
    • 强交互场景: 最典型的场景就是十字路口,多个物体在一个场景下的路线会发生交互而互相影响,所以交互的时候是有一定博弈在里面。在非常复杂的一个道路场景里,不断地对周围车做预测,然后基于交互的结果去规划,这不是能够用人的规则描述清楚的。
    • 强主观场景:简单说就是在不同路况下,人会无意识地根据环境去调节自车跟前车的距离。因为人脑中可能有一套规则在驱动,但这些规则又很抽象、不能明确,只可意会不可言传的,例如变道的时机、在路口对其他车辆的反应等等。有的场景下,虽然可以用规则算法来模仿车主的一些行为和驾驶风格,但人的主观习惯很难用规则解决,即使能解决也需要大量的人力。
  • 用基于规则的算法应对corner case,最难的是预测环节。因为,除了要预测自车轨迹外,自动驾驶车辆还需要预测“其他道路使用者”的轨迹,而道路中往往不只有一个“其他道路使用者”,他们彼此间会产生交互,所以预测他们的轨迹很难。

  • 小马智行的规控算法专家称,小马已将AI模型可以应用在多个层次。“比如可以用传统分类AI模型(可以是深度学习,也可以是传统的机器学习分类模型)来做decision making,用深度学习做轨迹生成来指导path planning,用端到端强化学习给出当前应该执行的action来指导motion planning(最终轨迹的规划)。” 这位专家还认为,结构化的高速场景可能更容易由传统算法解决,而非结构化的城区场景则可能有更大空间发挥AI模型的优势。

  • 挚途(苏州挚途科技有限公司)在高速匝道口场景的决策环节用到了强化学习算法。

  • 现阶段,深度学习算法还不能大规模应用于规控算法

    • 很难断定人类司机的驾驶行为是否“值得学习”。小马智行的规控算法专家说:“人类司机驾驶也有很多坏习惯,如果只是盲目追求拟人性而忽视了安全、舒适和高效这三个自动驾驶系统的主要优化目标,那就本末倒置了。实际上,即便用AI模型来弥补传统算法方面的不足,也应该是围绕着这3个维度来改进的。”
    • 深度学习算法比规则更难应对需求变更。工程师如果想根据需求更改模型,则需要对模型重新训练,成本很高。并且,如果出现事故,深度学习算法很难像规则算法那样在最短的时间里快速排查出问题究竟出在哪儿。
    • 深度学习算法的效果可能不如规则。毫末智行的规控算法专家也说:“现在AI模型效果还没有完全打败规则,试图拟人但效果还不够好,因为这类认知网络的模型架构、输入输出定义、,数据准备都还没有完全做好,并没有达到感知模型的程度,大家还在探索(但我觉得一年之内就会有重大突破)。”
    • 深度学习算法仍需要规则来兜底。领骏科技采用了混合决策架构,该公司CEO杨文利博士的说法是“深度学习算法由于善于学习人类的驾驶经验,因此主要用于提升性能,而由程序员设计的规则已进行过充分测试论证的,用来保证安全,拥有更高的优先级。”
    • 引入深度学习算法,意味着大量代码需要被替换。据一位曾在某头部Robotaxi公司担任规控算法负责人的资深专家说,在规控中引入深度学习后,代码重写的工作量非常大,因为涉及在线、离线、仿真等多个系统的改造。所以,现阶段,多数自动驾驶公司对混合式规控算法的态度是:只在应对匝道、十字路口等极少数场景时采用混合式规控算法;而过去用基于规则的算法已经解决的corner case,只要没发现“令人无法容忍”的问题就“不动”。
  • 特斯拉最近一次AI DAY上公布出的信息已经显示,特斯拉大量使用深度学习的规控算法表现非常亮眼。

  • 地平线CTO黄畅博士认为,在将深度学习算法引入规控时,我们不必过分纠结于系统是否“可解释”。

  • 关于深度学习算法应用于自动驾驶规控中的案例

    • 智加:通过深度学习算法降低油耗。
    • 轻舟智航:用深度学习算法提升系统的“拟人性”,例如:对变道时机选择、匝道merge时机选择、路口博弈等在使用城市NOA会遇到的某些规划关键场景,轻舟已经有专门的深度学习算法来进行处理。在轻舟智航,通过深度学习(比如模仿学习或者强化学习)来生成自车“未来可能的轨迹”这一技术已经比较成熟,通过收集大量专家驾驶的轨迹来训练模型,现在模型生成的轨迹在90%情况下都无需做后续的修饰;但在10%的情况下,深度学习生成的轨迹效果可能不好,甚至有安全风险,这时候就需要一个框架能够去修正/修改它。轻舟使用其国内在首创的时空联合算法(一种基于数值优化的算法)对深度学习生成的轨迹进行微调。轻舟规控算法专家说,时空联合规划算法相比传统的横向纵向分离更适合与深度学习算法协同使用。因为,用深度学习算法生成的轨迹本身其实就是一个时空联合的轨迹,这个轨迹上面不仅有位置、速度、方向信息,还有时间信息。因此,时空联合规划算法就能较好地跟模型出来的结果结合到一起,进而能够无缝地给深度学习算法加上安全防护。

5. Tesla AI DAY(2022)

https://www.bilibili.com/video/BV1sV4y1G7uH/?spm_id_from=333.337.search-card.all.click&vd_source=455951196dbc0d60ee36c55da45adf4c

6. Tesla AI DAY(2021)

https://www.bilibili.com/video/BV1ee4y1v7JW?p=4&vd_source=455951196dbc0d60ee36c55da45adf4c

7. Apollo EM planner

忠厚老实的老王 from bilibili

and apollo websites courses

8. CARLA Leaderboard

https://paperswithcode.com/sota/autonomous-driving-on-carla-leaderboard

Rank Model Driving Score Route Completion Infraction penalty Paper Code Year
1 InterFuser 76.18 88.23 0.84 Safety-Enhanced Autonomous Driving Using Interpretable Sensor Fusion Transformer link 2022
2 TCP 75.14 85.63 0.87 Trajectory-guided Control Prediction for End-to-end Autonomous Driving: A Simple yet Strong Baseline link 2022
3 Learning From All Vehicles (LAV) 61.846 94.459 0.640 Learning from All Vehicles link 2022
4 TransFuser 61.181 86.694 0.714 TransFuser: Imitation with Transformer-Based Sensor Fusion for Autonomous Driving link 2022

interFuser: https://www.bilibili.com/video/BV1Ma411G7z7/?spm_id_from=333.337.search-card.all.click&vd_source=455951196dbc0d60ee36c55da45adf4c

9. CARLA implementation of DQN

from sendex from learningpython.net
and from https://www.cnblogs.com/kin-zhang bilibili

10. self-driving cars tutorial

MIT:

https://gradientdescent.co/t/mit-s-deep-learning-for-self-driving-cars-2019-edition/126

Self-Driving Cars, lectureed by Prof. Andreas Geiger, University of Tübingen

(Techniques for Self-Driving Cars” taught at the University of Bonn)

打赏作者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

CAPTCHA