[论文笔记]Representation Learning with Contrastive Predictive Coding
引言
今天带来论文 Representation Learning with Contrastive Predictive Coding的笔记。
提出了一种通用的无监督学习方法从高维数据中提取有用表示,称为对比预测编码(Contrastive Predictive Coding,CPC)。使用了一种概率对比损失, 通过使用负采样使模型捕获潜在空间中的有用信息。
为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。
1. 总体介绍
从带标签数据中以端到端的方式学习高层表示是AI领域成功的应用之一,但仍存在许多挑战,例如数据效率、鲁棒性或泛化能力。无监督学习是通往鲁棒且通用表示学习的基石。
尽管无监督学习很重要,但它尚未取得类似于监督学习的突破。无监督学习中最常见的策略之一是预测未来的、缺失的或上下文信息。最近无监督学习的研究成果通过预测相邻词来学习单词表示。我们假设这些方法之所以有效,部分原因是预测相关值的上下文通常有条件依赖于相同的共享高级隐含信息。通过将此视为一个预测问题,我们自动推断出与表示学习相关的这些特征。
本篇工作提出以下三点:
- 将高维数据压缩到一个更紧凑的潜在嵌入空间中,在此空间中,条件预测更容易建模。
- 在这个潜在空间中使用强大的自回归模型来进行多步预测。
- 借鉴噪声对比估计来构建损失函数,与学习词嵌入的方法类似,使整个模型能端到端地训练。
得到的模型,CPC,可以应用于图像、语言、NLP等多种不同的数据模态。
2. 对比预测编码
2.1 动机和直觉
我们模型背后的主要直觉是学习表示,这些表示编码了高维信号不同部分之间潜在的共享信息。同时,它丢弃了更局部的低级信息和噪声。在时间序列和高维建模中,使用下一步预测的方法利用了信号的局部平滑性。当预测更远的未来时,共享信息的量会变得更低,模型需要推断更多全局结构。
预测高维数据的挑战之一是单峰损失函数,比如均方误差和交叉熵,并不十分有用,且通常需要强大的条件生成模型来重建数据中的每一个细节,这些模型的计算量很大,且在建模数据 x x x中的复杂关系时常常浪费能力,同时经常忽略上下文 c c c。例如,图像可能包含成千上万的比特信息,而高层隐变量(例如类别标签)所包含的信息则少得多(1024个类别只需10比特)。这表明直接建模 p ( x ∣ c ) p(x|c) p(x∣c)可能并不是提取 x x x和 c c c之间共享信息的最佳选择。
在预测未来信息时,我们将目标 x x x(未来)和上下文 c c c(现在)编码为紧凑的分布式向量表示,以最大程度地保留原始信号 x x x和 c c c 的互信息,定义为:
I ( x ; c ) = ∑ x , c p ( x , c ) log p ( x ∣ c ) p ( x ) (1) I(x;c) = \sum_{x,c} p(x,c) \log \frac{p(x|c)}{p(x)} \tag 1 I(x;c)=x,c∑p(x,c)logp(x)p(x∣c)(1)
通过最大化编码表示之间的互信息,我们提取输入信号共有的隐含变量。
这个公式怎么来的,通过互信息定义可以写成:
I ( x ; c ) = ∑ x , c p ( x , c ) log p ( x , c ) p ( x ) p ( c ) = ∑ x , c p ( x , c ) log p ( x ∣ c ) p ( c ) p ( x ) p ( c ) I(x;c) = \sum_{x,c} p(x,c) \log \frac{p(x,c)}{p(x)p(c)} =\sum_{x,c} p(x,c) \log \frac{p(x|c)p(c)}{p(x)p(c)} I(x;c)=x,c∑p(x,c)logp(x)p(c)p(x,c)=x,c∑p(x,c)logp(x)p(c)p(x∣c)p(c)
消掉 p ( c ) p(c) p(c)即得到了公式(1)。
2.2 对比预测编码
上图展示了对比预测编码模型的架构。首先,一个非线性编码器 g e n c g_{enc} genc将输入观测序列 x t x_t xt映射成一个潜在表示序列 z t = g e n c ( x t ) z_t=g_{enc}(x_t) zt=genc(xt)。接下来,一个自回归模型 g a r g_{ar} gar对潜在空间中的所有 z ≤ t z_{\leq t} z≤t进行总结,并生成一个上下文潜在表示 c t = g a r ( z ≤ t ) c_t=g_{ar}(z_{\leq t}) ct=gar(z≤t)。
这里不直接用生成模型 p k ( x t + k ∣ c t ) p_k(x_{t+k}|c_t) pk(xt+k∣ct)来预测未来的观测结果 x t + k x_{t+k} xt+k。相反,对密度比(density ratio)进行建模,该密度比保留了 x t + k x_{t+k} xt+k和 c t c_t ct之间的互信息(公式(1)),如下所示:
f k ( x t + k , c t ) ∝ p ( x t + k ∣ c t ) p ( x t + k ) (2) f_k(x_{t+k},c_t) \propto \frac{p(x_{t+k}|c_t)}{p(x_{t+k})} \tag 2 fk(xt+k,ct)∝p(xt+k)p(xt+k∣ct)(2)
其中 ∝ \propto ∝表示成比例于,即乘以一个常数。密度比 f f f可以是非归一化的(不需要积分到1)。这里我们使用一个简单的对数双线性模型:
f k ( x t + 1 , c t ) = exp ( z t + k T W k c t ) (3) f_k(x_{t+1},c_t) = \exp(z_{t+k}^T W_k c_t) \tag 3 fk(xt+1,ct)=exp(zt+kTWkct)(3)
也可以使用非线性网络。
通过使用密度比 f ( x t + k , c t ) f(x_{t+k},c_t) f(xt+k,ct)并使用编码器推断 z t + k z_{t+k} zt+k,减轻了模型对高维分布 x t x_t xt的建模负担。尽管我们无法直接评估 p ( x ) p(x) p(x)或 p ( x ∣ c ) p(x|c) p(x∣c),但我们可以使用来自这些分布的样本,从而允许我们使用基于将目标样本与随机采样的负样本进行比较的计数,例如噪声对比估计和重要性采样。
在提出的模型中, z t z_t zt或 c t c_t ct都可以作为下游任务的表示。如果需要来自过去的额外上下文,则可以使用自回归模型输出 c t c_t ct,比如语音识别,其中 z t z_t zt的感受野可能不足以捕获语音内容。在其他情况下,如果不需要额外的上下文, z t z_t zt可能更合适。如果下游任务需要对整个序列进行表示,比如分类任务,可以将 z t z_t zt或 c t c_t ct的表示在所有位置上进行池化。
任务类型的编码器和自回归模型都可以在本文提出的框架中使用。
2.3 InfoNCE损失和互信息估计
编码器和自回归模型都经过训练,以共同优化基于NCE的损失函数,我们将其称为InfoNCE。
给定一个包含 N N N个随机样本的集合 X = { x 1 , ⋯ , x N } X=\{x_1,\cdots,x_N\} X={x1,⋯,xN},其中包含一个来自 p ( x t + k ∣ c t ) p(x_{t+k}|c_t) p(xt+k∣ct)的正样本和 N − 1 N-1 N−1个来自提议(proposal)分布 p ( x t + k ) p(x_{t+k}) p(xt+k)的负样本。我们希望使公式(2)的结果最大,可以写出对应的交叉熵损失如下:
L N = − ∑ X [ p ( x , c ) log f k ( x t + k , c t ) ∑ x j ∈ X f k ( x j , c t ) ] = − E X [ log f k ( x t + k , c t ) ∑ x j ∈ X f k ( x j , c t ) ] \begin{aligned} \mathcal L_\text{N} &= -\sum_X \left[ p(x,c) \log \frac{f_k(x_{t+k},c_t)}{\sum_{x_j \in X} f_k(x_j,c_t) } \right] \\ &=-\Bbb E_X \left[ \log \frac{f_k(x_{t+k},c_t)}{\sum_{x_j \in X} f_k(x_j,c_t) }\right] \end{aligned} LN=−X∑[p(x,c)log∑xj∈Xfk(xj,ct)fk(xt+k,ct)]=−EX[log∑xj∈Xfk(xj,ct)fk(xt+k,ct)]
优化此损失将导致 f k ( x t + k , c t ) f_k(x_{t+k},c_t) fk(xt+k,ct)估计公式(2)中的密度比。下面给出证明。
公式(4)中的损失是将正样本正确分类的交叉熵损失,其中 f k ∑ X f k \frac{f_k}{\sum_X f_k} ∑Xfkfk是模型的预测结果。将此损失的最佳概率记为 p ( d = i ∣ X , c t ) p(d=i|X,c_t) p(d=i∣X,ct),其中 [ d = i ] [d=i] [d=i]表示样本 x i x_i xi是正样本。从条件分布 p ( x t + k ∣ c t ) p(x_{t+k}|c_t) p(xt+k∣ct)而不是提议分布 p ( x t + k ) p(x_{t+k}) p(xt+k)中抽取样本 x i x_i xi的概率可以推导如下:
p ( d = i ∣ X , c t ) = p ( x i ∣ c t ) = p ( x i ∣ c t ) ∏ l ≠ i p ( x l ) ∑ j = 1 N p ( x j ∣ c t ) ∏ l ≠ j p ( x l ) = p ( x i ∣ c t ) p ( x i ) p ( x i ) ∏ l ≠ i p ( x l ) ∑ j = 1 N p ( x j ∣ c t ) p ( x j ) p ( x j ) ∏ l ≠ j p ( x l ) = p ( x i ∣ c t ) p ( x i ) p ( X ) ∑ j = 1 N p ( x j ∣ c t ) p ( x j ) p ( X ) = p ( x i ∣ c t ) p ( x i ) ∑ j = 1 N p ( x j ∣ c t ) p ( x j ) (5) \begin{aligned} p(d=i|X,c_t) &= p(x_i|c_t) \\ &= \frac{ p(x_i|c_t)\prod_{l \neq i} p(x_l) }{\sum_{j=1}^N p(x_j|c_t) \prod_{l \neq j} p(x_l) } \\ &= \frac{ \frac{p(x_i|c_t)}{p(x_i)} p(x_i) \prod_{l \neq i} p(x_l) }{\sum_{j=1}^N \frac{p(x_j|c_t)}{p(x_j)} p(x_j) \prod_{l \neq j} p(x_l) } \\ &= \frac{ \frac{p(x_i|c_t)}{p(x_i)} p(X) }{\sum_{j=1}^N \frac{p(x_j|c_t)}{p(x_j)} p(X) } \\ &= \frac{ \frac{p(x_i|c_t)}{p(x_i)}}{\sum_{j=1}^N \frac{p(x_j|c_t)}{p(x_j)}} \\ \end{aligned} \tag 5 p(d=i∣X,ct)=p(xi∣ct)=∑j=1Np(xj∣ct)∏l=jp(xl)p(xi∣ct)∏l=ip(xl)=∑j=1Np(xj)p(xj∣ct)p(xj)∏l=jp(xl)p(xi)p(xi∣ct)p(xi)∏l=ip(xl)=∑j=1Np(xj)p(xj∣ct)p(X)p(xi)p(xi∣ct)p(X)=∑j=1Np(xj)p(xj∣ct)p(xi)p(xi∣ct)(5)
来解释下这个式子,这里假设 x i x_i xi是正样本,因此是从 p ( x t + k ∣ c t ) p(x_{t+k}|c_t) p(xt+k∣ct)采样出来的,而其他 l ≠ i l\neq i l=i是从 p ( x t + k ) p(x_{t+k}) p(xt+k)所采样出来的。这个式子表示给定上下文 c t c_t ct和数据 X X X, x i x_i xi是正样本的概率是多少。
我们看上式中第二个等式,分子表示 x i x_i xi是正样本的概率乘以其他 x l x_l xl( l ≠ i l\neq i l=i)是负样本的概率;分母表示正样本可能为 X X X中任何一个样本的概率之和。
我们第三个式子是构建整个样本的联合概率分布 p ( X ) p(X) p(X),它是一个常量。我们可以把它约掉得到最后一个等式。
可以发现分子和分母都简化为公式(2)中的密度比。公式(4)中 f ( x t + k , c t ) f(x_{t+k},c_t) f(xt+k,ct)的最优值与 p ( x t + k ∣ c t ) p ( x t + k ) \frac{p(x_{t+k}|c_t)}{p(x_{t+k})} p(xt+k)p(xt+k∣ct)成正比,与负样本的数量 N − 1 N-1 N−1的选择无关。
我们将这个最优值代回公式(4)并将 X X X分割为正样本和负样本 X neg X_\text{neg} Xneg,得到:
L N opt = − E X log [ p ( x t + k ∣ c t ) p ( x t + k ) p ( x t + k ∣ c t ) p ( x t + k ) + ∑ x j ∈ X neg p ( x j ∣ c t ) p ( x j ) ] = E X log [ 1 + p ( x t + k ) p ( x t + k ∣ c t ) ∑ x j ∈ X neg p ( x j ∣ c t ) p ( x j ) ] ≈ E X log [ 1 + p ( x t + k ) p ( x t + k ∣ c t ) ( N − 1 ) ] = E X log [ p ( x t + k ∣ c t ) + ( N − 1 ) p ( x t + k ) p ( x t + k ∣ c t ) ] ≥ E X log [ p ( x t + k ) p ( x t + k ∣ c t ) N ] = E X log [ p ( x t + k ) p ( x t + k ∣ c t ) ] + log N = − I ( x t + k , c t ) + log ( N ) \begin{aligned} \mathcal L_\text N^\text{opt} &= -\Bbb E_X \log \left[ \frac{\frac{p(x_{t+k}|c_t)}{p(x_{t+k})}}{\frac{p(x_{t+k}|c_t)}{p(x_{t+k})} + \sum_{x_j \in X_\text{neg}}\frac{p(x_j|c_t)}{p(x_j)} } \right] \\ &= \Bbb E_X \log \left[ 1 + \frac{p(x_{t+k})}{p(x_{t+k}|c_t)} \sum_{x_j \in X_\text{neg}}\frac{p(x_j|c_t)}{p(x_j)}\right] \\ &\approx \Bbb E_X \log \left[ 1 + \frac{p(x_{t+k})}{p(x_{t+k}|c_t)} (N-1) \right] \\ &= \Bbb E_X \log \left[ \frac{p(x_{t+k}|c_t) + (N-1)p(x_{t+k})}{p(x_{t+k}|c_t)} \right] \\ &\geq \Bbb E_X \log \left[ \frac{p(x_{t+k})}{p(x_{t+k}|c_t)} N\right] \\ &= \Bbb E_X \log \left[ \frac{p(x_{t+k})}{p(x_{t+k}|c_t)} \right] + \log N \\ &= -I(x_{t+k},c_t) + \log (N) \end{aligned} LNopt=−EXlog p(xt+k)p(xt+k∣ct)+∑xj∈Xnegp(xj)p(xj∣ct)p(xt+k)p(xt+k∣ct) =EXlog 1+p(xt+k∣ct)p(xt+k)xj∈Xneg∑p(xj)p(xj∣ct) ≈EXlog[1+p(xt+k∣ct)p(xt+k)(N−1)]=EXlog[p(xt+k∣ct)p(xt+k∣ct)+(N−1)p(xt+k)]≥EXlog[p(xt+k∣ct)p(xt+k)N]=EXlog[p(xt+k∣ct)p(xt+k)]+logN=−I(xt+k,ct)+log(N)
因此 I ( x t + k , c t ) ≥ log ( N ) − L N opt I(x_{t+k},c_t) \geq \log (N) -\mathcal L_\text N^\text{opt} I(xt+k,ct)≥log(N)−LNopt。我们通过这种方式评估 c t c_t ct和 x t + k x_{t+k} xt+k之间的互信息,最小化InfoNCE损失 L N \mathcal L_\text N LN最大化了互信息的下界,随着 N N N的增大,它也变得更加紧密。上式是怎么来的,讲一下个人的浅见,如有不对,欢迎指出。
第三个等式(约等于)是怎么来的,假设 p ( x j ∣ c t ) ≈ p ( x j ) p(x_j|c_t) \approx p(x_j) p(xj∣ct)≈p(xj)。
第五个等式因为 p ( x t + k ∣ c t ) ≥ p ( x t + k ) p(x_{t+k}|c_t) \geq p(x_{t+k}) p(xt+k∣ct)≥p(xt+k)。
总结
⭐ InfoNCE中的Info指的是互信息,目标是在学习过程中最大化互信息。InfoNCE在给定一个正样本和一组互样本的情况下,最大化正样本和一组负样本得分之间的对比,让模型能更好的学习数据的表示。
相关文章:
[论文笔记]Representation Learning with Contrastive Predictive Coding
引言 今天带来论文 Representation Learning with Contrastive Predictive Coding的笔记。 提出了一种通用的无监督学习方法从高维数据中提取有用表示,称为对比预测编码(Contrastive Predictive Coding,CPC)。使用了一种概率对比损失, 通过使用负采样使…...
Redis相关
Redis相关 什么是redis?redis可以干什么? Redis是一个c语言编写的nosql数据库(不仅仅是sql,泛指非关系型数据库,一般把非关系型数据库称为nosql数据库),数据在内存中以键值对的形式存储,读写速度快,提供数据持久化方式. 常常被广泛应用到做缓存 Redis使用场景 1.缓存 2…...
【优选算法】Binary-Blade:二分查找的算法刃(上)
文章目录 1.概念解析2.二分查找的简单模版3.二分查找的进阶模版4.x的平方根5.搜索插入位置希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 本篇是优选算法之二分查找算法,该算法是一种高效的在有序数组中查找特定元素的搜索算法 1.概…...
Docker--Docker Network(网络)
Docker Network(网络)是Docker容器之间和容器与外部网络之间的通信和连接的一种机制。以下是对Docker Network的详细解释: 一、Docker网络的重要性 Docker容器网络是为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作…...
转化率是衡量网页设计的一个重要指标,请问如何做?
AARRR是互联网产品运营中一个非常重要的模型,这些模型的每一个步骤都涉及到转化率问题,那么AARRR是是什么呢?转化漏斗是什么吗?转化率为什么重要?设计师在做网页设计的时候,如何提升转化率呢?本…...
运维工具之syncthing工具的安装和使用
一、syncthing工具简介 Syncthing是一款开源的文件同步工具,采用Go语言编写。它支持在多个操作系统上运行,包括Windows、macOS和Linux,以及BSD、Solaris和Android等。以下是对这款软件的详细介绍,主要功能: 实时文件同…...
国产数据库-崖山使用介绍
本文档基于崖山数据库23.3 个人版本,单机(主备)部署模式的情况下的使用介绍。 数据库实例状态: NOMOUNT:仅读取参数文件,不加载数据库 MOUNT:读取控制文件,加载数据库ÿ…...
primevue的<Menu>组件
1.使用场景 2.代码 1.给你的menu组件起个引用名 2.<Menu>组件需要一个MenuItem[] 3.你要知道MenuItem[ ]的特殊的数据格式,就像TreeNode[ ]一样,数据格式不对是不渲染的。。。。 常用的属性就这几种,js语言和java不一样,J…...
【玩转23种Java设计模式】行为型模式篇:备忘录模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...
便捷饭店点餐小程序的设计与实现ssm+论文源码调试讲解
第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…...
微信小程序Uniapp
使用命令行创建项目(vuets) npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project然后用HBX打开项目 再安装依赖 npm i 再运行开发版本,生成dist目录 pnpm dev:mp-weixin 注意要设置APPid 再用微信小程序打开...
Android GameActivity(NativeActivity)读写文件
最近研究native android相关内容,其中最棘手的就是文件读写问题,最主要的是相关的文档很少。这里写下我所知道的方法。 由于本人使用的是Android14[arm64-v8a]版本的设备,能访问的路径相当有限,如果想要访问更多的路径,就不得不申…...
《计算机网络A》单选题-复习题库解析-2
目录 51、下列关于以太网网卡地址特点的说法中,不正确的是( )。 52、当一个Web Browser向一个使用标准服务器端口的Web Server提出请求时,那么在服务返回的响应包中,所使用的源端口是( ࿰…...
GPU 进阶笔记(二):华为昇腾 910B GPU
大家读完觉得有意义记得关注和点赞!!! 1 术语 1.1 与 NVIDIA 术语对应关系1.2 缩写2 产品与机器 2.1 GPU 产品2.2 训练机器 底座 CPU功耗操作系统2.3 性能3 实探:鲲鹏底座 8*910B GPU 主机 3.1 CPU3.2 网卡和网络3.3 GPU 信息 3.3…...
如何利用 ClickHouse 实现高级分析:MySQL 到 ClickHouse 实时数据同步指南
在数据驱动的时代,企业必须依靠先进的数据分析能力来提升竞争力。随着数据量的激增和业务需求的复杂化,传统的关系型数据库已经无法满足高效处理和实时分析的需求。ClickHouse 作为一款高性能的列式数据库,凭借其卓越的查询性能和可扩展性&am…...
Python读取TIF文件
在Python中,逐帧读取TIFF文件(尤其是多页TIFF文件)可以使用tifffile库或Pillow库。以下是两种方法的示例: 方法 1:使用 tifffile 逐帧读取 tifffile 是一个专门用于处理TIFF文件的库,支持多页TIFF文件的逐…...
vue3+ts+element-plus 表单el-form取消回车默认提交
问题描述:在表单el-form中的el-input中按回车后,页面会刷新,url也会改变, 回车前: 回车后: 相关代码: 解决方法1:在 el-form 上阻止默认的 submit 事件,增加 submit.pre…...
面试经典150题——滑动窗口
文章目录 1、长度最小的子数组1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、无重复字符的最长子串2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、串联所有单词的子串3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、最小覆盖子串4.1 题目链接4.2 题目描…...
目标检测之DINO详解
相关链接 论文:[2203.03605] DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detectionhttps://arxiv.org/abs/2203.03605 代码:...
Linux指令
1. 将一个文件夹中的前5000张图片移动到另一个文件夹 可以使用 find 和 mv 命令来实现将一个文件夹 folder1 中的前 5000 张 jpg 图片移动到另一个文件夹 folder2。下面是具体的步骤: 首先,确保 folder2 存在。如果不存在,可以使用 mkdir 命…...
groovy:多线程 简单示例
在Groovy中,多线程编程与Java非常相似,因为Groovy运行在Java虚拟机(JVM)上,并且可以利用Java的所有并发工具。以下是一些在Groovy中实现多线程编程的方法: class MyThread extends Thread {Overridevoid…...
硬件产品:做产品,不仅仅是产品思维
目录 前言 1. 产品思维阶段 2. 流量思维阶段 3. 用户思维阶段 作者简介 前言 从思维层面来看, 做产品会经历三个阶段,分别是: 1. 产品思维阶段; 2. 流量思维阶段; 3. 用户思维阶段。 如果不理解这三个思维…...
【小程序开发】解决 HBuilder X 提示“本项目类型无法运行到小程序模拟器”
今天在hbuilder引入一个项目时,准备将该项目在微信开发者工具上运行时,发现提示“本项目类型”,如何解决这个问题? 问题如下: 第一:检查一下文件夹是否为一级文件夹(如图) 不要有多个…...
RuoYi-Vue从http升级为https(Jar+Nginx)
一、前提条件 1.已通过数字证书管理服务控制台签发证书。 2.SSL证书绑定的域名已完成DNS解析,即域名与主机IP地址相互映射。 附:阿里云网站运维检测平台 3.已在Web服务器开放443端口(HTTPS通信的标准端口)。 如果使用的是阿里云ECS服务器,请确保已经在安全组规则入方向…...
探索 Yocto-Meta-OpenEuler:嵌入式开发的强大基石
title: 探索 Yocto-Meta-OpenEuler:嵌入式开发的强大基石 date: ‘2024-11-19’ category: blog tags: Yocto-Meta-OpenEuler嵌入式系统开源项目定制化开发 sig: EmbeddedTech archives: ‘2024-12’ author:way_back summary: Yocto-Meta-OpenEuler 为嵌入式系统开…...
leetcode 3219. 切蛋糕的最小总开销 II
题目:3219. 切蛋糕的最小总开销 II - 力扣(LeetCode) 排序贪心。 开销越大的越早切。 注意m或n为1的情况。 class Solution { public:long long minimumCost(int m, int n, vector<int>& horizontalCut, vector<int>&…...
UniApp 打开文件工具,获取文件类型,判断文件类型
注意:以下代码使用 typeScript 开发,如果想在 js 中使用,可参考 npm 已经发布的包:https://www.npmjs.com/package/uni-easy-file NPM 使用 如果想直接在 npm 项目中使用可以直接执行以下命令 npm i uni-easy-file然后直接使用 …...
webpack打包node后端项目
webpack打包后端项目 后端项目写好了,感觉也可以打包一下,然后就想到了用webpack试试 先要下载webpack和webpack-cli npm install webpack webpack-cli然后创建webpack配置文件webpack.config.js 核心配置为entry、output、target 但是因为咱们是后…...
《学习之道》
《学习之道》主要讲述了以下内容: 学习的原理 大脑的两种认知模式:介绍了专注模式和发散模式。专注模式适合集中精力解决具体问题、进行深度理解和记忆推理,但长时间使用易疲惫和陷入思维定式;发散模式则让大脑在更广泛的认知网…...
随笔 | 写在2024的最后一天
. 前言 转眼又到了一年的末端。过去这一年,和前些年有些不同,变化巨大,感触良多。多到一时竟不知从何开始写。今天这篇随笔,因为时间有限,可能文法也会有些凌乱,就是想到哪里写到哪里,如果未来…...
对三层架构的梳理(Controller、Service、Dao)
项目结构如下: src├── main│ └── java│ └── com│ └── example│ └── demo│ ├── controller│ │ └── UserController.java│ ├…...
常用的公共 NTP(网络时间协议)服务器
公共 NTP 服务列表 以下是一些常用的公共 NTP(网络时间协议)服务器,供您参考: 中国地区公共 NTP 服务器 国家授时中心 NTP 服务器:ntp.ntsc.ac.cn中国 NTP 快速授时服务:cn.ntp.org.cn阿里云公共 NTP 服务…...
SimForge HSF 案例分享|复杂仿真应用定制——UAVSim无人机仿真APP(技术篇)
导读 「神工坊」核心技术——「SimForge HSF高性能数值模拟引擎」支持工程计算应用的快速开发、自动并行,以及多域耦合、AI求解加速,目前已实现航发整机数值模拟等多个系统级高保真数值模拟应用落地,支持10亿阶、100w核心量级的高效求解。其低…...
ROS2+OpenCV综合应用--10. AprilTag标签码追踪
1. 简介 apriltag标签码追踪是在apriltag标签码识别的基础上,增加了小车摄像头云台运动的功能,摄像头会保持标签码在视觉中间而运动,根据这一特性,从而实现标签码追踪功能。 2. 启动 2.1 程序启动前的准备 本次apriltag标签码使…...
Qanything 2.0源码解析系列6 PDF解析逻辑
Qanything 2.0源码解析系列6: PDF解析逻辑 type: Post status: Published date: 2024/12/04 summary: 深入剖析Qanything是如何拆解PDF的,核心是pdf转markdown category: 技术分享 原文:www.feifeixu.top 😀 前言: 在前面的文章中探究了图片是怎么进行解析的,这篇文章对…...
IDEA修改编译版本
目录 一、序言 二、修改maven配置 1.修改 2.代码 三、pom文件配置 1.修改 2.代码 3.问题 一、序言 有两种方法可以帮助大家解决IDEA每次刷新maven的pom配置时,会发生发行源版本不正常的报错。个人推荐第二种,原因:第二种你刷新maven后…...
Python 向量检索库Faiss使用
Faiss(Facebook AI Similarity Search)是一个由 Facebook AI Research 开发的库,它专门用于高效地搜索和聚类大量向量。Faiss 能够在几毫秒内搜索数亿个向量,这使得它非常适合于实现近似最近邻(ANN)搜索&am…...
LunarVim安装
LunarVim以其丰富的功能和灵活的定制性,迅速在Nvim用户中流行开来。它不仅提供了一套完善的默认配置,还允许用户根据自己的需求进行深度定制。无论是自动补全、内置终端、文件浏览器,还是模糊查找、LSP支持、代码检测、格式化和调试ÿ…...
机器学习随机森林回归时间序列预模型中时间滑动窗口作用以及参数设置
一、时间序列模型中时间滑动窗口作用 在时间序列模型中,时间滑动窗口(Sliding Window)起到了至关重要的作用。它是一种常见且有效的数据表示技术,通过将时间序列数据分割成多个固定大小的窗口,来捕捉和分析数据中的模式…...
【ArcGIS技巧】如何制作轨迹动画
轨迹是日常生活与工作经常要用到的,如跑步轨迹、自驾路线,考察轨迹等。地图根据路线生成轨迹也很好玩,今天小编就带大家用arcmap来实现这一功能,让你的制图动起来。 1、数据准备 在开始制作轨迹动画之前,准备一张影像…...
使用 Docker 搭建 Hadoop 集群
1.1. 启用 WSL 与虚拟机平台 1.1.1. 启用功能 启用 WSL并使用 Moba 连接-CSDN博客 1.2 安装 Docker Desktop 最新版本链接:Docker Desktop: The #1 Containerization Tool for Developers | Docker 指定版本链接:Docker Desktop release notes | Do…...
Bash 中的 2>1 | tee 命令详解
Bash 中的 2>&1 | tee 命令详解 在 Linux 和 Unix 系统中,命令行提供了强大的输出控制功能,能够灵活地处理标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。本文将详…...
hpcrunner
title: 探索 Hpcrunner:高性能计算的得力助手 date: ‘2024-12-31’ category: blog tags: Hpcrunner高性能计算任务调度资源优化 sig: HPC archives: ‘2024-12’ author:way_back summary: Hpcrunner 作为高性能计算领域的一款实用工具,专注于优化任务…...
关于 PPPOE技术的详细解释
PPPoE(以太网点对点协议)是一种网络协议,它通过光纤将点对点协议(PPP)封装以实现宽带接入点。PPPoE主要用于ADSL和光纤等宽带接入技术中,它允许多个用户共享同一个交换机连接,同时为每个用户提供…...
java下载文件流,不生成中间文件。
java下载文件流,不生成中间文件。 代码设计:代码实现 代码设计: 从前端获取的数据经过后端加工后,生成文件流,并返回前端,(不生成中间文件,注意内存,记得关闭流…...
Android:bug记录(简单)
1、theme 冲突 问题: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.demokotlinapplication/com.example.demokotlinapplication.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (…...
【模块系列】STM321.69TFT屏幕
前言 在翻翻自己的器件盒的时候,发现这块好久之前买的TFT屏了,想起还没有用STM32点亮过,手头上正好有立创的梁山派STM32F4,就试着按照网上的文章教程顺便移植个LVGL看看,然后就有了就本文。 代码工程命名的是LvglDemo&…...
机器学习详解(11):分类任务的模型评估标准
模型评估是利用不同的评估指标来了解机器学习模型的性能,以及其优势和劣势的过程。评估对于确保机器学习模型的可靠性、泛化能力以及在新数据上的准确预测能力至关重要。 文章目录 1 介绍2 评估准则3 分类指标3.1 准确率 (Accuracy)3.2 精确率 (Precision)3.3 召回率…...
UE5材质节点Camera Vector/Reflection Vector
Camera Vector相机向量,输出像素到相机的方向,结果归一化 会随着相机移动而改变 Reflection Vector 反射向量,物体表面法线反射到相机的方向,x和y和camera vector相反 配合hdr使用...
基于Springboot + vue实现的夕阳红公寓管理系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...