从数学推导到PyTorch实现:彻底搞懂Transformer中的√d_k缩放原理
从数学推导到PyTorch实现彻底搞懂Transformer中的√d_k缩放原理在构建现代大语言模型时Transformer架构中的自注意力机制无疑是其核心引擎。许多开发者都熟悉其标准公式在计算查询Query和键Key的点积后会先除以一个被称为“缩放因子”的√d_k然后再送入Softmax函数。这个看似简单的除法操作背后却蕴含着深刻的数学原理和工程智慧。它并非一个随意的设计而是确保模型能够稳定、高效训练的关键“稳定器”。对于希望深入模型底层、理解其行为而非仅仅调用API的中高级开发者而言透彻理解这个缩放因子的来龙去脉是通往更高级模型调试、优化乃至创新的必经之路。本文将带你从最基础的数学期望与方差出发一步步推导出这个缩放因子的必然性并通过PyTorch代码亲手验证其效果观察它对数值分布和训练动态的真实影响。1. 问题的根源点积的方差膨胀效应要理解为什么需要缩放我们必须先审视自注意力机制中最核心的运算查询向量Q与键向量K的点积Dot-Product。在Transformer中我们通常有多个“头”head每个头负责将输入序列映射到不同的表示子空间。对于单个注意力头其计算可以简化为注意力分数 Softmax( (Q * K^T) / √d_k )这里的d_k是查询和键向量的维度。那么如果不进行缩放直接计算Q * K^T会怎样1.1 一个直观的数值实验让我们先抛开理论用代码感受一下问题。假设我们的查询和键向量是随机初始化的。import torch import numpy as np import matplotlib.pyplot as plt # 设置随机种子以保证结果可复现 torch.manual_seed(42) def simulate_attention_scores(d_k, num_samples10000, scaleFalse): 模拟计算注意力分数 Args: d_k: 查询/键的维度 num_samples: 模拟的样本数量 scale: 是否进行缩放 Returns: 注意力分数矩阵的一个元素模拟 # 假设Q和K的每个元素服从均值为0方差为1的独立分布 # 这里我们模拟一个查询向量q和一个键向量k的点积 scores [] for _ in range(num_samples): q torch.randn(d_k) # 维度为d_k的随机向量 k torch.randn(d_k) # 维度为d_k的随机向量 score torch.dot(q, k) # 点积 if scale: score score / np.sqrt(d_k) scores.append(score.item()) return np.array(scores) # 测试不同维度下的分数分布 dims [16, 64, 256, 1024] fig, axes plt.subplots(2, 2, figsize(10, 8)) axes axes.flatten() for idx, d_k in enumerate(dims): ax axes[idx] # 不缩放 scores_unscaled simulate_attention_scores(d_k, scaleFalse) # 缩放 scores_scaled simulate_attention_scores(d_k, scaleTrue) ax.hist(scores_unscaled, bins50, alpha0.5, labelf未缩放 (d_k{d_k}), densityTrue) ax.hist(scores_scaled, bins50, alpha0.5, labelf缩放后 (d_k{d_k}), densityTrue) ax.set_xlabel(注意力分数值) ax.set_ylabel(密度) ax.set_title(f维度 d_k {d_k}) ax.legend() ax.grid(True, alpha0.3) plt.tight_layout() plt.show()运行这段代码你会立刻观察到一个显著现象随着维度d_k的增大未缩放的点积分数其数值范围方差急剧扩大。当d_k1024时分数可能分布在[-100, 100]这样巨大的区间内而缩放后的分数则始终被约束在一个相对稳定的范围内大约[-3, 3]。这个直观现象就是我们所有理论推导的起点。1.2 数学推导方差如何随维度增长为什么点积的方差会随着维度增加而线性增长我们来做一个严格的数学假设和推导。假设查询向量q和键向量k的每个元素都是独立同分布i.i.d.的随机变量。每个元素的期望值均值为 0E[q_i] E[k_i] 0。每个元素的方差为 1Var(q_i) Var(k_i) 1。q和k相互独立。推导点积的期望和方差 点积s q·k Σ_{i1}^{d_k} q_i * k_i。期望 E[s]E[s] E[Σ q_i k_i] Σ E[q_i k_i]。 由于q_i和k_i独立且均值为0E[q_i k_i] E[q_i] * E[k_i] 0。 因此E[s] 0。点积的期望值始终为0与维度无关。方差 Var[s] 方差公式Var[s] E[s^2] - (E[s])^2 E[s^2]因为E[s]0。s^2 (Σ q_i k_i)^2 Σ_i Σ_j (q_i k_i)(q_j k_j)。 求期望E[s^2] Σ_i Σ_j E[q_i k_i q_j k_j]。 由于q_i, k_i相互独立且不同下标i ≠ j时q_i, k_i, q_j, k_j相互独立那么当i ≠ j时E[q_i k_i q_j k_j] E[q_i]E[k_i]E[q_j]E[k_j] 0 * 0 * 0 * 0 0。当i j时E[q_i k_i q_i k_i] E[q_i^2 k_i^2]。由于q_i和k_i独立E[q_i^2 k_i^2] E[q_i^2] * E[k_i^2]。 根据方差定义Var(x) E[x^2] - (E[x])^2已知E[q_i]0,Var(q_i)1所以E[q_i^2] Var(q_i) (E[q_i])^2 1 0 1。同理E[k_i^2] 1。 因此E[q_i^2 k_i^2] 1 * 1 1。综合以上求和式中只有d_k个ij的项不为零每项值为1。 所以Var[s] E[s^2] d_k。关键结论在以上假设下查询向量q和键向量k的点积s其期望为0方差等于向量维度d_k。这意味着点积值的“波动范围”会随着维度d_k线性增大。2. 方差膨胀对Softmax的灾难性影响理解了点积方差随维度线性增长后我们需要探究这为什么会对Transformer的训练构成问题。答案的核心在于后续的Softmax函数。2.1 Softmax函数的特性Softmax函数将一个实数向量z映射为一个概率分布向量σ(z)其中第i个分量为σ(z)_i exp(z_i) / Σ_{j1}^{n} exp(z_j)这个函数有一个非常重要的性质它对输入值的绝对大小不敏感而对输入值之间的相对差异极其敏感。让我们看一个例子def analyze_softmax(input_vector): 分析Softmax输入输出 input_tensor torch.tensor(input_vector, dtypetorch.float32) output torch.softmax(input_tensor, dim0) print(f输入向量: {input_tensor.numpy()}) print(fSoftmax输出: {output.numpy()}) print(f输出熵不确定性度量: {-torch.sum(output * torch.log(output 1e-10)).item():.4f}\n) # 案例1数值适中差异明显 print(案例1适中的数值) analyze_softmax([1.0, 0.5, -0.5]) # 案例2数值整体很大但相对差异与案例1相同 print(案例2放大后的数值差异同案例1) analyze_softmax([10.0, 9.5, 8.5]) # 案例3数值极端大 print(案例3极端大的数值) analyze_softmax([100.0, 99.5, 98.5])输出结果会清晰地展示案例1输出是一个相对“柔和”的概率分布如[0.46, 0.34, 0.20]熵值较高表示还存在一定的不确定性。案例2虽然相对差异1.0, 0.5, -0.5与10.0, 9.5, 8.5相同但Softmax输出变得极其“尖锐”例如[0.84, 0.12, 0.04]熵值大幅降低。最大值几乎占据了全部概率。案例3输出会趋近于一个one-hot向量如[1.000, 0.000, 0.000]熵值接近0。此时Softmax函数几乎做出了绝对确定的选择。2.2 大方差如何导致“Hard” Softmax结合第一节的结论当d_k很大时例如512或1024点积分数s的方差会非常大。这意味着在计算一个序列中某个查询对所有键的注意力分数时这些分数值会散布在一个非常宽的范围内。当这些绝对值很大的分数被送入Softmax时会发生什么概率分布极端化最大的那个分数经过指数运算exp(s_i)后会变成一个天文数字而其他分数即使不小其指数值相对于最大值也微乎其微。这导致Softmax的输出几乎是一个one-hot向量即几乎所有注意力权重都集中在一个位置上。梯度消失Softmax函数的梯度为∂σ_i/∂z_j σ_i(δ_{ij} - σ_j)其中δ_{ij}是克罗内克δ函数。当输出σ接近one-hot时例如[1, 0, 0]对于非最大值的jσ_j ≈ 0导致梯度∂σ_i/∂z_j ≈ 0。这意味着在反向传播时模型几乎学不到如何调整那些未被关注的位置的信息梯度流非常微弱严重拖慢训练速度甚至导致训练停滞。注意力机制失效自注意力机制的设计初衷是让模型能够同时关注序列中多个不同位置的信息。而极端化的注意力分布迫使模型每次只“看”一个地方这严重削弱了其建模复杂依赖关系的能力。注意这种现象在论文《Attention Is All You Need》中被称为推动Softmax函数进入“具有极小梯度”的区域导致需要更多的迭代次数来收敛或者根本难以训练。3. 解决方案方差归一化与√d_k的由来既然问题的根源是点积方差Var[s] d_k那么最直接的思路就是对其进行缩放Scale使其方差回归到一个稳定的值比如1。这就是“缩放点积注意力Scaled Dot-Product Attention”中“缩放”一词的由来。3.1 推导最优缩放因子我们希望找到一个缩放因子α使得缩放后的点积s α * s的方差为1。 已知Var[s] d_k且Var[α * s] α^2 * Var[s] α^2 * d_k。 令α^2 * d_k 1解得α 1 / √d_k。因此将点积结果除以√d_k恰好可以将其方差从d_k校正为1。在之前的假设下均值为0方差为1这保证了缩放后的注意力分数s具有稳定的统计特性均值为0方差为1从而为Softmax函数提供了“友好”的输入。3.2 与其他归一化技术的对比保持梯度稳定是深度学习的核心挑战之一。除了缩放注意力还有其他常见技术技术应用位置核心思想与缩放注意力的关系缩放点积 (除以√d_k)注意力分数计算后Softmax前控制点积结果的方差稳定Softmax输入本文核心针对注意力机制特有问题的专项解决方案层归一化 (LayerNorm)通常用于子层如FFN输出后对单个样本的所有特征维度进行归一化减均值除以标准差稳定该层输出分布更通用处理内部协变量偏移常用于Transformer每个子层后权重初始化 (如Xavier, Kaiming)模型参数初始化时根据激活函数和前/后层维度设置初始权重的方差确保前向/反向传播中信号强度稳定预防性措施为训练提供一个好的起点。好的初始化有时能部分缓解注意力方差问题但不如缩放直接可靠。它们的关系缩放注意力是解决注意力机制内部特定统计问题的必需操作。而LayerNorm和好的初始化是构建深层网络更通用的稳定化工具。在Transformer中它们协同工作缩放保证了注意力分数的稳定性LayerNorm则进一步稳定了每个子层的输出。4. PyTorch实战可视化缩放前后的训练动态理论推导令人信服但实践是检验真理的唯一标准。让我们构建一个简单的实验在微型Transformer模型上直观对比使用和不使用缩放对训练过程的影响。4.1 构建一个可控制的实验环境我们将创建一个极简的、单头的注意力前向传播过程并模拟多次训练步骤观察损失下降和梯度变化。import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset import matplotlib.pyplot as plt class SimpleAttentionModel(nn.Module): 一个极简的模型只包含一层缩放点积注意力 def __init__(self, d_model512, d_k64, scaleTrue): super().__init__() self.d_k d_k self.scale scale # 简单的线性投影层模拟Q, K, V的生成 self.W_q nn.Linear(d_model, d_k, biasFalse) self.W_k nn.Linear(d_model, d_k, biasFalse) self.W_v nn.Linear(d_model, d_k, biasFalse) # 一个简单的输出投影 self.out_proj nn.Linear(d_k, d_model, biasFalse) def forward(self, x): # x: [batch_size, seq_len, d_model] batch_size, seq_len, _ x.shape Q self.W_q(x) # [B, L, d_k] K self.W_k(x) # [B, L, d_k] V self.W_v(x) # [B, L, d_k] # 计算注意力分数 attn_scores torch.matmul(Q, K.transpose(-2, -1)) # [B, L, L] # 关键步骤是否缩放 if self.scale: attn_scores attn_scores / (self.d_k ** 0.5) # 应用Softmax获取注意力权重 attn_weights torch.softmax(attn_scores, dim-1) # [B, L, L] # 应用注意力权重到V context torch.matmul(attn_weights, V) # [B, L, d_k] # 输出投影 output self.out_proj(context) # [B, L, d_model] return output, attn_weights, attn_scores # 生成模拟数据 def generate_synthetic_data(num_samples100, seq_len10, d_model512): 生成简单的合成数据模拟一个重建任务 data torch.randn(num_samples, seq_len, d_model) # 目标就是重建输入本身一个简单的自编码任务 target data.clone() return TensorDataset(data, target) # 训练和监控函数 def train_and_monitor(model, dataloader, epochs50, lr1e-3): criterion nn.MSELoss() optimizer optim.Adam(model.parameters(), lrlr) losses [] grad_norms [] # 记录梯度范数反映梯度大小 for epoch in range(epochs): epoch_loss 0 for batch_data, batch_target in dataloader: optimizer.zero_grad() output, _, _ model(batch_data) loss criterion(output, batch_target) loss.backward() # 计算并记录所有参数梯度的L2范数 total_norm 0 for p in model.parameters(): if p.grad is not None: param_norm p.grad.data.norm(2) total_norm param_norm.item() ** 2 total_norm total_norm ** 0.5 grad_norms.append(total_norm) optimizer.step() epoch_loss loss.item() avg_loss epoch_loss / len(dataloader) losses.append(avg_loss) if (epoch 1) % 10 0: print(fEpoch [{epoch1}/{epochs}], Loss: {avg_loss:.6f}) return losses, grad_norms # 主实验 d_model 128 d_k 64 batch_size 32 epochs 100 train_dataset generate_synthetic_data(num_samples500, seq_len8, d_modeld_model) train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue) print( 训练带缩放因子的模型 ) model_scaled SimpleAttentionModel(d_modeld_model, d_kd_k, scaleTrue) losses_scaled, grads_scaled train_and_monitor(model_scaled, train_loader, epochsepochs) print(\n 训练不带缩放因子的模型 ) model_unscaled SimpleAttentionModel(d_modeld_model, d_kd_k, scaleFalse) losses_unscaled, grads_unscaled train_and_monitor(model_unscaled, train_loader, epochsepochs)4.2 结果分析与可视化运行上述代码后我们可以绘制损失曲线和梯度范数变化图来进行对比。fig, (ax1, ax2) plt.subplots(1, 2, figsize(14, 5)) # 1. 损失曲线对比 ax1.plot(losses_scaled, label带缩放 (除以√d_k), linewidth2) ax1.plot(losses_unscaled, label不带缩放, linewidth2, linestyle--) ax1.set_xlabel(训练轮次 (Epoch)) ax1.set_ylabel(损失 (MSE)) ax1.set_title(训练损失曲线对比) ax1.legend() ax1.grid(True, alpha0.3) ax1.set_yscale(log) # 使用对数坐标更清晰地观察差异 # 2. 梯度范数对比前100个训练步骤 ax2.plot(grads_scaled[:100], label带缩放梯度范数, alpha0.7) ax2.plot(grads_unscaled[:100], label不带缩放梯度范数, alpha0.7) ax2.set_xlabel(训练步骤 (Step)) ax2.set_ylabel(梯度L2范数) ax2.set_title(训练初期梯度大小对比) ax2.legend() ax2.grid(True, alpha0.3) plt.tight_layout() plt.show()典型结果分析损失曲线通常带缩放的模型损失会以更稳定、更快的速度下降并最终收敛到一个更低的损失值。而不带缩放的模型损失曲线可能波动更大、下降缓慢甚至在某些情况下陷入平台期或发生震荡。对数坐标图能更清晰地展现这种收敛速度的差异。梯度范数在训练初期不带缩放的模型其梯度范数往往极其不稳定可能出现突然的尖峰爆炸梯度或接近于零的值消失梯度。带缩放的模型其梯度范数则通常保持在一个相对合理、稳定的范围内。稳定的梯度是模型能够有效学习的前提。这个实验虽然简单但它有力地验证了理论√d_k缩放因子通过稳定注意力分数的统计分布为Softmax提供了适宜的输入环境从而确保了训练过程中梯度流的健康最终使得模型能够更高效、更稳定地收敛。5. 深入思考与扩展讨论理解了基本原理和实现后我们可以进一步探讨一些相关的进阶话题。5.1 假设放松与实际情况我们的推导基于一个关键假设Q和K的元素是独立、零均值、单位方差的。在实际训练的Transformer模型中这个假设成立吗初始化阶段使用如Xavier或Kaiming等精心设计的初始化方法可以近似满足“零均值、单位方差”的假设。因此在训练开始时缩放因子√d_k的作用是精确且必要的。训练过程中随着参数更新Q和K的分布会发生变化不再严格满足初始假设。然而缩放操作仍然是有效的原因在于惯性原理好的初始化让训练起点处于一个良好状态缩放因子在其中起到了关键作用。层归一化LayerNorm的配合Transformer中每个子层包括自注意力层和前馈网络层后面通常都跟有LayerNorm。LayerNorm会主动将输出重新标准化为近似零均值和单位方差。这在一定程度上“修正”了中间层分布的漂移与缩放注意力形成了协同效应共同维护了网络的稳定性。5.2 替代方案与变体除以√d_k是原论文提出的标准方案但并非唯一解。研究社区也探索过其他思路可学习的缩放因子为什么不将缩放因子α作为一个可学习的参数让模型自己决定最优的缩放程度理论上可行但在实践中固定为1/√d_k被证明简单、鲁棒且有效增加一个参数带来的收益有限还可能引入额外的优化不确定性。其他归一化方式有工作尝试在Softmax之前使用LayerNorm或BatchNorm来处理注意力分数。例如√d_k缩放可以看作是一种极其轻量级的、基于固定假设的“归一化”。更复杂的归一化可能带来微小的性能提升但也会增加计算开销。在追求极致效率的架构中√d_k因其简洁高效而成为主流选择。改进的注意力机制如Reformer的局部敏感哈希LSH注意力、Linformer的低秩投影等这些工作从改变注意力计算方式本身入手其内部可能包含不同的数值稳定化策略但标准点积注意力中的缩放思想依然是基础。5.3 在实际项目中的调试启示当你在自定义或调试Transformer类模型时如果遇到训练不稳定、损失震荡或收敛缓慢的问题可以按以下思路排查首先检查缩放因子确认在计算注意力分数时是否正确地进行了除以 √d_k的操作。这是最常见也最容易忽略的bug之一。监控注意力分布在训练过程中定期抽样查看注意力权重矩阵attn_weights。如果发现大量接近0或1的值分布极端化可能就是缩放出了问题或者d_k维度设置得过大而其他稳定措施如LayerNorm未能有效补偿。梯度检查像我们实验中所做的那样监控模型参数的梯度范数。异常的梯度爆炸或消失是训练不稳定的直接信号而注意力机制往往是源头之一。回过头看√d_k这个简单的除法是深度学习中将理论洞察方差分析转化为工程实践稳定训练的一个完美典范。它没有增加任何参数计算代价几乎为零却解决了大模型训练中的一个核心稳定性问题。下次当你编写或调用nn.MultiheadAttention时不妨想一想这个隐藏在参数sqrt(d_k)背后的精妙设计。

