【深度学习】从点积到矩阵乘法:深度解析向量运算在神经网络中的核心应用

AI大模型与数学第64课:矩阵×向量乘法(神经网络矩阵运算底层) <think>我们只需要根据内容生成摘要,不超过150字。摘要应涵盖核心:矩阵乘向量是神经网络底层核心运算,规则、意义、与AI联系、代码验证等。用简洁中文。</think>矩阵乘向量是神经网络最底层核心运算:权重矩阵每行与输入向量点积,输出新特征向量,实现升维、降维与特征变换。全连接层本质就是 Wx+b,Transformer前向传播也全靠连续矩阵乘法。掌握这一步,才算真正看懂AI底层数据流。 阅读详情

1. 从“买菜算账”到神经网络:向量点积的直观理解

很多朋友刚开始接触深度学习,一看到“点积”、“内积”这些词就头疼,感觉是数学家在故弄玄虚。其实,它的核心思想你每天都在用,只是没意识到。想象一下你去菜市场买菜:土豆3块钱一斤,你买了2斤;西红柿4块钱一斤,你买了3斤;黄瓜2块钱一斤,你买了1斤。你心里默默算总价:3×2 + 4×3 + 2×1 = 6 + 12 + 2 = 20块。这个“单价乘以数量再全部加起来”的过程,本质上就是点积运算。

在数学上,对于两个长度相等的向量,比如代表单价的向量 [3, 4, 2] 和代表重量的向量 [2, 3, 1],它们的点积就是对应位置相乘再求和:3*2 + 4*3 + 2*1 = 20。结果是一个单一的数值(标量)。在PyTorch里,实现起来和你想的一样简单:

import torch
price = torch.tensor([3.0, 4.0, 2.0])
weight = torch.tensor([2.0, 3.0, 1.0])
total_cost = torch.dot(price, weight)  # 输出:tensor(20.)

点积之所以重要,是因为它衡量了两个向量之间的“对齐程度”或相似性。如果两个向量方向完全一致(比如单价和重量都成比例增长),点积会很大;如果方向相反,点积会是负数;如果垂直(在更高维空间里),点积接近0。这个特性在深度学习的很多场景里是基石。比如,在推荐系统中,我们可以把用户偏好和商品特征都编码成向量,计算它们的点积,分数越高就说明这个商品越可能被用户喜欢。我自己在搭建简易推荐原型时,就经常先用点积快速验证想法,效果往往出乎意料地好。

2. 点积的威力:从余弦相似度到注意力机制的基石

理解了点积的基本计算,我们来看看它在深度学习里两个非常实在的应用。第一个是余弦相似度。有时候我们不光关心数值大小,更关心向量的“方向”是否一致。比如比较两段文本的语义是否相似,直接看点积可能会被向量长度(比如文章长度)干扰。这时就需要余弦相似度,它其实就是把两个向量先归一化(变成单位长度),再计算点积。公式是 cos(θ) = (a·b) / (||a|| * ||b||)。在PyTorch里可以这样实现:

def cosine_similarity(vec_a, vec_b, eps=1e-8):
    dot_product = torch.dot(vec_a, vec_b)
    norm_a = torch.norm(vec_a)  # 计算向量a的模长
    norm_b = torch.norm(vec_b)  # 计算向量b的模长
    return dot_product / (norm_a * norm_b + eps)  # 加eps防止除零

# 示例:比较两个词向量的相似度
word_vec_cat = torch.tensor([0.8, 0.1, 0.1])
word_vec_kitten = torch.tensor([0.7, 0.2, 0.1])
similarity = cosine_similarity(word_vec_cat, word_vec_kitten)
print(f"余弦相似度: {similarity:.4f}")  # 输出会接近1,表示高度相似

这个函数在对比学习(Contrastive Learning)里是核心。我们需要拉近正样本对(如“猫”和“小猫”)的相似度,拉远负样本对(如“猫”和“汽车”)的相似度,点积或余弦相似度就是衡量这个距离的尺子。

第二个重量级应用,就是当下大热的Transformer注意力机制。注意力机制的核心步骤之一,是计算查询(Query)向量和键(Key)向量之间的相关性分数。这个分数怎么算?就是点积!假设我们有一个序列,每个位置都有一个Query向量和一个Key向量(通常由线性层从输入生成),那么注意力分数矩阵的每个元素 score[i][j],就代表第 i 个位置的Query和第 j 个位置的Key的点积。这个分数决定了在生成第 i 个位置的输出时,应该“注意”第 j 个位置输入的程度。

# 模拟一个简单的注意力分数计算 (不考虑batch和缩放)
seq_len, d_k = 5, 64  # 序列长度5,向量维度64
Q = torch.randn(seq_len, d_k)  # Query矩阵
K = torch.randn(seq_len, d_k)  # Key矩阵
# 计算注意力分数矩阵:每个元素都是点积
attention_scores = Q @ K.T  # 矩阵乘法,等价于批量计算所有向量对的点积
print(f"注意力分数矩阵形状: {attention_scores.shape}")  # 输出: torch.Size([5, 5])

