自动驾驶:LQR、ILQR和DDP原理、公式推导以及代码演示(六、ILQR正则化和line search)

news2024/11/16 11:38:04

(六)ILQR正则化和line search

1. ILQR正则化

在iLQR中,我们通常线性化系统动力学并对目标函数进行二阶近似。在反向传播步骤中,我们需要计算逆矩阵Q_{uu}(控制变量对目标函数的二阶导数矩阵),用以更新控制增量。但在某些情况下,Q_{uu}可能是奇异的或者接近奇异,导致逆矩阵的计算不稳定。为了避免这种问题,可以通过加入正则化项,使得Q_{uu}变得更具条件性。

方法1:基于梯度下降的正则化

一种常见的正则化方法是在Q_{uu}上加上一个对角项,这类似于梯度下降中的学习率调节。

令正则化矩阵为\lambda I,其中I是单位矩阵,\lambda是正则化系数。我们可以将Q_{uu}调整为:

Q_{uu}^{\text{reg}} = Q_{uu} + \lambda I

通过这种方式,即便Q_{uu}是非正定或接近奇异的,我们仍然可以通过计算 Q_{uu}^{\text{reg}}的逆矩阵来进行控制更新。

方法2:信赖域正则化(Trust-Region Regularization)

另一种正则化方法是基于信赖域(trust region)优化的思想。我们在优化控制增量时限制其大小。具体而言,控制增量\delta u_k的大小受限于一个固定范围:

\|\delta u_k\| \leq \Delta

这种方法通过限制更新步长来确保每一步的更新都不会过大,从而提高优化的鲁棒性。

正则化对算法的影响

收敛性: 适当的正则化能够提高 DDP 收敛的稳定性,但过大的正则化参数\lambda可能会减慢算法的收敛速度。

步长控制: 一些算法中,正则化系数\lambda会根据当前迭代的效果动态调整。若迭代效果较好,减小\lambda以加快收敛;若效果较差,则增大\lambda以确保稳定性。

2. 线搜索(Line Search)

在 iLQR中,线搜索(Line Search)是一种常见的技巧,用于在更新控制序列时进一步提高算法的数值稳定性和收敛性。在 iLQR 的反向传播阶段,通过局部线性化的系统模型和二次近似的目标函数来计算新的控制增量。然而,由于近似并不精确,直接应用所得到的控制更新可能会导致目标函数值的增加,尤其是当系统具有高度非线性时。为了防止目标值恶化,线搜索通过控制步长来确保新的控制输入能带来实际的性能提升。

线搜索的基本步骤

线搜索的核心思想是在一条给定的方向上缩小步长,直到找到一个合适的步长,使得目标函数有所改善。以下是具体的步骤:

  1. 初始控制增量: 通过反向传播步骤得到一个控制增量\delta u_k,假设控制更新为:

    u_k^{\text{new}} = u_k + \alpha \delta u_k

    其中\alpha是步长系数(初始设定为 1)。

  2. 目标函数改善判定: 对于每一个\alpha,我们进行前向传播以计算新的目标函数值J_{\text{new}}​。比较更新前后的目标函数值J_{\text{old}}

    J_{\text{new}} \leq J_{\text{old}}

    如果目标函数值降低,则可以接受当前的步长\alpha并更新控制序列。

  3. 缩小步长: 如果新的控制增量导致目标函数值变差,即J_{\text{new}} > J_{\text{old}}​,则缩小步长\alpha,例如设\alpha为初始值的一半(或其他比例),即\alpha = \beta \alpha \quad,其中\quad 0 < \beta < 1,继续计算目标函数值,直到找到合适的步长。

  4. 重复迭代: 重复前向模拟和目标函数比较,直到找到合适的 α\alphaα 或步长缩小到某个阈值以下。

3. python代码演示

import numpy as np

# System dynamics (nonlinear)
def system_dynamics(x, u):
    return x + np.sin(u)

# Cost function for a single step
def cost_function(x, u):
    return 0.5 * (x**2 + u**2)

# Derivative of the cost function w.r.t. control input u (l_u)
def cost_u(u):
    return u

# Derivative of the cost function w.r.t. state x (l_x)
def cost_x(x):
    return x

