深度学习——3种常见的Transformer位置编码【sin/cos、基于频率的二维位置编码(2D Frequency Embeddings)、RoPE】

🌺历史文章列表🌺

  1. 深度学习——优化算法、激活函数、归一化、正则化
  2. 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸
  3. 深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总
  4. 万字长文解读深度学习——卷积神经网络CNN
  5. 万字长文解读深度学习——循环神经网络RNN、LSTM、GRU、Bi-RNN
  6. 万字长文解读深度学习——Transformer
  7. 万字长文解读深度学习——GPT、BERT、T5
  8. 万字长文解读深度学习——ViT、ViLT、DiT
  9. 万字长文解读深度学习——CLIP、BLIP
  10. 万字长文解读深度学习——AE、VAE
  11. 万字长文解读深度学习——GAN
  12. 万字长文解读深度学习——训练、优化、部署细节

文章目录

  • Transformer中常见的编码方式
    • 正弦/余弦位置编码(Sinusoidal Positional Encoding)
    • 基于频率的二维位置编码(2D Frequency Embeddings)
    • 旋转式位置编码(Rotary Position Embeddings, RoPE)
      • RoPE 的数学原理
      • RoPE 的实现步骤
        • 1. 计算旋转角度
        • 2. 构造旋转矩阵
        • 3. 旋转变换
        • 4. 自注意力机制
      • RoPE 的优点
      • 应用场景
      • 总结

Transformer中常见的编码方式

  • 自注意力机制(Self-Attention)本身不具备任何顺序或空间位置信息。
  • 为此,需要显式地将位置信息嵌入输入特征,以确保模型能够感知特征间的空间或时间关系。

正弦/余弦位置编码(Sinusoidal Positional Encoding)

在 Transformer 的原始论文(Vaswani et al., 2017)中提出的,最原始的位置编码。正弦/余弦位置编码也叫1D Frequency Embeddings,通过频率函数将每个位置嵌入到特征空间中。

公式:
P E ( p o s , 2 i ) = sin ⁡ ( p o s 1000 0 2 i d ) PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{\frac{2i}{d}}}\right) PE(pos,2i)=sin(10000d2ipos)
P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 1000 0 2 i d ) PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{\frac{2i}{d}}}\right) PE(pos,2i+1)=cos(10000d2ipos)

  • p o s pos pos:表示输入序列的位置。
  • d d d:表示embedding维度。
  • 正弦和余弦的周期性特点可以让模型捕获相对位置信息。

说明:

  • 正弦 sin ⁡ \sin sin 被应用于所有偶数维(索引为 2 i 2i 2i);
  • 余弦 cos ⁡ \cos cos 被应用于所有奇数维(索引为 2 i + 1 2i+1 2i+1)。

这种设计的意义在于:

  1. 区分不同维度的位置信息
    • 对偶数维和奇数维分别使用不同的函数,可以让不同维度的位置信息具有不同的变化模式
    • 例如,偶数维的位置信息可能更注重某种语义,奇数维则可能补充另一种语义。
  2. 模型的平移不变性
    • 在一些任务中,特别是相对位置编码时,正弦和余弦函数的周期性可以帮助模型更容易地捕获相对距离信息。
  3. 消除对称性
    • 如果只用一种函数,比如全是 sin ⁡ \sin sin,可能导致偶数维和奇数维的输出具有对称性,降低信息的区分度

基于频率的二维位置编码(2D Frequency Embeddings)

主要针对Transformer处理二维数据(如图像)的情况。在 ViT(Vision Transformer)的标准实现中,将两个独立的 1D Frequency Embeddings 分别应用于图像的行(height)和列(width)方向,然后通过拼接(concat)或求和(add)来构造最终的 2D Frequency Embeddings

实现方式:两个 1D Frequency Embeddings 构成 2D Embeddings

