Batch Norm vs Layer Norm:为什么 Transformer 更适合用 Layer Norm?

Batch Norm vs Layer Norm:为什么 Transformer 更适合用 Layer Norm?


1. Batch Norm 和 Layer Norm 的定义与作用

1.1 Batch Normalization (BN)
Batch Norm 是一种归一化方法,主要用于加速深层神经网络的训练。它在每个小批量(batch)中对输入的特征值进行归一化,保证特征的均值接近 0,方差接近 1,从而减小梯度消失和梯度爆炸的问题。

公式:对于第 ( i i i) 个特征:一般是一列
x ^ i = x i − μ B σ B 2 + ϵ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} x^i=σB2+ϵ xiμB
其中:

  • ( x i x_i xi) 是第 ( i i i) 个特征值
  • ( μ B , σ B 2 \mu_B, \sigma_B^2 μB,σB2) 分别为该特征在当前 batch 的均值和方差
  • ( ϵ \epsilon ϵ) 是平滑项,防止分母为 0

经过归一化后,BN 会通过两个可学习参数恢复原来的表达能力:
y i = γ x ^ i + β y_i = \gamma \hat{x}_i + \beta yi=γx^i+β


1.2 Layer Normalization (LN)
Layer Norm 是一种对 单一输入样本的特征维度 进行归一化的方法,不依赖 batch 维度。与 Batch Norm 不同,LN 计算的是当前样本在特征维度上的均值和方差。

公式:对于样本 ( x x x) 中第 ( i i i) 个特征:一般是一行
x ^ i = x i − μ L σ L 2 + ϵ \hat{x}_i = \frac{x_i - \mu_L}{\sqrt{\sigma_L^2 + \epsilon}} x^i=σL2+ϵ xiμL
其中:

  • ( μ L , σ L 2 \mu_L, \sigma_L^2 μL,σL2) 是当前样本所有特征的均值和方差

同样,LN 会使用可学习参数 ( γ , β \gamma, \beta γ,β) 恢复特征表达能力:
y i = γ x ^ i + β y_i = \gamma \hat{x}_i + \beta yi=γx^i+β


2. Batch Norm 和 Layer Norm 的主要区别

对比维度Batch Norm (BN)Layer Norm (LN)
归一化范围Batch 中的每个特征单个样本的所有特征
依赖 Batch 大小依赖小批量数据的均值和方差,Batch 越小效果越差不依赖 Batch 大小,适合单样本或小 Batch
适用场景CNN 等图像任务,Batch 通常较大NLP 和 Transformer 等场景,输入序列和特征维度较多
稳定性小 Batch 或在线学习时效果较差,可能导致波动在小 Batch 和序列任务中表现稳定

3. 为什么 Transformer 中使用 Layer Norm?

Transformer 采用 Layer Norm 的原因可以从以下几个方面解释:

3.1 序列建模任务的特点
  • Transformer 主要用于序列任务(如 NLP),输入通常为高维特征序列,长度可变。
  • Layer Norm 在特征维度上归一化,适应任意长度的序列,而 Batch Norm 依赖批量大小,对序列任务不够灵活。
3.2 小批量训练的限制
  • 在 NLP 任务中,由于长文本的存在,Batch Size 通常较小。Batch Norm 在小 Batch 下效果较差,易受样本均值和方差的噪声影响。
  • Layer Norm 不依赖 Batch 维度,因此在小 Batch 训练中更稳定。
3.3 平稳性和梯度流动
  • Transformer 使用自注意力机制,每层的输入依赖于上一层的输出。Layer Norm 在特征维度归一化,使梯度更新更加稳定。
  • Batch Norm 会因为动态 Batch 均值和方差的变化导致梯度波动。
3.4 并行计算效率
  • Layer Norm 的计算只涉及当前样本,适合 Transformer 的并行计算框架。
  • Batch Norm 需要在小批量数据之间计算统计量,限制了并行效率。

4. 示例:数值模拟 Batch Norm 和 Layer Norm 的效果

我们通过代码模拟两种归一化方法的行为,观察它们在不同输入场景下的效果。