相关新闻

手把手教你用ATK-LORA-01模块实现3000米无线通信(附配置软件)

手把手教你用ATK-LORA-01模块实现3000米无线通信(附配置软件)

手把手教你用ATK-LORA-01模块实现3000米无线通信(附配置软件) 最近在做一个智慧农场的环境监测项目,需要在几个相隔较远的温棚之间传输温湿度数据。有线布线成本太高,Wi-Fi和蓝牙的覆盖距离又不够,于是我把目光投向了L…

2026/7/3 5:33:57 阅读更多 →
如何用GPT-4打造智能导航机器人?NavGPT实战教程(附避坑指南)

如何用GPT-4打造智能导航机器人?NavGPT实战教程(附避坑指南)

如何用GPT-4打造智能导航机器人?NavGPT实战教程(附避坑指南) 想象一下,你告诉一个机器人:“去客厅的茶几上把我的眼镜拿过来。”它不仅能听懂,还能环顾四周,识别出客厅、茶几和眼镜,…

2026/7/3 5:34:14 阅读更多 →
RobotStudio手动操作实战:从单轴到重定位的完整流程解析

RobotStudio手动操作实战:从单轴到重定位的完整流程解析

RobotStudio手动操作实战:从单轴到重定位的完整流程解析 在工业机器人仿真与离线编程的世界里,手动操作是连接虚拟模型与现实逻辑的桥梁。很多工程师虽然熟悉RobotStudio的基本界面,但在进行精细调试、路径规划或故障预演时,对手动…

