Transformer详解

2023-11-13

  • Transformer

    • 什么是transformer

    • 为什么需要用transformer

      • encoder

        • sub-encoder block

          • multi-head self-attention

          • FFN

        • input

      • decoder

        • input with look-ahead mask

        • sub-decoder block

      • output layer

      • summary

    • transformer的缺点

    • transformer的应用

    • ref

 

  • Transformer-XL

    • The motivation for Transformer-XL.

    • Transformer-XL: the proposed solution: Basic idea.

      • combine hidden states

      • how to compute self-attention

    • Absolute Positional Encoding & Memory:

    • summary

    • 应用和不足

    • ref


  • Self-Attention with Relative Position Representations

    • Relation-aware Self-Attention

    • Relative Position Representations

    • Implement

    • ref

  • Reformer

 

 

Transformer

什么是transformer

首先我们先说结论:Attention Is All You Need提出的transformer 其实就是 seq2seq + self attention。 代码实现, 非常清晰

seq2seq 任务指的是输入和输出都是序列的任务。例如说法语翻译成英文。

通常来说,Seq2Seq任务最常见的是使用encoder+decoder的模式,先将一个序列编码成一个上下文矩阵,在使用decoder来解码。当然,我们仅仅把context vector作为编码器到解码器的输入。

 

 

这样子往往得不到好的效果,因为我们的编码器的很多信息都无法完全编码在这个向量中,并且我们在解码的时候,对于输入的每个单词的权重是不一致的,所以在NMT任务上,还添加了attention的机制。

 

 

所以目前来说,我们可以直接先把transformer当成一个黑盒,就是transformer可以当成是一个序列转码的模型,只是它其中用了特殊的self-attention的机制。如下图所示:

 

 

为什么需要用transformer

在提到为什么需要用transformer的时候,我们需要了解,在没有transformer的时候,我们都是用什么来完成这系列的任务的呢?

其实在之前我们使用的是RNN(或者是其的单向或者双向变种LSTM/GRU等) 来作为编解码器。

RNN模块每次只能够吃进一个输入token和前一次的隐藏状态,然后得到输出。它的时序结构使得这个模型能够得到长距离的依赖关系,但是这也使得它不能够并行计算,模型效率十分低。

 

 

 

当然这边的的RNN可以通过CNN替换,从而达到并行的效果,可以看到下图,总共是两层的卷积层,第一层画出了两个filter,每个1D filter的size是2,到了第二层的卷积层的filter的size是3。

第一层的filter考虑的是两个字之间的关联,但是到了第二层,考虑了三个前一层输出的交互,从而考虑到了较长序列之间的关系。比如说这边序列是  , 第一层只考虑了  , ..  的交互,第二层考虑了  ,而  是前一层两两交互关系的结果,所以第二层考虑了  这个序列的结果了。

 

 

但是对于CNN每次一般我们的卷积核设的长度为3/5这种较小的值,对于序列长度较长的,比如512,就需要堆叠多层的卷积层,导致模型过于冗杂。

那么,我们有没有办法提出一个新的模型,能够并行,并且能够考虑到输入序列不同token的权重?聪明的科学家们提出了一种新的模型叫做transformer。

其实他就encoder+decoder模式,只是其中的编解码器采用了self-attention的机制。

 

 

当然transformer真的就比RNN好吗?有人提出,凡事用RNN做的模型,都可以直接用self-attention替代。这个我们会在transformer的缺点中讨论。# tranformer的内部结构

transformer其实是由encoder以及decoder不是单一模块,而是由小的多个sub-encoder block和sub-decoder block组成。

 

 

我们来看看transformer的具体结构图。由下图所示,它主要由左边的encoder+input以及右边的decoder+input+output组成。我们将会一一介绍。

 

 

encoder

这边的encoder由input以及多个sub-encoder blocks组成。我们将会先讲sub-encoder,再讲输入,因为输入的设计是为了弥补self-attention的缺陷的。

