【大模型微调系列-03】 大模型数学基础直观入门

【大模型微调系列-03】 大模型数学基础直观入门

🎯 本章目标:不要害怕数学!我们将通过可视化和简单代码,让你像"看电影"一样理解深度学习的数学原理。记住,深度学习的数学其实就是"让计算机学会调整参数"的艺术。

3.1 理论讲解:深度学习的数学"积木块"

3.1.1 张量与矩阵——数据的"容器"

想象一下,你在整理衣柜。标量就像一件衣服,向量就像一排衣服,矩阵就像一个衣柜的所有衣服,而张量就像整个房间所有衣柜的衣服。在深度学习中,张量就是我们存储和处理数据的"多维容器"。

为什么需要张量?

假设你要处理一张彩色图片:

  • 一个像素的亮度值 → 标量(0维)
  • 一行像素 → 向量(1维)
  • 一张灰度图 → 矩阵(2维)
  • 一张彩色图(RGB三通道)→ 3维张量
  • 100张彩色图一起处理 → 4维张量
标量
单个数字
温度: 25度C
向量
一维数组
一周温度
矩阵
二维表格
多城市温度表
3D张量
立体数据
RGB图像
4D张量
批量数据
100张图片
张量的关键属性
属性含义生活类比
形状(shape)各维度的大小衣柜的长×宽×高
数据类型(dtype)存储的数字类型整数价格 vs 小数重量
设备(device)存储位置仓库(CPU) vs 快递站(GPU)
import torch
import numpy as np# 从熟悉的Python列表开始
temperature = 25.5  # 标量
week_temps = [25.5, 26.1, 24.8, 25.9, 26.5, 27.0, 26.2]  # 向量# 转换为PyTorch张量
tensor_scalar = torch.tensor(temperature)
tensor_vector = torch.tensor(week_temps)print(f"标量张量: {tensor_scalar}, 形状: {tensor_scalar.shape}")
print(f"向量张量: {tensor_vector}, 形状: {tensor_vector.shape}")# 创建一个矩阵(多个城市的周温度)
cities_temps = torch.tensor([[25.5, 26.1, 24.8, 25.9, 26.5, 27.0, 26.2],  # 北京[28.5, 29.1, 28.8, 29.9, 30.5, 31.0, 30.2],  # 上海[22.5, 23.1, 22.8, 23.9, 24.5, 25.0, 24.2],  # 成都
])
print(f"矩阵形状: {cities_temps.shape}")  # [3, 7] = 3个城市,7天
张量操作的直观理解
原始张量
shape: 2,3,4
reshape操作
新张量
shape: 6,4
新张量
shape: 2,12
新张量
shape: 24
为什么能变形?
总元素数不变
2*3*4 = 24

关键概念:张量就像橡皮泥,只要总体积(元素总数)不变,就可以揉成不同形状。这在神经网络中非常重要,因为不同层需要不同形状的输入。

3.1.2 线性变换与权重矩阵——神经网络的"调味配方"

想象你在调制鸡尾酒。每种基酒的比例(权重)决定了最终的口味。神经网络中的权重矩阵就像这个配方,它决定了输入如何变成输出。

矩阵乘法的几何意义

矩阵乘法本质上是对空间的变换。想象你有一张照片,矩阵乘法可以:

  • 缩放:让照片变大或变小
  • 旋转:让照片转动角度
  • 投影:把3D物体投影到2D平面
输出空间
变换矩阵
输入空间
矩阵乘法
y = Wx
输出向量
-1,4
权重矩阵W
旋转+缩放
输入向量
2,3
神经网络中的线性变换

在神经网络中,每一层都在做这样的事情:

输出 = 权重矩阵 × 输入 + 偏置
y = Wx + b

这就像:

  • W(权重):每个特征的重要程度
  • x(输入):原始数据
  • b(偏置):基础分数(即使输入为0也有的输出)