给定图像的大小为 H × W H \times W H×W,编码维度为 D D D,这种 2D 编码的计算方式如下:

  1. 沿行(Height)方向生成 1D Frequency Embeddings
    对行索引 x ∈ [ 0 , H − 1 ] x \in [0, H-1] x[0,H1],生成对应的正弦和余弦位置编码:
    P E x , 2 i = sin ⁡ ( x 1000 0 2 i D ) , P E x , 2 i + 1 = cos ⁡ ( x 1000 0 2 i D ) PE_{x, 2i} = \sin\left(\frac{x}{10000^{\frac{2i}{D}}}\right), \quad PE_{x, 2i+1} = \cos\left(\frac{x}{10000^{\frac{2i}{D}}}\right) PEx,2i=sin(10000D2ix),PEx,2i+1=cos(10000D2ix)

  2. 沿列(Width)方向生成 1D Frequency Embeddings
    对列索引 y ∈ [ 0 , W − 1 ] y \in [0, W-1] y[0,W1],同样生成正弦和余弦位置编码:
    P E y , 2 i = sin ⁡ ( y 1000 0 2 i D ) , P E y , 2 i + 1 = cos ⁡ ( y 1000 0 2 i D ) PE_{y, 2i} = \sin\left(\frac{y}{10000^{\frac{2i}{D}}}\right), \quad PE_{y, 2i+1} = \cos\left(\frac{y}{10000^{\frac{2i}{D}}}\right) PEy,2i=sin(10000D2iy),PEy,2i+1=cos(10000D2iy)

  3. 最终组合:

    • 拼接:
      P E ( x , y ) = concat ( P E x , P E y ) PE_{(x, y)} = \text{concat}(PE_x, PE_y) PE(x,y)=concat(PEx,PEy)
      最终维度为 (2D)
    • 求和:
      P E ( x , y ) = P E x + P E y PE_{(x, y)} = PE_x + PE_y PE(x,y)=PEx+PEy
      最终维度为 (D)

说明:

  1. 分解二维结构:

    • 图像的二维空间本质上可以分解行和列的两个独立维度。因此,分别对行和列编码是一种有效的做法,既利用了图像的二维特性,又保持了实现的简单性。
  2. 保持 Transformer 的通用性:

    • Transformer 本质是基于序列操作的,而将二维图像划分为行和列的独立序列后,位置编码的计算方式可以复用 NLP 中的正/余弦编码
  3. 减少计算复杂度:

    • 相较于直接生成每个位置 ( x , y ) (x, y) (x,y)的二维正弦编码,这种方法的计算复杂度更低,同时效果相近。

旋转式位置编码(Rotary Position Embeddings, RoPE)

Rotary Position Embeddings (RoPE) 是一种基于旋转变换的位置编码方法,同时支持绝对位置相对位置的建模。

传统位置编码的局限

  1. 绝对位置编码(如正弦/余弦编码)
    • 提供固定的绝对位置信息。
    • 不能自然建模相对位置关系。
  2. 相对位置编码
    • 能够建模相邻元素间的相对距离。
    • 但实现复杂度较高,尤其在长序列任务中开销较大。

RoPE 的创新点
RoPE 提出了旋转式变换的思路,通过将位置信息直接嵌入到输入特征的投影空间,既能高效建模绝对位置,又能自然捕捉相对位置关系。

RoPE 的数学原理

输入特征与位置编码的表示

  1. 假设输入向量为 x ∈ R d \mathbf{x} \in \mathbb{R}^d xRd,其中 d d d 是特征维度。
  2. 每个输入向量的维度分为偶数和奇数两部分,分别进行正弦和余弦编码:
    • PE i = sin ⁡ ( pos 1000 0 2 i / d ) \text{PE}_i = \sin\left(\frac{\text{pos}}{10000^{2i/d}}\right) PEi=sin(100002i/dpos)(偶数维度)。
    • PE i = cos ⁡ ( pos 1000 0 2 i / d ) \text{PE}_i = \cos\left(\frac{\text{pos}}{10000^{2i/d}}\right) PEi=cos(100002i/dpos)(奇数维度)。
    • pos \text{pos} pos 是输入的位置信息。