# Second derivative of the cost function w.r.t. control input u (l_uu)
def cost_uu():
    return 1

# Second derivative of the cost function w.r.t. state x (l_xx)
def cost_xx():
    return 1

# Terminal cost for the final state
def terminal_cost(x):
    return 0.5 * x**2

# Derivative of terminal cost w.r.t state (l_x at final step)
def terminal_cost_x(x):
    return x

# Function to calculate the initial state trajectory based on control sequence
def compute_initial_trajectory(x0, u):
    x = np.zeros(N+1)
    x[0] = x0
    for k in range(N):
        x[k+1] = system_dynamics(x[k], u[k])
    return x

# iLQR algorithm with gradient descent, trust-region regularization, and line search
def ilqr_with_regularization_and_linesearch(x0, u, iterations, epsilon_u, epsilon_J, epsilon_x, max_step_size, line_search_steps=10):
    x = compute_initial_trajectory(x0, u)  # Compute initial trajectory
    prev_cost = np.inf
    regularization = 1e-3  # Regularization term for gradient descent (small to avoid overfitting)

    for i in range(iterations):
        # Backward pass
        V_x = np.zeros(N+1)
        V_xx = np.zeros(N+1)
        V_x[-1] = terminal_cost_x(x[-1])  # Terminal value for V_x
        V_xx[-1] = 1  # Terminal value for V_xx (quadratic cost on terminal state)

        du = np.zeros(N)  # Control updates

        # Backward pass: compute Q function and control update
        for k in range(N-1, -1, -1):
            # Compute Q-function terms
            f_u = np.cos(u[k])  # Derivative of system dynamics w.r.t. u
            Q_u = cost_u(u[k]) + f_u * V_x[k+1]  # Q_u = l_u + f_u^T * V_x(k+1)
            Q_uu = cost_uu() + f_u**2 * V_xx[k+1] + regularization  # Add regularization to avoid singularity
            Q_x = cost_x(x[k]) + V_x[k+1]  # Q_x = l_x + f_x^T * V_x(k+1)
            Q_xx = cost_xx() + V_xx[k+1]  # Q_xx = l_xx + f_x^T * V_xx(k+1) * f_x

            # Update control input with trust-region regularization
            step = -Q_u / Q_uu  # Compute step size for control update
            step = np.clip(step, -max_step_size, max_step_size)  # Apply trust-region constraint (step size regularization)
            du[k] = step
            V_x[k] = Q_x + Q_uu * du[k]  # Update value function gradient
            V_xx[k] = Q_xx  # Update value function Hessian (V_xx)

        # Forward pass: update trajectory using the new control inputs and line search
        x_new = np.zeros(N+1)
        u_new = np.zeros(N)
        x_new[0] = x0

        alpha = 1.0  # Starting step size for line search
        for search_step in range(line_search_steps):
            for k in range(N):
                u_new[k] = u[k] + alpha * du[k]  # Update control with line search step
                x_new[k+1] = system_dynamics(x_new[k], u_new[k])  # Update state

            # Compute the total cost for the current trajectory
            current_cost = np.sum([cost_function(x_new[k], u_new[k]) for k in range(N)]) + terminal_cost(x_new[-1])

            # Check if this step size improves the cost
            if current_cost < prev_cost:
                break
            alpha *= 0.5  # Reduce step size if no improvement

        # 1. Stop based on control input change
        if np.max(np.abs(du)) < epsilon_u:
            print(f"Stopped due to control input convergence at iteration {i}")
            break

        # 2. Stop based on cost function change (relative)
        if np.abs(prev_cost - current_cost) / np.abs(prev_cost) < epsilon_J:
            print(f"Stopped due to cost function convergence at iteration {i}")
            break

        # 3. Stop based on state trajectory change
        if np.max(np.abs(x_new - x)) < epsilon_x:
            print(f"Stopped due to state trajectory convergence at iteration {i}")
            break

        # Update for next iteration
        x = x_new
        u = u_new
        prev_cost = current_cost

    else:
        print("Reached maximum number of iterations")

    return x, u, i