import torch
import matplotlib.pyplot as plt# 创建一个简单的线性变换
input_features = 3  # 输入特征数(如:房屋面积、卧室数、位置评分)
output_features = 2  # 输出特征数(如:价格预测、投资价值)# 权重矩阵:决定每个输入特征如何影响输出
W = torch.tensor([[0.5, 2.0, -1.0],   # 第一个输出的权重[1.0, -0.5, 3.0]    # 第二个输出的权重
])# 输入数据
x = torch.tensor([100.0, 3.0, 8.0])  # [面积, 卧室数, 位置评分]# 线性变换
y = torch.matmul(W, x)
print(f"输入: {x}")
print(f"输出: {y}")
print(f"解释: 第一个输出 = 0.5×100 + 2.0×3 + (-1.0)×8 = {y[0]}")

3.1.3 导数与梯度——找到"下山"的方向

想象你蒙着眼睛站在山坡上,想要走到山谷(最低点)。你能做的就是:

  1. 感受脚下的坡度(导数)
  2. 判断哪个方向最陡(梯度)
  3. 朝着下坡方向走一小步(梯度下降)
导数:变化率的度量

导数告诉我们"如果参数变化一点点,结果会变化多少"。

当前位置
参数w=2
损失L=4
计算导数
导数=4
意味着:
w增加1
L约增加4
w减少1
L约减少4
所以应该
减小w!
梯度:多维空间的"指南针"

当有多个参数时,梯度就像一个指南针,指向函数增长最快的方向。我们要朝相反方向走(负梯度方向)才能找到最小值。

# 可视化梯度下降过程
import numpy as np
import matplotlib.pyplot as plt# 定义一个简单的损失函数(碗状)
def loss_function(w):return w**2# 计算导数
def gradient(w):return 2*w# 梯度下降过程
w = 5.0  # 初始位置
learning_rate = 0.1
history = [w]for step in range(20):grad = gradient(w)w = w - learning_rate * grad  # 更新规则history.append(w)if step % 5 == 0:print(f"步骤 {step}: w={w:.3f}, 梯度={grad:.3f}, 损失={loss_function(w):.3f}")
链式法则:复合函数的"多米诺骨牌"

深度网络就像多层嵌套的函数。链式法则告诉我们如何计算最内层参数对最终输出的影响。

dL/dy
dL/dz2
dL/da1
dL/dz1
dL/dW1
输入x
第一层
z1=W1x
激活
a1=ReLU z1
第二层
z2=W2a1
输出
y=softmax z2
损失L

就像推倒多米诺骨牌,每一块倒下都会影响下一块。链式法则让我们能够计算第一块骨牌(输入层参数)对最后一块(损失函数)的影响。

3.1.4 损失函数与优化——模型的"成绩单"

损失函数就像考试分数,告诉模型"你错了多少"。不同类型的问题需要不同的评分标准。

常见损失函数对比
损失函数类型
回归问题
分类问题
MSE均方误差
预测值与真实值
差距的平方
MAE平均绝对误差
预测值与真实值
差距的绝对值
交叉熵
预测概率分布与
真实分布的差异
Hinge Loss
SVM分类
间隔最大化
MSE vs 交叉熵的直观理解

MSE(均方误差):适合连续值预测

  • 预测房价:预测30万,实际32万 → 误差=(32-30)²=4
  • 特点:对大误差惩罚更重(平方放大)

交叉熵:适合分类问题

  • 预测是猫的概率:0.9,实际是猫 → 损失=-log(0.9)≈0.1(很小)
  • 预测是猫的概率:0.1,实际是猫 → 损失=-log(0.1)≈2.3(很大)
  • 特点:对错误但很自信的预测惩罚极重