import torch
import torch.nn as nn# 定义数据
torch.manual_seed(42)
input_data = torch.randn(4, 5)  # 4 个样本,每个样本 5 个特征
print("Input Data:\n", input_data)
#让input data = 
# tensor([[ 1.9269,  1.4873,  0.9007, -2.1055, -0.7581],
#        [ 1.0783,  0.8008,  1.6806,  0.3559, -0.6866],
#        [-0.4934,  0.2415, -0.2316,  0.0418, -0.2516],
#        [ 0.8599, -0.3097, -0.3957,  0.8034, -0.6216]])# Batch Norm
batch_norm = nn.BatchNorm1d(5)  # 对每个特征归一化
output_bn = batch_norm(input_data)
print("\nBatch Norm Output:\n", output_bn)# Layer Norm
layer_norm = nn.LayerNorm(5)  # 对每个样本的特征维度归一化
output_ln = layer_norm(input_data)
print("\nLayer Norm Output:\n", output_ln)

Input:

Input Data:tensor([[ 1.9269,  1.4873,  0.9007, -2.1055, -0.7581],[ 1.0783,  0.8008,  1.6806,  0.3559, -0.6866],[-0.4934,  0.2415, -0.2316,  0.0418, -0.2516],[ 0.8599, -0.3097, -0.3957,  0.8034, -0.6216]])
输出对比
  • Batch Norm 的归一化结果依赖于每列特征的 Batch 均值和方差。
  • Layer Norm 的归一化结果仅依赖于每个样本的特征维度。

计算过程与解释

以下是给定代码中 Batch Norm 和 Layer Norm 的手动计算过程。我们分别以 Batch Norm 第 1 列Layer Norm 第 1 行 为例,详细说明其工作原理。


1. Batch Norm 的计算过程

Batch Norm 操作

  • Batch Norm 是对每个特征(列)在整个 batch 中计算均值和方差,然后对每个特征进行归一化处理,公式如下:
    BN ( x i , j ) = x i , j − μ j σ j 2 + ϵ ⋅ γ + β \text{BN}(x_{i,j}) = \frac{x_{i,j} - \mu_j}{\sqrt{\sigma_j^2 + \epsilon}} \cdot \gamma + \beta BN(xi,j)=σj2+ϵ xi,jμjγ+β
    其中:
    • ( x i , j x_{i,j} xi,j ) 是第 ( i i i) 个样本第 ( j j j) 个特征值。
    • ( μ j \mu_j μj ) 是第 ( j j j) 列的均值,( σ j 2 \sigma_j^2 σj2) 是第 ( j j j) 列的方差。
    • ( γ \gamma γ) 和 ( β \beta β) 是可学习参数(初始化为 1 和 0)。

以第 1 列为例(特征索引为 0)
输入数据第 1 列为:
Input 第 1 列 = [ 1.9269 , 1.0783 , − 0.4934 , 0.8599 ] \text{Input}_{\text{第 1 列}} = [1.9269, 1.0783, -0.4934, 0.8599] Input 1 =[1.9269,1.0783,0.4934,0.8599]

  1. 计算均值
    μ 0 = 1.9269 + 1.0783 − 0.4934 + 0.8599 4 = 0.84293 \mu_0 = \frac{1.9269 + 1.0783 - 0.4934 + 0.8599}{4} = 0.84293 μ0=41.9269+1.07830.4934+0.8599=0.84293

  2. 计算方差
    σ 0 2 = ( 1.9269 − μ 0 ) 2 + ( 1.0783 − μ 0 ) 2 + ( − 0.4934 − μ 0 ) 2 + ( 0.8599 − μ 0 ) 2 4 = 0.71583 \sigma_0^2 = \frac{(1.9269 - \mu_0)^2 + (1.0783 - \mu_0)^2 + (-0.4934 - \mu_0)^2 + (0.8599 - \mu_0)^2}{4} = 0.71583 σ02=4(1.9269μ0)2+(1.0783μ0)2+(0.4934μ0)2+(0.8599μ0)2=0.71583

  3. 归一化操作(假设 ( γ = 1 , β = 0 \gamma = 1, \beta = 0 γ=1,β=0)):
    每个元素按以下公式计算:
    BN ( x i , 0 ) = x i , 0 − μ 0 σ 0 2 + ϵ \text{BN}(x_{i,0}) = \frac{x_{i,0} - \mu_0}{\sqrt{\sigma_0^2 + \epsilon}} BN(xi,0)=σ02+ϵ xi,0μ0
    取 ( ϵ = 1 0 − 5 \epsilon = 10^{-5} ϵ=105),结果如下:
    BN ( 1.9269 ) = 1.9269 − 0.84293 0.71583 + 1 0 − 5 ≈ 1.2794 \text{BN}(1.9269) = \frac{1.9269 - 0.84293}{\sqrt{0.71583 + 10^{-5}}} \approx 1.2794 BN(1.9269)=0.71583+105 1.92690.842931.2794
    BN ( 1.0783 ) = 1.0783 − 0.84293 0.71583 + 1 0 − 5 ≈ 0.2774 \text{BN}(1.0783) = \frac{1.0783 - 0.84293}{\sqrt{0.71583 + 10^{-5}}} \approx 0.2774 BN(1.0783)=0.71583+105 1.07830.842930.2774
    BN ( − 0.4934 ) = − 0.4934 − 0.84293 0.71583 + 1 0 − 5 ≈ − 1.5784 \text{BN}(-0.4934) = \frac{-0.4934 - 0.84293}{\sqrt{0.71583 + 10^{-5}}} \approx -1.5784 BN(0.4934)=0.71583+105 0.49340.842931.5784
    BN ( 0.8599 ) = 0.8599 − 0.84293 0.71583 + 1 0 − 5 ≈ 0.0216 \text{BN}(0.8599) = \frac{0.8599 - 0.84293}{\sqrt{0.71583 + 10^{-5}}} \approx 0.0216 BN(0.8599)=0.71583+105 0.85990.842930.0216