sub-encoder block

首先每个sub-encoder都由两个主要的部分组成(略过部分细节,之后会写),分别是self-attention layer以及ffn layer。

具体的实现机制就是:我们的输入每个词经过embedding 之后,然后经过self-attention ,根据自己的路径,经过转换得到新的输出vector,最后再经过ffn layer,得到新的输出,作为下一层sub-encoder的输入。

 

 

multi-head self-attention

首先我们先了解一下self-attention的作用,其实self attention大家并不陌生,比如我们有一句话,the animal didnot cross the street, because it was too tired. 这里面的it,指代的是the animal。我们在翻译it的时候会将更多的注意力放在the animal身上,self-attention起的作用跟这个类似,就是关注句子中的每个字,和其它字的关联关系。参考实现

 

 

我们来看看这些词是怎么经过multi-head attention,得到转换的。

首先我们每个字的输入vector  会经过变换得到三个vector,分别是query  , key  以及value  , 这些向量是通过输入  分别和query矩阵  ,key矩阵  ,value矩阵  相乘得来的。query矩阵  ,key矩阵  ,value矩阵  都是训练时学习而来的。

 

 

将 x1 和 WQ weight matrix 做矩阵乘法得到 q1, 即这个字对应的query向量. 类似地,我们最终得到这个字对应query向量,value向量,key向量。- query向量:query顾名思义,是负责寻找这个字的于其他字的相关度(通过其它字的key) - key向量:key向量就是用来于query向量作匹配,得到相关度评分的 - value向量:Value vectors 是实际上的字的表示, 一旦我们得到了字的相关度评分,这些表示是用来加权求和的

 

 

得到每个字的  之后,我们要得到每个字和句子中其他字的相关关系,我们只需要把这个字的query去和其他字的key作匹配,然后得到分数,最后在通过其它字的value的加权求和(权重就是哪个分数)得到这个字的最终输出。

 

 

我们来具体看看这个分数是怎么计算得到的。我们之前看到的都是单个字作self-attention,但是在GPU中,其实整个过程是并行的,一个序列  是同时得到每个  对应的Q,K,V的,这是通过矩阵乘法。

 

 

然后每个字与其他字对应的score的算法采用的是Scaled Dot-product Attention

具体就是以下公式

  • 其中  。

  • 其中,scale因子是输入的vector size  开根号。

总结来说:

 

等等,那么什么是multi-head呢?首先我们先了解一下什么是multi-head,其实很简单,就是我们刚才这个sub-encoder里面,我们的self-attention,只做了一次, 如果我们引入多个不同的  , 然后重复刚才的步骤,我们就可以得到multi-head了。

 

在得到多个  向量之后,我们把这些向量concat起来,然后再经过线性变换,得到最终的输出。

 

那么我们为什么需要multi-head呢?这是因为,他可以提高模型的能力 - 这使得模型能够关注不同的位置,比如句子经济。。。,教育。。。,这使得这座城市发展起来了,句子中的在不同的head中,可以着重关注不同的地方例如经济教育。亦或者如下面的栗子。

 

  • 就像是CNN采用不同的不同的kernel的效果,不同的kernel能过获取的信息不同,类似的,不同的head,能够扩展模型的不同表示空间(different representation subspaces),因为我们有不同的QKV,这些都是随机初始化,然后通过训练得到最总结果,并且结果往往不同。关于different representation subspaces,举一个不一定妥帖的例子:当你浏览网页的时候,你可能在颜色方面更加关注深色的文字,而在字体方面会去注意大的、粗体的文字。这里的颜色和字体就是两个不同的表示子空间。同时关注颜色和字体,可以有效定位到网页中强调的内容。使用多头注意力,也就是综合利用各方面的信息/特征。

  • 我觉得也可以把多头注意力看作是一种ensemble,模型内部的集成。

FFN