import torch
import torch.nn.functional as F# MSE示例:预测温度
predicted_temp = torch.tensor([25.0, 26.5, 24.8])
actual_temp = torch.tensor([24.5, 27.0, 24.0])
mse_loss = F.mse_loss(predicted_temp, actual_temp)
print(f"MSE损失: {mse_loss:.4f}")# 交叉熵示例:分类动物(猫、狗、鸟)
# 模型输出的原始分数(logits)
logits = torch.tensor([[2.0, 1.0, 0.1]])  # 认为是猫的可能性最大
target = torch.tensor([0])  # 真实标签:0代表猫
ce_loss = F.cross_entropy(logits, target)
print(f"交叉熵损失: {ce_loss:.4f}")# 转换为概率看看
probs = F.softmax(logits, dim=1)
print(f"预测概率: 猫={probs[0,0]:.2f}, 狗={probs[0,1]:.2f}, 鸟={probs[0,2]:.2f}")
优化器:如何"下山"

优化器决定了我们如何利用梯度来更新参数。就像下山有不同策略:

SGD
随机梯度下降
最简单
沿梯度方向走
Momentum
动量
考虑惯性
像滚雪球
Adam
自适应
自动调节步长
智能导航
  • SGD:老老实实按梯度走,可能很慢
  • Momentum:考虑之前的运动方向,能冲过小坑
  • Adam:自适应调整每个参数的学习率,通常是最佳选择

3.1.5 Softmax与概率——把分数变成概率

Softmax就像"分蛋糕"——把模型的原始输出分数转换成和为1的概率分布。

为什么需要Softmax?

模型的原始输出可能是任意数字:

  • 猫:5.2
  • 狗:2.1
  • 鸟:-1.3

这些数字没有直观含义。Softmax将它们转换为概率:

  • 猫:92%
  • 狗:7%
  • 鸟:1%

现在我们能清楚地说:“模型认为这92%是猫”。

原始分数
logits
指数化
e^x
归一化
除以总和
概率分布
和为1
5.2, 2.1, -1.3
181.3, 8.2, 0.3
181.3/189.8=0.955
8.2/189.8=0.043
0.3/189.8=0.002
95.5%, 4.3%, 0.2%
温度参数:控制模型的"自信度"

温度(Temperature)就像调节模型的"性格":

  • 低温(T<1):让模型更自信、更确定
  • 高温(T>1):让模型更保守、更均匀
import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt# 原始分数
logits = torch.tensor([3.0, 1.0, 0.2])# 不同温度下的概率分布
temperatures = [0.5, 1.0, 2.0, 5.0]
fig, axes = plt.subplots(1, 4, figsize=(12, 3))for idx, temp in enumerate(temperatures):probs = F.softmax(logits / temp, dim=0)axes[idx].bar(['类别A', '类别B', '类别C'], probs.numpy())axes[idx].set_title(f'温度={temp}')axes[idx].set_ylim([0, 1])plt.suptitle('温度对Softmax概率分布的影响')
plt.tight_layout()
# plt.show()  # 如果在notebook中运行print("温度越低,分布越尖锐(更确定)")
print("温度越高,分布越平滑(更不确定)")

3.1.6 反向传播流程——误差的"责任追溯"

反向传播就像侦探破案,从犯罪现场(输出误差)开始,一步步追溯每个嫌疑人(参数)的责任。

完整的前向+反向流程
参数更新
反向传播
前向传播
W2 = W2 - lr*dL/dW2
W1 = W1 - lr*dL/dW1
损失对输出梯度
dL/dy
输出对h2梯度
dL/dh2
h2对W2梯度
dL/dW2
h2对a1梯度
dL/da1
a1对h1梯度
dL/dh1
h1对W1梯度
dL/dW1
第一层
h1 = W1*x + b1
输入数据 x
激活函数
a1 = ReLU h1
第二层
h2 = W2*a1 + b2
输出
y = Softmax h2
计算损失
L = CrossEntropy y,target
梯度的反向流动

想象水从山顶(损失函数)流下来:

  1. 水流分叉:遇到加法节点,梯度复制
  2. 水流汇聚:遇到乘法节点,梯度相乘
  3. 水流调节:遇到激活函数,梯度被调节

每个参数受到的"水压"(梯度)决定了它需要调整多少。

