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详解 的相关文章

  • 机器学习算法——K-近邻算法(代码实现手写数字识别)

    0 引言 xff0c K 近邻算法是一种非常有效的分类算法 xff0c 它非常有效且易于掌握 原理 xff1a K 近邻算法通过计算不同样本之间的距离来分类物品 使用前 xff0c 我们需要有一个训练样本集 xff0c 并且样本集中每个数据
  • 【机器学习算法-python实现】逻辑回归的实现(LogicalRegression)

    转载请注明出处 xff1a http blog csdn net buptgshengod 1 背景知识 在刚刚结束的天猫大数据s1比赛中 xff0c 逻辑回归是大家都普遍使用且效果不错的一种算法 xff08 1 xff09 回归 先来说说
  • 机器学习算法: 逻辑回归的介绍和应用

    逻辑回归的介绍 逻辑回归 xff08 Logistic regression xff0c 简称LR xff09 虽然其中带有 34 回归 34 两个字 xff0c 但逻辑回归其实是一个分类模型 xff0c 并且广泛应用于各个领域之中 虽然现
  • 算法实践1_线性回归

    参数解释 sklearn linear model LinearRegression fit intercept True normalize False copy X True n jobs None 超参 解释 类型 默认值 fit i
  • 加权随机抽样算法

    1 基于均匀分布概率的算法 例如 3等奖抽中的概率是70 2等奖是20 1等奖是10 这样 大部分人都只能中3等奖 小部分人是二等奖 而只有特别少的人才可能拿到一等奖 产生0 100之间的均匀分布的随机数 当随机数在0 70时 就获得3等奖
  • 决策树和随机森林

    回归模型 1 信息熵 1 熵 2 联合熵 3 条件熵 4 互信息 2 决策树学习算法 1 决策树 2 决策树生成算法 3 信息增益 4 信息增益率 5 Gini系数 6 ID3算法举例 7 三种决策树学习算法 8 回归树 3 决策树的评价
  • 机器学习算法(二十四):最近邻算法 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 Regression Classifier)

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

    暂时针对二维卷积 方法1 按定义计算 def numpy conv inputs myfilter h ori w ori inputs shape h k w k myfilter shape h new w new h ori h k
  • Pytroch 模型权重初始化

    目录 1 概念 2 权值初始化方法 2 1 常数初始化 2 2 均匀分布初始化 2 3 正态分布初始化 2 4 Xavier 均匀分布 2 5 Xavier 正态分布 2 6 kaiming 均匀分布 2 7 kaiming 正态分布 2
  • 推荐系统详解

    1 基于内容的推荐系统 1 基于内容的推荐算法概述 基于内容的推荐算法 Content based Recommendations CB 也是一种工业界应用比较广的一种推荐算法 由于协同过滤推荐算法中仅仅基于用户对于商品的评分进行推荐 所以
  • 匹配算法之 匈牙利算法详解

    参考 算法学习笔记 5 匈牙利算法 漫谈匈牙利算法 匈牙利算法 KM算法 匈牙利算法 二分图 通俗易懂小白入门 二分图最大匹配 匈牙利算法 多目标跟踪之数据关联 匈牙利匹配算法和KM算法 小白学习笔记 一 目标跟踪 匈牙利匹配 一 匈牙利算
  • 关于Pytorch中的向量拼接

    torch cat A torch ones 2 4 print A B 2 torch ones 2 4 print B C torch cat A B 0 print C D torch cat A B 1 print D A的输出 t
  • SVM算法笔记(2)

    线性可分支持向量机与硬间隔最大化 1 线性可分支持向量机 一般地 训练数据线性可分 存在无穷个分离超平面可将两类数据正确分开 感知机利用误分类最小的策略 求得分离超平面 解有无穷多个 线性可分支持向量机利用间隔最大化求最优分离超平面 解唯一
  • 机器学习算法学习一--------学习链接

    1 这个github是java的机器学习算法 对于我这个java程序员来说 挺不错的点击打开链接 2 这个博客基础理论不错点击打开链接
  • 指数平滑法(Exponential Smoothing,ES)

    目录 1 指数平滑 2 一次指数平滑预测 又叫简单指数平滑 simple exponential smoothing SES 2 1 定义 2 2 例题 3 二次指数平滑法 Holt s linear trend method 3 1 定义
  • KNN算法优缺点、原理及参数最优解

    文章目录 1 KNN算法简介 1 1 简述 1 2 优缺点 1 3 适用数据范围 2 工作原理 2 1 训练样本集 2 2 电影类别的KNN分析 如何进行电影分类 在这里插入图片描述 2 3 欧几里得距离 Euclidean Distanc
  • 机器学习2-线性回归

    一 矩阵求导公式 1 总体情况 2 分子布局 Numerator layout 和分母布局 Denominator layout 首先我们常说 y 对 x 求导 这里的 y 和 x 均默认为列向量 y为 mx1 x为 nx1 1 分子布局
  • 人工智能-10种机器学习常见算法

    机器学习是目前行业的一个创新且重要的领域 今天 给大家介绍机器学习中的10种常见的算法 希望可以帮助大家适应机器学习的世界 1 线性回归 线性回归 Linear Regression 是目前机器学习算法中最流行的一种 线性回归算法就是要找一
  • 一网打尽目前常用的聚类方法,详细介绍了每一种聚类方法的基本概念、优点、缺点!!

    目前常用的聚类方法 1 K 均值聚类 K Means Clustering 2 层次聚类 Hierarchical Clustering 3 DBSCAN聚类 DBSCAN Clustering 4 谱聚类 Spectral Cluster

随机推荐

  • 【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