1 | 有两个CAD矢量图形,图形相似但是绘制存在旋转和缩放,怎么判断其相似性 |
判断两个矢量图形的相似性是计算机图形学、CAD、BIM、图像识别等领域的重要问题。由于矢量图形由点、线、曲线、多边形等几何元素构成,不能像像素图像那样直接用像素差比较,需要从几何结构、拓扑关系、形状特征等多个维度综合判断。
查看全文 >>
Python 作为一门强调“可读性”和“简洁性”的语言,拥有非常完善的代码规范与最佳实践体系。遵循主流规范不仅能提升代码质量,还能增强团队协作效率。
以下是目前 Python 主流的编码规范、风格指南和工程实践,涵盖语法、命名、结构、文档、测试等多个方面。
这是 Python 官方推荐的代码风格标准,几乎所有 Python 项目都以此为基础。
查看全文 >>Visual Studio Code(VS Code)是开发者广泛使用的轻量级但功能强大的代码编辑器。掌握其常用快捷键可以极大提升编码效率。
以下整理了 Windows / Linux 和 macOS 两大平台的常用快捷键(括号内为 macOS 键位):
论文 DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model
github: DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model
参考博客:
https://bruceyuan.com/post/hands-on-deepseek-mla-projection-absorption.html
https://github.com/madsys-dev/deepseekv2-profile/blob/main/workspace/blog/optimizing-mla.md
1 | 洞见: |
标准的多头注意力:d表示嵌入维度,nh表示注意力头的数量,dh表示每个头的维度,ht∈Rd 表示在注意力层中第t个token的注意力输入。
标准MHA机制通过三个矩阵WQ、WK、WV∈Rdhnh×d分别生成输入ht的查询向量qt∈Rdh、键向量kt∈Rdh和值向量vt∈Rdh。公式如下:
qt=WQht(1)
kt=WKht(2)
vt=WVht(3)
接下来,qt,kt,vt将被切分成nh个头,用于多头注意力计算:
[qt,1;qt,2;…;qt,nh]=qt(4)
[kt,1;kt,2;…;kt,nh]=kt(5)
[vt,1;vt,2;…;vt,nh]=vt(6)
其中:
公式含义:将原始的 qt,kt,vt 按列切分成 nh 个头的子向量。
每个头的注意力计算公式为:
attention_weightt,i=Softmaxj=1t(dhqt,i⊤kj,i)
ot,i=j=1∑tSoftmax(dhqt,i⊤kj,i)vj,i(7)
最后拼接所有头的输出,再做输出投影:
ut=WO[ot,1;ot,2;…;ot,nh](8)
其中 WO∈Rd×dhnh 是输出映射矩阵。
推理时问题:
MLA 核心是通过低秩联合压缩减少 KV cache大小。
压缩输入:
将输入 ht 压缩到KV低维共享表示 ctKV:
ctKV=WDKVht(9)
解码 key 和 value:
从 ctKV 解码出 key 和 value:
ktC=WUKctKV(10)
vtC=WUVctKV(11)
**低秩压缩后的注意力权重计算方式 **:
qt⊤kjC=(WQht)⊤WUKctKV=ht⊤(WQ)⊤WUKctKV=ht(WUK)⊤WQctKV
多头注意力相当于把 注意力权重attention_weight从一维向量变为了二维向量,shape: (seq_len,) -> (seq_len, head_num),但本质上还是一个张量,只是得到这个张量的方式注意力机制计算比较复杂。
[ot,1;ot,2;…;ot,nh]=vt@attention_weight=WUVctKV@attention_weight
ut=WO[ot,1;ot,2;…;ot,nh]ut=WOWUV(ctKV@attention_weight)
优势:
上面公式看似需要使用ctKV重新生成历史的KV,但是通过权重吸收(合并)可以将重新生成的步骤合并其他向量的投影中,从而无需真正重新生成。
WUK∈Rdhnh×dc 与 WQ∈Rdhnh×d的合并,维度变换是 d−>dhnh−>dc,吸收后是 d−>dc,如果是原始的MHA不进行维度压缩d−>dhnh,可以看出来吸收后相比MHA计算量减少,不吸收则增大计算量。
WUV∈Rdhnh×dc 与 WO∈Rd×dhnh合并,维度变换是 dc−>dhnh−>d, 吸收后是dc−>d,同样吸收后相比MHA计算量减少,不吸收则增大计算量。
虽然压缩 Query 不能减少 KV 缓存,但是也能节省计算。
ctQ=WDQht(12)
qtC=WUQctQ(13)
作用:
前面的推理没有考虑位置编码,如果考虑RoPE位置编码,会发现权重吸收和位置编码不兼容:
qt⊤kjC=>RoPE(qt⊤)RoPE(kjC)(-1)
RoPE(qt⊤)RoPE(kjC)=(Rtqt)⊤RjkjC=qt⊤Rt⊤RjkjC=qt⊤Rj−tkjC=ht⊤(WQ)⊤Rj−tWUKctKV(-2)
前面 WUK 与 WQ 可以合并,是因为$(WQ)\top 𝑊^{𝑈𝐾} 是常量,但是(WQ)\top R_{j-t} 𝑊^{𝑈𝐾}是与query向量的位置t相关的变量R_{j-t}$,即随推理过程中query的位置变化而变化,导致旧的缓存不能直接使用,所以无法直接合并。
为什么GQA的低秩投影没有受RoPE影响,因为GQA只减少了头数,计算时又恢复了头数,但是隐式恢复头数直接通过广播实现,不涉及特征维度改变序列长度改变;而MLA减小的是每个头的特征维度,计算时为了避免增加计算量,只能隐式恢复特征维度,即需要借助权重吸收,而两个权重之间又夹着RoPE,没办法权重吸收。
RoPE(Rotary Position Embedding)对 key 和 query 都是位置敏感的。
若直接将 RoPE 应用于压缩后的 key,升维矩阵 WUK 无法与 WQ 合并,影响推理效率?
一个简单的逻辑应该是把位置编码都应用到压缩后的特征上。
将 query 和 key 分为两部分,一部分就用MLA不使用RoPE 位置编码,另一部分用MQA使用位置编码:
对 query 和 key 分别应用 RoPE:
将输入的查询内容向量 ctQ通过矩阵 WQR投影到 RoPE 编码后的空间,得到分离后的旋转位置编码查询向量 qtR,并按多头nh分块。
[qt,1R;qt,2R;…;qt,nhR]=RoPE(WQRctQ)(14)
将隐藏状态 $ h_t $ 通过矩阵 WKR投影,并应用 RoPE 得到分离后的旋转位置编码键向量$ k^R_t $。
ktR=RoPE(WKRht)(15)
拼接压缩部分和 RoPE 部分:
将内容查询向量与旋转位置编码查询向量进行拼接,得到最终的第 i个头的查询向量。
qt,i=[qt,iC,qt,iR](16)
将内容键向量与旋转位置编码键向量拼接,得到最终的第i个头的键向量。
kt,i=[kt,iC,kt,iR](17)
注意力计算:
通过点积计算第 i 个头在时间步 t的查询向量与历史键向量的相关性,除以 dh+dhR进行缩放,然后使用 Softmax 得到注意力权重,对对应的值向量 vj,iC进行加权求和。
ot,i=j=1∑tSoftmaxdh+dhRqt,i⊤kj,ivj,iC(18)
最终输出:
将所有头的输出 ot,i拼接起来,并通过输出权重矩阵 WO得到最终的输出向量 ut。
ut=WO[ot,1;ot,2;…;ot,nh](19)
其中 WQR∈RdhRnh×dc′ 和$ W^{KR} \in \mathbb{R}{dR_h \times d}是分别用于生成分离查询向量和分离键向量的矩阵;RoPE(·)表示应用旋转位置编码的操作;符号[\cdot ;\cdot]$表示拼接操作。在推理阶段,分离的键向量也需要被缓存。因此,MLA需要一个包含 (dc+dhR)l元素的 KV 缓存。
参数说明:
MLA 的核心目标是降低推理时的显存占用和计算延迟,同时保持注意力效果。具体方法包括:
最终效果:
人工智能、图像处理,建筑审图
在结构工程审图领域,桩平面图的自动识别面临以下严峻挑战:1. 图纸上桩的画法多样,2. 单张图纸中桩结构高度密集,3. 受墙体和柱子等其他建筑元素的严重干扰,这使得传统的基于规则的检测方法显得力不从心,无法满足现代建筑审图的高精度与效率需求。
本项目通过创新性地结合基于规则和深度学习的算法,实现了高效、准确的桩检测。相较于基于规则的传统方法,本方法检测效率提高3倍,召回率提高了30%,准确率达到99%,显著优化了检测效果。通过自研自动化数据生成,自监督训练方案,替代完全依赖人工标注的传统方式,降低大量标注成本。总体来看,本项目实现了从无到有的技术突破,为结构检测带来了新的赋能。
名称:Detecting Text in Natural Image with Connectionist Text Proposal Network
论文:https://arxiv.org/abs/1609.03605
会议:ECCV 2016
github: https://github.com/tianzhi0549/CTPN
CTPN(Connectionist Text Proposal Network)是一种基于深度学习的文本检测算法,擅长在自然场景图像中定位文本行。其核心思想是将文本行分解为多个小文本段(text proposals),再通过序列连接形成完整文本行 。以下从算法流程、关键技术、优缺点及改进方向展开详解:
conv5
层输出)。模型输出:每个特征窗口设置k(=10)个相同宽度不同高度的候选框,每个候选框生成二分类判断是文字还是背景,2k;每个候选宽生成高度方向上下边界的微调,2k;每个候选宽生成一个水平微调, 1k。
查看全文 >>在IntelliJ IDEA 和Android Studio 中,可以通过以下步骤指定 Gradle 主目录(Gradle Home Directory)。这个设置允许你使用手动安装的 Gradle 版本,而不是依赖 IDE 自动下载的版本。
查看全文 >>要在安卓设备上运行使用 PyQt 编写的程序,需要解决一个关键问题:PyQt 是为桌面环境设计的,而安卓是一个移动操作系统,直接在安卓上运行 PyQt 程序并不支持。不过,可以通过一些工具和框架将 PyQt 应用适配到安卓平台。以下是实现这一目标的主要方法和步骤:
如果目标是开发跨平台的 Python 应用(包括安卓),可以考虑使用专门为移动设备设计的框架,例如 Kivy 或 BeeWare 。这些框架支持直接构建安卓应用,并且语法与 PyQt 类似。
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true