大模型之-Seq2Seq介绍

大模型之-Seq2Seq介绍


1. Seq2Seq 模型概述

Seq2Seq(Sequence to Sequence)模型是一种用于处理序列数据的深度学习模型,常用于机器翻译、文本摘要和对话系统等任务。它的核心思想是将一个输入序列转换成一个输出序列。

Seq2Seq模型由两个主要部分组成:编码器(Encoder)和解码器(Decoder)。编码器读取并理解输入序列,将其转换成一个称为上下文向量的固定长度表示。解码器根据这个上下文向量生成目标序列。

编码器逐步处理输入序列中的每个元素,并将每一步的结果传递给下一步,最终生成一个总结输入信息的上下文向量。解码器使用这个向量,逐步生成输出序列的每个元素。

为了提高模型性能,常引入Attention机制,使解码器在生成每个输出时能够关注编码器输出的不同部分。Seq2Seq模型的灵活性和强大功能使其成为解决许多自然语言处理任务的有效工具。

1-1. 基本组成部分

  1. 编码器(Encoder):负责读取并理解输入序列。

假设正在读一本书。编码器就像大脑在读书的时候,它会逐字逐句地理解书中的内容,并在你的脑海里形成一个总结。具体来说,编码器会逐个处理输入的每个单词(或字符),并把它们转化为一个理解的内部表示。

  1. 解码器(Decoder):负责生成输出序列。

现在需要根据你读的书写一篇总结。解码器就像你在写这篇总结的过程。它会根据编码器生成的内部表示(你对书的理解),逐步地写出总结中的每个句子或单词。

  • 编码器和解码器合作过程

    • 读书(编码器):编码器一边读一边总结,把整个输入(比如一句话或一段话)变成一个内部表示,就像你读完一本书后脑海中的理解。
    • 写总结(解码器):解码器根据编码器的内部表示,逐字逐句地写出总结内容,就像你在写一篇文章。
  • 简单比喻

    • 编码器:你在读一本书,把内容记在脑子里。

    • 解码器:你根据记在脑子里的内容,写出一篇文章。

所以,编码器是负责理解输入内容的部分,而解码器是根据理解的内容生成输出的部分

  1. 上下文向量(Context Vector):编码器将输入序列转换成的固定长度向量,作为解码器的输入。

像是你在读完书之后形成的“脑海里的理解”或者“脑海中的总结”。它浓缩了你所读的内容的所有重要信息。

当编码器处理完输入序列(比如一句话的所有单词)之后,它会生成一个代表整个输入序列的内部状态,这个状态就是上下文向量。这个向量包含了输入序列中的所有关键信息,能够帮助解码器理解输入内容的总体意思。

1-2. 基本工作流程

  1. 输入序列通过编码器,生成上下文向量。
  2. 解码器根据上下文向量生成目标序列。

2. 编码器(Encoder)

编码器通常由一个或多个RNN(循环神经网络)组成,如LSTM(长短期记忆网络)或GRU(门控循环单元)。编码器将输入序列逐步处理,将每个时刻的隐藏状态传递给下一个时刻,最终生成一个上下文向量,表示整个输入序列的信息。

2-1. 编码器结构

  • 输入嵌入层:将输入的词或字符转换为向量表示。
  • RNN层:处理输入嵌入,生成隐藏状态。
import torch
import torch.nn as nn

class Encoder(nn.Module):
    def __init__(self, input_dim, emb_dim, hidden_dim, n_layers):
        super(Encoder, self).__init__()
        self.embedding = nn.Embedding(input_dim, emb_dim)
        self.rnn = nn.LSTM(emb_dim, hidden_dim, n_layers, batch_first=True)
    
    def forward(self, src):
        embedded = self.embedding(src)
        outputs, (hidden, cell) = self.rnn(embedded)
        return hidden, cell

3. 解码器(Decoder)

解码器的结构与编码器类似,但其初始状态是编码器生成的上下文向量。解码器逐步生成输出序列,每一步都依赖于前一步的输出和隐藏状态。

3-1. 解码器结构

  • 输入嵌入层:将前一步的输出词或字符转换为向量表示。
  • RNN层:处理输入嵌入和编码器的隐藏状态,生成新的隐藏状态和输出。