# 简单的反向传播示例
import torch# 构建一个简单的计算图
x = torch.tensor(2.0, requires_grad=True)
w = torch.tensor(3.0, requires_grad=True)
b = torch.tensor(1.0, requires_grad=True)# 前向传播
y = w * x + b  # y = 3*2 + 1 = 7
z = y ** 2     # z = 7^2 = 49
loss = z       # 损失就是z# 反向传播
loss.backward()print(f"前向计算: x={x.item()}, w={w.item()}, b={b.item()}")
print(f"中间结果: y={y.item()}, z={z.item()}")
print(f"\n梯度(责任分配):")
print(f"x的梯度: {x.grad.item()} (x改变1,loss改变{x.grad.item()})")
print(f"w的梯度: {w.grad.item()} (w改变1,loss改变{w.grad.item()})")
print(f"b的梯度: {b.grad.item()} (b改变1,loss改变{b.grad.item()})")
梯度消失和爆炸

在深层网络中,梯度可能会:

  • 消失:梯度越传越小,最后变成0(像电话传话,传到最后听不清)
  • 爆炸:梯度越传越大,最后变成无穷大(像雪崩,越滚越大)

解决方案:

  • 使用合适的激活函数(ReLU而非Sigmoid)
  • 批归一化(Batch Normalization)
  • 梯度裁剪(Gradient Clipping)
  • 残差连接(ResNet的核心思想)

3.2 实操案例

实操1:张量操作实战

import torch
import numpy as np# === 1. 创建张量的多种方式 ===
print("=== 张量创建方法 ===")# 从Python列表
tensor_from_list = torch.tensor([1, 2, 3, 4])
print(f"从列表: {tensor_from_list}")# 全零张量
zeros = torch.zeros(2, 3)
print(f"全零: \n{zeros}")# 全一张量
ones = torch.ones(2, 3)
print(f"全一: \n{ones}")# 随机张量
random = torch.randn(2, 3)  # 标准正态分布
print(f"随机: \n{random}")# 等差数列
arange = torch.arange(0, 10, 2)  # 0到10,步长2
print(f"等差: {arange}")# === 2. 张量形状操作 ===
print("\n=== 形状操作 ===")x = torch.randn(4, 3)
print(f"原始形状: {x.shape}")# reshape/view
x_reshaped = x.reshape(2, 6)
print(f"reshape后: {x_reshaped.shape}")# squeeze去除维度为1的轴
x_with_1 = torch.randn(1, 3, 1, 4)
x_squeezed = x_with_1.squeeze()
print(f"squeeze前: {x_with_1.shape}, squeeze后: {x_squeezed.shape}")# unsqueeze添加维度
x_expanded = x.unsqueeze(0)  # 在第0维添加
print(f"unsqueeze后: {x_expanded.shape}")# === 3. 张量运算 ===
print("\n=== 基本运算 ===")a = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32)
b = torch.tensor([[5, 6], [7, 8]], dtype=torch.float32)print(f"加法: \n{a + b}")
print(f"逐元素乘法: \n{a * b}")
print(f"矩阵乘法: \n{torch.matmul(a, b)}")# === 4. 自动微分预览 ===
print("\n=== 自动微分 ===")x = torch.tensor(2.0, requires_grad=True)
y = x ** 2 + 3 * x + 1
y.backward()
print(f"y = x^2 + 3x + 1, 当x=2时")
print(f"y的值: {y.item()}")
print(f"dy/dx: {x.grad.item()}")

实操2:构建迷你神经网络

import torch
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt# 定义一个简单的两层网络
class MiniNetwork(nn.Module):def __init__(self, input_size, hidden_size, output_size):super().__init__()self.layer1 = nn.Linear(input_size, hidden_size)self.layer2 = nn.Linear(hidden_size, output_size)def forward(self, x):# 前向传播x = self.layer1(x)x = F.relu(x)  # 激活函数x = self.layer2(x)return x# 创建网络
net = MiniNetwork(input_size=3, hidden_size=4, output_size=2)# 生成模拟数据
batch_size = 5
x = torch.randn(batch_size, 3)
target = torch.randint(0, 2, (batch_size,))# 前向传播
output = net(x)
print(f"输入形状: {x.shape}")
print(f"输出形状: {output.shape}")# 计算损失
loss = F.cross_entropy(output, target)
print(f"损失值: {loss.item():.4f}")# 反向传播
loss.backward()# 查看梯度
for name, param in net.named_parameters():if param.grad is not None:print(f"{name}的梯度形状: {param.grad.shape}")