2026/5/17 12:14:36 阅读更多 →

最新新闻

PhotoGIMP终极指南:如何在3天内从Photoshop零成本迁移到开源图像编辑

PhotoGIMP终极指南:如何在3天内从Photoshop零成本迁移到开源图像编辑

PhotoGIMP终极指南:如何在3天内从Photoshop零成本迁移到开源图像编辑 【免费下载链接】PhotoGIMP A Patch for GIMP 3 for Photoshop Users 项目地址: https://gitcode.com/GitHub_Trending/ph/PhotoGIMP 还在为高昂的Photoshop订阅费而苦恼吗?是…

2026/7/3 6:23:44 阅读更多 →
Three.js 加载3dtiles教程

Three.js 加载3dtiles教程

加载3dtiles Load Tiles ▶ 在线运行案例 案例合集: 三维可视化功能案例(threehub.cn)开源仓库github地址: https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 OrbitControls 相机…

2026/7/3 6:23:44 阅读更多 →
基于multisim的函数信号发生器10-10KHz设计

基于multisim的函数信号发生器10-10KHz设计

利用集成运放、电阻、电容、二极管等元器件设计基本的函数信号发生器电路,要求输出方波-三角波-正弦波发生器。频率范围:10~100Hz,100Hz~1kHz,1kHz~10kHz;正弦波Vp-p≈3,三角波Vp-p≈5V,方波Vp-…