class Decoder(nn.Module):
    def __init__(self, output_dim, emb_dim, hidden_dim, n_layers):
        super(Decoder, self).__init__()
        self.embedding = nn.Embedding(output_dim, emb_dim)
        self.rnn = nn.LSTM(emb_dim, hidden_dim, n_layers, batch_first=True)
        self.fc_out = nn.Linear(hidden_dim, output_dim)
    
    def forward(self, input, hidden, cell):
        input = input.unsqueeze(1)
        embedded = self.embedding(input)
        output, (hidden, cell) = self.rnn(embedded, (hidden, cell))
        prediction = self.fc_out(output.squeeze(1))
        return prediction, hidden, cell

4. 训练过程

4-1. 损失函数

使用交叉熵损失(Cross-Entropy Loss)来计算模型输出与目标序列之间的差异。

4-2. 优化器

常用的优化器有Adam和SGD。

4-3. 训练循环

def train(model, iterator, optimizer, criterion, clip):
    model.train()
    epoch_loss = 0
    for i, batch in enumerate(iterator):
        src = batch.src
        trg = batch.trg
        optimizer.zero_grad()
        output = model(src, trg)
        output_dim = output.shape[-1]
        output = output[1:].view(-1, output_dim)
        trg = trg[1:].view(-1)
        loss = criterion(output, trg)
        loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(), clip)
        optimizer.step()
        epoch_loss += loss.item()
    return epoch_loss / len(iterator)

5. Attention机制

Attention机制用于解决上下文向量长度固定导致的信息丢失问题。通过Attention机制,解码器在生成每个词时,可以“关注”编码器输出的不同部分,从而利用更多的上下文信息。

5-1. Attention层

class Attention(nn.Module):
    def __init__(self, hidden_dim):
        super(Attention, self).__init__()
        self.attn = nn.Linear(hidden_dim * 2, hidden_dim)
        self.v = nn.Parameter(torch.rand(hidden_dim))
    
    def forward(self, hidden, encoder_outputs):
        batch_size = encoder_outputs.shape[0]
        src_len = encoder_outputs.shape[1]
        hidden = hidden.unsqueeze(1).repeat(1, src_len, 1)
        energy = torch.tanh(self.attn(torch.cat((hidden, encoder_outputs), dim=2)))
        energy = energy.permute(0, 2, 1)
        v = self.v.repeat(batch_size, 1).unsqueeze(1)
        attention = torch.bmm(v, energy).squeeze(1)
        return torch.softmax(attention, dim=1)

6. 实际应用场景

6-1. 机器翻译

Seq2Seq(Sequence to Sequence)模型是一种基于神经网络的技术,广泛应用于自然语言处理任务,特别是机器翻译。Seq2Seq模型能够将一个序列(例如一句话)转换为另一个序列(另一种语言的翻译)。其主要构成包括编码器(Encoder)和解码器(Decoder)两个部分,通常使用递归神经网络(RNN)、长短期记忆网络(LSTM)或门控循环单元(GRU)来实现。

6-1-1. Seq2Seq模型的基本结构
  1. 编码器(Encoder)
    • 编码器的任务是将输入序列(源语言句子)转换为一个固定大小的上下文向量(Context Vector)。
    • 输入序列的每个单词通过嵌入层(Embedding Layer)转换为词向量,然后逐步输入到RNN、LSTM或GRU单元中。
    • 编码器的最后一个隐藏状态(Hidden State)作为上下文向量传递给解码器。
  2. 解码器(Decoder)
    • 解码器根据编码器传递的上下文向量生成目标序列(目标语言句子)。
    • 解码器在每个时间步接收前一个时间步生成的单词和当前的隐藏状态,输出当前时间步的单词。
    • 解码器输出的每个单词通过Softmax层转换为概率分布,从中选出最可能的单词作为当前时间步的输出。
6-1-2. 应用流程
  1. 训练阶段
    • 输入大量的源语言-目标语言对(例如英语句子-中文句子)。
    • 编码器将源语言句子编码为上下文向量。
    • 解码器根据上下文向量和已生成的目标语言单词逐步生成整个目标语言句子。
    • 使用目标语言的实际单词对生成的单词进行监督学习,更新模型参数。
  2. 翻译阶段
    • 输入一个新的源语言句子。
    • 编码器将其编码为上下文向量。
    • 解码器根据上下文向量逐步生成目标语言句子,直到生成结束标记()。