旋转变换

  • RoPE 的核心思想是对每个特征向量进行旋转操作,具体通过二维旋转矩阵实现:
    x rot = R ( θ ) ⋅ x , \mathbf{x}_{\text{rot}} = \mathbf{R}(\theta) \cdot \mathbf{x}, xrot=R(θ)x,
    其中:
    • R ( θ ) \mathbf{R}(\theta) R(θ) 是旋转矩阵,角度 θ \theta θ 与位置有关。

    • 旋转矩阵作用于偶数维度和奇数维度的输入特征,旋转变化如下:
      [ x even ′ x odd ′ ] = [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] ⋅ [ x even x odd ] \begin{bmatrix} x_{\text{even}}' \\ x_{\text{odd}}' \end{bmatrix} = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} \cdot \begin{bmatrix} x_{\text{even}} \\ x_{\text{odd}} \end{bmatrix} [xevenxodd]=[cos(θ)sin(θ)sin(θ)cos(θ)][xevenxodd]

      符号意义

      1. [ x even x odd ] \begin{bmatrix} x_{\text{even}} \\ x_{\text{odd}} \end{bmatrix} [xevenxodd]:

        • 原始特征向量的偶数维度和奇数维度
        • 输入向量 x \mathbf{x} x 被分解为偶数索引部分 x even x_{\text{even}} xeven 和奇数索引部分 x odd x_{\text{odd}} xodd
          • 偶数维:例如,第 0、2、4… 维。
          • 奇数维:例如,第 1、3、5… 维。
      2. [ x even ′ x odd ′ ] \begin{bmatrix} x_{\text{even}}' \\ x_{\text{odd}}' \end{bmatrix} [xevenxodd]:

        • 旋转后特征向量的偶数维度和奇数维度
        • 这是嵌入位置信息后的特征表示。
      3. [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} [cos(θ)sin(θ)sin(θ)cos(θ)]:

        • 二维旋转矩阵,用于将特征向量的偶数维度和奇数维度进行旋转变换。
        • 旋转角度 θ \theta θ与位置(如时间步或空间坐标)相关。

相对位置的自然建模

  • 通过旋转变换,两个特征间的相对位置关系可以直接通过旋转角度差 ( Δ θ ) (\Delta \theta) (Δθ) 捕捉:
    Attention ( q , k ) = dot ( q rot , k rot ) . \text{Attention}(\mathbf{q}, \mathbf{k}) = \text{dot}(\mathbf{q}_{\text{rot}}, \mathbf{k}_{\text{rot}}). Attention(q,k)=dot(qrot,krot).
    • q rot \mathbf{q}_{\text{rot}} qrot k rot \mathbf{k}_{\text{rot}} krot 是经过 RoPE 编码的查询(Query)和键(Key)向量。
    • 相对位置差的建模通过旋转后的内积自然实现。

RoPE 的实现步骤

1. 计算旋转角度

根据输入位置 pos \text{pos} pos 和维度 d d d 生成旋转角度。

公式
每个维度的旋转角度通过以下公式计算:
θ i = pos 1000 0 2 i / d , \theta_{i} = \frac{\text{pos}}{10000^{2i/d}}, θi=100002i/dpos,
其中:

  • pos \text{pos} pos:输入特征的位置索引(如序列中的时间步或图像的空间位置)。
  • d d d:特征向量的总维度。
  • i i i:当前特征维度的索引。

过程

  1. 分解频率因子

    • 为不同的维度 (i) 生成对应的频率因子:
      1 1000 0 2 i / d \frac{1}{10000^{2i/d}} 100002i/d1
      其中 d d d 控制总维度范围内的频率分布:
      • 低维度的频率变化较慢(低频),适合建模全局信息
      • 高维度的频率变化较快(高频),适合捕捉局部细节
  2. 结合位置计算角度

    • 对于每个位置 pos \text{pos} pos,乘以频率因子以生成旋转角度:
      θ i = pos ⋅ 1 1000 0 2 i / d \theta_{i} = \text{pos} \cdot \frac{1}{10000^{2i/d}} θi=pos100002i/d1
    • 不同位置的旋转角度反映了其空间或时间位置信息。