实操3:可视化梯度下降

import numpy as np
import matplotlib.pyplot as plt# 定义一个简单的二次函数
def f(x):return (x - 3) ** 2 + 1def gradient_f(x):return 2 * (x - 3)# 梯度下降
x_history = []
loss_history = []x = -2.0  # 起始点
learning_rate = 0.1
n_steps = 30for i in range(n_steps):x_history.append(x)loss_history.append(f(x))# 计算梯度并更新grad = gradient_f(x)x = x - learning_rate * grad# 可视化
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))# 左图:函数曲线和优化路径
x_range = np.linspace(-3, 8, 100)
y_range = f(x_range)ax1.plot(x_range, y_range, 'b-', label='f(x)=(x-3)²+1')
ax1.plot(x_history, loss_history, 'ro-', markersize=4, label='优化路径')
ax1.axvline(x=3, color='g', linestyle='--', label='最优解 x=3')
ax1.set_xlabel('参数 x')
ax1.set_ylabel('损失值')
ax1.set_title('梯度下降过程')
ax1.legend()
ax1.grid(True, alpha=0.3)# 右图:损失值变化
ax2.plot(range(n_steps), loss_history, 'b-o', markersize=4)
ax2.set_xlabel('迭代步数')
ax2.set_ylabel('损失值')
ax2.set_title('损失值随迭代下降')
ax2.grid(True, alpha=0.3)plt.tight_layout()
# plt.show()print(f"起始点: x={x_history[0]:.2f}, 损失={loss_history[0]:.2f}")
print(f"终止点: x={x_history[-1]:.2f}, 损失={loss_history[-1]:.2f}")
print(f"最优解: x=3.00, 损失=1.00")

实操4:Softmax温度实验

import torch
import torch.nn.functional as Fdef apply_temperature_softmax(logits, temperature):"""应用温度调节的softmax"""return F.softmax(logits / temperature, dim=0)# 模拟模型输出
logits = torch.tensor([4.0, 2.0, 1.0, 0.5, 0.1])
classes = ['猫', '狗', '鸟', '鱼', '兔']print("原始分数(logits):", logits.numpy())
print("\n不同温度下的概率分布:")
print("-" * 50)temperatures = [0.5, 1.0, 2.0, 5.0]for temp in temperatures:probs = apply_temperature_softmax(logits, temp)print(f"\n温度 T={temp}:")for cls, prob in zip(classes, probs):bar = '█' * int(prob * 50)print(f"  {cls}: {prob:.3f} {bar}")# 计算熵(不确定性度量)entropy = -torch.sum(probs * torch.log(probs + 1e-10))print(f"  熵值: {entropy:.3f} (越大越不确定)")

3.3 章节总结

核心要点思维导图

mindmaproot((深度学习数学基础))张量数据的容器多维数组形状操作线性变换矩阵乘法权重和偏置空间变换梯度导数方向导数链式法则优化损失函数梯度下降优化器选择概率Softmax温度调节概率分布反向传播误差传递参数更新梯度流动

与实际深度学习的联系

本章学习的数学概念在实际深度学习中的应用:

  1. 张量操作 → 数据预处理、批处理、特征工程
  2. 线性变换 → 全连接层、卷积层的基础
  3. 梯度计算 → 模型训练的核心机制
  4. 损失函数 → 评估模型性能、指导优化方向
  5. Softmax → 分类任务的概率输出
  6. 反向传播 → 自动计算所有参数的梯度

重要提示

必须掌握

  • 张量的基本概念和形状操作
  • 梯度下降的直观理解
  • 损失函数的作用
  • 前向传播和反向传播的流程