在self-attention层之后模型会经过FFN层。\begin{equation} FFN(x) = max(0, xW_1 + b_1 )W_2 + b_2 \end{equation} 这边的实现就是两层的Dense layer,第一层的激活函数是RELU。

 

两个sub-layer的连接并不是直接相连,而是先通过ADD&Normalize层,所谓的ADD&Normalize层,由以下两个组成

- ADD:将输入+self-attention的输出 - Normalize:在经过layer-normalization以及dropout操作。

layer normalization:其实很简单就是每一条样本都经过(x-mean) / std, 其mean和std 都是按照单条样本进行计算的。

input

对于encoder的输入,由于self-attention的机制讲没有考虑输入序列的顺序,但是一个句子的输入顺序其实很重要,例如你喜欢苹果不,你不喜欢苹果,两个句子的含义不同,所以我们需要为输入embedding添加position encoding。

 

 

这边的position encoding,主要可以分为通过序列的关系可以分为 - 绝对位置:例如每个sequence  , 位置都是从0,1..n开始 - 相对位置:位置的表示是由字与字之间的差表示的。相对位置表达Relative Position Representations (RPR)是Shaw et al., 2018,这个论文指出,同一个sequence中使用相对位置更好。

它根据encoding的方式也可以分为, - functional encoding: 这个是指的是通过特定函数的方式,将输入的位置idx变换为embedding。- parametric encoding:指的是通过embedding loopup的方式,让模型自己学习位置的embedding 这两种方式的效果都差不多,但是functional的可以减少模型的参数。

BERT使用的是 parametric absolute positional encoding (PAPE) 而transformer使用的是functional absolute positional encoding (FAPE)。

这边的函数使用的是正弦位置编码:

  •  指的是模型输出的embedding size

  • pos 代表是字在序列中的位置

  •  代表的是position embedding 之后的第  维,即  这个公式比较具有迷惑性,特别是论文中的写法,结合例子就比较好理解了,如pos=3,d(model)=128,那么3对应的位置向量如下: 

 

 

 

这个编码函数的可视化结果:

 

decoder

编码器完成之后我们需要解码器进行工作,最后一层的输出会被转化为一组 attention vectors K and V. 作为encoder-decoder attention层的K,V矩阵使用,这些能够帮助decoder关注输入的合适位置。

 

每一个timestamp的输出都会被喂给decoder,我们将这个输出做embedding 输出在添加position encoding。decoder的解码工作的停止条件就是知道特殊字符\<end of sentence> 得到了。

input with look-ahead mask

decoder的输入和encoder的输入不太一样,引文decoder的self-attention layer只能够关注输出序列当前位置以及之前的字,不能够关注之后的字。所以这边需要将这之后的字都添加上mask,即q*k之后加上负无穷(-inf),使得其再经过softmax之后的权重变为0。

The look-ahead mask is used to mask the future tokens in a sequence. In other words, the mask indicates which entries should not be used.

look-ahead mask 是用来mask序列的future tokens。具体的做法如下:

def create_look_ahead_mask(size):
  mask = 1 - tf.linalg.band_part(tf.ones((size, size)), -1, 0)
  return mask  # (seq_len, seq_len)

x = tf.random.uniform((1, 3))
temp = create_look_ahead_mask(x.shape[1])
>><tf.Tensor: shape=(3, 3), dtype=float32, numpy=
>>array([[0., 1., 1.],
>>       [0., 0., 1.],
>>       [0., 0., 0.]], dtype=float32)>

刚看到这边的时候,我有个问题,就是decoder的每次timestamp的输入不都是之前的前一次的输出吗,如何并行?这不是跟RNN一样?但是其实在训练的时候,我们是把所有的target 的序列直接作为decoder的输入的!然后通过look-ahead mask来模拟不同timestamp。