结果

  • 每个位置 pos \text{pos} pos 和每个维度 i i i 对应一个独特的旋转角度 θ i \theta_{i} θi
  • 输出是一个长度为 d d d 的旋转角度数组。

2. 构造旋转矩阵

旋转矩阵用于将偶数维和奇数维的特征进行二维旋转嵌入每对偶数维和奇数维被看作一个二维向量。

公式
二维旋转矩阵的形式为:
R ( θ ) = [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] \mathbf{R}(\theta) = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} R(θ)=[cos(θ)sin(θ)sin(θ)cos(θ)]
过程

  1. 匹配每个维度的角度

    • 根据上一步计算的旋转角度 θ i \theta_i θi,生成每对偶数维和奇数维的旋转矩阵。
  2. 作用对象

    • 偶数维 even ( i ) \text{even}(i) even(i) 和奇数维 odd ( i + 1 ) \text{odd}(i+1) odd(i+1) 被看作一个二维向量:
      x even , x odd \mathbf{x}_{\text{even}}, \mathbf{x}_{\text{odd}} xeven,xodd
  3. 生成旋转变换

    • 使用 cos ⁡ ( θ i ) \cos(\theta_i) cos(θi) sin ⁡ ( θ i ) \sin(\theta_i) sin(θi) 填充旋转矩阵。

3. 旋转变换

将旋转矩阵作用于特征向量的偶数维和奇数维,以嵌入位置信息。

公式
旋转后的特征向量表示为:
[ x even ′ x odd ′ ] = [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] ⋅ [ x even x odd ] . \begin{bmatrix} x_{\text{even}}' \\ x_{\text{odd}}' \end{bmatrix} = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} \cdot \begin{bmatrix} x_{\text{even}} \\ x_{\text{odd}} \end{bmatrix}. [xevenxodd]=[cos(θ)sin(θ)sin(θ)cos(θ)][xevenxodd].

过程

  1. 输入特征

    • 输入特征 x \mathbf{x} x 被分解为偶数维和奇数维两部分:
      x = [ x even , x odd ] \mathbf{x} = [x_{\text{even}}, x_{\text{odd}}] x=[xeven,xodd]
  2. 旋转变换

    • 对于每对偶数维和奇数维:
      x even ′ = x even ⋅ cos ⁡ ( θ ) − x odd ⋅ sin ⁡ ( θ ) , x_{\text{even}}' = x_{\text{even}} \cdot \cos(\theta) - x_{\text{odd}} \cdot \sin(\theta), xeven=xevencos(θ)xoddsin(θ),
      x odd ′ = x even ⋅ sin ⁡ ( θ ) + x odd ⋅ cos ⁡ ( θ ) . x_{\text{odd}}' = x_{\text{even}} \cdot \sin(\theta) + x_{\text{odd}} \cdot \cos(\theta). xodd=xevensin(θ)+xoddcos(θ).
    • 旋转后的特征将位置信息嵌入到每个维度中。
  3. 重组特征

    • 将旋转后的偶数维和奇数维重新合并,得到嵌入了位置信息的特征向量。

4. 自注意力机制

使用旋转后的特征向量参与自注意力计算,在 Attention 的点积操作中显式建模 绝对位置相对位置信息

自注意力公式
自注意力的计算公式为:
Attention ( q , k ) = q ⋅ k \text{Attention}(\mathbf{q}, \mathbf{k}) = \mathbf{q} \cdot \mathbf{k} Attention(q,k)=qk

  • q \mathbf{q} q:查询向量(Query)。
  • k \mathbf{k} k:键向量(Key)。