这里 Q @ K.T 是一个矩阵乘法,但请你理解它的本质:结果矩阵第 i 行第 j 列的那个数,就是向量 Q[i] 和向量 K[j] 的点积。矩阵乘法在这里只是高效批量计算所有点积的一种实现方式。我最初学的时候总把矩阵乘法和点积对立起来,后来才明白,矩阵乘法的每个元素计算,都是一个点积过程。这是连接微观(向量运算)和宏观(矩阵变换)的关键。

3. 矩阵乘法:神经网络中的“流水线”与“空间变换”

如果说点积是原子级的反应,那么矩阵乘法就是组建这些原子、构成复杂分子的流水线。它是深度学习中最核心、计算量最大的操作,没有之一。一个最简单的全连接层(也叫线性层或稠密层),其前向传播就是一次矩阵乘法加上一个偏置。

我们来拆解一下这个过程。假设我们有一批数据,batch_size=32,每个样本有 input_dim=784 个特征(比如一张展平的28x28手写数字图像)。第一层神经网络有 output_dim=256 个神经元。那么,权重矩阵 W 的形状就是 [784, 256]。前向传播的公式是 Y = X @ W + b,其中 X 形状为 [32, 784],b 是偏置向量。这个 @ 符号在PyTorch里就代表矩阵乘法。

batch_size, input_dim, output_dim = 32, 784, 256
X = torch.randn(batch_size, input_dim)  # 输入数据
W = torch.randn(input_dim, output_dim)  # 权重矩阵
b = torch.randn(output_dim)             # 偏置向量

# 全连接层前向传播
Y = torch.matmul(X, W) + b  # 等价于 X @ W + b
print(f"输入X形状: {X.shape}")   # torch.Size([32, 784])
print(f"权重W形状: {W.shape}")   # torch.Size([784, 256])
print(f"输出Y形状: {Y.shape}")   # torch.Size([32, 256])

这个计算有什么几何意义呢?你可以把矩阵 W 看作一个“空间变换器”。原始的784维输入空间(每个样本是一个点),经过 W 的乘法,被映射(或投影)到了一个全新的256维空间。这个新空间的每个维度(即输出的256个值),代表了原始特征在新“坐标系”下的某种组合。神经网络的神奇之处就在于,通过堆叠多个这样的变换层(中间加上非线性激活函数如ReLU),它可以学习到将原始数据(如图像像素)逐步映射到高级抽象概念(如“这是数字9”)的复杂变换链。

在实际写代码时,新手最容易混淆的就是 torch.mm、torch.matmul 和 @ 运算符。简单来说:

  • torch.mm:只用于严格的二维矩阵乘法,输入必须是两个二维张量。
  • torch.matmul 或 @:功能更强大,支持广播和批量处理。比如当你的输入是三维张量 [batch, seq, dim] 时,它会把最后两维当作矩阵进行乘法,前面的 batch 和 seq 维度当作批次处理,非常方便。在绝大多数深度学习模型代码中,你看到和使用的都应该是 @ 或 torch.matmul。

4. 哈达玛积:神经网络里的“精细调节器”

现在我们来聊聊哈达玛积(Hadamard Product),也叫逐元素乘积。它的规则简单到令人愉悦:两个形状完全相同的张量,对应位置的数字直接相乘。在PyTorch和NumPy里,直接用 * 运算符或者 torch.mul 函数就行。

A = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
B = torch.tensor([[5.0, 6.0], [7.0, 8.0]])
C = A * B  # 哈达玛积
print(C)
# 输出:
# tensor([[ 5., 12.],
#         [21., 32.]])

你可能觉得这太简单了,有什么用?它的用处可大了,堪称神经网络里的“精细调节器”。一个经典应用是在**门控循环单元(GRU)或长短期记忆网络(LSTM)**中。这些网络里有“门”的概念(比如遗忘门、输入门),门的输出是一个由sigmoid函数产生的、值在0到1之间的向量。这个门控向量会通过哈达玛积,逐元素地控制另一个向量(如候选记忆)有多少信息可以通过。

# 模拟LSTM中输入门对候选记忆的控制
batch_size, hidden_size = 4, 128
input_gate = torch.sigmoid(torch.randn(batch_size, hidden_size))  # 门控信号,值在0~1
candidate_memory = torch.tanh(torch.randn(batch_size, hidden_size)) # 候选记忆
# 使用哈达玛积进行逐元素调制
new_memory_component = input_gate * candidate_memory
# input_gate中接近1的位置,candidate_memory的信息完全保留
# input_gate中接近0的位置,candidate_memory的信息被完全屏蔽