📚 了解即可

  • 具体的数学推导过程
  • 优化器的内部算法细节
  • 梯度消失/爆炸的数学原因

记住:深度学习的数学不是障碍,而是工具。就像开车不需要理解发动机的每个零件,使用深度学习也不需要证明每个数学定理。重要的是理解概念,知道什么时候用什么工具!

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

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

相关文章

科技赋能千年养生丨七彩喜艾灸机器人,让传统智慧触手可及

传统艾灸养生效果显著&#xff0c;却常因烟雾缭绕、操作繁琐、安全隐患等问题令人望而却步。如今&#xff0c;七彩喜艾灸机器人以创新科技破解痛点&#xff0c;将千年艾灸智慧与现代智能深度融合&#xff0c;让养生变得简单、安全、高效&#xff0c;为大众开启“无负担”的艾灸…

【web站点安全开发】任务2:HTML5核心特性与元素详解

目录 一、HTML元素 1、行内元素、块元素、行内块元素 2、替换元素和非替换元素 二、HTML5新增特性 1、语义化标签&#xff1a;提升页面结构化与可读性 2、原生多媒体支持&#xff1a;摆脱插件依赖 3、表单增强&#xff1a;提升交互与验证能力 4、Canvas 与 WebGL&#…

Notepad++插件开发实战:从零打造效率工具

通过定制插件提升文本处理效率300%​​ 一、插件开发核心价值​解决效率瓶颈的终极方案​​定制化工作流​深度集成编辑器功能&#xff08;文档访问、选区操作、语法解析&#xff09;自动化重复操作&#xff08;批量替换、格式转换、数据提取&#xff09;案例&#xff1a;法律文…

微服务单元测试组件(附源码)

背景 微服务的调试&#xff0c;哪怕是简单问题&#xff0c;需要启动9个服务&#xff0c;ui/nginx 网关 应用 auth 基础数据服务 redis nacos 平台服务 &#xff0c;效率差得不行&#xff0c;准备开发一个支持微服务环境的单元测试组件&#xff0c; 组件解决3个问题&#xff1a…

【LeetCode 热题 100】55. 跳跃游戏

Problem: 55. 跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 文…

Java-JVM是什么JVM的类加载机制

一.JVM是什么1.jvm是java虚拟机&#xff0c;是java程序运行的基础环境2.jvm运行的是java源代码经过编译后的class文件&#xff0c;这些class文件经过jvm负责解释或即时编译为对应平台的机器码并执行3.class文件也可以通过其他【jvm languages】经过编译后得到&#xff0c;例如s…

做亚马逊广告,有哪些提高效率的工具

"为什么每天花3小时调整广告却看不到效果&#xff1f;""如何避免高转化关键词被竞争对手抢走&#xff1f;""为什么手动调整预算总是慢市场半拍&#xff1f;""ACOS居高不下真的是关键词选错了吗&#xff1f;""有没有工具能真正实现…

研究学习3DGS的顺序

6 个核心基础模块 序号模块说明推荐学习顺序1&#x1f4f7; 三维计算机视觉基础建立对3D场景、点云、体积的空间理解✅第一个2&#x1f9ee; CT成像原理与图像表示理解CT图像本质、断层数据、密度单位✅并行进行3&#x1f7e1; NeRF与3D Gaussian Splatting原理掌握点云/高斯场…

期刊分类计算机领域会议

该图片已上传图床&#xff0c;需要可自行下载&#xff1a; https://youke1.picui.cn/s1/2025/08/15/689f1e3553930.png 参考链接&#xff1a; 【干货】最全学术期刊级别分类讲解_哔哩哔哩_bilibili

【计算机视觉与深度学习实战】01基于直方图优化的图像去雾技术

摘要 随着计算机视觉技术的快速发展,图像去雾已成为数字图像处理领域的重要研究方向。雾霾、灰尘、水汽等环境因素会严重降低图像的对比度和可见度,影响图像的视觉效果和后续的计算机视觉任务。本文深入探讨了基于直方图优化的图像去雾技术,包括全局直方图均衡化、对比度限…