6-1-3. Seq2Seq机器翻译优点
  • 处理变长输入和输出:Seq2Seq模型能够处理长度不固定的输入和输出序列。
  • 上下文捕捉:编码器能够捕捉源语言句子的全局上下文信息,有助于生成连贯的目标语言句子。
  • 端到端训练:Seq2Seq模型可以通过端到端的方式直接训练,无需手工设计特征。

6-2. 文本摘要

Seq2Seq(Sequence to Sequence)模型在文本摘要任务中的应用与其在机器翻译中的应用有很多相似之处。文本摘要的目标是从一个长文本中生成一个简短的、语义上等价的摘要。与机器翻译类似,Seq2Seq模型通过编码器和解码器的组合来实现这个任务。

6-2-1. Seq2Seq模型在文本摘要中的基本结构
  1. 编码器(Encoder)
    • 编码器将输入的长文本编码成一个固定长度的上下文向量(Context Vector)。
    • 通常使用递归神经网络(RNN)、长短期记忆网络(LSTM)或门控循环单元(GRU)来处理输入文本。
    • 输入文本的每个词通过嵌入层(Embedding Layer)转换为词向量,然后逐步输入到编码器的RNN、LSTM或GRU单元中。
    • 最终,编码器的隐藏状态作为上下文向量传递给解码器。
  2. 解码器(Decoder)
    • 解码器根据编码器生成的上下文向量生成文本摘要。
    • 解码器在每个时间步接收前一个时间步生成的词和当前的隐藏状态,输出当前时间步的词。
    • 解码器输出的每个词通过Softmax层转换为概率分布,从中选出最可能的词作为当前时间步的输出。
6-2-2. 应用流程
  1. 训练阶段
    • 输入大量的原始文本和相应的摘要对。
    • 编码器将原始文本编码为上下文向量。
    • 解码器根据上下文向量和已生成的摘要词逐步生成整个摘要。
    • 使用实际的摘要词对生成的词进行监督学习,更新模型参数。
  2. 摘要生成阶段
    • 输入一个新的长文本。
    • 编码器将其编码为上下文向量。
    • 解码器根据上下文向量逐步生成摘要,直到生成结束标记()。
6-2-3. Seq2Seq文本摘要优点
  • 处理变长输入和输出:Seq2Seq模型能够处理长度不固定的输入和输出序列,这对文本摘要特别重要。
  • 上下文捕捉:编码器能够捕捉输入文本的全局上下文信息,有助于生成连贯的摘要。
  • 端到端训练:Seq2Seq模型可以通过端到端的方式直接训练,无需手工设计特征。

6-3. 对话系统

Seq2Seq(Sequence to Sequence)模型在对话系统中的应用非常广泛。对话系统(也称为聊天机器人)需要处理自然语言输入,并生成自然语言输出,这与机器翻译和文本摘要任务有很多相似之处。Seq2Seq模型能够根据用户输入的对话上下文,生成适当的回复,完成自然语言理解和生成的任务。

6-3-1. Seq2Seq模型在对话系统中的基本结构
  1. 编码器(Encoder)
    • 编码器将用户输入的对话内容编码成一个固定长度的上下文向量(Context Vector)。
    • 通常使用递归神经网络(RNN)、长短期记忆网络(LSTM)或门控循环单元(GRU)来处理输入文本。
    • 输入的每个词通过嵌入层(Embedding Layer)转换为词向量,然后逐步输入到编码器的RNN、LSTM或GRU单元中。
    • 最终,编码器的隐藏状态作为上下文向量传递给解码器。
  2. 解码器(Decoder)
    • 解码器根据编码器生成的上下文向量生成对话回复。
    • 解码器在每个时间步接收前一个时间步生成的词和当前的隐藏状态,输出当前时间步的词。
    • 解码器输出的每个词通过Softmax层转换为概率分布,从中选出最可能的词作为当前时间步的输出。
6-3-2. 应用流程

训练阶段

  • 输入大量的对话数据对(例如用户输入和对应的回复)。
  • 编码器将用户输入编码为上下文向量。
  • 解码器根据上下文向量和已生成的回复词逐步生成整个回复。
  • 使用实际的回复词对生成的词进行监督学习,更新模型参数。