第 1 列的输出为
BN 第 1 列输出 = [ 1.2794 , 0.2774 , − 1.5784 , 0.0216 ] \text{BN 第 1 列输出} = [1.2794, 0.2774, -1.5784, 0.0216] BN  1 列输出=[1.2794,0.2774,1.5784,0.0216]


2. Layer Norm 的计算过程

Layer Norm 操作

  • Layer Norm 是对每个样本的所有特征(行)计算均值和方差,然后对整行归一化处理,公式如下:
    LN ( x i , j ) = x i , j − μ i σ i 2 + ϵ ⋅ γ + β \text{LN}(x_{i,j}) = \frac{x_{i,j} - \mu_i}{\sqrt{\sigma_i^2 + \epsilon}} \cdot \gamma + \beta LN(xi,j)=σi2+ϵ xi,jμiγ+β
    其中:
    • ( x i , j x_{i,j} xi,j ) 是第 ( i i i) 个样本第 ( j j j) 个特征值。
    • ( μ i \mu_i μi ) 是第 ( i i i) 行的均值,( σ i 2 \sigma_i^2 σi2) 是第 ( i i i) 行的方差。
    • ( γ \gamma γ) 和 ( β \beta β) 是可学习参数(初始化为 1 和 0)。

以第 1 行为例(样本索引为 0)
输入数据第 1 行为:
Input 第 1 行 = [ 1.9269 , 1.4873 , 0.9007 , − 2.1055 , − 0.7581 ] \text{Input}_{\text{第 1 行}} = [1.9269, 1.4873, 0.9007, -2.1055, -0.7581] Input 1 =[1.9269,1.4873,0.9007,2.1055,0.7581]

  1. 计算均值
    μ 0 = 1.9269 + 1.4873 + 0.9007 − 2.1055 − 0.7581 5 = 0.29026 \mu_0 = \frac{1.9269 + 1.4873 + 0.9007 - 2.1055 - 0.7581}{5} = 0.29026 μ0=51.9269+1.4873+0.90072.10550.7581=0.29026

  2. 计算方差
    σ 0 2 = ( 1.9269 − μ 0 ) 2 + ( 1.4873 − μ 0 ) 2 + ( 0.9007 − μ 0 ) 2 + ( − 2.1055 − μ 0 ) 2 + ( − 0.7581 − μ 0 ) 2 5 = 2.01125 \sigma_0^2 = \frac{(1.9269 - \mu_0)^2 + (1.4873 - \mu_0)^2 + (0.9007 - \mu_0)^2 + (-2.1055 - \mu_0)^2 + (-0.7581 - \mu_0)^2}{5} = 2.01125 σ02=5(1.9269μ0)2+(1.4873μ0)2+(0.9007μ0)2+(2.1055μ0)2+(0.7581μ0)2=2.01125

  3. 归一化操作(假设 ( γ = 1 , β = 0 \gamma = 1, \beta = 0 γ=1,β=0)):
    每个元素按以下公式计算:
    LN ( x 0 , j ) = x 0 , j − μ 0 σ 0 2 + ϵ \text{LN}(x_{0,j}) = \frac{x_{0,j} - \mu_0}{\sqrt{\sigma_0^2 + \epsilon}} LN(x0,j)=σ02+ϵ x0,jμ0
    取 ( ϵ = 1 0 − 5 \epsilon = 10^{-5} ϵ=105),结果如下:
    LN ( 1.9269 ) = 1.9269 − 0.29026 2.01125 + 1 0 − 5 ≈ 1.1526 \text{LN}(1.9269) = \frac{1.9269 - 0.29026}{\sqrt{2.01125 + 10^{-5}}} \approx 1.1526 LN(1.9269)=2.01125+105 1.92690.290261.1526
    LN ( 1.4873 ) = 1.4873 − 0.29026 2.01125 + 1 0 − 5 ≈ 0.8415 \text{LN}(1.4873) = \frac{1.4873 - 0.29026}{\sqrt{2.01125 + 10^{-5}}} \approx 0.8415 LN(1.4873)=2.01125+105 1.48730.290260.8415
    LN ( 0.9007 ) = 0.9007 − 0.29026 2.01125 + 1 0 − 5 ≈ 0.4318 \text{LN}(0.9007) = \frac{0.9007 - 0.29026}{\sqrt{2.01125 + 10^{-5}}} \approx 0.4318 LN(0.9007)=2.01125+105 0.90070.290260.4318
    LN ( − 2.1055 ) = − 2.1055 − 0.29026 2.01125 + 1 0 − 5 ≈ − 1.6822 \text{LN}(-2.1055) = \frac{-2.1055 - 0.29026}{\sqrt{2.01125 + 10^{-5}}} \approx -1.6822 LN(2.1055)=2.01125+105 2.10550.290261.6822
    LN ( − 0.7581 ) = − 0.7581 − 0.29026 2.01125 + 1 0 − 5 ≈ − 0.7437 \text{LN}(-0.7581) = \frac{-0.7581 - 0.29026}{\sqrt{2.01125 + 10^{-5}}} \approx -0.7437 LN(0.7581)=2.01125+105 0.75810.290260.7437

