【深度学习】S2 数学基础 P1 线性代数(上)

目录

  • 基本数学对象
    • 标量与变量
    • 向量
    • 矩阵
    • 张量
    • 降维求和
    • 非降维求和
    • 累计求和
  • 点积与向量积
    • 点积
    • 矩阵-向量积
    • 矩阵-矩阵乘法

深度学习的三大数学基础 —— 线性代数、微积分、概率论;
自本篇博文以下几遍博文,将对这三大数学基础进行重点提炼。

本节博文将介绍线性代数知识,为线性代数第一部分。包含基本数学对象、算数和运算,并用数学符号和相应的张量代码实现表示它们。


基本数学对象

基本数学对象包含:

  • 0维:标量与变量
  • 1维:向量
  • 2维:矩阵

标量与变量

一个简单的温度转换计算表达式,
c = 5 9 ( f − 52 ) c = \frac 5 9 (f-52) c=95(f52)

其中 c 代表摄氏度,而 f 代表华氏度。
而这个计算表达式中,数值 5、9、52 是标量值,而未知的标量值,即自变量 f 与因变量 c,都是变量值。

标量与变量在张量中,由只有一个元素的张量来表示。

import torch
# 实例化两个标量
x = torch.tensor(3.0)
y = torch.tensor(2.0)# 执行算数运算
print("x+y=", x+y, "\nx*y=", x*y, '\nx/y=', x/y, '\nx**y=', x**y)
x+y= tensor(5.) 
x*y= tensor(6.) 
x/y= tensor(1.5000) 
x**y= tensor(9.)

P.S. 在线性代数中,标量与变量通常用小写不加粗的字母表示, a a a


向量

向量可以视为由一系列标量值组成的列表,这些标量值被称为向量的元素或者分量。当使用向量来表示数据集中的样本时,它们通常具有一定的现实意义。例如一个用于表征用户个人信息的样本可以使用向量表示用户的年龄、性别、收入等标量信息。

使用张量表示向量,通常使用一维张量;

import torchx = torch.arange(4)
print(x)
tensor([0, 1, 2, 3])

索引: 访问向量中的元素,可以直接通过索引值来访问;

print(x[-1])

长度: 所谓向量的长度,指的是向量中标量的个数,通过 len() 函数获取;

print(len(x))

形状: 通过 .shape 属性访问向量的形状。形状是一个元素组,列出张量沿每个轴的长度(维数)。而对于只有一个轴的张量,其形状只有一个元素。

print(x.shape)

P.S. 在线性代数中,向量通常使用粗体小写字母表示: a \mathbf{a} a


矩阵

正如向量是将标量从零阶推广到一阶,矩阵则是将向量从一阶推广到二阶。矩阵 A m n \mathbf{A_{mn}} Amn m m m n n n 列标量组成,其中每个元素 a i j a_{ij} aij 是矩阵中第 i i i j j j 列元素。

使用张量表示矩阵,使用二维张量;

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

索引: 访问矩阵中元素,通过行索引( i i i)和列索引( j j j)来访问矩阵中的标量元素 a i j a_{ij} aij

# 访问第二行第三个元素
print(x[1][2])

转置: 交换矩阵的行和列称为矩阵的转置( A T \mathbf{A^T} AT)。对于 B = A T \mathbf{B}=\mathbf{A^T} B=AT,有 b i j = a j i b_{ij}=a_{ji} bij=aji

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