sample_decoder = Decoder(num_layers=2, d_model=512, num_heads=8,
                         dff=2048, target_vocab_size=8000,
                         maximum_position_encoding=5000)
target_input = tf.random.uniform((64, 26), dtype=tf.int64, minval=0, maxval=200)

output, attn = sample_decoder(target_input,
                              enc_output=sample_encoder_output,
                              training=False,
                              look_ahead_mask=None,
                              padding_mask=None)

在预测的时候,才是真正将decoder的输出作为下一次的输入。但这时候模型已经是一个黑盒了。

def evaluate(inp_sentence):
  start_token = [tokenizer_pt.vocab_size]

  end_token = [tokenizer_pt.vocab_size + 1]

  # inp sentence is portuguese, hence adding the start and end token
  inp_sentence = start_token + tokenizer_pt.encode(inp_sentence) + end_token
  encoder_input = tf.expand_dims(inp_sentence, 0)

  # as the target is english, the first word to the transformer should be the
  # english start token.
  decoder_input = [tokenizer_en.vocab_size] # <start_of_sentence>
  output = tf.expand_dims(decoder_input, 0)

  for i in range(MAX_LENGTH):
    print(output)
    enc_padding_mask, combined_mask, dec_padding_mask = create_masks(
        encoder_input, output)
    predictions, attention_weights = transformer(encoder_input,
                                                 output,
                                                 False,
                                                 enc_padding_mask,
                                                 combined_mask,
                                                 dec_padding_mask)

    # select the last word from the seq_len dimension
    predictions = predictions[: ,-1:, :]  # (batch_size, 1, vocab_size)

    predicted_id = tf.cast(tf.argmax(predictions, axis=-1), tf.int32)

    # return the result if the predicted_id is equal to the end token
    if predicted_id == tokenizer_en.vocab_size+1: # <end_of_sentence>
      return tf.squeeze(output, axis=0), attention_weights

    # concatentate the predicted_id to the output which is given to the decoder
    # as its input.
    output = tf.concat([output, predicted_id], axis=-1)

  return tf.squeeze(output, axis=0), attention_weights
translate("este é um problema que temos que resolver.")
print ("Real translation: this is a problem we have to solve .")
>> tf.Tensor([[8087]], shape=(1, 1), dtype=int32)
>> tf.Tensor([[8087   16]], shape=(1, 2), dtype=int32)
>> tf.Tensor([[8087   16   13]], shape=(1, 3), dtype=int32)
>> tf.Tensor([[8087   16   13    7]], shape=(1, 4), dtype=int32)
>> tf.Tensor([[8087   16   13    7  328]], shape=(1, 5), dtype=int32)
>> tf.Tensor([[8087   16   13    7  328   10]], shape=(1, 6), dtype=int32)
>> tf.Tensor([[8087   16   13    7  328   10   14]], shape=(1, 7), dtype=int32)
>> tf.Tensor([[8087   16   13    7  328   10   14   24]], shape=(1, 8), dtype=int32)
>> tf.Tensor([[8087   16   13    7  328   10   14   24    5]], shape=(1, 9), dtype=int32)
>> tf.Tensor([[8087   16   13    7  328   10   14   24    5  966]], shape=(1, 10), dtype=int32)
>> tf.Tensor([[8087   16   13    7  328   10   14   24    5  966   19]], shape=(1, 11), dtype=int32)
>> tf.Tensor([[8087   16   13    7  328   10   14   24    5  966   19    2]], shape=(1, 12), dtype=int32)
Input: este é um problema que temos que resolver.
Predicted translation: this is a problem that we have to solve it .
Real translation: this is a problem we have to solve .

sub-decoder block

sub-decoder block 跟encoder几乎一样,只是它比普通的encoder多了一个Encoder-Decoder Attention,The “Encoder-Decoder Attention” layer和multiheaded self-attention的工作机制一样,除了它使用的是 Keys 和 Values matrix 是encoder的输出, 这就意味着,我们decoder的query考虑到了encoder的所有的字了。

 

 

