Transformer详解(附代码实现及翻译任务实现)

一:了解背景和动机

  1. 阅读Transformer论文:

    阅读原始的Transformer论文:“Attention is All You Need”,由Vaswani等人于2017年提出,是Transformer模型的开创性工作。
    在这里插入图片描述

二:理解基本构建块

  1. 注意力机制:

    Transformer的核心在于自注意力机制。它允许模型在处理每个词时考虑句子中的所有其他词,从而有效捕获长距离依赖关系。这是通过计算查询(Q)、键(K)和值(V)之间的关系实现的,其中注意力分数是通过以下公式计算得出的:
    Attention(Q, K, V) = softmax ( QK T d k ) V \text{Attention(Q, K, V)} = \text{softmax}\left(\frac{\text{QK}^T}{\sqrt{d_k}}\right)\text{V} Attention(Q, K, V)=softmax(dk QKT)V
    在这里插入图片描述

  2. 位置编码:

    在Transformer模型中,由于自注意力机制并不关注输入序列中元素的顺序,为了使模型能够处理序列数据的顺序信息,引入了位置编码(Positional Encoding)。

    位置编码的主要目的是为模型提供一些关于输入序列中元素相对位置的信息。由于Transformer没有内置的对序列顺序的理解,位置编码的添加有助于模型区分不同位置的词或输入。位置编码通常是通过在输入嵌入向量中添加一个与位置相关的向量来实现的。这个向量的设计通常遵循一些规律,以便模型能够通过学习位置编码来理解输入序列的顺序。一种常见的方式是使用正弦和余弦函数:

    位置 p o s pos pos 和嵌入维度 i i i 之间的位置编码 P E ( p o s , 2 i ) PE(pos, 2i) PE(pos,2i) P E ( p o s , 2 i + 1 ) PE(pos, 2i+1) PE(pos,2i+1) 分别计算如下:

    P E ( p o s , 2 i ) = sin ⁡ ( p o s 1000 0 2 i / d ) P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 1000 0 2 i / d ) PE(pos, 2i) = \sin\left(\frac{{pos}}{{10000^{2i/d}}}\right) \\ PE(pos, 2i+1) = \cos\left(\frac{{pos}}{{10000^{2i/d}}}\right) PE(pos,2i)=sin(100002i/dpos)PE(pos,2i+1)=cos(100002i/dpos)
    其中,(pos) 是位置,(i) 是维度的索引,(d) 是嵌入的维度。这样设计的位置编码能够使得不同位置之间的编码有一些规律性的差异,以便模型学习到序列的顺序信息。

    在实际实现中,这个位置编码会被直接添加到输入嵌入向量中。这样,通过学习嵌入向量和位置编码之间的权重,模型就可以同时利用嵌入向量的语义信息和位置编码的顺序信息。以下是一个简化的Python代码示例,演示了如何生成位置编码:

    import torch
    import torch.nn as nn
    import mathclass PositionalEncoding(nn.Module):def __init__(self, d_model, max_len=512):super(PositionalEncoding, self).__init__()self.encoding = torch.zeros(max_len, d_model)position = torch.arange(0, max_len).unsqueeze(1).float()div_term = torch.exp(torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model))self.encoding[:, 0::2] = torch.sin(position * div_term)self.encoding[:, 1::2] = torch.cos(position * div_term)self.encoding = self.encoding.unsqueeze(0)def forward(self, x):return x + self.encoding[:, :x.size(1)].detach()# Example usage
    d_model = 512
    max_len = 100
    positional_encoding = PositionalEncoding(d_model, max_len)# Assuming input is a tensor of shape (batch_size, sequence_length, d_model)
    input_sequence = torch.rand((32, 50, d_model))
    output_sequence = positional_encoding(input_sequence)
    

    这个示例中,PositionalEncoding 模块可以添加到Transformer的输入嵌入中。你可以根据实际任务和模型的需要调整嵌入维度和序列的最大长度。