另一个无处不在的应用是注意力机制中的掩码(Masking)。在Transformer处理变长序列时,我们需要屏蔽(mask)掉那些无效的位置(比如句子后面的填充部分)。具体做法就是生成一个与注意力分数矩阵形状相同的掩码矩阵(有效位置为1,填充位置为0或一个很小的负数),然后与注意力分数做哈达玛积。

seq_len = 5
attention_scores = torch.randn(seq_len, seq_len)
# 假设后两个位置是填充的
mask = torch.tensor([[1, 1, 1, 0, 0] for _ in range(seq_len)], dtype=torch.float32)
masked_scores = attention_scores * mask  # 哈达玛积应用掩码
# 或者对于需要softmax前屏蔽的情况,常用加一个极大负数的方法
masked_scores = attention_scores + (1 - mask) * -1e9

哈达玛积和矩阵乘法是深度学习中最容易混淆的两种操作。记住一个简单的口诀:* 是“对应位置直接乘”(哈达玛积),@ 是“行乘列再求和”(矩阵乘法)。 写代码时用错了,模型行为会完全错误,但编译器可能不会报错,所以需要特别小心。

5. 内积与外积:更广阔的视野与特定场景的利器

点积和矩阵乘法我们已经很熟悉了,但“内积”和“外积”这两个词也经常出现,它们到底是什么关系?简单来说,在深度学习的语境下:

  • 内积(Inner Product) 是点积概念的推广。在欧几里得空间(就是我们熟悉的常规向量空间)里,内积就等于点积。但在更广义的数学空间里(比如函数空间、定义了特殊度量的向量空间),内积有更抽象的定义。对我们工程师而言,很多时候可以混用“点积”和“内积”这两个词,知道在 R^n 空间里它们是一回事就行。矩阵也有内积,称为Frobenius内积,就是两个形状相同的矩阵对应元素相乘再全部加起来,得到一个标量。这在计算权重矩阵的L2正则化项(权重衰减)时特别有用,因为L2范数的平方就是矩阵与自身的内积。
# 矩阵的Frobenius内积与L2正则化
weight = torch.randn(100, 50, requires_grad=True)
# 方法1:直接按定义,逐元素乘后求和
frobenius_inner_1 = torch.sum(weight * weight)
# 方法2:等价于计算权重的Frobenius范数的平方
frobenius_inner_2 = torch.norm(weight, p='fro').pow(2)
# 在损失函数中添加L2正则化项
loss = main_loss + 0.01 * frobenius_inner_1
  • 外积(Outer Product) 则是另一种运算。两个向量 u (m维) 和 v (n维) 的外积,结果是一个 m x n 的矩阵。计算方法是 u 的每一个元素分别与整个 v 向量相乘,生成矩阵的一行。在PyTorch中可以用 torch.outer(u, v)。
u = torch.tensor([1, 2, 3])  # 形状 (3,)
v = torch.tensor([4, 5])     # 形状 (2,)
outer_product = torch.outer(u, v)  # 形状 (3, 2)
print(outer_product)
# 输出:
# tensor([[ 4,  5],
#         [ 8, 10],
#         [12, 15]])
# 等价于 u.view(-1, 1) @ v.view(1, -1)

外积在深度学习的一些特定领域很有用。例如,在推荐系统的协同过滤中,用户向量和物品向量的外积可以显式地建模二者特征的交互。在自然语言处理中,有时会用它来构建单词的共现矩阵。在图神经网络中,节点特征的外积可以用来建模节点对之间的关系强度。不过,由于外积会产生一个维度为 m*n 的矩阵,当向量维度很高时,计算和存储开销会非常大,所以它的应用不如点积和矩阵乘法广泛,通常只在维度可控或需要显式交互建模的场景下使用。

6. 综合实战:用向量运算“组装”一个简易自注意力模块

光说不练假把式。我们现在就动手,用前面讲到的点积(矩阵乘法)和哈达玛积,从零组装一个简化版的自注意力(Self-Attention)模块。这个练习能让你真切感受到这些运算是如何协同工作的。

假设我们有一个长度为 T=4 的序列,每个位置的输入特征维度是 d_model=8。我们想计算自注意力。

import torch
import torch.nn.functional as F

T, d_model = 4, 8
# 1. 输入序列
X = torch.randn(T, d_model)  # [4, 8]

# 2. 定义可学习的权重矩阵,用于生成Query, Key, Value
W_q = torch.randn(d_model, d_model, requires_grad=True)
W_k = torch.randn(d_model, d_model, requires_grad=True)
W_v = torch.randn(d_model, d_model, requires_grad=True)

# 3. 计算Q, K, V (线性变换,本质是矩阵乘法)
Q = X @ W_q  # [4,8] @ [8,8] -> [4,8]
K = X @ W_k  # [4,8] @ [8,8] -> [4,8]
V = X @ W_v  # [4,8] @ [8,8] -> [4,8]

