Category: ICT-Information and Communication Technology
-
关于扩散模型的一点总结和思考
人们很多时候都是从其他的学科的知识理论中得以启发,以在各自的领域进行融合创新,这篇短文将扩散模型算法的相关背景做一下介绍,疏漏和不正确的地方欢迎大家批评指正。 首先扩散模型算法从统计物理中的布朗运动和热力学熵中借鉴了相关的思想,在布朗运动过程中,系统中所有粒子的坐标和动量组成的6N维空间被称为相空间 (Phase Space)。相空间中的一个高维点唯一地代表了系统的一个微观状态(微观状态也称Microstate,即某一瞬间所有粒子的精确位置和动量,或者称为一个系统的瞬时状态快照)。系统的熵是对“我们不确定系统究竟处于哪一个具体微观状态”的度量。这个不确定性的大小,由所有可能微观状态的数量以及它们各自出现的概率共同决定。这样的定义和信息论中的对事件的不确定性度量的信息熵有很大的相似之处,或者说信息熵是在热力学熵的基础上对发生事件的不确定性在数学领域的推广。从布朗分子热运动的扩散过程情况来看,一开始不同局部的温度和系统宏观状态不同,但随着分子热运动的扩散过程发生,系统最终趋向于逐渐达到热平衡,最后系统各个部分都在做无序随机的热运动。 扩散模型DDPM在图像生成领域的应用,也可以和分子的布朗运动进行类比,DDPM中,一副图像组成的像素空间和颜色空间组成的张量H*W*C可以类比为分子布朗运动中相空间的一个高维点,因此一张图片就是相空间中的一个点状态(Microstate,或者说是系统在某个瞬时时间的快照),给图像添加噪声的过程好比分子的热运动的扩散过程,从加噪前的微状态到加噪后的微状态的转化逐渐走向了一个更加无须和混乱的结构,最后系统趋于完全随机的白噪声,和布朗运动的热平衡状态相对应。 而图像生成过程是上述扩散过程的逆过程,最终学习到的是特定数据集的数据流形的分布规律,从无序走向有序,也是系统处于熵减的过程,主要是通过神经网络能过学习到当前的噪声,并通过迭代逐渐消除噪声逐渐走向更有序的状态的过程,而这个过程需要有智能的干预或者属于智能系统的演化过程。 熵的概念有可能会在多个领域和方向得以关联甚至有较大的可能结合进行创新,比如说生命的过程,比如说其他系统甚至人文社会科学所研究对象的演化过程,也可能可以从系统的熵状态加以综合分析,但也要理解生命的过程和其他系统的演化过程均不是一个封闭的系统,如何考虑在开放环境下的熵减过程,达到更加有序的状态和结构,本身也是一个需要开放和需要不断总结和思考的问题,希望后续在这方面能有更多的一些思考和总结,也欢迎和期待读者朋友们对这个议题提供更多更精彩的观点和论断。
-
大语言模型基础及应用介绍
大家好,最近对大语言模型基础及应用做了一个系列相关主题的介绍,主要介绍了transformer架构,包括编码器架构及应用(BERT),解码器架构及应用(GPT),以及编码器解码器架构(seq2seq任务)等,同时对较新的大语言模型的架构(MoE)和算法(RLHF, GRPO)等做了介绍,希望能对相关同学们和从业人员有点帮助,谢谢。 References
-
扩散模型基础和应用新版本分享
大家好,最近准备了扩散模型系列知识分享,对扩散基础算法原理和及其在图像生成领域的诸多应用场景做了较为详细的介绍,希望能对相关的读者朋友们在相关方面提供一点有用的资源和信息,期待大家的反馈意见,谢谢。 References
-
强化学习系列算法新版本分享
大家好,最近准备了强化学习原理与实践的系列知识分享,对强化学习的基础算法原理和实践做了较为详细的介绍,希望能对相关的读者朋友们在相关方面提供一点有用的资源和信息,期待大家的反馈意见,以便向大家提供更好的知识内容输出,谢谢。 references
-
机器学习系列算法新版本分享计划
大家好,最近正在准备机器学习原理与实践系列课程,欢迎感兴趣或有意从事相关工作的朋友们一起将机器学习相关算法原理探索和代码实现进行更加具体详细的分析和理解,也希望在知识求学和实践的过程中给大家提供一点帮助,期待大家的反馈意见,以便向大家提供更好的知识内容材料,谢谢。 References
-
Latex文本输入编辑工具分享
最近有用到要较为频繁输入数学公式的地方,通过键盘输入Latex的不便性表现在Latex语法繁冗查阅记忆编排都比较需要精力。 这里向大家提供一个通过手写公式识别快速输入Latex公式的工具:Mathpix。该工具可以通过在工具窗口面板上手写(或鼠标输入)公式,然后通过扫描OCR识别的形式进行识别输出准确率较高的Latex文本公式,并进行数学公式的渲染。通过渲染来核实公式是否正确,不对的局部也可以通过更新对应的Latex文本进行校正。 该工具提供有限额度的free试用,1个月的付费服务价格也较为便宜(好像支持的公式识别的数量也挺高一般足够使用),建议大家短期频繁使用的可以按月购买相关的服务。该工具在个人使用过程中有不错的体验,友情帮忙做下推广,也欢迎读者提供更多更好用的相关工具推荐。 References
-
SLAM系列之cartographer系统架构分析和总结
这篇文章将对cartographer的系统做一个简要总结,前面系列文章已经对各个子模块做了较为详细的分析和介绍。这里再做一点补充说明:全局优化的结果不会反馈到局部优化的过程,所有子地图构建的时候其栅格的坐标系和轨迹的起始点标准坐标系对齐,点云帧的origin作为初始地图的中心。前面总体的分析内容主要基于二维建图过程展开,具体三维建图的逻辑框架基本和二维建图保持一致,这里暂不准备继续在三维建图方面做进一步详细的介绍。 如下图为cartographer系统的结构图,主要有传感器数据模块,局部SLAM和全局SLAM等关键模块, 在这里将对cartographer系统做一下简要的总结: 1、多传感器基于sensor_collator的缓存并实现同步和分发[2][3];2、点云数据的数据流转和变换,以及同步器range_collator实现多lidar传感器的融合及坐标变换支持(对定义的多个点云帧数据进行聚合并按照时间排序,多个点云传感器的origin也加以记录,以便进行range过滤)[4];3、基于extrapolator的点云点级别位姿估计,基于点云点时刻位姿和点云点局部坐标变换到trajectory统一坐标系下实现点云点去畸变[5][6];4、子地图的表示基于元数据limits和具体的栅格数据grid相结合,子地图的坐标系和轨迹坐标原点坐标系方向保持一致。地图创建的中心点为创建时点云帧的原点坐标,在更新的过程中,每一个点云帧的坐标都会对齐到轨迹坐标轴方向后进行更新,更新的时候基于当前点云点的原点作为射线起始点,在地图表示方面,二维概率栅格地图和tsdf表示方法具有不同的含义,但处理流程类似,三维地图构建扩展主要在地图表示和位姿估计时的自由度的扩展上,其主体流程也基本相同,框架也是复用[7]][8][9];5、基于局部扫描匹配算法实现点云帧位姿更精确估计并更新当前活动子地图[10];6、全局位姿优化,基于点云帧位姿和子地图位姿实现基于位姿图的全局优化,优化的结果不返回更新到子地图。可视化渲染或地图融合时,可以根据submap的全局位姿优化结果和submap对应的和轨迹坐标轴对齐的地图栅格数据做对应旋转变换实现不同子地图的对齐统一表示[11][12]。 以上为对cartographer的系统的部分关键内容做的一个小结,由于其良好的结构设计,cartographer的工程化的设计和实现在应用落地方面具有较为明显的优势,也可以在此现有架构基础之上做扩展开发考虑将当前的一些先进的SLAM算法集成进来。关于cartographer系统的系列介绍暂时就到这里,有疑问的地方欢迎联系沟通确认或勘误,谢谢。 References
-
SLAM系列之cartographer系统中PoseGraph2D全局位姿优化算法实现分析(二)
上篇文章主要向大家分析介绍了cartographer系统中基于ceres的位姿图构建的相关方面的细节,本篇将继续cartographer系统中关于全局优化的流程处理中的更多细节问题。也将继续以问答的形式向大家做分析介绍。 问题1:cartographer的实现中,一般一个点云帧会对应到两个子图中,在动态构建位姿图的过程中,是否是两个子图的全局位姿节点和点云帧位姿节点都要建立约束呢? 回答:计算约束的函数为PoseGraph2D::ComputeConstraintsForNode,在该函数中根据三种情况来计算约束:(1)、根据当前点云帧节点(简称节点)和其相关的正在构建的两个局部地图的全局位姿参数块节点(简称子图节点)之间的约束(INTRA_SUBMAP);(2)、当前点云帧节点和已经构建完成的子图(标记为完成状态)之间可能的回环约束;(3)、如果当前的子图也刚刚标记为结束状态,则需要更新已有的位姿图点云帧位姿节点和当前子图的约束,其中后面两种约束为INTER_MAP回环约束,将在下一个问题中加以具体的描述。 问题2:回环检测和约束如何实现? 回环检测的算法在PoseGraph2D::ComputeConstraint函数中进行的实现,其计算涉及到了轨迹内部和轨迹之间的可能的回环检测。具体会根据条件选择局部匹配搜索和全局匹配搜索。关于其约束构建的具体计算参考ComputeConstraint,下面对其具体的细节做相关分析说明。 其中计算这些constraints的过程也是作为异步背景线程中来运行的。具体更多的实现可以参考ConstraintBuilder2D类中的更多的代码实现细节。 问题3:全局地图的表示以及更新的方法细节如何实现?位姿图进行全局优化后如何更新地图的表示,以及如何更新子地图和点云帧的全局位姿信息? 回答:cartographer_node是cartographer在ROS中最主要的运行节点,在其内部运行了cartographer核心库的实现,包括SLAM的前端和后端,核心库本身不维护全局唯一的大图,但是其会已优化好的子图数据(包括每个子图的网格内容及其最终优化后的全局姿态)以二进制流(pbstream 格式)的形式发送给接收融合节点,如cartographer_occupancy_grid_node,在接收融合节点内会创建一个足够大的消息nav_msgs/OccupancyGrid,并将子地图进行融合后,以/map的ros topic发布出来。 问题4:位姿图优化一般作为背景线程,在什么时候被触发?如何支持多轨迹联合全局优化? 回答:在cartographer的内部实现中,基于线程池和任务队列的方式进行位姿图节点的更新,约束的计算等计算任务较重的计算逻辑,在cartographer中节点(点云帧和子图都有对应的trajectory_id属性,在进行全局优化的时候,不同轨迹的点云帧节点和子图数据更新插入到位姿图的逻辑是统一的接口。位姿图优化的是所有轨迹的节点和子子图节点和约束边的整体全局多轨迹位姿图。在全局的多轨迹地图点云节点联合位姿优化中,已经冻结的轨迹中的点云帧节点和子地图节点在位姿图节点中将会被设置为常量,不参与进一步的优化,也有利于效率的进一步提高。 References
-
SLAM系列之cartographer系统中PoseGraph2D全局位姿优化算法实现分析(一)
这篇文章将向大家介绍2D建图的全局优化算法实现分析的第一部分,主要介绍cartographer系统中基于ceres优化框架下的问题定义和求解的具体实现。后面将继续介绍优化过程中更多的议题,如全局位姿图优化实现中的更多的策略技巧,回环检测和全局地图信息如何维护和更新等。 首先Local SLAM的优化结果会插入到全局优化位姿图中,具体调用过程堆栈可以参考如下的代码片段和相关注释分析。 原始的激光点云帧经过一些列的流转变换和聚合后形成一个较为稠密的逻辑点云(如TRAJECTORY_BUILDER_3D.num_accumulated_range_data = 160,时间跨度会较长一点,后面处理的时候会通过自适应滤波器进行滤波)。该点云帧优化后的位姿等数据作为位姿图的节点插入,同时一个子图中会存在num_range_data个点云帧数据,但是也并不是每一个逻辑点云帧都会加入到位姿图的节点中(比如扫描匹配效果不太好的或运动变化小的将返回nullptr,不会插入到位姿节点中)。接下来将以问答的形式对相关问题进行说明。 问题:cartographer中位姿图优化和局部SLAM的最小二乘非线性优化的不同点,以及和其他SLAM系统的全局BA优化有哪些不同? 回答:在cartographer的系统实现中,基于位姿图的全局优化和局部SLAM位姿优化都是基于ceres::Problem的优化问题定义及ceres::Solver问题求解器相结合的优化问题求解框架来完成的,但在全局位姿图优化中的问题定义方式和局部SLAM的扫描匹配算法中定义的位姿优化求解的问题定义方式有所不同:(1)、通过参数块来定义待优化的变量,在SLAM系统中一般优化变量为位姿,在前文中介绍的局部SLAM优化中没有添加参数块,也就是在局部SLAM中中的优化问题只有一个扫描匹配的过程,没有图优化的节点和边的概念,(2)、通过定义残差项来定义优化的约束和目标,位姿图优化中通过定义残差块的方式将子图内位姿变换约束(INTRA_SUBMAP)或回环约束(INTER_SUBMAP)添加到位姿图的残差模块定义中来,而局部SLAM则将点云帧和局部地图的匹配对齐程度的度量计算作为残差块加入到求解问题框架中来。虽然都是基于最小二乘的非线性优化算法,算法的定义和求解思路是类似的,但是算法的具体对应的问题和算法的求解问题规模有较大的不同,局部SLAM的优化基于当前点云帧位姿构建的最小二乘的非线性优化问题,问题规模小求解速度块,而全局SLAM优化基于逻辑的位姿图的构建,基于大量的点云帧位姿优化变量,以及子地图位姿优化变量作为位姿图的节点,以及上述的INTRA_SUBMAP和INTER_SUBMAP可以看成节点之间的约束的边,构成了逻辑上的位姿图,具体的求解方法基于高斯牛顿法或 Levenberg-Marquardt算法,求解的具体实现细节已经封装在ceres优化求解器的内部(有兴趣的读者可以检索相关SLAM中的优化算法介绍,后面也将会有相关的SLAM专题介绍)。其中添加参数块的代码和注释如下: 添加约束的代码和注释如下: 其中子图的全局位姿和子图的第一个点云帧的节点位姿的相对变换为Identiy变换的约束,但是仍然在优化的时候采用独立优化进行。 References