三:学习Transformer模型的结构

  1. Encoder和Decoder结构:

    • 理解Transformer模型的整体结构,包括Encoder和Decoder。了解Encoder中多头注意力(Multi-Head Attention)和前馈神经网络(Feedforward Network)的作用,以及Decoder中的掩码多头注意力。
    Encoder结构:
    1. 多层自注意力机制(Multi-Head Self Attention):
      • 每个注意力头学习不同的注意力表示,从而捕捉输入序列中不同位置的信息。
      • 每个注意力头的输出通过线性层进行变换和组合。
    2. 前馈神经网络(Feedforward Neural Network):
      • 每个注意力头的输出通过一个全连接前馈神经网络进行非线性映射。
    3. 层归一化(Layer Normalization)和残差连接(Residual Connection):
      • 在每个子层(自注意力和前馈神经网络)的输出后都应用层归一化和残差连接。
      • 这有助于梯度的流动和训练稳定性。

    Decoder结构:

    1. 多层自注意力机制(Multi-Head Self Attention):
      • 类似于Encoder,但在Decoder中,自注意力机制要注意到输入序列和输出序列的不同位置。
    2. 多层编码-解码注意力机制(Multi-Head Encoder-Decoder Attention):
      • 将Encoder的输出用作Query,将Decoder的自注意力输出用作Key和Value。这允许Decoder关注输入序列的不同部分。
    3. 前馈神经网络(Feedforward Neural Network):
      • 与Encoder中的结构类似,用于处理解码器的注意力输出。
    4. 层归一化(Layer Normalization)和残差连接(Residual Connection):
      • 同样,在每个子层后应用层归一化和残差连接。
  2. Layer Normalization 和残差连接:

    • 学习如何在Transformer的层中使用Layer Normalization和残差连接。

    1. Layer Normalization(层归一化):

    层归一化是一种用于神经网络中的归一化技术,其目的是减少内部协变量转移(Internal Covariate Shift)。在每个训练小批量上,层归一化对每个特征进行归一化,使其均值为零,标准差为一。

    在Transformer中,Layer Normalization通常在每个子层的输出上应用,例如自注意力层或前馈神经网络层。其数学表达式如下:
    L a y e r N o r m ( x ) = γ ( ( x − μ ) / σ ) + β LayerNorm(x)=γ((x−μ)/σ)+β LayerNorm(x)=γ((xμ)/σ)+β
    其中,x 是输入张量,μσ 分别是其均值和标准差,γβ 是可学习的缩放和平移参数。

    2. 残差连接(Residual Connection):

    残差连接是一种通过将输入直接添加到输出上的机制,用于解决梯度消失问题。在Transformer的每个子层的输出后都使用了残差连接。其数学表达式如下:
    O u t p u t = I n p u t + S u b l a y e r ( I n p u t ) Output=Input+Sublayer(Input) Output=Input+Sublayer(Input)
    其中,Sublayer(⋅) 是子层的变换,可以是自注意力、编码-解码注意力或前馈神经网络等。