# 4. 计算注意力分数(核心:矩阵乘法实现批量点积)
attn_scores = Q @ K.T  # [4,8] @ [8,4] -> [4,4]
# 此时attn_scores[i, j] 就是第i个位置的Query与第j个位置的Key的点积

# 5. 缩放,防止点积结果过大导致softmax梯度消失
d_k = d_model
attn_scores = attn_scores / (d_k ** 0.5)

# 6. 应用可选的注意力掩码(这里演示一个因果掩码,防止看到未来信息)
#    使用哈达玛积的逻辑(这里用加法掩码更常见)
causal_mask = torch.triu(torch.ones(T, T) * float('-inf'), diagonal=1)
attn_scores_masked = attn_scores + causal_mask

# 7. 通过softmax将分数转化为概率分布(注意力权重)
attn_weights = F.softmax(attn_scores_masked, dim=-1)  # [4,4],每行和为1

# 8. 根据注意力权重,对Value进行加权求和(矩阵乘法)
#    attn_weights: [4,4], V: [4,8]
#    输出: [4,8],每个位置得到一个融合了全局信息的新表示
output = attn_weights @ V  # [4,4] @ [4,8] -> [4,8]

print(f"输入形状: {X.shape}")
print(f"注意力权重形状: {attn_weights.shape}")
print(f"输出形状: {output.shape}")

通过这几十行代码,我们清晰地看到了:

  • 矩阵乘法(@) 扮演了核心角色:第3步的线性变换、第4步的点积相似度计算、第8步的加权聚合,都是矩阵乘法。
  • 点积 是第4步的内在本质:attn_scores 矩阵的每个元素都是一个点积。
  • 哈达玛积或其思想 在第6步的掩码操作中体现:虽然这里用了加法掩码,但逐元素操作的思想与哈达玛积一脉相承。

这个简易模块忽略了批量处理、多头注意力等复杂细节,但骨架已经在了。在实际的Transformer实现中,这些运算会被高度优化,并可能调用更底层的库(如CUDA核函数)来加速,但最基本的数学原理就是这些。

7. 效率与优化:理解计算背后的考量

当我们理解了这些运算是什么之后,下一个自然的问题就是:它们快吗?怎么让它们更快?在深度学习中,效率至关重要。

首先,矩阵乘法的时间复杂度是 O(m*n*k)(对于 [m,k] 乘 [k,n] 的矩阵)。当矩阵很大时(比如在大型语言模型中,维度动辄数千),这个计算量是惊人的。这就是为什么深度学习如此依赖GPU。GPU有成千上万个核心,擅长并行执行大量简单的算术运算(如乘加运算),而矩阵乘法正好可以被分解为大量独立的乘加操作,因此GPU的并行计算能力可以得到极致发挥。

其次,内存访问模式同样关键。现代硬件(CPU/GPU)有复杂的内存层次结构(缓存)。连续的内存访问比随机访问快得多。在实现矩阵乘法时,优秀的库(如PyTorch调用的BLAS库)会采用分块(Tiling)等技术,尽量让数据在被使用时停留在高速缓存中,从而减少访问慢速主内存的次数。

对于我们自己写的代码,有一些简单的优化原则:

  1. 尽量使用批量操作:而不是在Python循环中逐个处理样本。PyTorch/TensorFlow的矩阵运算都是高度优化的。
  2. 注意张量的形状和内存布局:确保在连续维度上进行操作。
  3. 理解广播机制:哈达玛积支持广播,即当两个张量形状不完全相同时,较小的张量可以“广播”到较大张量的形状。这很便利,但不当使用可能导致意外的内存扩张和性能下降。
# 广播的例子
A = torch.randn(3, 4, 5)
B = torch.randn(5)        # 形状 (5,)
C = A * B                 # B被广播为(1,1,5),然后复制到(3,4,5)与A相乘
# 这比写循环高效得多,但要知道底层创建了临时张量。

最后,在模型设计层面,研究人员一直在寻找更高效的运算来近似或替代昂贵的矩阵乘法。例如,一些轻量级模型尝试使用深度可分离卷积、线性注意力(Linear Attention)等机制来降低计算复杂度。但无论如何,点积和矩阵乘法作为衡量相似性和进行空间变换的基础地位,目前看来仍是不可动摇的。

8. 常见“坑”与调试技巧

在实战中,我踩过不少关于向量运算的“坑”,这里分享几个最常见的,希望能帮你省点时间。

第一个大坑:混淆 * 和 @。这是新手(有时甚至是老手)最容易犯的错误。* 是逐元素乘,要求两个张量形状相同或可广播;@ 是矩阵乘,要求第一个张量的列数等于第二个张量的行数。如果形状不匹配,PyTorch会报错,这是好事。但可怕的是形状恰好匹配但意义完全错误的情况。比如,你想计算两个特征向量的相似度(点积),却错误地写了 a * b,如果 a 和 b 形状相同,代码不会报错,但返回的是一个向量而不是标量,后续计算必然出错。