output layer

decoder的output是一个vector,这时候再经过一个dense层得到vocabulary size的logits,再经过softmax在取argmax得到输出的字。

 

summary

 

 

class Transformer(tf.keras.Model):
  def __init__(self, num_layers, d_model, num_heads, dff, input_vocab_size,
               target_vocab_size, pe_input, pe_target, rate=0.1):
    super(Transformer, self).__init__()

    self.encoder = Encoder(num_layers, d_model, num_heads, dff,
                           input_vocab_size, pe_input, rate)

    self.decoder = Decoder(num_layers, d_model, num_heads, dff,
                           target_vocab_size, pe_target, rate)

    self.final_layer = tf.keras.layers.Dense(target_vocab_size)

  def call(self, inp, tar, training, enc_padding_mask,
           look_ahead_mask, dec_padding_mask):

    enc_output = self.encoder(inp, training, enc_padding_mask)  # (batch_size, inp_seq_len, d_model)

    # dec_output.shape == (batch_size, tar_seq_len, d_model)
    dec_output, attention_weights = self.decoder(
        tar, enc_output, training, look_ahead_mask, dec_padding_mask)

    final_output = self.final_layer(dec_output)  # (batch_size, tar_seq_len, target_vocab_size)

    return final_output, attention_weights

transformer的缺点

  • tranformer 的空间以及时间复杂度非常大,sequence length  , 达到  ,这是因为每一层的self attention 都要储  的score用于之后的更新,所以L的长度不能很大,否则会遇到OOM的问题。在这种情况下,如果一个句子特别长, 那么他就不得不被分为两个sequence作为输入,但是这个时候前后句子之间的关系就没了,但是RNN可以不管多长的输入都能handle。

  • 运行时间太慢,模型太大

  • position encoding 使用absolute encoding,而Self-Attention with Relative Position Representations指出了相对位置更好

transformer的应用

翻译等, summary

ref

李宏毅transformer

Attention Is All You Need

the-illustrated-transformer

The Evolved Transformer – Enhancing Transformer with Neural Architecture Search

Transformer-XL – Combining Transformers and RNNs Into a State-of-the-art Language Model7

code


Transformer-XL

The motivation for Transformer-XL.