RoPE 的贡献

  1. 绝对位置信息

    • 旋转变换后的 q \mathbf{q} q k \mathbf{k} k 包含绝对位置信息,使模型能够感知每个特征的位置。
  2. 相对位置信息

    • 点积中隐含了旋转角度差 Δ θ = θ 2 − θ 1 \Delta \theta = \theta_2 - \theta_1 Δθ=θ2θ1
      cos ⁡ ( Δ θ ) + sin ⁡ ( Δ θ ) , \cos(\Delta \theta) + \sin(\Delta \theta), cos(Δθ)+sin(Δθ),
      • Δ θ \Delta \theta Δθ 是两位置间的相对关系,直接体现在注意力值中。

RoPE 的优点

  1. 高效性

    • 不需要复杂的相对位置偏移矩阵或附加参数,直接通过旋转实现。
    • 适合长序列任务,计算复杂度低。
  2. 支持绝对与相对位置

    • 旋转式编码不仅能捕捉绝对位置,还能通过旋转角度差捕捉相对位置关系。
  3. 适配多模态任务

    • RoPE 能同时适用于文本、图像、视频等多模态场景的位置编码需求。
    • 在 FLUX.1 中,用于处理文本的序列关系和图像的空间关系。
  4. 自然的时空特性建模

    • 在视频任务中,可扩展为三维旋转式编码,处理时间维和空间维的关系。

应用场景

  1. 多模态任务

    • 在 FLUX.1 中,用于图像和文本模态的联合处理:
      • 文本位置被编码为序列信息。
      • 图像位置被编码为二维空间关系。
  2. 视频生成

    • 支持视频任务的时空建模,可将时间维引入位置编码。
  3. 长序列任务

    • 如文本生成、长文档理解中,RoPE 能显著提升相对位置的建模能力。

总结

旋转式位置编码(RoPE)是一种高效、灵活的位置编码方案:

  • 核心机制:通过二维旋转矩阵嵌入位置信息,既能建模绝对位置,又能自然捕捉相对位置。
  • 适用场景:从长序列任务到多模态场景,再到视频生成,RoPE 展现出强大的扩展性和适配能力。

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

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

相关文章

【JavaScript】JavaScript开篇基础(7)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

JavaScript的基础数据类型

一、JavaScript中的数组 定义 数组是一种特殊的对象,用于存储多个值。在JavaScript中,数组可以包含不同的数据类型,如数字、字符串、对象、甚至其他数组。数组的创建有两种常见方式: 字面量表示法:let fruits [apple…

WebSocket详解、WebSocket入门案例

目录 1.1 WebSocket介绍 http协议: webSocket协议: 1.2WebSocket协议: 1.3客户端(浏览器)实现 1.3.2 WebSocket对象的相关事宜: 1.3.3 WebSOcket方法 1.4 服务端实现 服务端如何接收客户端发送的请…

周志华深度森林deep forest(deep-forest)最新可安装教程,仅需在pycharm中完成,超简单安装教程

1、打开pycharm 没有pycharm的,在站内搜索安装教程即可。 2、点击“文件”“新建项目” 3、创建项目,Python版本中选择Python39。如果没有该版本,选择下面的Python 3.9下载并安装。 4、打开软件包,搜索“deep-forest”软件包&am…

ES 和Kibana-v2 带用户登录验证

1. 前言 ElasticSearch、可视化操作工具Kibana。如果你是Linux centos系统的话,下面的指令可以一路CV完成服务的部署。 2. 服务搭建 2.1. 部署ElasticSearch 拉取docker镜像 docker pull elasticsearch:7.17.21 创建挂载卷目录 mkdir /**/es-data -p mkdir /**/…

分布式kettle调度平台v6.4.0新功能介绍

介绍 Kettle(也称为Pentaho Data Integration)是一款开源的ETL(Extract, Transform, Load)工具,由Pentaho(现为Hitachi Vantara)开发和维护。它提供了一套强大的数据集成和转换功能&#xff0c…

力扣hot100-->排序

排序 1. 56. 合并区间 中等 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输…

.net 8使用hangfire实现库存同步任务

C# 使用HangFire 第一章:.net Framework 4.6 WebAPI 使用Hangfire 第二章:net 8使用hangfire实现库存同步任务 文章目录 C# 使用HangFire前言项目源码一、项目架构二、项目服务介绍HangFire服务结构解析HangfireCollectionExtensions 类ModelHangfireSettingsHttpAuthInfoUs…

滑动窗口最大值(java)

题目描述 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-1,-3,5,3,6,7]…