第二个坑:维度不匹配导致的隐式广播错误。尤其是在处理批量数据和多头注意力时,张量维度可能是 [batch, heads, seq, dim]。进行矩阵乘法时,你需要清楚你想乘哪两个维度。torch.matmul 在三维及以上张量上的规则是:对最后两个维度进行矩阵乘法,前面的维度作为批次维度进行广播。如果你想要的行为不同,就需要先 transpose 或 permute 调整维度顺序。

# 假设我们有多头注意力的Q, K
batch, heads, seq, d_k = 2, 8, 10, 64
Q = torch.randn(batch, heads, seq, d_k)
K = torch.randn(batch, heads, seq, d_k)
# 想计算每个头内部的注意力分数
scores = torch.matmul(Q, K.transpose(-2, -1))  # 正确:对最后两维做乘,Q:[...,seq,d_k], K^T:[...,d_k,seq]
print(scores.shape)  # [2, 8, 10, 10]
# 如果错误地写成 scores = Q @ K.T,会因维度不匹配而报错。

第三个坑:对in-place操作和自动求导的忽视。在PyTorch中,大部分张量运算会创建新的张量。但有些操作,比如 torch.add_()、torch.mul_() 是in-place操作(原地修改)。在需要计算梯度的张量上使用in-place操作,可能会破坏计算图,导致梯度错误。一个安全的原则是:在模型的前向传播中,除非你非常确定,否则避免对 requires_grad=True 的张量使用带下划线 _ 的in-place操作。

调试技巧:当你怀疑运算出错时,一个非常有效的方法是构造极小化的确定数据来验证。

# 验证点积计算
a = torch.tensor([1., 2.])
b = torch.tensor([3., 4.])
my_dot = (a * b).sum()  # 手动计算:1*3 + 2*4 = 11
torch_dot = torch.dot(a, b)  # 官方函数
print(my_dot, torch_dot)  # 应该都输出 tensor(11.)
assert torch.allclose(my_dot, torch_dot)

另外,善用 torch.einsum 函数。它用一种简洁的标记法来描述张量之间的求和约定,可以清晰地表达复杂的多维张量运算,既不容易出错,也便于理解意图。例如,上述多头注意力的分数计算可以写成 torch.einsum('bhqd,bhkd->bhqk', Q, K),非常清晰。

把这些向量和矩阵运算搞明白,就像是拿到了深度学习这座大厦的砖瓦和钢筋。你可能不会亲自去设计每一块砖,但当你需要搭建自己的模型、修改网络结构或者调试一个诡异的训练错误时,对这些基础材料的透彻理解,就是你手中最可靠的工具。

【线性代数】矩阵运算在深度学习中的核心应用与实战解析 本文深入解析了矩阵运算在深度学习中的核心作用,揭示了其作为神经网络“发动机”的本质。文章通过前向传播、反向传播的矩阵化实现,以及卷积、注意力机制等高级应用,结合实战代码,系统阐述了线性代数如何支撑从数据表示到模型训练的全过程,是理解深度学习底层原理的关键。 阅读详情

相关推荐

矩阵乘法在神经网络中的实战应用:从线性变换到特征提取的完整解析

本文深入解析了矩阵乘法在神经网络中的核心作用,从全连接层的线性变换到卷积神经网络的局部连接,再到注意力机制中的全局关系建模。通过PyTorch实战代码,揭示了权重矩阵如何将原始输入数据转化为高级特征,并强调了激活函数引入非线性的关键性。理解矩阵乘法是掌握深度学习模型设计与优化的基础。

weixin_29048775的博客 235

《神经网络与深度学习》第16章:矩阵运算在深度学习中的应用

你是否曾在调试神经网络时因矩阵维度不匹配而抓狂?是否好奇卷积神经网络中数十亿参数如何高效计算?本文将从基础到实践,详解矩阵运算(Matrix Operation)在深度学习中的核心应用,帮你突破数学瓶颈,提升模型优化能力。读完本文,你将掌握张量运算规则、自动求导中的矩阵变换技巧,并能通过项目提供的可视化资源直观理解复杂运算过程。 ## 矩阵运算基础:从标量到张量 深度学习中的所有数据和参数都以

gitblog_00828的博客 1037

从广播机制到高维运算:NumPy矩阵乘法操作的全维度解析

本文全面解析NumPy中矩阵乘法操作,包括multiply、matmul和dot函数的区别与应用。通过广播机制和高维运算实例,揭示不同场景下的最佳实践,帮助开发者高效处理数据科学和深度学习中的矩阵计算问题。特别适合需要优化numpy矩阵乘法性能的读者。

weixin_29065959的博客 393

【深度学习-Day 2】图解线性代数:从标量到张量,理解深度学习的数据表示与运算