Vue3 + Axios 实现一个精美天气组件(含实时与未来预报)

Vue3 Axios 实现一个精美天气组件&#xff08;含实时与未来预报&#xff09; 一、前言 在很多管理系统、信息看板、门户首页中&#xff0c;天气模块是一个常见的小组件。 它不仅能展示当前的气温、天气状况&#xff0c;还能提供未来几天的天气趋势&#xff0c;让用户对环境有…

Unity:GUI笔记(二)——工具栏和选择网格、滚动列表和分组、窗口、自定义皮肤样式、自动布局

写在前面&#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。五、工具栏和选择网格1、工具栏使用Unity提供的API&#xff1a;GUI.Toolbar()可以创建一个工具栏。有三个参数是必须…

Streamlit实现Qwen对话机器人

Web界面 一、Streamlit 是一个用于创建数据科学和机器学习应用的开源前端框架&#xff0c;能够快速将 Python 脚本转化为交互式 Web 应用。通过简单的 Python API 就能构建出交互式的数据应用。 1、主要特点 简单易用&#xff1a;纯 Python 编写代码&#xff0c;API 简洁直观…

Linux-地址空间

目录 1.介绍 2.理解 3.Linux早期的内核调度队列 1.介绍 这是32位的程序空间地址图&#xff1a; 为了更好地理解这段图&#xff0c;我们来写一段代码编译运行&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <std…

**标题:发散创新之力,探索隐私计算的未来**隐私计算,作为当下数字化时代的热门话题,正受

标题&#xff1a;发散创新之力&#xff0c;探索隐私计算的未来 隐私计算&#xff0c;作为当下数字化时代的热门话题&#xff0c;正受到越来越多开发者和从业者的关注。本文将带您走进隐私计算的奇妙世界&#xff0c;探讨其背后的技术原理、应用场景以及发展趋势。 一、隐私计算…

线程P5 | 单例模式[线程安全版]~懒汉 + 饿汉

什么是单例模式&#xff1f;在我们正式讲解单例模式之前&#xff0c;没有了解过的小伙伴可能会有疑问...到底啥叫单例模式&#xff1f;&#xff1f;其实单例模式呢&#xff0c;是我们设计模式中的一种&#xff0c;所谓的设计模式&#xff0c;你可以把它理解为一个模板&#xff…

kubernetes中数据存储etcd

etcd 在 Kubernetes 中的角色核心定位&#xff1a;Kubernetes 的 唯一持久化数据存储&#xff08;一致性数据库&#xff09;。职责&#xff1a; 保存整个集群的期望状态&#xff08;desired state&#xff09;&#xff0c;包括节点信息、Pod 清单、Service 定义、ConfigMap、Se…

Linux crontab定时任务

参考资料 【図解】cronの仕組み定时任务 - crontab解决ubuntu下定时任务不执行问题crontab环境变量问题&#x1f4a5;Linux定时任务功能详解&#xff1a;crontab与at命令应用指南 目录一. 环境准备1.1 wsl开启systemd1.2 开启cron日志二. cron服务管理相关命令2.1 service 的方…

企业频繁收到软件律师函?如何彻底解决这一难题

1. 引言&#xff1a;律师函频发&#xff0c;已成信息化管理的“隐形雷区”在工业制造、芯片、航空航天、船舶制造、医疗器械等高要求行业&#xff0c;软件不仅是研发与生产的关键工具&#xff0c;更是企业数据与知识产权安全的“底座”。然而&#xff0c;不少企业却在日常运营中…

在 macOS 上顺利安装 lapsolver

一、什么是 lapsolver&#xff1f; lapsolver 是一个用于求解线性分配问题&#xff08;Linear Assignment Problem, LAP&#xff09; 的 Python 库。线性分配问题是运筹学中的经典问题&#xff0c;核心是在两个集合&#xff08;如“工人”与“任务”&#xff09;之间找到一组最…