Pytorch --线性代数实现

矩阵

正如向量将标量从零阶推广到一阶,矩阵将向量从一阶推广到二阶。 矩阵,我们通常用粗体、大写字母来表示 (例如,𝑋、𝑌和𝑍), 在代码中表示为具有两个轴的张量。

数学表示法使用𝐴∈𝑅𝑚×𝑛 来表示矩阵𝐴,其由𝑚行和𝑛列的实值标量组成。 我们可以将任意矩阵𝐴∈𝑅𝑚×𝑛视为一个表格, 其中每个元素𝑎𝑖𝑗属于第𝑖行第𝑗列:

创建矩阵

当调用函数来实例化张量时, 我们可以通过指定两个分量𝑚和𝑛来创建一个形状为𝑚×𝑛的矩阵。

A = torch.arange(20).reshape(5, 4)
A
tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11],[12, 13, 14, 15],[16, 17, 18, 19]])

矩形转置

A.T
tensor([[ 0,  4,  8, 12, 16],[ 1,  5,  9, 13, 17],[ 2,  6, 10, 14, 18],[ 3,  7, 11, 15, 19]])

张量

就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构。 张量(本小节中的“张量”指代数对象)是描述具有任意数量轴的𝑛维数组的通用方法。 例如,向量是一阶张量,矩阵是二阶张量。 张量用特殊字体的大写字母表示(例如,𝑋、𝑌和𝑍), 它们的索引机制(例如𝑥𝑖𝑗𝑘和[𝑋]1,2𝑖−1,3)与矩阵类似。

当我们开始处理图像时,张量将变得更加重要,图像以𝑛维数组形式出现, 其中3个轴对应于高度、宽度,以及一个通道(channel)轴, 用于表示颜色通道(红色、绿色和蓝色)。 现在先将高阶张量暂放一边,而是专注学习其基础知识。

X = torch.arange(24).reshape(2, 3, 4)
X
tensor([[[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]],[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]])

张量算法的基本性质