第 1 行的输出为
LN 第 1 行输出 = [ 1.1526 , 0.8415 , 0.4318 , − 1.6822 , − 0.7437 ] \text{LN 第 1 行输出} = [1.1526, 0.8415, 0.4318, -1.6822, -0.7437] LN  1 行输出=[1.1526,0.8415,0.4318,1.6822,0.7437]


更详细的例子可以参考笔者的另一篇博客:以[Today is great] [ How are you]两句话为例:学习Batch Norm和Layer Norm

总结
  • Batch Norm 是对每列(特征维度)进行归一化操作,关注每个特征的分布。适合于计算机视觉任务中输入数据的特征相似性较强的情况。
  • Layer Norm 是对每行(样本维度)进行归一化操作,关注样本自身的特征平衡。适合于 NLP 和序列建模中每个输入样本维度分布差异较大的场景。

5. Transformer 中 Layer Norm 的代码实现

在 Transformer 中,Layer Norm 通常应用于每个子层(子层归一化,SubLayer Norm),确保模型在深层架构中保持数值稳定。

import torch
import torch.nn as nnclass TransformerLayer(nn.Module):def __init__(self, d_model):super(TransformerLayer, self).__init__()self.self_attention = nn.MultiheadAttention(d_model, num_heads=8)self.feed_forward = nn.Sequential(nn.Linear(d_model, d_model * 4),nn.ReLU(),nn.Linear(d_model * 4, d_model))self.norm1 = nn.LayerNorm(d_model)self.norm2 = nn.LayerNorm(d_model)self.dropout = nn.Dropout(0.1)def forward(self, x):# Self-Attention + Residual Connection + Layer Normattn_output, _ = self.self_attention(x, x, x)x = self.norm1(x + self.dropout(attn_output))# Feed-Forward + Residual Connection + Layer Normff_output = self.feed_forward(x)x = self.norm2(x + self.dropout(ff_output))return x# 测试 Transformer Layer
x = torch.randn(10, 16, 512)  # 序列长度 10,Batch Size 16,特征维度 512
layer = TransformerLayer(d_model=512)
output = layer(x)
print("Transformer Output Shape:", output.shape)