对话生成阶段

  • 输入一个新的用户对话内容。
  • 编码器将其编码为上下文向量。
  • 解码器根据上下文向量逐步生成回复,直到生成结束标记()。
6-3-3. Seq2Seq对话系统优点
  • 处理变长输入和输出:Seq2Seq模型能够处理长度不固定的输入和输出序列,这对对话系统特别重要。
  • 上下文捕捉:编码器能够捕捉用户输入的全局上下文信息,有助于生成连贯的回复。
  • 端到端训练:Seq2Seq模型可以通过端到端的方式直接训练,无需手工设计特征。

7. 完整示例代码演示

7-1. 完整代码分享

以下是一份完整的示例代码,包括编码器、解码器、Seq2Seq模型、训练和预测部分,test_seq2seq.py

​ 代码实现了一个基础的Seq2Seq模型,并使用随机数据进行训练。训练损失的逐步下降表明模型在学习,但损失下降比较缓慢,可能是需要调整参数和数据来优化模型性能。实际应用场景中,一般跑模型的都是真实数据集并根据需要调整模型参数,以获得更好的结果。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @Project  :WangtAI
# @File     :test_seq2seq.py
# @Time     :2024/6/19 17:56
# @Author   :wangting_666
# @Email    :wangtingbk@gmail.com

### pip install torch torchvision

import torch
import torch.nn as nn
import torch.optim as optim
import random

# 设置随机种子以确保结果可重复
SEED = 1234
random.seed(SEED)
torch.manual_seed(SEED)
torch.backends.cudnn.deterministic = True

# 定义编码器Encoder
class Encoder(nn.Module):
    def __init__(self, input_dim, emb_dim, hidden_dim, n_layers, dropout):
        super().__init__()
        self.embedding = nn.Embedding(input_dim, emb_dim)
        self.rnn = nn.LSTM(emb_dim, hidden_dim, n_layers, dropout=dropout)
        self.dropout = nn.Dropout(dropout)

    def forward(self, src):
        embedded = self.dropout(self.embedding(src))
        outputs, (hidden, cell) = self.rnn(embedded)
        return hidden, cell


# 定义解码器Decoder
class Decoder(nn.Module):
    def __init__(self, output_dim, emb_dim, hidden_dim, n_layers, dropout):
        super().__init__()
        self.embedding = nn.Embedding(output_dim, emb_dim)
        self.rnn = nn.LSTM(emb_dim, hidden_dim, n_layers, dropout=dropout)
        self.fc_out = nn.Linear(hidden_dim, output_dim)
        self.dropout = nn.Dropout(dropout)

    def forward(self, input, hidden, cell):
        input = input.unsqueeze(0)
        embedded = self.dropout(self.embedding(input))
        output, (hidden, cell) = self.rnn(embedded, (hidden, cell))
        prediction = self.fc_out(output.squeeze(0))
        return prediction, hidden, cell


# 定义Seq2Seq模型
class Seq2Seq(nn.Module):
    def __init__(self, encoder, decoder, device):
        super().__init__()
        self.encoder = encoder
        self.decoder = decoder
        self.device = device

    def forward(self, src, trg, teacher_forcing_ratio=0.5):
        trg_len = trg.shape[0]
        batch_size = trg.shape[1]
        trg_vocab_size = self.decoder.fc_out.out_features
        outputs = torch.zeros(trg_len, batch_size, trg_vocab_size).to(self.device)

        hidden, cell = self.encoder(src)
        input = trg[0, :]

        for t in range(1, trg_len):
            output, hidden, cell = self.decoder(input, hidden, cell)
            outputs[t] = output
            teacher_force = random.random() < teacher_forcing_ratio
            top1 = output.argmax(1)
            input = trg[t] if teacher_force else top1

        return outputs


# 初始化模型参数
INPUT_DIM = 100
OUTPUT_DIM = 100
ENC_EMB_DIM = 32
DEC_EMB_DIM = 32
HID_DIM = 64
N_LAYERS = 2
ENC_DROPOUT = 0.5
DEC_DROPOUT = 0.5
DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

enc = Encoder(INPUT_DIM, ENC_EMB_DIM, HID_DIM, N_LAYERS, ENC_DROPOUT)
dec = Decoder(OUTPUT_DIM, DEC_EMB_DIM, HID_DIM, N_LAYERS, DEC_DROPOUT)
model = Seq2Seq(enc, dec, DEVICE).to(DEVICE)