四:使用现有的实现进行实践

  1. PyTorch或TensorFlow实现:

    • 使用PyTorch或TensorFlow,了解如何实现一个简单的Transformer模型。可以参考开源实现或教程。
    import torch
    import torch.nn as nn
    import torch.nn.functional as Fclass MultiHeadAttention(nn.Module):def __init__(self, d_model, num_heads):super(MultiHeadAttention, self).__init__()self.d_model = d_modelself.num_heads = num_headsself.Q = nn.Linear(d_model, d_model)self.K = nn.Linear(d_model, d_model)self.V = nn.Linear(d_model, d_model)self.fc_out = nn.Linear(d_model, d_model)def forward(self, Q, K, V, mask):# Q, K, V: (batch_size, seq_len, d_model)Q = self.Q(Q)K = self.K(K)V = self.V(V)Q = self.split_heads(Q)K = self.split_heads(K)V = self.split_heads(V)scores = torch.matmul(Q, K.transpose(-1, -2)) / torch.sqrt(torch.tensor(self.d_model, dtype=torch.float32))if mask is not None:scores = scores.masked_fill(mask == 0, float("-inf"))attention = F.softmax(scores, dim=-1)x = torch.matmul(attention, V)x = self.combine_heads(x)x = self.fc_out(x)return xdef split_heads(self, x):return x.view(x.size(0), -1, self.num_heads, self.d_model // self.num_heads).transpose(1, 2)def combine_heads(self, x):return x.transpose(1, 2).contiguous().view(x.size(0), -1, self.num_heads * (self.d_model // self.num_heads))class PositionwiseFeedforward(nn.Module):def __init__(self, d_model, d_ff, dropout=0.1):super(PositionwiseFeedforward, self).__init__()self.linear1 = nn.Linear(d_model, d_ff)self.dropout = nn.Dropout(dropout)self.linear2 = nn.Linear(d_ff, d_model)def forward(self, x):x = F.relu(self.linear1(x))x = self.dropout(x)x = self.linear2(x)return xclass PositionalEncoding(nn.Module):def __init__(self, d_model, max_len=512):super(PositionalEncoding, self).__init__()self.encoding = torch.zeros(max_len, d_model)position = torch.arange(0, max_len).unsqueeze(1).float()div_term = torch.exp(torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model))self.encoding[:, 0::2] = torch.sin(position * div_term)self.encoding[:, 1::2] = torch.cos(position * div_term)self.encoding = self.encoding.unsqueeze(0)def forward(self, x):return x + self.encoding[:, :x.size(1)].detach()class TransformerEncoderLayer(nn.Module):def __init__(self, d_model, num_heads, d_ff, dropout=0.1):super(TransformerEncoderLayer, self).__init__()self.self_attention = MultiHeadAttention(d_model, num_heads)self.feedforward = PositionwiseFeedforward(d_model, d_ff, dropout)self.layer_norm1 = nn.LayerNorm(d_model)self.layer_norm2 = nn.LayerNorm(d_model)self.dropout = nn.Dropout(dropout)def forward(self, x, mask):attention_output = self.self_attention(x, x, x, mask)x = x + self.dropout(attention_output)x = self.layer_norm1(x)feedforward_output = self.feedforward(x)x = x + self.dropout(feedforward_output)x = self.layer_norm2(x)return xclass TransformerEncoder(nn.Module):def __init__(self, vocab_size, d_model, num_heads, d_ff, num_layers, max_len=512, dropout=0.1):super(TransformerEncoder, self).__init__()self.embedding = nn.Embedding(vocab_size, d_model)self.positional_encoding = PositionalEncoding(d_model, max_len)self.layers = nn.ModuleList([TransformerEncoderLayer(d_model, num_heads, d_ff, dropout) for _ in range(num_layers)])def forward(self, x, mask):x = self.embedding(x)x = self.positional_encoding(x)for layer in self.layers:x = layer(x, mask)return xclass TransformerDecoderLayer(nn.Module):def __init__(self, d_model, num_heads, d_ff, dropout=0.1):super(TransformerDecoderLayer, self).__init__()self.self_attention = MultiHeadAttention(d_model, num_heads)self.encoder_decoder_attention = MultiHeadAttention(d_model, num_heads)self.feedforward = PositionwiseFeedforward(d_model, d_ff, dropout)self.layer_norm1 = nn.LayerNorm(d_model)self.layer_norm2 = nn.LayerNorm(d_model)self.layer_norm3 = nn.LayerNorm(d_model)self.dropout = nn.Dropout(dropout)def forward(self, x, encoder_output, src_mask, tgt_mask):attention_output = self.self_attention(x, x, x, tgt_mask)x = x + self.dropout(attention_output)x = self.layer_norm1(x)encoder_attention_output = self.encoder_decoder_attention(x, encoder_output, encoder_output, src_mask)x = x + self.dropout(encoder_attention_output)x = self.layer_norm2(x)feedforward_output = self.feedforward(x)x = x + self.dropout(feedforward_output)x = self.layer_norm3(x)return xclass TransformerDecoder(nn.Module):def __init__(self, vocab_size, d_model, num_heads, d_ff, num_layers, max_len=512, dropout=0.1):super(TransformerDecoder, self).__init__()self.embedding = nn.Embedding(vocab_size, d_model)self.positional_encoding = PositionalEncoding(d_model, max_len)self.layers = nn.ModuleList([TransformerDecoderLayer(d_model, num_heads, d_ff, dropout) for _ in range(num_layers)])self.fc_out = nn.Linear(d_model, vocab_size)def forward(self, x, encoder_output, src_mask, tgt_mask):x = self.embedding(x)x = self.positional_encoding(x)for layer in self.layers:x = layer(x, encoder_output, src_mask, tgt_mask)x = self.fc_out(x)return xclass Transformer(nn.Module):def __init__(self, src_vocab_size, tgt_vocab_size, d_model, num_heads, d_ff, num_layers, max_len=512, dropout=0.1):super(Transformer, self).__init__()self.encoder = TransformerEncoder(src_vocab_size, d_model, num_heads, d_ff, num_layers, max_len, dropout)self.decoder = TransformerDecoder(tgt_vocab_size, d_model, num_heads, d_ff, num_layers, max_len, dropout)def forward(self, src_input, tgt_input, src_mask, tgt_mask):encoder_output = self.encoder(src_input, src_mask)decoder_output = self.decoder(tgt_input, encoder_output, src_mask, tgt_mask)return decoder_output# Example usage:
    src_vocab_size = 1000
    tgt_vocab_size = 1000
    d_model = 512
    num_heads = 8
    d_ff = 2048
    num_layers = 6
    max_len = 100
    dropout = 0.1model = Transformer(src_vocab_size, tgt_vocab_size, d_model, num_heads, d_ff, num_layers, max_len, dropout)
    