6. Layer Norm 在 NLP 任务中的应用

在 NLP 中,Layer Norm 被广泛应用于 Transformer 模型,如 BERT、GPT 等。
典型的应用:

  • BERT:在每个 Encoder 子层中使用 Layer Norm。
  • GPT:在 Decoder 中结合残差连接使用 Layer Norm。

以下是 Layer Norm 在 NLP 任务中提升稳定性的原因:

  1. 输入多样性:句子长度和特征分布差异大,Layer Norm 可适应这些变化。
  2. 小批量训练:NLP 任务常用小 Batch,Layer Norm 保持稳定。
  3. 多头注意力机制:Layer Norm 确保特征维度的均衡分布,提升注意力权重的稳定性。

7. 总结

维度Batch NormLayer Norm
归一化范围Batch 内每列特征每个样本的所有特征
适用场景图像任务(CNN 等)NLP 和序列建模(Transformer 等)
对 Batch 大小的依赖依赖 Batch 大小,Batch 越大越稳定无需依赖 Batch 大小
数值稳定性小 Batch 下梯度可能波动较大无论 Batch 大小如何均稳定

Layer Norm 的灵活性和稳定性,使其成为 Transformer 和 NLP 任务的首选归一化方法,在深层序列模型中尤为重要。

后记

2024年12月14日17点01分于上海,在GPT4o大模型辅助下完成。

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

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

相关文章

【Linux SH脚本】LinuxCheck 应急检查信息脚本

LinuxCheck 1.下载地址 【Linux SH脚本】LinuxCheck 应急检查信息脚本 2.简介 LinuxCheck 是一个开源的自动化检查脚本,旨在快速检测 Linux 系统的安全配置和潜在问题。它支持多种发行版,能够扫描并生成详细的报告,涵盖用户管理、权限配置…

docker 部署 redis

docker 部署 redis 1. 下载 redis 镜像 # docker images | grep redis bitnami/redis 7.2.4-debian-11-r5 45de196aef7e 10 months ago 95.2MB2. docker-compose 部署 version: "3" services:redis:image: bitnami/redis:7.2.4-debian-11-…

WPF中依赖属性的底层和普通属性的底层有什么不一样

WPF中依赖属性的底层 在 WPF 中,依赖属性(Dependency Property)是 WPF 属性系统的核心,它支持功能强大的特性(如数据绑定、动画、样式等)。其底层实现是围绕 DependencyObject 类展开的。以下是 WPF 中依赖…

Python 开源项目精彩荟萃

一、Web 开发框架 Django 高效路由系统&#xff1a; 支持基于正则表达式的复杂 URL 模式匹配&#xff0c;精准定位视图函数&#xff0c;例如可通过r^articles/(?P<year>\d{4})/$这样的正则表达式来匹配特定年份的文章列表页面 URL&#xff0c;并将年份参数传递给视图函数…

相机测距原理

基础概念的回顾 焦距的定义 焦距是指透镜或镜头的光学中心&#xff08;通常是透镜的几何中心&#xff09;到其焦点的距离。 焦点是光线的交点&#xff0c;它指的是透镜或镜头聚焦所有入射光线后汇聚的位置。焦点的位置与透镜的曲率和光线的入射角度相关。就是说所有光线经过…

Python粉色圣诞树

系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…

数据分析学习Day1-使用matplotlib生成2小时每分钟的气温可视化分析图

注意&#xff1a;需要提前下载matplotlib包 pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple import matplotlib.pyplot as plt import random from matplotlib import font_manager # 数据准备 x list(range(121)) # 使用 list() 转换为列表 y [rando…

C++(举例说明类的实例化方式)