springboot项目使用maven打包,第三方jar问题

springboot项目使用maven package打包为可执行jar后,第三方jar会被打包进去吗? 答案是肯定的。做了实验如下: 第三方jar的项目结构及jar包结构如下:(该第三方jar采用的是maven工程,打包为普通jar&#xf…

常用Rust日志处理工具教程

在本文中,我想讨论Rust中的日志。通过一些背景信息,我将带您了解两个日志库:env_logger和log4rs。最后,我将分享我的建议和github的片段。 Rust log介绍 log包是Rust中日志API的事实标准,共有五个日志级别&#xff1…

嵌入式的C/C++:深入理解 static、const 与 volatile 的用法与特点

目录 一、static 1、static 修饰局部变量 2、 static 修饰全局变量 3、static 修饰函数 4、static 修饰类成员 5、小结 二、const 1、const 修饰普通变量 2、const 修饰指针 3、const 修饰函数参数 4. const 修饰函数返回值 5. const 修饰类成员 6. const 与 #defi…

时间请求参数、响应

(7)时间请求参数 1.默认格式转换 控制器 RequestMapping("/commonDate") ResponseBody public String commonDate(Date date){System.out.println("默认格式时间参数 date > "date);return "{module : commonDate}"; }…

SpringBoot(9)-Dubbo+Zookeeper

目录 一、了解分布式系统 二、RPC 三、Dubbo 四、SpringBootDubboZookeeper 4.1 框架搭建 4.2 实现RPC 一、了解分布式系统 分布式系统:由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统 二、RPC RPC:远程…

单片机学习笔记 8. 矩阵键盘按键检测

更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘 目录 0、实现的…

道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选

在现代农业的发展进程中,科技的力量正日益凸显。其中,移动式水肥一体机以其独特的可移动性、智能化以及实现水肥一体化的卓越性能,成为了农业领域的一颗璀璨新星。它不仅改变了传统的农业灌溉施肥方式,更为农业生产带来了高效、精…

android 音效可视化--Visualizer

Visualizer 是使应用程序能够检索当前播放音频的一部分以进行可视化。它不是录音接口,仅返回部分低质量的音频内容。但是,为了保护某些音频数据的隐私,使用 Visualizer 需要 android.permission.RECORD_AUDIO权限。传递给构造函数的音频会话 …

计算机网络八股整理(一)

计算机网络八股文整理 一:网络模型 1:网络osi模型和tcp/ip模型分别介绍一下 osi模型是国际标准的网络模型,它由七层组成,从上到下分别是:应用层,表示层,会话层,传输层,…

利用Python爬虫获得1688按关键字搜索商品:技术解析

在电商领域,1688作为中国领先的B2B电商平台,其商品搜索功能对于商家来说具有极高的价值。通过获取搜索结果,商家可以更好地了解市场趋势,优化产品标题,提高搜索排名。本文将介绍如何使用Python编写爬虫,以获…

Spring Boot集成MyBatis-Plus:自定义拦截器实现动态表名切换

Spring Boot集成MyBatis-Plus:自定义拦截器实现动态表名切换 一、引言 介绍动态表名的场景需求,比如多租户系统、分表分库,或者不同业务模块共用一套代码但操作不同表。说明 MyBatis-Plus 默认绑定固定表名的问题。 二、项目配置 1. 集成 M…