五:深入细节

  1. 超参数调整:

    • 学习调整Transformer模型的超参数,包括学习率、层数、隐藏单元数等。
  2. 更深入的理解多头注意力:

    • 了解多头注意力是如何工作的,以及它如何在不同的子空间上学到不同的表示。

    多头注意力机制的工作原理:

    考虑一个输入序列 X X X,通过线性变换分别生成 Q u e r y ( Q ) Query(Q) QueryQ K e y ( K ) Key(K) KeyK V a l u e ( V ) Value(V) ValueV的表示。对于每个注意力头 i i i,通过计算注意力分数并对Value进行加权,得到头 i i i 的输出 O i O_i Oi

    多头注意力的输出 O O O 是所有注意力头输出的拼接:
    O = C o n c a t ( O 1 , O 2 , . . . , O h ) O=Concat(O_1,O_2,...,O_h) O=Concat(O1,O2,...,Oh)
    其中, h ℎ h 是注意力头的数量。

    学习不同表示的子空间:

    每个注意力头都有独立的权重矩阵 ( W i Q , W i K , W i V ) (W_i^Q,W_i^K,W_i^V) (WiQ,WiK,WiV),这意味着每个头可以学到不同的表示。这种独立性使得每个头都能够关注输入序列的不同部分,捕捉不同方面的信息。

    举例来说,考虑一个翻译任务,输入是一个包含动词的句子。不同的注意力头可以分别关注主语、宾语、谓语等不同的语法成分,从而更好地捕捉句子的语法结构。

六:应用到实际任务

  1. 语言建模或翻译任务:

    • 尝试将学到的Transformer模型应用于语言建模或翻译任务。使用开源的语料库和模型预训练,然后微调模型以适应你的任务。
    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torchtext.data import Field, BucketIterator
    from torchtext.datasets import Multi30k
    from torch.nn import Transformer# 设置随机种子以保证可重复性
    torch.manual_seed(42)# 定义Field对象
    SRC = Field(tokenize='spacy', tokenizer_language='en', init_token='<sos>', eos_token='<eos>', lower=True)
    TRG = Field(tokenize='spacy', tokenizer_language='fr', init_token='<sos>', eos_token='<eos>', lower=True)# 加载Multi30k数据集
    train_data, valid_data, test_data = Multi30k.splits(exts=('.en', '.fr'), fields=(SRC, TRG))# 构建词汇表
    SRC.build_vocab(train_data, min_freq=2)
    TRG.build_vocab(train_data, min_freq=2)# 定义Transformer模型
    class TransformerModel(nn.Module):def __init__(self, src_vocab_size, trg_vocab_size, d_model=512, nhead=8, num_encoder_layers=6, num_decoder_layers=6):super(TransformerModel, self).__init__()self.embedding = nn.Embedding(src_vocab_size, d_model)self.transformer = Transformer(d_model, nhead, num_encoder_layers, num_decoder_layers)self.fc = nn.Linear(d_model, trg_vocab_size)def forward(self, src, trg):src = self.embedding(src)trg = self.embedding(trg)output = self.transformer(src, trg)output = self.fc(output)return output# 初始化模型和优化器
    model = TransformerModel(len(SRC.vocab), len(TRG.vocab))
    optimizer = optim.Adam(model.parameters(), lr=0.001)
    criterion = nn.CrossEntropyLoss()# 定义训练函数
    def train(model, iterator, optimizer, criterion):model.train()for batch in iterator:src = batch.srctrg = batch.trgoptimizer.zero_grad()output = model(src, trg)output = output.view(-1, output.shape[-1])trg = trg.view(-1)loss = criterion(output, trg)loss.backward()optimizer.step()# 构建BucketIterator
    BATCH_SIZE = 32
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    train_iterator, valid_iterator, test_iterator = BucketIterator.splits((train_data, valid_data, test_data), batch_size=BATCH_SIZE, device=device)# 训练模型
    for epoch in range(10):train(model, train_iterator, optimizer, criterion)# 在测试集上评估模型(简化,实际应用中需要更详细的评估过程)
    def evaluate(model, iterator, criterion):model.eval()total_loss = 0with torch.no_grad():for batch in iterator:src = batch.srctrg = batch.trgoutput = model(src, trg)output = output.view(-1, output.shape[-1])trg = trg.view(-1)loss = criterion(output, trg)total_loss += loss.item()return total_loss / len(iterator)test_loss = evaluate(model, test_iterator, criterion)
    print(f'Test Loss: {test_loss:.3f}')
    