大家好!欢迎来到深度学习系列博客的第二篇。在上一篇中,我们初步了解了深度学习是什么以及它的重要性。从今天开始,我们将深入学习构建深度学习模型所必需的基础知识。而其中,线性代数扮演着至关重要的角色。你可能会问:“为什么需要线性代数?” 简单来说,深度学习本质上是对数据进行一系列复杂的变换和计算。而线性代数正是描述和操作这些数据(通常以数组形式存在)的强大数学语言。无论是输入数据(如图像像素、文本词语)、模型参数(权重和偏置),还是中间计算结果,都可以用线性代数中的概念(向量、矩阵、张量)来表示。

吴师兄大模型的博客 2090

【人工智能-初级】第21章 线性代数与 AI:理解矩阵乘法和特征向量

矩阵乘法是线性代数中的一种基本运算,用于将两个矩阵结合,得到一个新的矩阵。假设有两个矩阵 A 和 B,如果 A 的列数等于 B 的行数,那么可以对 A 和 B 进行矩阵乘法,得到一个新的矩阵 C。矩阵乘法的规则是,将矩阵 A 的每一行与矩阵 B 的每一列做点积(相乘并求和),形成新的矩阵 C 的元素。Cij∑kAikBkjCij​k∑​Aik​Bkj​特征向量(Eigenvector)和特征值(Eigenvalue)

若北辰 1064

人工智能深度学习类封装实现与矩阵向量操作

类封装是面向对象编程(OOP)的核心概念之一,它涉及将数据(属性)和操作数据的方法(行为)绑定到单个单元,即类。封装的目的是隐藏对象的内部状态和实现细节,仅通过公共接口与外界通信。通过这种方式,类的使用者不需要了解对象内部的复杂性,只需知道如何通过方法和属性与对象交互。封装提供了数据保护,防止外界直接访问和修改对象的内部数据,从而避免了数据不一致和错误的风险。此外,封装还促进了代码的模块化,使系统更易于理解和维护。在类中隐藏实现细节还有助于减少代码间的依赖,便于未来的维护和升级。

weixin_42124497的博客 842

第4篇:线性代数在AI中的应用:向量、矩阵与张量(附NumPy代码实现)

摘要:本文系统阐述了线性代数在人工智能领域的核心应用,涵盖向量、矩阵、张量等基本概念及其运算方法。文章详细解析了矩阵乘法、逆矩阵、特征值等关键概念,并通过NumPy代码实现各种运算,帮助读者理解AI模型背后的数学原理。主要内容包括:向量作为数据基本单元的作用,矩阵运算在神经网络中的应用,特征分解在PCA等算法中的重要性,以及张量在深度学习中的普遍性。文章还通过图像灰度化实例展示了线性代数的实际应用,为AI学习者提供了从理论到实践的完整指导。适合机器学习、深度学习初学者阅读。

to do , to be . 1828

Cadence 中Cutout、Design_Outline 和 Outline的区别

摘要: 在PCB设计中,Cutout、Design_Outline和Outline都与电路板外形相关但用途不同。Cutout用于定义切割区域(如孔、槽),直接影响制造;Design_Outline仅标记设计边界,作为参考不影响切割;Outline则是实际切割轮廓层,用于制造。三者区别在于:Cutout针对具体切割区域,Design_Outline是设计参考,Outline是最终切割依据。设计时需根据需求选择合适层:外形参考用Design_Outline/Outline,切割区域用Cutout。

卤煮小鱼的博客 1802

矩阵运算:深度学习的数学基石与手工实现解析

数学基石:重新审视线性代数的核心概念,理解它们在深度学习中的真正含义

牟同學的博客 555

SRC漏洞挖掘实战:从攻击面管理到业务逻辑漏洞的精准狩猎

在网络安全领域,漏洞挖掘是识别和利用软件系统中安全弱点的核心实践。其基本原理在于通过系统化的方法,识别和评估一个应用或系统的攻击面,并从中定位安全防护的薄弱环节。这项技术的价值在于能够主动发现潜在风险,防患于未然,对于保障企业数字资产安全至关重要。典型的应用场景包括对Web应用、移动端API以及各类在线业务系统的安全性评估。在实际的漏洞挖掘,尤其是针对安全应急响应中心(SRC)的实战中,高效的策略往往聚焦于**边缘资产**的发现与利用,以及对**业务逻辑漏洞**的模式化测试。掌握这些经过验证的思路,能帮助安

babing2770的博客 415

OLED的字模提取(保姆级)---基于PCtoLCD2013

做为一个刚刚开始接触编程不久的白菜,这个OLED想做一个信息显示,可是商家给我的例程里就是88,816两种字体的格式,我的屏幕是0.91寸的8*16的字体显示上感觉特别丢丢儿小,我就想整个大的,哎,只怪直接学习习惯不好,总是学一半,绕了好大一圈,才搞好,想写一篇博客,时刻提醒踏实学习,第一次写博客,小白一枚,勿喷。。 OLED屏幕驱动程序功能 我们对Markdown编辑器进行了一些功能拓展与语法支...