对称矩阵: 对称矩阵是特殊的方阵,方阵是特殊的矩阵。对于矩阵 A m n \mathbf{A_{mn}} Amn,有方阵( m = n m=n m=n),对称矩阵( A = A T \mathbf{A}=\mathbf{A^T} A=AT

B = torch.tensor([[1, 2, 3],[2, 0, 4],[3, 4, 5]])print(B == B.T)
tensor([[True, True, True],[True, True, True],[True, True, True]])

矩阵是很有用的数据结构,其中的行可对应于不同的数据样本,列对应着不同的属性。


张量

现实世界并非是单纯的二维世界。图片,通常由 RGB 三个颜色通道构成,这就需要一个三维的数据结构来表示。而张量,可以用来表示任意维度数的数据结构。例如:向量是一阶张量,矩阵是二阶张量。

张量算法有两个基本性质:

  • 按元素运算: 两个张量按元素运算,要求其形状 shape 必须相同,张量中对应位置的标量将进行运算操作。
import torchx = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
print("x=", x)
print("y=", y)
print("x+y=", x+y)
x= tensor([1., 2., 4., 8.])
y= tensor([2, 2, 2, 2])
x+y= tensor([ 3.,  4.,  6., 10.])
  • 广播机制: 张量的广播机制用于将张量扩展,要求两个向量要分别满足形状( x x x, y y y)与( y y y, z z z)方才可以进行运算。
import torcha = torch.arange(3).reshape(3, 1)
b = torch.arange(2).reshape(1, 2)print("a=", a)
print("b=", b)
print("a*b=", a*b)
a= tensor([[0],[1],[2]])
b= tensor([[0, 1]])
a*b= tensor([[0, 0],[0, 1],[0, 2]])

更多关于张量的操作博文,请移步:【深度学习】S1 预备知识 P1 张量


降维求和

对于一个张量,我们可以使用函数 sum() 进行简答求和;

import torchx = torch.arange(12).reshape(3, -1)
print(x)
print(x.sum())
tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
tensor(66)

在默认情况下,调用求和函数会降低张量的维度直到变成一个标量。但是我们也可以通过 sum() 函数中的变量 axis= 来指定张量沿哪一个轴来进行求和操作。比如;

print(x.sum(axis=0))
tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
tensor([12, 15, 18, 21])

通过在函数 sum() 中设置 axis= 参数,我们可以沿着二维张量的横坐标将其合并成一维的张量向量。

另外,针对多维张量,我们还可以通过将 axis 参数设置为一个数组,来实现同时降低多个维度到指定的维度。

print(x.sum(axis=[0, 1]))
tensor(66)

观察结果可知,数据维度降至默认的标量形式。


非降维求和

然而,在某些情况下,我们可能希望保留计算出的和的结果的原始维度,此时,在 sum(axis=) 函数中需要增加设置 keepdims 参数;

print(x.sum(axis=0))
print(x.sum(axis=0, keepdims=True))
# 打印维度信息
print((x.sum(axis=0)).shape)
print((x.sum(axis=0, keepdims=True)).shape)
tensor([12, 15, 18, 21])
tensor([[12, 15, 18, 21]])
# 维度信息
torch.Size([4])
torch.Size([1, 4])

观察两个结果的对比,明显可以看出它们的维度存在差异。


累计求和

使用 cumsum() 函数,可以实现张量在某一维度上的累加求和操作。

import torchx = torch.arange(12).reshape(3, -1)
print(x)
print(x.cumsum(axis=0))
tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
tensor([[ 0,  1,  2,  3],[ 4,  6,  8, 10],[12, 15, 18, 21]])

可以观察到,张量在其维度上进行逐层累加求和。如上,便是 cumsum() 函数。


点积与向量积

点积

点积(也称为内积)是指两个张量在对应位置上元素相乘后的和。

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

上述结果: 6 = 0 ∗ 1 + 1 ∗ 1 + 2 ∗ 1 + 3 ∗ 1 6 = 0*1+1*1+2*1+3*1 6=01+11+21+31


矩阵-向量积

矩阵向量积,指的是矩阵与向量的乘法,也就是将矩阵与向量相乘得到一个新的向量。

e . g . e.g. e.g. 假设我们有矩阵 A \mathbf{A} A 和向量 v \mathbf{v} v,其中 A \mathbf{A} A 是一个 m ∗ n m*n mn 矩阵, v \mathbf{v} v 是一个 n n n 维向量,那么它们的向量积 A v \mathbf{Av} Av 是一个 m m m 维向量;

在这里插入图片描述

读者可以借助以下张量的示例来增进理解。

在张量中,通过 mv() 函数来实现矩阵向量积;其中 m m m 意味着矩阵 matrix, v v v 意味着向量 vector;

import torchx = torch.arange(20, dtype=torch.float32).reshape(5, 4)
y = torch.ones(4, dtype=torch.float32)
print("x=", x)
print("y=", y)
print(torch.mv(x, y))
x= tensor([[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[12., 13., 14., 15.],[16., 17., 18., 19.]])
y= tensor([1., 1., 1., 1.])
tensor([ 6., 22., 38., 54., 70.])

矩阵-矩阵乘法

矩阵与矩阵乘法,可以看作简单地执行多次矩阵-向量积,并将结果拼接在一起形成矩阵。假设有两个矩阵 A \mathbf{A} A B \mathbf{B} B,其中 A \mathbf{A} A 是一个 m × n m×n m×n 的矩阵, B \mathbf{B} B 是一个 n × p n×p n×p 的矩阵,那么它们的乘积 C = A × B C=A×B C=A×B 是一个 m × p m×p m×p 的矩阵。

在这里插入图片描述

e . g . e.g. e.g. 矩阵-矩阵乘法使用 mm() 函数实现;

import torchx = torch.arange(20, dtype=torch.float32).reshape(5, 4)
y = torch.ones(12, dtype=torch.float32).reshape(4, 3)
print("x=", x)
print("y=", y)
print(torch.mm(x, y))
x= tensor([[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[12., 13., 14., 15.],[16., 17., 18., 19.]])
y= tensor([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]])
tensor([[ 6.,  6.,  6.],[22., 22., 22.],[38., 38., 38.],[54., 54., 54.],[70., 70., 70.]])

以上便是深度学习数学基础,线性代数第一部分;
线性代数第二部分将讲述 L 1 L1 L1 范数以及 L 2 L2 L2 范数,以及其张量实现。

如有任何问题,请留言或联系!谢谢!!

2024.2.13

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

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

相关文章

mysql Day05

sql性能分析 sql执行频率 show global status like Com_______ 慢查询日志 执行时间超过10秒的sql语句 profile详情 show profiles帮助我们了解时间都耗费到哪里了 #查看每一条sql的耗时情况 show profiles#查看指定query_id的sql语句各个阶段的耗时情况 show profile fo…

单片机学习笔记---DS18B20温度传感器

目录 DS18B20介绍 模拟温度传感器的基本结构 数字温度传感器的应用 引脚及应用电路 DS18B20的原理图 DS18B20内部结构框图 暂存器内部 单总线介绍 单总线电路规范 单总线时序结构 初始化 发送一位 发送一个字节 接收一位 接收一个字节 DS18B20操作流程 指令介…

基于 Python 深度学习的电影评论情感分析系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

前端JavaScript篇之await 在等待什么呢?async/await 如何捕获异常

目录 await 在等待什么呢?async/await 如何捕获异常 await 在等待什么呢? await 关键字实际上是等待一个表达式的结果,这个表达式的计算结果可以是 Promise 对象或者其他值。如果 await 后面的表达式不是 Promise 对象,那么 awai…

Spring Boot3自定义异常及全局异常捕获

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 前置条件 目的 主要步骤 定义自定义异常类 创建全局异常处理器 手动抛出自定义异常 前置条件 已经初始化好一个…

vue 获取 form表格 的值 的方法

vue 获取 form表格 的值 代码 let discountLastMoney this.form.getFieldValue(discountLastMoney)-0

格式化字符串的简单学习

文章目录 Format String格式化字符串函数格式化字符串参数原理 这几天学的少,过完年就一直在走亲戚(现在看到肉就犯恶心 Format String 格式化字符串函数可以接受可变数量的参数,并将第一个参数作为格式化字符串,根据其来解析之…

[Python进阶] 识别验证码

11.3 识别验证码 我们再开发某些项目的时候,如果遇到要登录某些网页,那么会经常遇到输入验证码的情况,而每次人工输入验证码的话,比较浪费时间。于是,可以通过调用某些接口进行识别。 11.3.1 调用百度文字识别接口 …

中小学信息学奥赛CSP-J认证 CCF非专业级别软件能力认证-入门组初赛模拟题第一套(阅读程序题)

CCF认证CSP-J入门组模拟测试题 二、阅读程序题 (程序输入不超过数组或字符串定义的范围&#xff1b;除特殊说明外&#xff0c;判断题 1.5分&#xff0c;选择题3分&#xff0c;共计40分) 第一题 1 #include<iostream> 2 using namespace std; 3 int a,b,c; 4 int main…

【C++】内存五大区详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Kotlin基本语法1到函数

1.range表达式 fun main() {var age 12.3if (age in 0.0..3.3){println("婴幼儿")}else if (age in 4.0..12.2){println("少儿")}else{println("未知")}/*** in 后面还可以接 list set 都可以*/if (age !in 0.0..3.3){println("婴幼儿&quo…

UE4运用C++和框架开发坦克大战教程笔记(十八)(第55~57集)

UE4运用C和框架开发坦克大战教程笔记&#xff08;十八&#xff09;&#xff08;第55~57集&#xff09; 55. UI 进入退出动画HideOther 面板出现时隐藏其他面板添加面板出现和收起的动画效果编写遮罩管理器前的准备 56. 弹窗进入界面57. UI 显示隐藏与遮罩转移完善遮罩管理器 55…

【C++】static静态关键字

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

C# CAD2016 多边形顶点按方向重新排序

多边形顶点按方向重新排序 初始化多边形顶点集合 outerPoints 创建一个名为 outerPoints 的 List<Point2d>&#xff0c;用于存储多边形的所有顶点坐标。 计算多边形顶点集合的边界框&#xff08;BoundingBox&#xff09; 使用LINQ的Aggregate方法遍历整个outerPoints列表…

【C++】中的 inline 用法

1、引入 inline 关键字的原因 在 c/c 中&#xff0c;为了解决一些频繁调用的小函数大量消耗栈空间&#xff08;栈内存&#xff09;的问题&#xff0c;特别的引入了 inline 修饰符&#xff0c;表示为内联函数。 栈空间就是指放置程序的局部数据&#xff08;也就是函数内数据&a…

SpringBoot+Vue3 完成小红书项目

简介 该项目采用微服务架构&#xff0c;实现了前后端分离的系统设计。在前端&#xff0c;我们选择了 Vue3 配合 TypeScript 和 ElementUi 框架&#xff0c;以提升开发效率和用户体验。而在后端&#xff0c;则是运用 SpringBoot 和 Mybatis-plus 进行开发&#xff0c;保证了系统…

使用word2vec+tensorflow自然语言处理NLP

目录 介绍&#xff1a; 搭建上下文或预测目标词来学习词向量 建模1&#xff1a; 建模2&#xff1a; 预测&#xff1a; 介绍&#xff1a; Word2Vec是一种用于将文本转换为向量表示的技术。它是由谷歌团队于2013年提出的一种神经网络模型。Word2Vec可以将单词表示为高维空间…

JS逆向进阶篇【去哪儿旅行登录】【上篇】

目标url: aHR0cHM6Ly91c2VyLnF1bmFyLmNvbS9wYXNzcG9ydC9sb2dpbi5qc3A 实现难点&#xff1a; 逆向滑块请求发送短信登录 目录 每篇前言&#xff1a;0、前置技术栈&#xff08;1&#xff09;JS实现页面滑动&#xff08;2&#xff09;JS实现记录滑动轨迹&#xff08;3&#xff…

SAP MM学习笔记42 - 特殊调达流程 - 受托品(寄售)

上一章讲了 外注加工的知识。 详细可以参考如下链接。 SAP MM学习笔记41 - 特殊调达流程 - 外注加工-CSDN博客 咱们继续学习特殊调达流程。 本章主要讲受托品。 1&#xff0c;什么是受托品 &#xff08;寄售&#xff09; 仕入先提供的商品&#xff0c;商品是放在你公司了&a…

一周学会Django5 Python Web开发-Django5 Hello World编写

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计14条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…