标量、向量、矩阵和任意数量轴的张量(本小节中的“张量”指代数对象)有一些实用的属性。 例如,从按元素操作的定义中可以注意到,任何按元素的一元运算都不会改变其操作数的形状。 同样,给定具有相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量。 例如,将两个相同形状的矩阵相加,会在这两个矩阵上执行元素加法。

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone()  # 通过分配新内存,将A的一个副本分配给B
A, A + B
(tensor([[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[12., 13., 14., 15.],[16., 17., 18., 19.]]),tensor([[ 0.,  2.,  4.,  6.],[ 8., 10., 12., 14.],[16., 18., 20., 22.],[24., 26., 28., 30.],[32., 34., 36., 38.]]))

具体而言,两个矩阵的按元素乘法称为Hadamard(哈达码)积(Hadamard product)(数学符号⊙)。 对于矩阵𝐵∈𝑅𝑚×𝑛, 其中第𝑖行和第𝑗列的元素是𝑏𝑖𝑗。 矩阵𝐴和𝐵的Hadamard积为:在这里插入图片描述

A * B
tensor([[  0.,   1.,   4.,   9.],[ 16.,  25.,  36.,  49.],[ 64.,  81., 100., 121.],[144., 169., 196., 225.],[256., 289., 324., 361.]])

将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。

a = 2
X = torch.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape
(tensor([[[ 2,  3,  4,  5],[ 6,  7,  8,  9],[10, 11, 12, 13]],[[14, 15, 16, 17],[18, 19, 20, 21],[22, 23, 24, 25]]]),torch.Size([2, 3, 4]))

降维

我们可以对任意张量进行的一个有用的操作是计算其元素的和。 数学表示法使用∑符号表示求和。 为了表示长度为𝑑的向量中元素的总和,可以记为∑𝑖=1𝑑𝑥𝑖。 在代码中可以调用计算求和的函数:

x = torch.arange(4, dtype=torch.float32)
x, x.sum()
(tensor([0., 1., 2., 3.]), tensor(6.))

我们可以表示任意形状张量的元素和。 例如,矩阵𝐴中元素的和可以记为∑𝑖=1𝑚∑𝑗=1𝑛𝑎𝑖𝑗。

A.shape, A.sum()
(torch.Size([5, 4]), tensor(190.))

默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。 我们还可以指定张量沿哪一个轴来通过求和降低维度。 以矩阵为例,为了通过求和所有行的元素来降维(轴0),可以在调用函数时指定axis=0。 由于输入矩阵沿0轴降维以生成输出向量,因此输入轴0的维数在输出形状中消失。

A_sum_axis0 = A.sum(axis=0)          #行,求完后只剩下一行
A_sum_axis0, A_sum_axis0.shape
(tensor([40., 45., 50., 55.]), torch.Size([4]))

指定axis=1将通过汇总所有列的元素降维(轴1)。因此,输入轴1的维数在输出形状中消失。

A_sum_axis1 = A.sum(axis=1)         #列,求完后只剩下一列
A_sum_axis1, A_sum_axis1.shape
(tensor([ 6., 22., 38., 54., 70.]), torch.Size([5]))

沿着行和列对矩阵求和,等价于对矩阵的所有元素进行求和。

A.sum(axis=[0, 1])  # 结果和A.sum()相同

一个与求和相关的量是平均值(mean或average)。 我们通过将总和除以元素总数来计算平均值。 在代码中,我们可以调用函数来计算任意形状张量的平均值。

A.mean(), A.sum() / A.numel()
(tensor(9.5000), tensor(9.5000))

同样,计算平均值的函数也可以沿指定轴降低张量的维度。

非降维求和

有时在调用函数来计算总和或均值时保持轴数不变会很有用。

sum_A = A.sum(axis=1, keepdims=True)
sum_A
tensor([[ 6.],[22.],[38.],[54.],[70.]])

如果我们想沿某个轴计算A元素的累积总和, 比如axis=0(按行计算),可以调用cumsum函数。 此函数不会沿任何轴降低输入张量的维度。

A.cumsum(axis=0)
tensor([[ 0.,  1.,  2.,  3.],[ 4.,  6.,  8., 10.],[12., 15., 18., 21.],[24., 28., 32., 36.],[40., 45., 50., 55.]])

点积(Dot Product)

我们已经学习了按元素操作、求和及平均值。 另一个最基本的操作之一是点积。 给定两个向量𝑥,𝑦∈𝑅𝑑, 它们的点积(dot product)𝑥⊤𝑦 (或⟨𝑥,𝑦⟩) 是相同位置的按元素乘积的和:𝑥⊤𝑦=∑𝑖=1𝑑𝑥𝑖𝑦𝑖。

y = torch.ones(4, dtype = torch.float32)
x, y, torch.dot(x, y)
(tensor([0., 1., 2., 3.]), tensor([1., 1., 1., 1.]), tensor(6.))

我们也可以通过执行按元素乘法,然后进行求和来表示两个向量的点积:

torch.sum(x * y)
tensor(6.)

点积在很多场合都很有用。 例如,给定一组由向量𝑥∈𝑅𝑑表示的值, 和一组由𝑤∈𝑅𝑑表示的权重。 𝑥中的值根据权重𝑤的加权和, 可以表示为点积𝑥⊤𝑤。 当权重为非负数且和为1(即(∑𝑖=1𝑑𝑤𝑖=1))时, 点积表示加权平均(weighted average)。 将两个向量规范化得到单位长度后,点积表示它们夹角的余弦

矩阵-向量积

回顾矩阵𝐴∈𝑅𝑚×𝑛和向量𝑥∈𝑅𝑛。 让我们将矩阵𝐴用它的行向量表示:

在这里插入图片描述

我们可以把一个矩阵𝐴∈𝑅𝑚×𝑛乘法看作一个从𝑅𝑛到𝑅𝑚向量的转换。 这些转换是非常有用的,例如可以用方阵的乘法来表示旋转。 后续章节将讲到,我们也可以使用矩阵-向量积来描述在给定前一层的值时, 求解神经网络每一层所需的复杂计算。

在代码中使用张量表示矩阵-向量积,我们使用**mv函数**。 当我们为矩阵A和向量x调用torch.mv(A, x)时,会执行矩阵-向量积。 注意,A的列维数(沿轴1的长度)必须与x的维数(其长度)相同

A.shape, x.shape, torch.mv(A, x)
(torch.Size([5, 4]), torch.Size([4]), tensor([ 14.,  38.,  62.,  86., 110.]))

图片解释:
在这里插入图片描述

矩阵-矩阵乘法

假设有两个矩阵𝐴∈𝑅𝑛×𝑘和𝐵∈𝑅𝑘×𝑚

我们可以将矩阵-矩阵乘法AB看作简单地执行𝑚次矩阵-向量积,并将结果拼接在一起,形成一个𝑛×𝑚矩阵。 在下面的代码中,我们在AB上执行矩阵乘法。 这里的A是一个5行4列的矩阵,B是一个4行3列的矩阵。 两者相乘后,我们得到了一个5行3列的矩阵。

B = torch.ones(4, 3)
torch.mm(A, B)
tensor([[ 6.,  6.,  6.],[22., 22., 22.],[38., 38., 38.],[54., 54., 54.],[70., 70., 70.]])

矩阵-矩阵乘法可以简单地称为矩阵乘法,不应与“Hadamard积”混淆

范数

性代数中最有用的一些运算符是范数(norm)。 非正式地说,向量的范数是表示一个向量有多大。 这里考虑的大小(size)概念不涉及维度,而是分量的大小。

在线性代数中,向量范数是将向量映射到标量的函数𝑓。 给定任意向量𝑥,向量范数要满足一些属性。 第一个性质是:如果我们按常数因子𝛼缩放向量的所有元素, 其范数也会按相同常数因子的绝对值缩放:

​ 𝑓(𝛼𝑥)=|𝛼|𝑓(𝑥).

第二个性质是熟悉的三角不等式:

​ 𝑓(𝑥+𝑦)≤𝑓(𝑥)+𝑓(𝑦).

第三个性质简单地说范数必须是非负的:

​ 𝑓(𝑥)≥0.

这是有道理的。因为在大多数情况下,任何东西的最小的大小是0。 最后一个性质要求范数最小为0,当且仅当向量全由0组成。

​ ∀𝑖,[𝑥]𝑖=0⇔𝑓(𝑥)=0.

范数听起来很像距离的度量。 欧几里得距离和毕达哥拉斯定理中的非负性概念和三角不等式可能会给出一些启发。 事实上,欧几里得距离是一个𝐿2范数: 假设𝑛维向量𝑥中的元素是𝑥1,…,𝑥𝑛,其𝐿2范数是向量元素平方和的平方根:

在这里插入图片描述

其中,在𝐿2范数中常常省略下标2,也就是说‖𝑥‖等同于‖𝑥‖2。 在代码中,我们可以按如下方式计算向量的𝐿2范数。

u = torch.tensor([3.0, -4.0])
torch.norm(u)
tensor(5.)

深度学习中更经常地使用𝐿2范数的平方,也会经常遇到𝐿1范数,它表示为向量元素的绝对值之和:

在这里插入图片描述

与𝐿2范数相比,𝐿1范数受异常值的影响较小。 为了计算𝐿1范数,我们将绝对值函数和按元素求和组合起来。

torch.abs(u).sum()
tensor(7.)

类似于向量的𝐿2范数,矩阵𝑋∈𝑅𝑚×𝑛的Frobenius范数(Frobenius norm)是矩阵元素平方和的平方根:
在这里插入图片描述

Frobenius范数满足向量范数的所有性质,它就像是矩阵形向量的𝐿2范数。 调用以下函数将计算矩阵的Frobenius范数。

torch.norm(torch.ones((4, 9)))
tensor(6.)

​ ------文章由沐神的教学文档改编

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

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

相关文章

行业分享丨泛亚汽车数字化转型实践:虚拟仿真技术如何赋能汽车研发的创新实践?

随着汽车行业向智能化、电动化快速转型,虚拟仿真技术正成为推动产品研发变革的核心驱动力。作为行业技术先锋,泛亚汽车通过系统性布局,构建了完整的虚拟仿真技术体系,并总结出三个关键方向:打造数字化研发体系、探索精…

【硬核数学】4. AI的“寻路”艺术:优化理论如何找到模型的最优解《从零构建机器学习、深度学习到LLM的数学认知》

欢迎来到本系列的第四篇文章。我们已经知道,训练一个AI模型,本质上是在寻找一组参数,使得描述模型“有多差”的损失函数 L ( θ ) L(\theta) L(θ) 达到最小值。微积分给了我们强大的工具——梯度下降,告诉我们如何一步步地向着最…

springboot切面编程

SpringBoot切面编程 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转。本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理。 何为AOP AOP(Aspect OrientedProgramming):面向切面编程&…

【Redis#4】Redis 数据结构 -- String类型

一、前言 1. 基本概念 理解:字符串对象是 Redis 中最基本的数据类型,也是我们工作中最常用的数据类型。redis中的键都是字符串对象,而且其他几种数据结构都是在字符串对象基础上构建的。字符串对象的值实际可以是字符串、数字、甚至是二进制&#xff0…

Spring Boot 集成 Dufs 通过 WebDAV 实现文件管理

Spring Boot 集成 Dufs 通过 WebDAV 实现文件管理 引言 在现代应用开发中,文件存储和管理是一个常见需求。Dufs 是一个轻量级的文件服务器,支持 WebDAV 协议,可以方便地集成到 Spring Boot 应用中。本文将详细介绍如何使用 WebDAV 协议在 Sp…

Unity打包时编码错误解决方案:NotSupportedException Encoding 437

问题描述 在Unity项目开发过程中,经常会遇到这样的情况:项目在编辑器模式下运行完全正常,但是打包后运行时却出现以下错误: NotSupportedException: Encoding 437 data could not be found. Make sure you have correct interna…

Spring Bean的生命周期与作用域详解

一、Spring Bean的生命周期 Spring Bean的生命周期指的是Bean从创建到销毁的整个过程。理解这个生命周期对于正确使用Spring框架至关重要,它可以帮助我们在适当的时机执行自定义逻辑。 1. 完整的Bean生命周期阶段 Spring Bean的生命周期可以分为以下几个主要阶段…

如何将Excel表的内容转化为json格式呢?

文章目录 一、前言二、具体操作步骤 一、前言 先说一下我使用Excel表的内容转为json的应用场景,我们是用来处理国际化的时候用到的。 二、具体操作步骤 第一步:选择要转化Excel表的内容(必须是key,value形式的) 第二…

内存堆栈管理(Linux)

以问题形式讲解 1.每一个进程都有一个堆空间吗?还是多个进程共用一个堆空间? 在操作系统中,​​每个进程都有自己独立的虚拟地址空间,其中包括自己独占的堆空间。堆空间是进程私有的,不与其他进程共享。 进程之间的内…

ThreatLabz 2025 年人工智能安全报告

AI 应用趋势:爆发式增长与风险并存 2024 年,全球企业的 AI/ML 工具使用量呈指数级增长。Zscaler 云平台数据显示,2024 年 2 月至 12 月期间,AI/ML 交易总量达 5365 亿次,同比激增 3464.6%,涉及 800 多个应…

【Oracle学习笔记】7.存储过程(Stored Procedure)

Oracle中的存储过程是一组为了完成特定功能而预先编译并存储在数据库中的SQL语句和PL/SQL代码块。它可以接受参数、执行操作(如查询、插入、更新、删除数据等),并返回结果。以下从多个方面详细讲解: 1. 存储过程的创建 创建存储过…

tc工具-corrupt 比 delay/loss 更影响性能

1. netem corrupt 5% 的作用 功能说明 corrupt 5% 表示 随机修改 5% 的数据包内容(如翻转比特位),模拟数据损坏。它本身不会直接丢弃或延迟数据包,而是让接收端收到错误的数据(可能触发校验和失败、协议层重传等&…

Flask YAML管理工具

项目概述 项目地址:https://github.com/KaiqiZing/Flask_Yaml_Demo 这是一个基于Flask开发的YAML文件管理工具,提供了完整的YAML文件查看、编辑、管理功能,具有现代化的Web界面和强大的编辑能力。 核心功能 1. 文件管理功能 目录扫描&am…

Embedding模型微调实战(ms-swift框架)

目录 简介 1. 创建虚拟环境 2 安装ms-swift 3安装其他依赖库 4. 下载数据集 5.开始embedding模型训练 6. 自定义数据格式和对应的Loss类型 (1) infoNCE损失 (2)余弦相似度损失 (3)对比学习损失 (4).在线对比学习损失 &#…

从性能优化赛到社区Committer,走进赵宇捷在Apache Fory的成长之路

Apache Fory 是一个基于JIT和零拷贝的高性能多语言序列化框架,实现了高效紧凑的序列化协议,提供极致的性能、压缩率和易用性。在多语言序列化框架技术领域取得了重大突破,推动序列化技术步入高性能易用新篇章!这一切,都…

Python实例题:基于 Flask 的任务管理系统

目录 Python实例题 题目 要求: 解题思路: 代码实现: Python实例题 题目 基于 Flask 的任务管理系统 要求: 使用 Flask 框架构建一个任务管理系统,支持以下功能: 用户认证(注册、登录、…

利用GPU加速TensorFlow

一、写在前面 我们已经依靠keras和TensorFlow给大家做了一些机器学习在图像处理中的应用(影像组学学习手册,基于深度学习的图像分类任务),此前的教程中我们没有用GPU进行加速,但是相较于CPU而言,GPU是设计用于处理大规模并行计算任务的硬件&…

模型预测专题:强鲁棒性DPCC

0 1 前言 在进行DPCC的学习过程中,于下面链接看到了一篇强鲁棒性算法;感觉挺有意思的,学习一下。 永磁同步电机高性能控制算法(12)——基于预测电流误差补偿的强鲁棒预测控制/参数辨识&有限集预测控制与连续集预…

修复opensuse 风滚草rabbitmq的Error: :plugins_dir_does_not_exist问题

https://wiki.archlinux.org/title/Talk:RabbitMQ 报错 yqh192 /u/l/r/l/r/plugins> sudo rabbitmq-plugins enable rabbitmq_management Error: :plugins_dir_does_not_exist Arguments given:enable rabbitmq_managementUsagerabbitmq-plugins [--node <node>] [--…

前端做gis地图有哪些库

以下是前端开发GIS地图常用的库&#xff1a; Leaflet&#xff1a;轻量级、易于使用的开源JavaScript库&#xff0c;具有丰富的地图功能和插件生态系统&#xff0c;支持多种地图数据源&#xff0c;适合初学者和专业开发者。其优势在于简洁性和易用性&#xff0c;代码结构清晰&am…