if __name__ == "__main__":

    # iLQR parameters
    N = 3  # Number of time steps
    x0 = 1  # Initial state
    iterations = 50  # Maximum number of iterations
    epsilon_u = 1e-3  # Tolerance for control input changes
    epsilon_J = 1e-4  # Tolerance for cost function change (relative)
    epsilon_x = 1e-4  # Tolerance for state trajectory change
    max_step_size = 1.0  # Trust region step size for control updates

    # Initialize control sequence and state trajectory
    u = np.zeros(N)  # Initial control sequence
    x = np.zeros(N+1)  # State trajectory
    x[0] = x0

    # Compute initial trajectory
    x_initial = compute_initial_trajectory(x0, u)

    # Run iLQR with stopping conditions
    x_final, u_final, num_iterations = ilqr_with_regularization_and_linesearch(x0, u, iterations, epsilon_u, epsilon_J, epsilon_x, max_step_size)

    # Output the final results and number of iterations
    print("Final state trajectory: ", x_final)
    print("Final control inputs: ", u_final)
    print("Total iterations: ", num_iterations)

输出结果如下:

Stopped due to cost function convergence at iteration 8
Final state trajectory:  [1.         0.44370578 0.17737126 0.0834065 ]
Final control inputs:  [-0.58991961 -0.26958819 -0.09410359]
Total iterations:  8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通信工程学习:什么是FDMA频分多址

FDMA&#xff1a;频分多址 FDMA&#xff08;Frequency Division Multiple Access&#xff0c;频分多址&#xff09;是一种在无线通信领域广泛应用的多址技术。该技术通过将可用的频谱资源按频率划分&#xff0c;把传输频带划分为若干较窄且互不重叠的子频带&#xff08;或称信道…

IP-Adapter学习

参考&#xff1a;https://baijiahao.baidu.com/s?id1803373544569190578&wfrspider&forpc IP-Adapter 是 SD中比较重要的controlnet&#xff0c;由腾讯公司出品。主要原理&#xff1a;提取图像特征&#xff0c;并嵌入预训练文本&#xff0c;最终加入到扩散图像中。简…

阿里云社区领积分自动打卡Selenium IDE脚本

脚本 感觉打卡比较麻烦&#xff0c;要点开点按钮这种机械化的操作。 所以就自己整了个脚本&#xff1a; { “id”: “f9999777-9ad6-40e0-9435-4f105919c982”, “version”: “2.0”, “name”: “aliyun”, “url”: “https://developer.aliyun.com”, “tests”: [{ “id”…

bp的模块被隐藏了

看我们现在没有代理那个模块了 我们点击查看 这里有被我们隐藏的模块&#xff0c;比如代理等&#xff0c;把前面的眼睛点一下 这个模块就出来了&#xff0c;如果想把他固定在任务栏里 拖动这个位置 就好了&#xff0c;如果有其他问题可以留言&#xff0c;看到可进我的努力给你…

【JUC并发编程系列】深入理解Java并发机制:Synchronized机制深度剖析、HotSpot下的并发奥秘(四、synchronized 原理分析)

文章目录 【JUC并发编程系列】深入理解Java并发机制&#xff1a;Synchronized机制深度剖析、HotSpot下的并发奥秘(四、synchronized 原理分析)1. 虚拟机环境2. 基本数据类型占多少字节3. JVM对象头3.1 Klass Pointer3.2 实例属性3.3 对齐填充3.4 查看Java对象布局3.5 论证压缩效…

Failed building wheel for opencv-python-headless

Failed building wheel for opencv-python-headless 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主理人…

PD虚拟机的优点有哪些,哪个版本的 Parallels Desktop 最稳定?

在如今多元化的操作系统环境中&#xff0c;Parallels Desktop 作为一款强大的跨平台虚拟机软件&#xff0c;提供了一个无缝集成Mac与Windows操作系统的解决方案。这篇文章将深入探讨Parallels Desktop的优点以及 Parallels Desktop 版本哪个最稳定&#xff0c;帮助你做出更明智…

探索Python的神秘力量:Borb库的奇妙之旅

文章目录 探索Python的神秘力量&#xff1a;Borb库的奇妙之旅背景&#xff1a;为何选择Borb&#xff1f;Borb库是什么&#xff1f;如何安装Borb库&#xff1f;简单库函数使用方法场景应用常见Bug及解决方案总结 探索Python的神秘力量&#xff1a;Borb库的奇妙之旅 背景&#x…