七:关注最新研究

  1. 阅读最新的Transformer相关论文:

    • 随着研究的不断进展,关注最新的Transformer相关的研究论文,了解模型的演进和新的应用。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

源码:Spring常规Bean创建过程

Bean创建过程&#xff1a; 一、版本 5.3.10二、学习内容 Bean创建过程源码三、Bean生命周期 时间轴地址&#xff1a;点击 四、bean创建过程脑图总结 脑图地址&#xff1a;点击 五、源码过程 说明&#xff1a; bean创建入口一般都是通过getBean(xxx);方法进入的&#xf…

C 语言->编译和链接实现原理

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 今天学习&#xff1a;浅学编译和链接内部实现原理 前提&#xff1a;本文是在gcc编译环…

「Kafka」Broker篇

「Kafka」Broker篇 主要讲解的是在 Kafka 中是怎么存储数据的&#xff0c;以及 Kafka 和 Zookeeper 之间如何进行数据沟通的。 Kafka Broker 总体工作流程 Zookeeper 存储的 Kafka 信息 启动 Zookeeper 客户端&#xff1a; [atguiguhadoop102 zookeeper-3.5.7]$ bin/zkCli.sh通…

git 删除 submodule 子模块的步骤

实验有效&#xff0c;这里删除了两个 submodule。 1, 执行删除 submodule mkdir tmp1 && cd tmp1 && git clone --recursive ssh://gitaaa.bbb.ccc.git \ && cd ccc/ && git checkout -b abranch_01 \ && git submodule deinit -f…

如何给新华网投稿发稿?新华网的媒体发稿方法步骤

现如今&#xff0c;互联网已经成为了人们获取信息的主要途径&#xff0c;各大媒体网站也成为了发布自己作品的首选平台。其中&#xff0c;新华网作为中国最具影响力的新闻媒体之一&#xff0c;其内容覆盖面广、触及人群众多&#xff0c;因此&#xff0c;能够在新华网上发表文章…

ASEPRITE使用笔记

aseprite学习笔记 快捷键 新建图层后,按快捷键c可以调出画布属性框放大缩小画布快捷键,鼠标滚轮移动画布快捷键,空格ctr+d,取消选取基本概念 软件五个基本区域:菜单栏、工具属性栏、工具栏、图层栏、颜色栏颜色栏分为色板和调色区域注意事项 创造时,需要把输入法调整成应…

Docker:6种网络配置详解浅介

在Docker中&#xff0c;网络配置是一个重要的主题&#xff0c;因为容器需要与其他容器或外部网络进行通信。Docker提供了多种网络模式和配置选项&#xff0c;以便在不同的场景下满足用户的需求。 本文介绍这些网络模式的区别以及配置&#xff0c;相信看完以后你能够掌握Docker网…

【AI】ChatGPT和文心一言那个更好用

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读文章&#xff01; 此篇是【话题达人】序列文章&#xff0c;这一次的话题是《自然语言处理的发展》 文章将以博主的角度进行讲述&#xff0c;理解和水平有限&#xff0c;不足之处&#xff0c;望指正。 目录 背景自我介绍面试题…

在线扒站网PHP源码-在线扒站工具网站源码