# 定义优化器和损失函数
optimizer = optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss()


# 训练函数
def train(model, iterator, optimizer, criterion, clip):
    model.train()
    epoch_loss = 0
    for i, batch in enumerate(iterator):
        src = batch.src.to(DEVICE)
        trg = batch.trg.to(DEVICE)
        optimizer.zero_grad()
        output = model(src, trg)
        output_dim = output.shape[-1]
        output = output[1:].view(-1, output_dim)
        trg = trg[1:].view(-1)
        loss = criterion(output, trg)
        loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(), clip)
        optimizer.step()
        epoch_loss += loss.item()
    return epoch_loss / len(iterator)


# 示例数据
class Batch:
    def __init__(self, src, trg):
        self.src = src
        self.trg = trg


batch_size = 10
src_len = 7
trg_len = 9

src = torch.randint(0, INPUT_DIM, (src_len, batch_size)).long()
trg = torch.randint(0, OUTPUT_DIM, (trg_len, batch_size)).long()

iterator = [Batch(src, trg)]

# 训练模型
N_EPOCHS = 10
CLIP = 1

for epoch in range(N_EPOCHS):
    train_loss = train(model, iterator, optimizer, criterion, CLIP)
    print(f'Epoch: {epoch + 1:02}, Train Loss: {train_loss:.3f}')

    
### 运行代码后,控制台输出内容:
"""
D:\Python\Python312\python.exe E:\PandasAI\tmp\test_seq2seq.py 
Epoch: 01, Train Loss: 4.613
Epoch: 02, Train Loss: 4.604
Epoch: 03, Train Loss: 4.598
Epoch: 04, Train Loss: 4.594
Epoch: 05, Train Loss: 4.589
Epoch: 06, Train Loss: 4.583
Epoch: 07, Train Loss: 4.587
Epoch: 08, Train Loss: 4.578
Epoch: 09, Train Loss: 4.566
Epoch: 10, Train Loss: 4.562
"""

7-2 . 总结和分析

  • 功能实现
  1. 编码器(Encoder):通过嵌入层和循环神经网络(LSTM)来处理输入序列,并生成隐藏状态和细胞状态。这些状态捕捉了输入序列中的信息。
  2. 解码器(Decoder):使用嵌入层和LSTM,根据编码器生成的隐藏状态和细胞状态逐步生成输出序列。
  3. Seq2Seq模型:结合编码器和解码器,将输入序列转换为输出序列。解码器使用教师强制(Teacher Forcing)策略,即在生成序列的过程中,有一定概率使用真实的目标序列作为下一个时间步的输入,以加速训练。
  4. 训练过程:使用随机生成的数据进行训练,优化模型参数以最小化交叉熵损失。训练过程中,每轮迭代都会输出当前的训练损失。
  • 结果分析

从提供的训练损失结果来看:

Epoch: 01, Train Loss: 4.613
Epoch: 02, Train Loss: 4.604
Epoch: 03, Train Loss: 4.598
Epoch: 04, Train Loss: 4.594
Epoch: 05, Train Loss: 4.589
Epoch: 06, Train Loss: 4.583
Epoch: 07, Train Loss: 4.587
Epoch: 08, Train Loss: 4.578
Epoch: 09, Train Loss: 4.566
Epoch: 10, Train Loss: 4.562

可以得出以下结论:

  1. 损失下降趋势:总体上,训练损失在逐步下降。这表明模型在学习过程中逐渐改进,尽管下降幅度较小。
  2. 下降缓慢:损失下降的幅度较小,可能原因如下:
    • 数据复杂性:随机生成的数据可能过于简单或过于复杂,导致模型难以有效学习。
    • 模型参数:编码器和解码器的参数选择(如隐藏层维度、层数、丢弃率等)可能需要调整,以更好地适应数据。
    • 训练数据量:训练数据量较小(仅一个批次),可能不足以充分训练模型。

8. 进阶优化

8-1. 双向编码器

使用双向RNN(BiRNN)作为编码器,使得编码器能够利用输入序列的前后文信息,从而提高表示能力。

