NLP深度学习 DAY5:Sequence-to-sequence 模型详解
Seq2Seq(Sequence-to-Sequence)模型是一种用于处理输入和输出均为序列任务的深度学习模型。它最初被设计用于机器翻译,但后来广泛应用于其他任务,如文本摘要、对话系统、语音识别、问答系统等。
核心思想
Seq2Seq 模型的目标是将一个序列(如一句话)转换为另一个序列,例如:
-
输入:英文句子 "Hello, how are you?"
-
输出:法语句子 "Bonjour, comment ça va ?"
模型结构
Seq2Seq 模型通常由两部分组成:
-
编码器(Encoder):
-
将输入序列(如源语言句子)编码为一个固定长度的上下文向量(Context Vector),用于捕捉输入序列的语义信息。
-
常用循环神经网络(RNN、LSTM、GRU)或 Transformer 作为编码器。
-
-
解码器(Decoder):
-
基于编码器生成的上下文向量,逐步生成输出序列(如目标语言句子)。
-
解码器通常也是一个循环神经网络(或 Transformer),每一步生成一个输出词,直到生成结束符(如
<EOS>
)。
-
首先,来简单介绍下RNN(循环神经网络)结构:
1. RNN 简介
RNN结构
RNN中,每个单元接受两个输入,一个是当前时间步输入的信息 ,另一个是上一个单元的隐藏层状态
。为什么这种结构的RNN适合用于做文本等序列型数据的任务,主要是因为隐藏状态的存在使得模型具有记忆性。针对不同的任务,根据输入和输出的数量,通常对RNN结构进行调整。
RNN的常见几种结构
1.1 N to N
该模型处理的一般是输入和输出序列长度相等的任务,如
- 词性标注
- 语言模型(Language Modeling)
1.2 1 to N
此类结构的输入长度为1,输出长度为N,一般又可以分为两种:一种是将输入只输入到第一个神经元,另一种将输入输入到所有神经元。
一般用于以下任务:
图像生成文字,一般输入 X 为图片,输出为一段图片描述性的文字;
输入音乐类别,生成对应的音乐
根据小说(新闻情感)类别,生成对应的文字
1.3 N to 1
和1 to N相反,一般常见任务有:
- 序列分类任务,如给定一段文本或语音序列,归类(情感分类,主题分类等)
2. Seq2Seq 模型
经过上面对几种RNN结构的分析,不难发现RNN结构大多对序列的长度比较局限,对于类似于机器翻译的任务,输入和输出长度并不对等,为N to M的结构,简单的RNN束手无策,因此便有了新的模型,Encoder-Decoder模型,也就是Seq2Seq模型。
模型一般由两部分组成:第一部分是Encoder部分,用于对输入的N长度的序列进行表征;第二部分是Decoder部分,用于将Encoder提取出的表征建立起到输出的M长度序列的映射。
2.1 编码器 Encoder
Encoder部分一般使用了普通RNN的结构。其将一个序列表征为一个定长的上下文向量c,计算方式有多种,如下:
2.2 解码器 Decoder
相对于编码器而言,解码器的结构更多,下面介绍三种:
第一种
这种结构直接Encoder得到的上下文向量作为RNN的初始隐藏状态输入到RNN结构中,后续单元不接受 c 的输入,计算公式如下:
- 隐藏状态的更新:
第二种
第二种将Encoder得到的上下文向量作为每个神经单元的输入,不再是只作为第一个单元的初始隐藏状态。计算公式如下:
第三种
第三种在 c 的处理上和第二种类似,但是区别在于将前一个神经单元的输出作为当前神经单元的输出。计算公式如下:
3. Seq2Seq中的Trick
3.1 Teacher Forcing
主要针对第三种Decoder应用。当某一个单元输出出错时,如果将其输出传递给下一个单元,可能导致错误传递下去。这时候,需要在一定程度上减少这种传递,就采用按一定的比例决定是否对神经单元采用上一个上一个单元的输出作为输入。即:
3.2 Attention 机制(很重要)
提出Attention机制之前,我们先来看下之前的结构有什么问题:
核心问题是当序列过长时,上述的Encoder输出的上下文向量 c 无法记住所有信息,会出现长序列梯度消失的问题。比如句子有100个词,那么c里面可能丢失了前几个词的信息。
Attention 机制是怎样的?
Attention 机制其实是参考了人在翻译文章时候的注意力机制,它会将模型的注意力放在当前翻译的单词上,换句话说,它并不像前面提到的Encoder的结构一样对整个句子用一个表征,它对于每个单词都有一个以单词为中心的表征。Encoder结构如下:
3.3 束搜索(Beam Search)
注意:Beam Search只用于测试,不用于训练过程。
当模型训练好后,给其输入一段话,其输出的每个单元的 y 给的是各个词的概率,我们如何根据概率选词且如何判断是否句子终止呢?
采取的方法是在每个时间步,选取当前时间步条件概率最大的k个词,作为该时间步的候选输出序列。如下图,k选择2,第一步p(A|c)和p(C|c)最大;第二步 P(AB|c),P(CE|c)最大;第三步P(ABD|c),P(CED|c)最大。
这样,得到的最终候选序列就是各个时间步的得到的序列的集合,下图种即为6个 {A, C, AB, CE, ABD, CED}。那么最终预测结果就是要从这6个中选出分最高的。
这时候,可能有小伙伴会发现,那按概率算的话,序列越长的概率肯定越小呀,所以一般最后分数计算会有一个和序列长度有关的惩罚系数,如下:
其中L为候选序列的长度,α 一般选0.75. 这样一来,序列长的对应的系数更小,而由于取了对数,概率的对数是负数,如此变化后会使得长序列和短序列处于一个可比的情形。
4. 详细代码对比(RNN VS Seq2Seq)
4.1 基础 RNN 示例(以文本分类为例)
4.1.1 模型结构
- 输入:一个批次的句子(或序列),已被转化为数字索引表示(如词向量)。
- RNN:使用
nn.RNN
来提取序列特征。 - 输出:可以是序列最后一个时间步(或平均池化后的序列向量)接一个线性层,最终输出分类结果。
import torch
import torch.nn as nnclass BasicOnlyRNNModel(nn.Module):def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim,num_layers=1, bidirectional=False):super(BasicOnlyRNNModel, self).__init__()# 词向量层self.embedding = nn.Embedding(vocab_size, embedding_dim)# 仅使用RNNself.rnn = nn.RNN(input_size=embedding_dim, hidden_size=hidden_dim, num_layers=num_layers,batch_first=True,bidirectional=bidirectional)# 双向时需要 *2self.num_directions = 2 if bidirectional else 1rnn_output_dim = hidden_dim * self.num_directions# 全连接层, 用于将 RNN 的输出映射到分类空间self.fc = nn.Linear(rnn_output_dim, output_dim)def forward(self, text):"""text: [batch_size, seq_len]"""# 嵌入: [batch_size, seq_len] -> [batch_size, seq_len, embedding_dim]embedded = self.embedding(text)# 前向传播 RNN# rnn_out: [batch_size, seq_len, hidden_dim * num_directions]# hidden : [num_layers * num_directions, batch_size, hidden_dim]rnn_out, hidden = self.rnn(embedded) # 取最后一层的 hidden state# hidden 的形状: [num_layers * num_directions, batch_size, hidden_dim]# 若是单向 RNN,hidden[-1] 即可# 若是双向 RNN,需拼接正向和反向最后时刻if self.num_directions == 1:out = hidden[-1, :, :] # [batch_size, hidden_dim]else:# 对双向的情况,hidden[-2] 与 hidden[-1] 分别是正向/反向最后时刻out = torch.cat((hidden[-2, :, :], hidden[-1, :, :]), dim=1)# [batch_size, hidden_dim * 2]# 全连接映射至分类空间logits = self.fc(out) # [batch_size, output_dim]return logits# ================ 以下是训练/推理时的简单示例 ================
if __name__ == "__main__":# 假设我们有一些超参数vocab_size = 10000 # 词典大小embedding_dim = 128 # 词向量维度hidden_dim = 256 # RNN 隐藏层维度output_dim = 2 # 假设做二分类num_layers = 1 # RNN 层数bidirectional = True # 是否使用双向model = BasicOnlyRNNModel(vocab_size=vocab_size,embedding_dim=embedding_dim,hidden_dim=hidden_dim,output_dim=output_dim,num_layers=num_layers,bidirectional=bidirectional)# 假设当前批次的输入batch_size = 32seq_len = 50batch_text = torch.randint(0, vocab_size, (batch_size, seq_len)) # [batch_size, seq_len]# 前向传播logits = model(batch_text) # 形状: [32, 2]print(logits.shape) # 输出: torch.Size([32, 2])
基础 RNN 模型特点
- 数据流:输入序列 → 嵌入层 → RNN → 最后一层 hidden state → 全连接层 → 输出。
- 应用场景:常用于序列分类/回归(文本分类、情感分析、序列标注等)。
- 优点:结构简单,实现快速。
- 缺点:对长序列依赖可能不够,若需要输出一个序列(而不是一个标量或一个向量),就需要进一步改造或循环解码。
二、Seq2Seq 示例(以机器翻译为例)
对于Seq2Seq模型,一般包含 Encoder(编码器)和Decoder(解码器)两个主要部分(可选地加入Attention机制)。下文示例使用 LSTM 结构,演示最基础的编码器-解码器形式(不带注意力机制)。带注意力的情况会多一步 Attention 计算。
1. Encoder(编码器)
import torch
import torch.nn as nnclass Encoder(nn.Module):def __init__(self, vocab_size, embedding_dim, hidden_dim, num_layers=1):super(Encoder, self).__init__()self.hidden_dim = hidden_dimself.num_layers = num_layersself.embedding = nn.Embedding(vocab_size, embedding_dim)self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers, batch_first=True)def forward(self, src):"""src: [batch_size, src_len]"""embedded = self.embedding(src) # [batch_size, src_len, embedding_dim]outputs, (hidden, cell) = self.lstm(embedded)# outputs: [batch_size, src_len, hidden_dim]# hidden: [num_layers, batch_size, hidden_dim]# cell: [num_layers, batch_size, hidden_dim]return hidden, cell
2. Decoder(解码器)
class Decoder(nn.Module):def __init__(self, vocab_size, embedding_dim, hidden_dim, num_layers=1):super(Decoder, self).__init__()self.hidden_dim = hidden_dimself.num_layers = num_layersself.embedding = nn.Embedding(vocab_size, embedding_dim)self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers, batch_first=True)self.fc_out = nn.Linear(hidden_dim, vocab_size) # 输出到词表大小def forward(self, tgt, hidden, cell):"""tgt: [batch_size] 当前时间步解码器输入(可以是一个词或一批词)hidden, cell: 编码器传过来的(或者上一时间步传下来的)隐状态"""# 解码器一般一次输入一个token,也可以批量处理多个# 这里假设 tgt 形状是 [batch_size],先unsqueeze到[batch_size, 1]tgt = tgt.unsqueeze(1) # [batch_size, 1]embedded = self.embedding(tgt) # [batch_size, 1, embedding_dim]output, (hidden, cell) = self.lstm(embedded, (hidden, cell))# output: [batch_size, 1, hidden_dim]prediction = self.fc_out(output.squeeze(1)) # [batch_size, vocab_size]return prediction, hidden, cell
3. Seq2Seq 整合
class Seq2Seq(nn.Module):def __init__(self, encoder, decoder, device):super(Seq2Seq, self).__init__()self.encoder = encoderself.decoder = decoderself.device = devicedef forward(self, src, tgt, teacher_forcing_ratio=0.5):"""src: [batch_size, src_len]tgt: [batch_size, tgt_len] 训练时通常会有“开始标志 <sos>”和“结束标志 <eos>”。teacher_forcing_ratio: float,表示在训练时使用老师强制的概率"""batch_size = src.shape[0]tgt_len = tgt.shape[1]vocab_size = self.decoder.fc_out.out_features# 用于存储解码器每个时间步的输出词分布outputs = torch.zeros(batch_size, tgt_len, vocab_size).to(self.device)# 1. 编码器对源序列进行编码,获取初始 hidden, cellhidden, cell = self.encoder(src)# 2. 解码器的第一个输入通常是 <sos>input_t = tgt[:, 0] # 取第0个词(即<sos>)for t in range(1, tgt_len):# 2.1 将当前时间步的 token 喂给 Decoderoutput, hidden, cell = self.decoder(input_t, hidden, cell)# output 形状: [batch_size, vocab_size]# 2.2 存储outputs[:, t, :] = output# 2.3 决定下一时间步输入:是用模型自己的预测还是用老师的标签(teacher forcing)teacher_force = torch.rand(1).item() < teacher_forcing_ratiotop1 = output.argmax(1) # [batch_size], 最大值所对应的词索引input_t = tgt[:, t] if teacher_force else top1return outputs
Seq2Seq 模型特点
- 整体结构:输入序列先经过
Encoder
编码,将序列信息“压缩”到hidden, cell
(或h_n, c_n
),再在解码阶段通过Decoder
逐步解码出目标序列。 - 输出:是一个序列而非一个标量/向量,通过循环或一步步地喂入上一步的输出(或真实标签)来生成。
- 扩展:在解码阶段可加入
Attention
(Luong/Bahdanau 等),或者进一步用Transformer
替代 RNN,形成更强大的序列到序列生成模型。 - 应用场景:机器翻译、文本摘要、对话系统、序列到序列的生成任务(如代码自动生成、语音到文本等)。
三、RNN VS Seq2Seq(回答问题:为什么要有编码器?直接把词向量拼在一起,然后用 RNN 1 to N 不行吗?)
在序列到序列(Seq2Seq)任务中(如机器翻译、文本摘要等),直接使用RNN后通过全连接层输出(1 to N)看似简单,但存在以下关键问题,而编码器-解码器(Encoder-Decoder)结构通过分步编码和解码的方式有效解决了这些挑战:
在序列到序列(Seq2Seq)任务中(如机器翻译、文本摘要等),直接使用词嵌入后通过全连接层(“M个神经元”)输出看似简单,但存在以下关键问题,而编码器-解码器(Encoder-Decoder)结构通过分步编码和解码的方式有效解决了这些挑战:
1. 序列的时序依赖性
自然语言中的单词顺序至关重要。例如:
-
句子1:
猫追老鼠
-
句子2:
老鼠追猫
两个句子包含相同的词,但含义完全相反。 -
简单词嵌入+全连接的缺陷:
若直接将所有词嵌入拼接成一个向量(如[猫, 追, 老鼠]
→ 一个长向量),模型会丢失词序信息,无法区分两个句子的差异。 -
编码器-解码器的优势:
通过LSTM或Transformer按顺序处理输入词,编码器能够保留词序信息,并在隐藏状态中传递时序依赖关系。
2. 输入和输出的变长问题
在Seq2Seq任务中,输入和输出的长度通常是动态变化的。例如:
-
输入:英文句子
"Hello world"
(2个词) -
输出:中文翻译
"你好世界"
(3个词) -
简单词嵌入+全连接的缺陷:
全连接层需要固定维度的输入和输出,无法处理变长序列。 -
编码器-解码器的优势:
-
编码器可处理任意长度的输入序列,将其压缩为固定长度的上下文向量(
hidden
和cell
)。 -
解码器基于上下文向量逐步生成变长的输出序列(逐词生成,直到预测到
<eos>
)。
-
3. 长距离依赖建模
语言中常存在跨越多个单词的依赖关系。例如:
-
句子:
The cat, which was hungry and had been wandering the streets for days, finally found some food.
主句的主语cat
与谓语found
相隔很远。 -
简单词嵌入+全连接的缺陷:
全连接层难以捕捉长距离依赖(尤其是当句子较长时)。 -
编码器-解码器的优势:
-
LSTM通过门控机制(遗忘门、输入门)逐步更新
cell
状态,传递长期信息。 -
Transformer通过自注意力机制(Self-Attention)直接建模词与词之间的全局依赖。
-
4. 信息压缩与语义表示
编码器的核心作用是将输入序列编码为一个全局语义表示(上下文向量)。
-
简单词嵌入+全连接的缺陷:
直接将所有词嵌入拼接为一个向量,缺乏对整体语义的抽象(相当于“词袋模型”)。 -
编码器-解码器的优势:
-
编码器通过循环或注意力机制逐步融合上下文信息,生成紧凑的语义表示。
-
解码器基于此表示逐步展开生成目标序列,确保输出与输入语义一致。
-
5. 模型效率与参数共享
-
简单词嵌入+全连接的缺陷:
若输入长度为N
,输出长度为M
,全连接层的参数量为(N×embedding_dim) × M
,随序列长度增长迅速膨胀,导致计算成本高且易过拟合。 -
编码器-解码器的优势:
-
LSTM或Transformer通过参数共享(同一层处理所有时间步),参数量仅与隐藏层维度相关,与序列长度无关。
-
例如,LSTM的参数量为
4×(embedding_dim + hidden_dim)×hidden_dim
,与输入长度N
无关。
-
6. 实际案例对比
假设用两种模型处理机器翻译任务:
方案1:简单全连接
-
输入:将源句子所有词嵌入拼接为一个向量(如
N=5
,embedding_dim=256
→ 输入维度1280
)。 -
输出:直接映射到目标语言的词表(如
vocab_size=10000
),参数量为1280×10000 = 12.8M
。 -
问题:
-
无法处理长度变化的输入输出。
-
无法建模词序和长距离依赖。
-
参数量大且难以训练。
-
方案2:编码器-解码器(LSTM)
-
编码器:LSTM逐步处理源序列,输出上下文向量(如
hidden_dim=256
)。 -
解码器:LSTM基于上下文向量逐词生成目标序列。
-
参数量:编码器和解码器的LSTM参数量均为
4×(256+256)×256 ≈ 1M
,总计约2M
。 -
优势:
-
处理变长序列。
-
建模词序和长距离依赖。
-
参数量小且高效。
-
总结
编码器-解码器结构通过分步编码和解码,解决了以下核心问题:
-
时序依赖性:保留词序信息。
-
变长序列处理:动态生成输出。
-
长距离依赖建模:通过LSTM或注意力机制捕捉全局关系。
-
语义压缩与传递:生成紧凑的上下文表示。
-
模型效率:参数共享降低计算成本。
直接使用词嵌入+全连接的方案虽然在理论上可行,但无法满足实际任务的需求。编码器-解码器及其改进模型(如Transformer)已成为序列建模的主流方法,广泛应用于机器翻译、对话系统、文本生成等任务。
相关文章:
NLP深度学习 DAY5:Sequence-to-sequence 模型详解
Seq2Seq(Sequence-to-Sequence)模型是一种用于处理输入和输出均为序列任务的深度学习模型。它最初被设计用于机器翻译,但后来广泛应用于其他任务,如文本摘要、对话系统、语音识别、问答系统等。 核心思想 Seq2Seq 模型的目标是将…...
音视频多媒体编解码器基础-codec
如果要从事编解码多媒体的工作,需要准备哪些更为基础的内容,这里帮你总结完。 因为数据类型不同所以编解码算法不同,分为图像、视频和音频三大类;因为流程不同,可以分为编码和解码两部分;因为编码器实现不…...
数据分析系列--⑦RapidMiner模型评价(基于泰坦尼克号案例含数据集)
一、前提 二、模型评估 1.改造⑥ 2.Cross Validation算子说明 2.1Cross Validation 的作用 2.1.1 模型评估 2.1.2 减少过拟合 2.1.3 数据利用 2.2 Cross Validation 的工作原理 2.2.1 数据分割 2.2.2 迭代训练与测试 2.2.3 结果汇总 …...
【react+redux】 react使用redux相关内容
首先说一下,文章中所提及的内容都是我自己的个人理解,是我理逻辑的时候,自我说服的方式,如果有问题有补充欢迎在评论区指出。 一、场景描述 为什么在react里面要使用redux,我的理解是因为想要使组件之间的通信更便捷…...
nacos 配置管理、 配置热更新、 动态路由
文章目录 配置管理引入jar包添加 bootstrap.yaml 文件配置在application.yaml 中添加自定义信息nacos 配置信息 配置热更新采用第一种配置根据服务名确定配置文件根据后缀确定配置文件 动态路由DynamicRouteLoaderNacosConfigManagerRouteDefinitionWriter 路由配置 配置管理 …...
前端知识速记:节流与防抖
前端知识速记:节流与防抖 什么是防抖? 防抖是一种控制事件触发频率的方法,通常用于处理用户频繁触发事件的场景。防抖的核心思想是将多个连续触发事件合并为一个事件,以减少执行次数。它在以下场景中特别有效: 输入…...
2.攻防世界PHP2及知识点
进入题目页面如下 意思是你能访问这个网站吗? ctrlu、F12查看源码,什么都没有发现 用kali中的dirsearch扫描根目录 命令如下,根据题目提示以及需要查看源码,扫描以php、phps、html为后缀的文件 dirsearch -u http://61.147.17…...
【ubuntu】双系统ubuntu下一键切换到Windows
ubuntu下一键切换到Windows 1.4.1 重启脚本1.4.2 快捷方式1.4.3 移动快捷方式到系统目录 按前文所述文档,开机默认启动ubuntu。Windows切换到Ubuntu直接重启就行了,而Ubuntu切换到Windows稍微有点麻烦。可编辑切换重启到Windows的快捷方式。 1.4.1 重启…...
C#属性和字段(访问修饰符)
不同点逻辑性/灵活性存储性访问性使用范围安全性属性(Property)源于字段,对字段的扩展,逻辑字段并不占用实际的内存可以被其他类访问对接收的数据范围做限定,外部使用增加了数据的安全性字段(Field)不经过逻辑处理占用内存的空间及位置大部分字段不能直接被访问内存使用不安全 …...
Androidstdio-真机调试
显示隐藏设备 手机通过数据线插入电脑 Androidstdio设置中下载USB驱动 选择下载的驱动 更新完成后,在编译器查看,此时真机已经显示出来了 调试app可以在日志中查看日志,详细日志查看方法看前面的帖子 如果有这种日志输出,运行到此…...
2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文
模型设计思路与创新点: 建模的时候应该先确定我们需要建立什么类的模型?优化类还是统计类?这个题需要大量的数据分析,因此我们可以建立一个统计学模型。 统计学建模思路:观察规律,建立模型,参…...
数据结构【链栈】
基于 C 实现链表栈:原理、代码与应用 一、引言 栈就是一个容器,可以当场一个盒子,只能一个一个拿,一个一个放,而且是从上面放入。 有序顺序栈操作比较容易【会了链栈之后顺序栈自然明白】,所以我们这里只…...
MediaPipe与YOLO已训练模型实现可视化人脸和手势关键点检测
项目首页 - ZiTai_YOLOV11:基于前沿的 MediaPipe 技术与先进的 YOLOv11 预测试模型,精心打造一款强大的实时检测应用。该应用无缝连接摄像头,精准捕捉画面,能即时实现人脸检测、手势识别以及骨骼关键点检测,将检测结果实时、直观地…...
使用 SpringBoot+Thymeleaf 模板引擎进行 Web 开发
目录 一、什么是 Thymeleaf 模板引擎 二、Thymeleaf 模板引擎的 Maven 坐标 三、配置 Thymeleaf 四、访问页面 五、访问静态资源 六、Thymeleaf 使用示例 七、Thymeleaf 常用属性 前言 在现代 Web 开发中,模板引擎被广泛用于将动态内容渲染到静态页面中。Thy…...
pytorch深度Q网络
人工智能例子汇总:AI常见的算法和例子-CSDN博客 DQN 引入了深度神经网络来近似Q函数,解决了传统Q-learning在处理高维状态空间时的瓶颈,尤其是在像 Atari 游戏这样的复杂环境中。DQN的核心思想是使用神经网络 Q(s,a;θ)Q(s, a; \theta)Q(s,…...
list的使用,及部分功能的模拟实现(C++)
目录(文章中"节点"和"结点"是同一个意思) 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list…...
makailio-alias_db模块详解
ALIAS_DB 模块 作者 Daniel-Constantin Mierla micondagmail.com Elena-Ramona Modroiu ramonaasipto.com 编辑 Daniel-Constantin Mierla micondagmail.com 版权 © 2005 Voice Sistem SRL © 2008 asipto.com 目录 管理员指南 概述依赖 2.1 Kamailio 模块 2.2 外…...
【AI】DeepSeek 概念/影响/使用/部署
在大年三十那天,不知道你是否留意到,“deepseek”这个词出现在了各大热搜榜单上。这引起了我的关注,出于学习的兴趣,我深入研究了一番,才有了这篇文章的诞生。 概念 那么,什么是DeepSeek?首先百…...
算法随笔_35: 每日温度
上一篇:算法随笔_34: 最后一个单词的长度-CSDN博客 题目描述如下: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升…...
人工智能入门课【手写自注意力机制】
原理 自注意力(Self-Attention)是一种强大的机制,广泛应用于自然语言处理、计算机视觉等领域,尤其是在Transformer架构中发挥了关键作用。它的核心思想是让模型能够动态地关注输入序列中不同位置之间的关系,从而更好地…...
记7(激活函数+多层神经网络+梯度下降法及其优化
目录 1、激活函数1.1、sigmoid函数:2端饱和,下面2个函数都要幂运算,运算速度会比较慢1.2、ReLU函数(Rectified Linear Unit,修正线性单元)1.3、PReLU函数(Parameteric Rectified Linear Unit&am…...
Qt u盘自动升级软件
Qt u盘自动升级软件 Chapter1 Qt u盘自动升级软件u盘自动升级软件思路:step1. 获取U盘 判断U盘名字是否正确, 升级文件是否存在。step2. 升级step3. 升级界面 Chapter2 Qt 嵌入式设备应用程序,通过U盘升级的一种思路Chapter3 在开发板上运行的…...
关于低代码技术架构的思考
我们经常会看到很多低代码系统的技术架构图,而且经常看不懂。是因为技术架构图没有画好,还是因为技术不够先进,有时候往往都不是。 比如下图: 一个开发者,看到的视角往往都是技术层面,你给用户讲React18、M…...
如何使用 ChatBox AI 简化本地模型对话操作
部署模型请看上一篇帖子:本地部署DeepSeek教程(Mac版本)-CSDN博客 使用 ChatBox AI 简化本地模型对话操作: 打开 ChatBox AI 官网:Chatbox AI官网:办公学习的AI好助手,全平台AI客户端…...
缩位求和——蓝桥杯
1.题目描述 在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。 比如:248153720248153720 把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是 1 位数,得 24814>145 156 56 而…...
hexo部署到github page时,hexo d后page里面绑定的个人域名消失的问题
Hexo 部署博客到 GitHub page 后,可以在 setting 中的 page 中绑定自己的域名,但是我发现更新博客后绑定的域名消失,恢复原始的 githubio 的域名。 后面搜索发现需要在 repo 里面添加 CNAME 文件,内容为 page 里面绑定的域名&…...
neo4j入门
文章目录 neo4j版本说明部署安装Mac部署docker部署 neo4j web工具使用数据结构图数据库VS关系数据库 neo4j neo4j官网Neo4j是用ava实现的开源NoSQL图数据库。Neo4作为图数据库中的代表产品,已经在众多的行业项目中进行了应用,如:网络管理&am…...
代码随想录——回溯
文章目录 组合组合总数电话号码的字母组合组合总数组合总数Ⅱ分割回文串复原IP地址子集子集Ⅱ非递减子序列去重的实现方法方法 1:**排序 跳过重复元素**方法 2:**使用哈希表或数组记录已使用的数字** 去重的完整示例总结本题代码 全排列全排列Ⅱ重新安排…...
独立游戏RPG回顾:高成本
刚看了某纪录片, 内容是rpg项目的回顾。也是这个以钱为核心话题的系列的最后一集。 对这期特别有代入感,因为主角是曾经的同事,曾经在某天晚上听过其项目组的争论。 对其这些年的起伏特别的能体会。 主角是制作人,在访谈中透露这…...
SQLModel入门
目录 概述快速开始官方教程简单使用样例 概述 SQLModel 是一个 ORM 框架,其基于 SQLAlchemy 和 Pydantic,其中 SQLALchemy 提供底层 ORM 能力,Pydantic 提供类型校验能力,SQLModel 中,一个 SQLModel model 既是一个 S…...
关于MySQL InnoDB存储引擎的一些认识
文章目录 一、存储引擎1.MySQL中执行一条SQL语句的过程是怎样的?1.1 MySQL的存储引擎有哪些?1.2 MyIsam和InnoDB有什么区别? 2.MySQL表的结构是什么?2.1 行结构是什么样呢?2.1.1 NULL列表?2.1.2 char和varc…...
【学习笔记】深度学习网络-正则化方法
作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中用…...
NVIDIA (英伟达)的 GPU 产品应用领域
游戏娱乐领域 PC 游戏:NVIDIA 的 GeForce 系列 GPU 是 PC 游戏玩家的首选之一。能实现实时光线追踪、高分辨率渲染等,使游戏画面更加逼真,如《赛博朋克 2077》等支持光线追踪的游戏,在 NVIDIA GPU 的加持下,可呈现出真…...
Docker快速部署高效照片管理系统LibrePhotos搭建私有云相册
文章目录 前言1.关于LibrePhotos2.本地部署LibrePhotos3.LibrePhotos简单使用4. 安装内网穿透5.配置LibrePhotos公网地址6. 配置固定公网地址 前言 想象一下这样的场景:你有一大堆珍贵的回忆照片,但又不想使用各种网盘来管理。怎么办?别担心…...
goframe 多语言国际化解决方案
项目背景 本项目采用基于JSON配置的多语言国际化(i18n)解决方案,支持多种语言的无缝切换和本地化。 目录结构 manifest/ └── i18n/├── zh.json # 简体中文├── zh-tw.json # 繁体中文├── en.json # 英语├…...
mysql如何修改密码
在MySQL中修改密码可以通过多种方式完成,具体取决于你的MySQL版本和你是否有足够的权限。以下是一些常用的方法来修改MySQL用户的密码: 方法1: 使用ALTER USER命令 这是最常用的方法,适用于MySQL 5.7及以上版本。 ALTER USER usernameloca…...
17.2 图形绘制8
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 17.2.10 重绘 先看以下例子: 【例 17.28】【项目:code17-028】绘制填充矩形。 private void button1_Clic…...
Java基础知识总结(三十八)--读取数据
使用Reader体系,读取一个文本文件中的数据。返回 -1 ,标志读到结尾。 import java.io.*; class { public static void main(String[] args) throws IOException { /* 创建可以读取文本文件的流对象,让创建好的流对象和指定的文件相关联。…...
【并查集】
并查集(Disjoint Set Union,DSU)是一种用于处理不相交集合的数据结构,主要支持两种操作:查找(Find)和合并(Union)。它在解决连通性问题、图论问题以及动态连通性等问题时…...
SQL NOW() 函数详解
SQL NOW() 函数详解 引言 在SQL数据库中,NOW() 函数是一个常用的日期和时间函数,用于获取当前的时间戳。本文将详细介绍 NOW() 函数的用法、参数、返回值以及在实际应用中的注意事项。 函数概述 NOW() 函数返回当前的日期和时间,格式为 Y…...
[EAI-023] FAST,机器人动作专用的Tokenizer,提高VLA模型的能力和训练效率
Paper Card 论文标题:FAST: Efficient Action Tokenization for Vision-Language-Action Models 论文作者:Karl Pertsch, Kyle Stachowicz, Brian Ichter, Danny Driess, Suraj Nair, Quan Vuong, Oier Mees, Chelsea Finn, Sergey Levine 论文链接&…...
Rust 条件语句
Rust 条件语句 在编程语言中,条件语句是进行决策和实现分支逻辑的关键。Rust 语言作为一门系统编程语言,其条件语句的使用同样至关重要。本文将详细介绍 Rust 中的条件语句,包括其基本用法、常见场景以及如何避免常见错误。 基本用法 Rust…...
Windows 上安装 PostgreSQL
Windows 上安装 PostgreSQL PostgreSQL 是一款功能强大的开源对象-关系型数据库系统,它具有出色的扩展性和稳定性。本文将详细介绍在 Windows 操作系统上安装 PostgreSQL 的步骤和注意事项。 1. 准备工作 在开始安装 PostgreSQL 之前,请确保您的计算机满足以下要求: 操作…...
UE 5.3 C++ 对垃圾回收的初步认识
一.UObject的创建 UObject 不支持构造参数。 所有的C UObject都会在引擎启动的时候初始化,然后引擎会调用其默认构造器。如果没有默认的构造器,那么 UObject 将不会编译。 有修改父类参数的需求,就使用指定带参构造 // Sets default value…...
解码,蓝桥杯2020G
a2b 解码后:aab #include<iostream> using namespace std; typedef struct Node {char data;int size;Node* next; }Node,*Linklist; char* scan(char str[],int size) {int i 0;Linklist head new Node;Linklist rear head;while (i<size-1) {Lin…...
【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:贪心算法篇–CSDN博客 文章目录 一.贪心算法1.什么是贪心算法2.贪心算法的特点 二.例题1.柠…...
Python3 + Qt5:实现AJAX异步更新UI
使用 Python 和 Qt5 开发时异步加载数据的方法 在开发使用 Python 和 Qt5 的应用程序时,为了避免在加载数据时界面卡顿,可以采用异步加载的方式。以下是几种实现异步加载的方法: 1. 使用多线程(QThread) 通过将数据…...
Windows系统中Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher
Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher Windows系统中Docker可视化工具对比分析1. 工具概览2. Docker Desktop官网链接:主要优点:主要缺点:版本更新频率: 3. Portainer官网…...
从ai产品推荐到利用cursor快速掌握一个开源项目再到langchain手搓一个Text2Sql agent
目录 0. 经验分享:产品推荐 1. 经验分享:提示词优化 2. 经验分享:使用cursor 阅读一篇文章 3. 经验分享:使用cursor 阅读一个完全陌生的开源项目 4. 经验分享:手搓一个text2sql agent (使用langchain l…...
curope python安装
目录 curope安装 测试: 报错:libc10.so: cannot open shared object file: No such file or directory 解决方法: curope安装 git clone : GitHub - Junyi42/croco at bd6f4e07d5c4f13ae5388efc052dadf142aff754 cd models/curope/ python setup.py build_ext --inplac…...