2026/7/3 6:23:44 阅读更多 →
医学AI数据基建:高质量临床影像数据集构建实战指南

医学AI数据基建:高质量临床影像数据集构建实战指南

1. 这不是又一个“AI看CT”的演示项目,而是一次临床数据基建的实操复盘“Contributing a New Large Dataset for SARS-CoV-2 Identification via CT Scan”——光看标题,很多人第一反应是:哦,又一个用深度学习识别新冠肺部CT影像的…

2026/7/3 6:23:44 阅读更多 →
Claude Fable 5 恢复访问:模型定位、refusal 机制、fallback 与接入核验指南

Claude Fable 5 恢复访问:模型定位、refusal 机制、fallback 与接入核验指南

Claude Fable 5 已恢复访问。对开发者来说,这次更新不只是“多了一个更强模型”,而是需要重新设计模型路由、成本预算、refusal 处理和 fallback 策略。1. 核心规格项目Claude Fable 5Model IDclaude-fable-5Context window1M tokensMax output128k toke…

2026/7/3 6:21:43 阅读更多 →
VSCode——打开大型项目提示 `OOM (Out of Memory)` 的解决方案

VSCode——打开大型项目提示 `OOM (Out of Memory)` 的解决方案

一、问题描述 最近在使用 VS Code Remote SSH 开发一个大型 Python 项目时,打开工作区后 VS Code 会直接崩溃,并弹出如下错误: The window terminated unexpectedly (reason: oom, code: -536870904)如下图所示:(此处…

2026/7/3 6:19:43 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