class BiEncoder(nn.Module):
    def __init__(self, input_dim, emb_dim, hidden_dim, n_layers):
        super(BiEncoder, self).__init__()
        self.embedding = nn.Embedding(input_dim, emb_dim)
        self.rnn = nn.LSTM(emb_dim, hidden_dim, n_layers, bidirectional=True, batch_first=True)
        self.fc = nn.Linear(hidden_dim * 2, hidden_dim)
    
    def forward(self, src):
        embedded = self.embedding(src)
        outputs, (hidden, cell) = self.rnn(embedded)
        hidden = torch.tanh(self.fc(torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim=1)))
        return hidden, cell

8-2. Beam Search

解码器在生成序列时,使用Beam Search代替贪心搜索,可以生成更优的目标序列。Beam Search在每一步保留得分最高的k个序列,最终选择得分最高的一个。

def beam_search_decoder(data, k):
    sequences = [[list(), 1.0]]
    for row in data:
        all_candidates = list()
        for i in range(len(sequences)):
            seq, score = sequences[i]
            for j in range(len(row)):
                candidate = [seq + [j], score * -np.log(row[j])]
                all_candidates.append(candidate)
        ordered = sorted(all_candidates, key=lambda tup: tup[1])
        sequences = ordered[:k]
    return sequences

8-3. 多任务学习

通过多任务学习,Seq2Seq模型可以在同一网络中同时学习多个相关任务,提高模型的泛化能力和性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络体系结构】计算机网络体系结构实验-DHCP实验

服务器ip地址 2. 服务器地址池 3. 客户端ip 4. ping Ipconfig

「五度易链」企业大数据API接口开放平台上线啦!

“五度易链”企业大数据API接口开放平台现已正式上线&#xff0c;旨在为广大企业、开发者及个人提供标准、安全、高效、便捷的企业数据API接口服务&#xff0c;帮您更轻松地构建应用、扩展功能&#xff0c;并基于用户应用场景提供专属接口定制服务&#xff0c;助力企业提升研发…

模式分解的概念(下)-无损连接分解的与保持函数依赖分解的定义和判断、损失分解

一、无损连接分解 1、定义 2、检验一个分解是否是无损连接分解的算法 输入与输出 输入&#xff1a; 关系模式R&#xff08;U&#xff0c;F&#xff09;&#xff0c;F是最小函数依赖集 R上的一个分解 输出&#xff1a; 判断分解是否为无损连接分解 &#xff08;1&#x…

【机器学习】Lasso回归:稀疏建模与特征选择的艺术

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Lasso回归&#xff1a;稀疏建模与特征选择的艺术引言一、Lasso回归简介1.1 基本…

python基础篇(4):range语句

1 功能介绍 range语句的功能是获得一个数字序列&#xff08;可迭代类型的一种&#xff09; 2 语法 语法1&#xff1a; range(num) 获取一个从0开始&#xff0c;到num结束的数字序列&#xff08;不含num本身&#xff09; 如range(5)取得的数据是&#xff1a;[0, 1, 2, 3, 4…

等保2.0对云计算有哪些特定的安全要求?

等保2.0针对云计算环境设定了特定的安全要求&#xff0c;这些要求是在原有的安全通用要求基础上的扩展&#xff0c;旨在确保云服务的安全性和合规性。以下是一些关键的云计算安全扩展要求&#xff1a; 1. 基础设施的位置&#xff1a;等保2.0要求云计算基础设施位于中国境内&am…

LeetCode刷题之HOT100之LRU缓存

2024/6/21 酷暑难耐&#xff0c;离开空调我将不知道能否《活着》&#xff0c;昨天跑步感觉全身的热无法排出去&#xff0c;出门那种热浪一阵一阵打过来&#xff0c;一点风都舍不得给我。早早的来到实验室&#xff0c;也没多早&#xff0c;九点哈哈&#xff0c;做题啦&#xff0…

GPT-4o与GPT-4的价格对比

截图来源于微软Azure的OpenAI服务。 GPT-4o比GPT-4的价格降低是肉眼可见&#xff0c;可惜计价是美元单位&#xff0c;较国内的价格而言还是比较贵&#xff0c;拿来做Demo演示可以&#xff0c;商用的话&#xff0c;还要仔细考量考量。 国内的地板价已经来到了0.5元/百万Token的…

canvas绘制红绿灯路口(二)