首先,为什么会提出transformerXL呢,它的提出主要是为了解决transformer的问题。我们首先先分析一下RNN以及Transformer的优缺点。

  • RNN

    • 优点:

      • 支持可变长

      • 支持记忆

      • 有序列顺序关系

    • 缺点:

      • gradient vanish

      • 耗时,无法并行

  • Transformer

    • 优点:

      • 并行

      • 考虑到sequence的long term dependency信息(相对于RNN)

      • 可解释性

    • 缺点:

      • 句子与句子之间的关系

      • batch size也不能很大

      • 空间占用大(因为我每个encoder的score matrix(sequenceLen*sequecenLen是 的空间复杂度(BOOOOM!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Transformer详解 的相关文章

  • 机器学习算法: 逻辑回归的介绍和应用

    逻辑回归的介绍 逻辑回归 xff08 Logistic regression xff0c 简称LR xff09 虽然其中带有 34 回归 34 两个字 xff0c 但逻辑回归其实是一个分类模型 xff0c 并且广泛应用于各个领域之中 虽然现
  • 机器学习算法(一):逻辑回归模型(Logistic Regression, LR)

    目录 1 LR 1 1 直观表述 1 2 决策边界 Decision Boundary 2 权值求解 2 1 代价函数 似然函数 2 1 1 为什么损失函数不用最小二乘 即逻辑斯蒂回归损失函数为什么使用交叉熵而不是MSE 2 1 2 代价函
  • EM算法及其推广---《统计学习方法》第9章

    EM算法是一种迭代算法 用于含有隐变量的概率模型参数的极大似然估计 或极大后验概率估计 EM算法的每次迭代由两步组成 E步求期望值 M步求最大值 EM算法是一种对模型参数的估计 该模型中含有隐变量 EM算法的引入 EM算法 概率模型有时既含
  • 算法实践1_线性回归

    参数解释 sklearn linear model LinearRegression fit intercept True normalize False copy X True n jobs None 超参 解释 类型 默认值 fit i
  • 决策树和随机森林

    回归模型 1 信息熵 1 熵 2 联合熵 3 条件熵 4 互信息 2 决策树学习算法 1 决策树 2 决策树生成算法 3 信息增益 4 信息增益率 5 Gini系数 6 ID3算法举例 7 三种决策树学习算法 8 回归树 3 决策树的评价
  • 机器学习算法1_线性回归

    通俗描述 线性回归模型是利用线性函数对一个或多个自变量和因变量 y y y 之间关系进行拟合的模型 公式推导 数据输入 给定数据集 D
  • 机器学习算法(二十四):最近邻算法 KNN(k-nearest neighbor)

    目录 1 基于实例的学习 2 k 最近邻法 2 1 算法概述 2 2 kNN算法的一般流程 2 3 距离公式 2 4 k值的选择 2 5 KNN特点 2 5 1 特点 2 5 2 KNN算法的优势和劣势 3 距离加权最近邻算法 k 最近邻算
  • 线性分类模型(二):logistic回归模型分析

    前言 上一篇文章介绍了线性判别模型 本文介绍线性生成模型 logistic回归模型 本文介绍logstic回归模型相关的知识 为了更好理解模型的决策边界函数 本文同时分析了多元变量的协方差对概率分布的影响 目录 1 logistic回归模型
  • 逻辑回归分类器(Logistic Regression Classifier)

    Logistic regression 逻辑回归 是当前业界比较常用的机器学习方法 用于估计某种事物的可能性 也用来进行分类 在分类的情形下 经过学习之后的LR分类器其实就是一组权值w0 w1 wm 当输入测试样本集中的测试数据时 这一组权
  • 【深度学习】常见优化算法

    本文介绍常见的一阶数值优化算法 这些方法在现代神经网络框架 tensorflow caffe torch 中已经是标准配置 问题 设系统参数为 omega 对于样本 i i i 其代价函数为
  • 数据预测分析

    数据预测分析 Matlab实现TCN时间卷积网络数据预测分析 目录 数据预测分析 Matlab实现TCN时间卷积网络数据预测分析 基本介绍 数据下载 程序设计 参考资料 致谢 基本介绍 此示例说明如何使用通用时间卷积网络 TCN 对序列数据
  • 机器学习算法(二十三):DTW(Dynamic Time Warping,动态时间调整)

    目录 1 DTW 动态时间调整 2 算法的实现 3 例子 4 python实现 5 DTW的加速算法FastDTW 5 1 标准DTW算法 5 2 DTW常用加速手段 5 3 FastDTW 1 DTW 动态时间调整 动态时间调整算法是大多
  • 匹配算法之 匈牙利算法详解

    参考 算法学习笔记 5 匈牙利算法 漫谈匈牙利算法 匈牙利算法 KM算法 匈牙利算法 二分图 通俗易懂小白入门 二分图最大匹配 匈牙利算法 多目标跟踪之数据关联 匈牙利匹配算法和KM算法 小白学习笔记 一 目标跟踪 匈牙利匹配 一 匈牙利算
  • 【BERT类预训练模型整理】

    BERT类预训练模型整理 1 BERT的相关内容 1 1 BERT的预训练技术 1 1 1 掩码机制 1 1 2 NSP Next Sentence Prediction 1 2 BERT模型的局限性 2 RoBERTa的相关内容 2 1
  • 【机器学习-分类】决策树预测

    我用一些机器学习的算法对数据进行一个分类 下面是一些需要用到的基础代码 以决策树为例 并不包括针对项目的模型处理和修改 留作记忆学习 对于数据划分训练集直接省略 def Tree score depth 3 criterion entrop
  • 机器学习算法学习一--------学习链接

    1 这个github是java的机器学习算法 对于我这个java程序员来说 挺不错的点击打开链接 2 这个博客基础理论不错点击打开链接
  • kaggle:泰坦尼克生存预测( R语言机器学习分类算法)

    本文在基本的多元统计分析技术理论基础上 结合机器学习基本模型 选择Kaggle 数据建模竞赛网站 的入门赛 Titanic生存预测作为实战演练 较为完整地呈现了数据建模的基本流程和思路 采用的模型有逻辑回归 决策树 SVM支持向量机以及进阶
  • 指数平滑法(Exponential Smoothing,ES)

    目录 1 指数平滑 2 一次指数平滑预测 又叫简单指数平滑 simple exponential smoothing SES 2 1 定义 2 2 例题 3 二次指数平滑法 Holt s linear trend method 3 1 定义
  • 残差神经网络(ResNet)

    残差神经网络的主要贡献是发现了退化现象 并针对退化现象发明了快捷连接 shortcut connection 极大的消除了深度过大的神经网络训练困难问题 1 神经网络越深准确率越高 假设一个层数较少的神经网络已经达到了较高准确率 可以在这个
  • 机器学习2-线性回归

    一 矩阵求导公式 1 总体情况 2 分子布局 Numerator layout 和分母布局 Denominator layout 首先我们常说 y 对 x 求导 这里的 y 和 x 均默认为列向量 y为 mx1 x为 nx1 1 分子布局

随机推荐

  • 【Python实训】Python实现多级菜单

    menu 北京 海淀 五道口 soho 网易 google 中关村 爱奇艺 汽车之家 youku 上地 百度
  • 二叉树的建立与遍历详解 菜鸟都能看懂的教程

    树形结构要多利用递归来求解 递归的关键就是想清楚所有的基准情形 然后扩展到一般情况 写代码的时候最好把基准情况放在前面 把一般情况放在后面 定义二叉树结构体 typedef struct BinaryTreeNode TelemType d
  • 前端获取后端的BigDecimal类型字段数值,丢失精度处理

    1 问题 前端请求后端接口获取BigDecimal类型字段数值时丢失精度 例如 5999 00变成5999 5999 50变成5999 5 2 解决方法 在字段上添加 JsonFormat shape JsonFormat Shape ST
  • 旋转矩阵推导

    一 前言 周而复始的搜索 循环往复的记忆 但终究还是不深刻 不能像老师一样交给一个新人 所谓提纲挈领 名师指导还是相当有必要的 因为所有的坎 名师都遇到过 而且总结了自己的一套方法论 这样才能够言简意赅 才能够让一个什么都不懂 有点夸张 略
  • springboot项目创建之后多个文件报红

    原因 因为你之前可能使用了git提交过项目 没有修改配置 而且在idea里默认就会会用git 解决办法 file gt seting gt version Control gt 编辑 gt 点击你的项目 gt vcs 修改为null
  • 服务器安全狗搭建过程

    发现安全狗构建基础的服务器安全环境简单高效 推荐 整理步骤如下 环境 Centos 6 x 7 x 64位 wget http down safedog cn safedog linux64 tar gz tar xzvf safedog
  • 【机器学习】感知机、线性支持向量机

    文章目录 一 感知机 线性二分类 二 感知机的损失函数 三 感知机实战 sklearn linear model Perceptron 四 Linear SVM 参考链接 一 感知机 线性二分类 感知机是一种相对简单的 二分类 的 线性 分
  • 在职场中哪些人不会被企业团队选用?在企业团队中哪些人不能用?

    企业团队离不开员工的打拼 那么现在人才济济的社会 企业团队中那些人是不能用的 小人不能用 当今社会我们评论一个人的好坏 首先看到的是他的道德品质 当一个人的道德品质不行 道德品行很差时 我们统称这类人为小人 都说远小人 在职场中也一样 小人
  • 华为OD机试 C++【TLV解析】

    题目 你收到了一串由两端设备传递的TLV格式的消息 现在你需要根据这串消息生成一个对应的 tag length valueOffset 列表 详细说明 这串消息其实是由许多小组成的 每一小组里包含了tag length value 其中 t
  • 关于element-ui el-cascader 级联选择器 单独选择任意一级选项,去掉单选按钮(记录一下)

    效果如下 分类 代码如下 单独选择任意一项属性 checkStrictly 绑定的是分类 id popper class自定义类名
  • SpringBoot--基础--05--错误处理

    SpringBoot 基础 05 错误处理 一 原理 1 1 自动配置类 ErrorMvcAutoConfiguration 1 2 一但系统出现4xx或者5xx之类的错误 ErrorPageCustomizer就会生效 定制错误的响应规则
  • 13个SQL优化技巧

    1 避免无计划的全表扫描 如下情况进行全表扫描 该表无索引 对返回的行无人和限制条件 无Where子句 对于索引主列 索引的第一列 无限制条件 对索引主列的条件含在表达式中 对索引主列的限制条件是is not null或 对索引主列的限制条
  • 国内IoT云平台横向对比

    三年过去了 目前各IoT平台功能有了极大的丰富和优化 行业头部玩家也逐渐浮出水面 目前市场的排名如下 阿里 小米 京东 百度 涂鸦 这几家以开放的生态 接入了千万甚至亿级设备 传统设备厂家如美的 海尔也在积极搭建自己的物联网平台 物联网已然
  • 华为天才少年谢凌曦分享了万字长文,阐述了关于视觉识别领域发展的个人观点...

    作者 谢凌曦 编辑 桃子 报道 新智元 计算机视觉识别领域的发展如何 华为天才少年谢凌曦分享了万字长文 阐述了个人对其的看法 最近 我参加了几个高强度的学术活动 包括CCF计算机视觉专委会的闭门研讨会和VALSE线下大会 经过与其他学者的交
  • 【软件分析/静态分析】学习笔记01——Introduction

    课程链接 李樾老师和谭天老师的 南京大学 软件分析 课程01 Introduction 哔哩哔哩 bilibili 目录 一 静态程序分析介绍 1 1 PL and Static Analysis 程序语言和静态分析 1 2 为什么要学 S
  • HTTP学习(五)实体、编码

    HTTP作为现在非常重要的协议 需要仔细梳理一下 本次学习知识点来自于 HTTP权威指南 只是文中知识点罗列 算是读书笔记 请有兴趣的读者购买 HTTP权威指南 完整阅读 一 实体 每天都有数以亿计的各种媒体对象经由 HTTP 传送 如图像
  • AMD CPU针脚弯曲无工具 完美修好

    b350m pro4 r7 3700 Q 电脑cpu针脚不小心弯了怎么办 今天在清理机箱的时候 把风扇取下来的时候 cpu连着风扇一起取下来了 然后因为我的错误操作 cpu有一排针脚都弯曲 对角针脚有四五跟接近45度弯曲 见图 解决工具 针
  • TreeMap的应用

    TreeMap的demo package dailyTest import java util Comparator import java util TreeMap author createtime 2023 9 12 19 56 pu
  • C# 学习笔记(四)数据类型

    C 学习笔记 四 数据类型 开篇语 C 都有哪些数据类型呢 前面几次学习里我们已经遇到过的几种数据类型有 string 字符串类型 double 双精度类型 抽象类型 即Class类型 具体的某个类 在 C 中 变量分为以下几种类型 值类型
  • Transformer详解

    Transformer 什么是transformer 为什么需要用transformer encoder sub encoder block multi head self attention FFN input decoder input