基于SpringBoot的考研资讯平台设计与实现

需要项目源码请联系我&#xff0c;目前有各类成品 毕设 javaweb ssh ssm springboot等等项目框架&#xff0c;源码丰富。 专业团队&#xff0c;咨询就送开题报告&#xff0c;活动限时免费&#xff0c;有需要的朋友可以来留言咨询。 一、摘要 随着现在网络的快速发展&#xff…

Kafka入门-C#操作

目录 1. 安装 zookeeper 1.1、官网下载Zookeeper 1.2、创建data文件夹 1.3、修改配置文件 1.4 启动Zookeeper服务:zkServer 1.5 客户端连接Zookeeper:zkCli 2.安装kafka 2.1、官网下载kafka,解压 2.2、修改配置 2.3 运行 .\bin\windows\kafka-server-start.bat .\…

CI/CD持续集成和持续部署以及相关软件的使用

目录 一&#xff1a;CI/CD是什么&#xff1f; 1.1 持续集成&#xff08;Continuous Integration&#xff09; 1.2 持续部署&#xff08;Continuous Deployment&#xff09; 1.3 持续交付&#xff08;Continuous Delivery&#xff09; CI/CD 的好处包括: 二&#xff1a;git…

Holynix: v1

确认物理地址 00:0C:29:BC:05:DE ip扫描 arp-scan -l 端口扫描 nmap 192.168.48.167 访问一下80端口 burp抓包 找到一个登录框 想着burp抓包试试 将抓到的包放入kali中的文件中使用sqlmap注入试试 sqlmap 存在sql注入 sqlmap -r password --batch --random-agent 发现…

电脑提示丢失mfc140u.dll的详细解决方案,mfc140u.dll文件是什么

遇到电脑显示“缺少 mfc140u.dll 文件”的错误其实是比较常见的。这种提示通常表示某个应用程序在尝试运行时未能找到它所需的关键 DLL 文件&#xff0c;导致无法正常启动。不过&#xff0c;别担心&#xff0c;本文将一步步引导你通过几种不同的方法来解决这个问题&#xff0c;…

【红动中国-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

AV1 Bitstream Decoding Process Specification--[3]:约定

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码器…

DebateGPT:通过多智能体辩论监督微调大模型

人工智能咨询培训老师叶梓 转载标明出处 这些模型的训练通常依赖于资源密集型的人工反馈&#xff0c;这不仅成本高昂&#xff0c;而且耗时。为了解决这一问题&#xff0c;一篇名为《FINE-TUNING LARGE LANGUAGE MODELS WITH MULTI-AGENT DEBATE SUPERVISION》的论文提出了一种…

Sybase「退役」在即,某公共卫生机构如何实现 SAP Sybase 到 PostgreSQL 的持续、无缝数据迁移?

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量替代 OGG, Kettle 等同步工具&#xff0c;以及基于 Kafka 的 ETL 解决方案&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速仓内数据流转&#xff0c;帮助企业…

表单标记form

1.form:表单域标记&#xff0c;表示表单范围&#xff0c;所有的表单元素必须放进form标记中 2.input:用来设置表单输入元素&#xff0c;<input>元素根据不同的属性&#xff0c;可以有多种形式&#xff0c;如文本框&#xff08;text&#xff09;,密码框&#xff08;passw…

Maven入门学习笔记

一、maven介绍 Maven是一款自动化构建工具&#xff0c;专注服务于JAVA平台的项目构建和依赖管理。在javaEE开发的历史上构建工具的发展也经历了一系列的演化和变迁。 管理jar包 当我们使用SSM之后我们就需要使用非常多的jar包 没有maven找jar包非常的麻烦。 使用maven下载…

一次开发,多端部署--实例介绍

一、自适应布局 1、拉伸能力 容器组件尺寸发生变化时&#xff0c;增加或减小的空间全部分配给容器组件内指定区域。 Row() {// 通过flexGrow和flexShrink属性&#xff0c;将多余的空间全部分配给图片&#xff0c;将不足的控件全部分配给两侧的空白区域Row().width(150).flexG…