qq_44886611的博客 7782

(十七)深度学习之线性代数:核心概念与应用解析

线性代数贯穿深度学习的模型设计、计算优化与理论分析,从底层的矩阵运算到高层的算法逻辑,其核心概念(如矩阵乘法、特征分解、范数)为深度学习提供了数学工具和优化思路。CNN的正向传播是将输入图像通过多层网络结构逐步提取特征,并最终生成分类结果的过程,其核心是线性代数运算与非线性激活的结合。从数据表示到优化算法,其思想贯穿深度学习全流程。通过线性代数的高效运算,CNN能够在GPU/TPU等硬件上实现并行加速,这也是深度学习框架(如PyTorch、TensorFlow)底层依赖线性代数库(如BLAS)的核心原因。

只有左边一个小酒窝的专栏 1778

【RF】Receiver Function接收函数:从理论到实践的深度解析

本文深入解析地震学中的接收函数(Receiver Function, RF)技术,从理论原理到实践操作。文章将RF比作地球的“听诊器”,详细阐述了其通过反褶积剥离震源影响、揭示地下结构(如莫霍面)的核心机制,并提供了使用Python和rf库进行数据处理、计算、动校正与叠加的完整实战流程,同时探讨了其应用、局限性与常见问题的解决方案。

Jerry的专栏 122

从直线到神经网络:揭秘矩阵向量乘法

当我们凝视神经网络中的Y=WX+B,看到的不仅是数学形式的延续,更是思想的跃迁:维度突破从二维直线 → 高维超平面 → 非线性流形功能进化从描述静态关系 → 构建动态学习系统哲学启示最复杂的智能往往建立在最简单的线性组合之上爱因斯坦曾言:"这个世界最不可理解之处,就是它竟然可以被理解。"当神经网络用WX+B拟合宇宙规律时,我们看到的正是数学描述世界的永恒魅力——从一条简单的直线开始,延伸到智能的无限可能。

bill的博客 938

CRMEB商城系统任意文件下载漏洞(CVE-2024-52726)分析与修复

在Web应用安全领域,API接口安全是保障系统边界安全的核心环节。其原理在于通过签名验证、参数校验等机制,确保请求的合法性与完整性。这项技术的价值在于为系统间数据交互提供安全通道,防止未授权访问和数据泄露。典型的应用场景包括电商系统的对外数据接口、第三方服务集成等。然而,当签名验证逻辑存在缺陷或文件路径处理不当,便会引发严重的安全风险。本文以CRMEB开源商城系统为例,深入剖析其对外API模块中因签名验证绕过和路径遍历导致的任意文件下载漏洞。该漏洞允许攻击者下载服务器敏感文件,如数据库配置文件、日志和源码,

weixin_27722377的博客 378