系列文章 canvas绘制红绿灯路口&#xff08;一&#xff09; 无图不欢&#xff0c;先上图 优化项&#xff1a; 一&#xff1a;加入人行道红绿信号 二&#xff1a;加入专用车道标识&#xff08;无方向标识时采用专用车道标识&#xff09; 三&#xff1a;东南西北四项路口优化绘…

电脑开机后出现Aptio Setup Utility 处理方法

电脑开机后出现Aptio Setup Utility怎么处理 Aptio Setup Utility界面的原因&#xff1a; 这是由于 bios设置与真实的硬件情况不匹配硬盘故障找不到可启动的硬盘情况 我的问题是找不到可启动的硬盘情况 解决方式如下&#xff1a; 进入如下界面了&#xff0c;选择Boot选项…

通信系统的最佳线性均衡器(2)---自适应滤波算法

本篇文章是博主在通信等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对通信等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在通信领域笔记&#xff1a;…

干货 | 如何进行群体DNA甲基化分析

目前&#xff0c;针对群体的研究基本上还是以重测序为主&#xff0c;基于对遗传多样性丰富的自然群体中的个体进行全基因组重测序&#xff0c;研究物种遗传进化多样性&#xff0c;结合准确的目标性状的表型数据及统计方法进行全基因组关联分析&#xff0c;可对动植物复杂农艺性…

【数据分析】用Python做事件抽取任务-快速上手方案

目录 方法一&#xff1a;使用OmniEvent库安装OmniEvent使用OmniEvent进行事件抽取OmniEvent优点缺点 方法二&#xff1a;使用大模型使用GPT网页版进行事件抽取事件类型列表 大模型优点缺点 总结 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;事件抽取是一项关键任…

迅狐短视频商城系统:打造直播带货、社区种草和商品分销一站式解决方案

迅狐短视频商城系统作为一体化电商解决方案&#xff0c;致力于为用户提供全方位、便捷的购物体验。从直播带货到社区种草、再到商品分销&#xff0c;系统提供了全面的功能模块&#xff0c;满足用户多元化的需求。 一、直播带货功能模块 迅狐短视频商城系统的直播带货功能模块&…

SAMBA(简单混合状态空间模型用于高效的无限上下文语言建模)及其对长文本模型的改进

论文地址&#xff1a; https://arxiv.org/pdf/2406.07522 SAMBA&#xff08;Simple Hybrid State Space Models for Efficient Unlimited Context Language Modeling&#xff09;是一种新型的基于Transformer的语言模型&#xff0c;旨在解决传统大语言模型在处理长文本时遇到的…

【初阶数据结构】二叉树(附题)

目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念&#xff08;树结构的相关概念命名参考自然树和人的血缘关系&#xff09; 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff0c;初次之外网盘中使用到&#xff09; 2.二叉树概念及结构 …

关于OS中逻辑地址与物理地址转换

首先将逻辑地址134D从十六进制转为2进制 0001 0011 0100 1101 1&#xff09;1K的时候对应2的10次方 页面大小占10位 从后往前数 0001 00 || 11 0100 1101 前面的转为十进制为4 对应页号4内容1A转为2进制01 1010将这个替换原来的前六位数字 即0110 1011 0100 1101 再转换为…

『互联网三驾马车』

某天开会的时候&#xff0c;老板问了大家一个问题&#xff0c;对目前各个角色分工合作有哪些不满意的地方。有人回答到&#xff0c;能不能别让产品同学每次都在假期前几天发布需求&#xff0c;让开发同学周末或者假期加班搞需求&#xff0c;然后在还在假期看着产品同学到处去玩…

【React 】折叠面板,点击展开时再请求数据

需求背景&#xff1a;使用折叠面板的形式展示数据&#xff0c;面板内部数据需要在打开时请求接口获取。 遇到问题&#xff1a;最开始使用Antd 的折叠面板组件&#xff0c;它对于数据直接渲染是没问题的&#xff0c;但是不好满足打开面板时再动态加载数据的需求&#xff0c;于是…

Linux机器通过Docker-Compose安装Jenkins发送Allure报告

目录 一、安装Docker 二、安装Docker Compose 三、准备测试用例 四、配置docker-compose.yml 五、启动Jenkins 六、配置Jenkins和Allure插件 七、创建含pytest的Jenkins任务 八、项目结果通知 1.通过企业微信通知 2.通过邮件通知 九、配置域名DNS解析 最近小编接到一…