太多的信息会让你抓不住重点&#xff0c;下面通过间短的举例说明了类的几种实例化方式&#xff0c;熟悉以后再阅读代码的时候就能减少疑惑。 1.直接实例化&#xff1a;使用类名直接实例化对象 MyClass obj; 2.使用 new 关键字动态分配内存&#xff1a;使用 new 关键字来在堆上…

HuggingGPT Solving AI Tasks with ChatGPT and its Friends in Hugging Face 论文解读

1. 引言 近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;如ChatGPT在自然语言处理领域取得了惊人的进展&#xff0c;展现出强大的语言理解、生成和推理能力。然而&#xff0c;当前的LLMs仍然存在一些局限性&#xff0c;例如无法处理复杂信息&#xff08;如视觉和…

uniapp uni-table最简单固定表头

需求&#xff1a;固定表头数据&#xff0c;在网上找了半天&#xff0c;啥都有&#xff0c;就是一直实现不了&#xff0c;最后更改代码实现 1.效果 2.主要代码讲解完整代码 表格的父级一定要设置高度&#xff0c;不然会错位&#xff0c;我看网上说设置position&#xff1a;fixed…

HTML、CSS表格的斜表头样式设置title 画对角线

我里面有用到layui框架的影响&#xff0c;实际根据你自己的框架来小调下就可以 效果如下 上代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

【人工智能】OpenAI O1模型:超越GPT-4的长上下文RAG性能详解与优化指南

在人工智能&#xff08;AI&#xff09;领域&#xff0c;长上下文生成与检索&#xff08;RAG&#xff09; 已成为提升自然语言处理&#xff08;NLP&#xff09;模型性能的关键技术之一。随着数据规模与应用场景的不断扩展&#xff0c;如何高效地处理海量上下文信息&#xff0c;成…

Java后端面试场景题汇总

1.50 亿数据如何去重&排序? 如此大的数据集进行去重(例如50亿数据条目),我们需要考虑内存和存储空间的限制,同时还需要有一个高效的算法。一般来说,这样的数据量无法直接载入内存进行处理,因此需要采用磁盘存储和分布式处理的技术。主要有以下几种思路: 外部排序…

学习笔记069——Java集合框架

文章目录 集合1、List 接口2、Set 接口3、Map3.1、Map 常用实现类 集合 需要创建多个对象&#xff0c;但是数量和类型不确定。 集合是 Java 提供的一种类型&#xff0c;功能和数组类似&#xff0c;但是长度和数据类型都是动态。 集合框架&#xff08;包括很多类和接口&#…

Baumer工业相机的EMVA1288 数据报告简介

项目场景&#xff1a; Baumer工业相机堡盟VCX系列和VLX系列为堡盟全系列相机中的主流常用相机和高端相机&#xff0c;性能强大、坚固可靠&#xff0c;易于集成&#xff0c;常用与一般行业的检测定位识别使用。 对应的高端相机系列具有极为丰富的强大技术功能&#xff0c;可轻…

游戏引擎学习第45天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们刚刚开始研究运动方程&#xff0c;展示了如何处理当人物遇到障碍物时的情况。有一种版本是角色会从障碍物上反弹&#xff0c;而另一版本是角色会完全停下来。这种方式感觉不太自然&#xff0c;因为在游戏中&#xff0c;…

Django基础之模板

一.前言 前面我们讲了视图&#xff0c;我们今天来讲一下模板&#xff0c;模板其实也就是视图中render返回的html进行的渲染&#xff0c;然后展示到浏览器页面上去&#xff0c;那我们今天就来和大家来说一下模板的基本用法 二.寻找html模板 这个也就是我们前面说了的找html&a…

每天40分玩转Django:简介和环境搭建

Django简介和环境搭建 一、课程概述 学习项目具体内容预计用时Django概念Django框架介绍、MVC/MTV模式、Django特点60分钟环境搭建Python安装、pip配置、Django安装、IDE选择45分钟创建项目项目结构、基本配置、运行测试75分钟实战练习创建个人博客项目框架60分钟 二、Djang…

C++随机数

有些时候&#xff0c;当我们想要一些不固定的数时&#xff0c;总是不知道怎么搞 so&#xff0c;咋搞&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#…

MacOs 日常故障排除troubleshooting

1. 关闭开机自启动 app X macOs 15.1 System settings -> General -> Login Items & Extensions->Open at Login -> Select app X and click -