基于PChmi.dll的PLC报警显示和记录(C#)

本文介绍了如何使用C#编写基于PChmi.dll的程序,实现PLC报警的显示和记录功能。通过订阅PLC的报警事件,我们可以实时显示报警信息,并通过日志文件记录报警历史。PLC(可编程逻辑控制器)在工业自动化领域中扮演着重要的角色,而报警显示和记录是PLC应用中常见的需求。本文将介绍如何使用C#编写基于PChmi.dll的程序,实现PLC报警的显示和记录功能。当然,这只是实现报警显示和记录的基本框架,具体的实现方式可能因不同的PLC和HMI库而有所差异。你需要根据你所使用的具体库和设备进行相应的调整和修改。

ByteLegend的博客 1673

【深度学习数学系列(一)线性代数】深度学习的数学引擎:线性代数如何驱动神经网络的底层运算

从简单的标量到复杂的张量,线性代数贯穿深度学习的每一个环节。掌握向量运算、矩阵乘法和张量变换,不仅是理解神经网络原理的关键,更是解决实际问题的核心能力。无论是面试备考还是技术深耕,扎实的线性代数基础都将成为你在深度学习领域披荆斩棘的利器。未来,随着深度学习技术的不断演进,这些基础数学知识仍将是驱动创新的底层力量。

weixin_73784131的博客 746

ShardingJDBC支持批量插入数据

最近在进行分库分表,但是有张表,里面有一些批量的插入。 也就是: insert xxx values(...),(...),(...) 这样的语句。 开始我的依赖是: <dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core</artifactId> <v

谙忆-陈浩翔 9766

【Python】NumPy矩阵运算全解析:从点积到矩阵乘法,掌握np.dot()、np.multiply()、np.matmul()与*、@的实战应用

本文全面解析NumPy矩阵运算的核心方法,包括np.dot()、np.multiply()、np.matmul()以及*和@运算符的实战应用。通过详细对比点积、矩阵乘法与逐元素运算的区别,帮助开发者避免常见错误并提升计算效率。特别适合Python科学计算、机器学习和数据分析领域的从业者掌握高效的矩阵操作技巧。

weixin_33690367的博客 672

ISO13849功能安全从入门到精通(3):安全功能及其对降低风险的贡献4

例如,如果机器必须在有限速度下运行时进行设置,那么在低加速度值下进行设置时,参数P1将是正确的选择:随着危险缓慢出现并给予足够的运动自由,操作员将能够移出危险区域。例如,在无故障的条件下,在操作者的手的方向移动的滚子不能陷住它。在所有其他情况下,F1是正确的选择,前提是危险暴露的持续时间不超过机器总操作时间的1/20。需求来源于必要的风险降低。由于这些考虑而降低的PLr在任何情况下都不得低于通过比较方式考虑的机器的PLr,因为并不能从事故发生率低和严重程度低得出实施的安全功能提供的安全水平高于要求。

wdconan001的博客 837

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

NumPy数组四种乘法全解析:从逐元素乘到矩阵乘,掌握向量化运算核心

在Python数据科学和机器学习领域,数组运算是处理大规模数值计算的基础。其核心原理在于利用向量化操作替代低效的循环,通过底层高度优化的库(如BLAS)实现并行计算,从而极大提升性能。这一技术价值在于,它是连接数学理论与工程实践的桥梁,使得复杂的线性代数运算能以简洁、高效的代码实现。典型的应用场景包括数据预处理中的特征缩放、图像像素级操作、机器学习模型(如神经网络)的前向传播与梯度计算,以及科学计算中的线性方程组求解。本文将聚焦于NumPy中四种关键的乘法运算:逐元素乘法、矩阵乘法、点积和叉积。其中,**逐

weixin_28691741的博客 335

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

深度学习数学基础llama3-from-scratch:矩阵乘法与线性代数

你是否曾经好奇过,像Llama3这样的大型语言模型是如何理解人类语言的?答案就隐藏在看似简单的矩阵乘法中。在现代深度学习架构中,矩阵乘法不仅仅是数学运算,更是神经网络进行信息传递、特征提取和模式识别的核心机制。 本文将深入探讨Llama3-from-scratch项目中的矩阵乘法实现,揭示线性代数在Transformer架构中的关键作用。通过理解这些基础数学概念,你将能够: - ???? 掌握Tr...

gitblog_00413的博客 1236

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

大模型必备数学_矩阵运算与向量空间

如果说向量是大模型里表示 token 的基本数据结构,那么矩阵就是不断改写这些表示的“变换器”。Embedding、注意力投影、FFN、分类头、LoRA,本质上都在用矩阵把向量从一个空间变到另一个空间

倔强的石头的博客 1万+

深度学习中的向量与矩阵:从数学定义到工程实践的核心指南

向量运算与矩阵乘法是深度学习的底层语言,张量维度则决定了数据在模型中的流动方式。理解点积、范数、转置和广播机制,不仅能帮助开发者排查梯度爆炸、形状不匹配等常见问题,更是掌握全连接层、注意力机制等核心组件的关键。在词嵌入、图像分类、自然语言处理等场景中,向量与矩阵的运算逻辑贯穿始终。本文从工程直觉出发,系统梳理向量运算、矩阵乘法与张量维度的核心概念,结合代码实现与避坑经验,帮助读者真正看懂模型内部的计算过程。

weixin_29053073的博客 230

[人工智能-深度学习-22]:卷积神经网络CNN -- 单层神经网络的本质是矩阵相乘

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_优快云博客 本文网址: 目录 第1章 单个神经的本质是一维矩阵(向量)内积(点乘) 1.1 任意维度输入形态的神经元本质:算术乘+累加和 1.2 任意维度形态的神经元都可以转换成一维输入的神经元:一维矩阵相乘 1.3 多样本输入并发运算的神经元模型 第2章 神经网络模型(多个独立的神经元) 2.1 单样本,多个神经元输出并发运算的模型 2.2 多样本,多个神经元输出并发运算的模型 第1章 单个神经的本质是一维

文火冰糖(王文兵)的博客 1万+

PyTorch张量运算实战:点积、矩阵乘法与逐元素乘法的核心差异与应用场景

本文深入解析PyTorch中三种核心张量乘法运算:点积、矩阵乘法与逐元素乘法的核心差异与应用场景。点积用于计算向量相似度,矩阵乘法是深度学习模型进行线性变换的基石,而逐元素乘法则适用于特征加权、注意力掩码等精细化操作。掌握其区别是编写正确、高效神经网络代码的关键。

weixin_29098391的博客 217
上一篇: 05-SA8155 QNX Hypervisor 之 Pass-through直通模式实战解析
下一篇: Java网络抓包实战(基于jnetpcap解析HTTP协议)——从三次握手到数据包捕获
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值