源码介绍 这是一款在线的网站模板下载程序&#xff0c;也就是我们常说的扒站工具&#xff0c;利用它我们可以很轻松的将别人的网站模板样式下载下来&#xff0c;这样就可以大大提高我们编写前端的速度了&#xff01;注&#xff1a;扒取的任何站点不得用于商业、违法用途&#…

day3:基于UDP模型的简单文件下载

思维导图 tftp文件下载客户端实现 #include <head.h> #define SER_PORT 69 #define SER_IP "192.168.125.223" int link_file() {int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}return sfd; } int filedownloa…

关于java的继承

关于java的继承 我们在上一篇文章中&#xff0c;了解到了封装&#xff0c;我们本篇文章来介绍一下面向对象的第二大特点&#xff0c;继承&#xff0c;还是遵循结合现实生活中的实际情况&#xff0c;理解着去学习&#xff0c;能更好的加深印象&#x1f600;。 一、继承 继承的…

逻辑运算

目录 AND OR NOT Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 逻辑运算可以保证连接多个条件&#xff0c;连接主要使用 AND、OR 、NOT完成 AND 1.查询职位不是办事员&#xff0c;但是工资低于 300 的员工信息 这个范例可以理…

Windows系统字体尺寸学习

调用GetTextMetrics来获得字体尺寸信息, 函数返回设备描述表中当前选定的字体信息&#xff1b; 返回值到TEXTMETRIC类型的结构中&#xff1b; 返回字段值的单位取决于当前设备描述表映射方式&#xff1b;默认映射方式是MM_TEXT&#xff0c;值的单位是像素&#xff1b; 前7个字…

脱离于ASP.NET 和Visual Studio编辑Razor脚本

Razor Pad是一个编辑Razor脚本的工具&#xff0c;脱离于ASP.NET 和Visual Studio。 github地址&#xff1a;GitHub - RazorPad/RazorPad: RazorPad is a quick and simple stand-alone editing environment that allows anyone (even non-developers) to author Razor templat…

Python项目——搞怪小程序(PySide6+Pyinstaller)

1、介绍 使用python编写一个小程序&#xff0c;回答你是猪吗。 点击“是”提交&#xff0c;弹窗并退出。 点击“不是”提交&#xff0c;等待5秒&#xff0c;重新选择。 并且隐藏了关闭按钮。 2、实现 新建一个项目。 2.1、设计UI 使用Qt designer设计一个UI界面&#xff0c…

Three.JS教程1 环境搭建、场景与相机

Three.JS教程1 环境搭建、场景与相机 一、Three.JS简介二、环境搭建1. 开发准备2. 安装 three.js3. 新建文件index.htmlmain.js 4. 关于附加组件5. 启动 三、创建场景1. 场景的概念2. 相机的概念3. 相机的几个相关概念&#xff08;1&#xff09;视点&#xff08;Position&#…

ctfshow php特性(web89-web101)

目录 web89 web90 web91 web92 web93 web94 web95 web96 web97 web98 web99 web100 web101 php特性(php基础知识) web89 <?php include("flag.php"); highlight_file(_FILE_);if(isset($_GET[num])){$num$_GET[num];if(preg_match("/[0-9]/&…

【征服redis2】redis的事务介绍

目录 目录 1.redis事务介绍 2 事务出错的处理 3.Java如何使用redis事务 1.redis事务介绍 在前面我们介绍了redis的几种典型数据结构和应用&#xff0c;本文我们来看一下redis的事务问题。事务也是数据库的重要主题&#xff0c;熟悉关系型数据库的读者应该对事务比较了解&a…

深度学习记录--偏差/方差(bias/variance)

误差问题 拟合神经网络函数过程中会出现两种误差&#xff1a;偏差(bias)和方差(variance) 偏差和误差的区别 欠拟合(underfitting) 当偏差(bias)过大时&#xff0c;如左图&#xff0c;拟合图像存在部分不符合值&#xff0c;称为欠拟合(underfitting) 过拟合(overfitting) …

【Linux install】Ubuntu和win双系统安装及可能遇到的所有问题

文章目录 1.前期准备1.1 制作启动盘1.2关闭快速启动、安全启动、bitlocker1.2.1 原因1.2.2 进入BIOSshell命令行进入BIOSwindows设置中高级启动在开机时狂按某个键进入BIOS 1.2.3 关闭Fast boot和Secure boot 1.3 划分磁盘空间1.3.1 查看目前的虚拟内存大小 2.开始安装2.1 使用…