首页/文章/ 详情

预备知识3-线性代数学习笔记

21小时前浏览3

一、概念简介

  1. 标量:由只有一个元素的张量表示。
  2. 向量:可以被视为标量值组成的列表。这些标量值被称为向量的元素(element)或分量(component)。在数学表示法中,一个向量xn个实值标量组成,可以将其表示为∈ Rn。向量的长度通常称为向量的维度(dimension)。 向量或轴的维度被用来表示向量或轴的长度,即向量或轴的元素数量。 张量的维度用来表示张量具有的轴数。 
  3. 矩阵:表示为具有两个轴的张量。 数学表示法使用∈ Rm×来表示矩阵A,其由m行和n列的实值标量组成。当矩阵具有相同数量的行和列时,其形状将变为正方形;因此,它被称为方阵(square matrix)。当我们交换矩阵的行和列时,结果称为矩阵的转置(transpose),通常用a来表示矩阵的转置。作为方阵的一种特殊类型,对称矩阵(symmetric matrix) A等于其转置: A 
  4. 张量:描述具有任意数量轴的n维数组的通用方法。

二、张量算法的基本性质 

  1. 给定具有相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量。
  2. 将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。

三、降维

四、张量积

  1. 点积:给定两个向量x∈ Rd,它们的点积(dot product) x(或xy)是相同位置的按元素乘积的和: xPd i=1 xiyi 点积在很多场合都很有用。例如,给定一组由向量∈ Rd表示的值,和一组由∈ Rd表示的权重。 x中的值根据权重w的加权和,可以表示为点积xw。当权重为非负数且和为1(即Pd i=1 w= 1)时,点积表示加权平均(weighted average)。将两个向量规范化得到单位长度后,点积表示它们夹角的余弦。
  2. 矩阵-向量积:假设A为形状m*n的矩阵,x为n维数组,定义Ax为矩阵-向量积。其中Ax为m维向量,任意第i个元素为ai与x的点积,ai为A的第i个行向量,维度为n。注意:A的列维数(沿轴1的长度)必须与x的维数(其长度)相同。
  3. 矩阵-矩阵乘法:假设A为形状m*k的矩阵,B为形状k*n的矩阵,定义C=AB,其中C为形状m*n的矩阵。其中任意元素cij=ai.bj,ai为矩阵A的第i行维度为k的行向量,bj为矩阵B的第j列维度为k的列向量。矩阵矩阵乘法可以简单地称为矩阵乘法,不应与“Hadamard积”混淆。 

五、范数

在线性代数中,向量范数是将向量映射到标量的函数f给定任意向量x,其范数的基本性质如下:
  1. 按常数因子α缩放向量的所有元素,其范数也会按相同常数因子的绝对值缩放:f(αx) = |α|f(x)
  2. 满足三角不等式:f(x+y)≤f(x)+f(y;
  3. 范数必须是非负的: f(x)≥0 当且仅当向量元素全为0时取得等号。

常用范数的表达式:
L1范数:表示为向量元素的绝对值之和。 
 L2范数(欧几里得距离):假设n维向量x中的元素是x1, . . . , xn,其L2范数是向量元素平方和的平方根。
Lp范数:
矩阵Frobenius范数:矩阵元素平方和的平方根。
      在深度学习中,我们经常试图解决优化问题:最大化分配给观测数据的概率最小化预测和真实观测之间的距离。用向量表示物品(如单词、产品或新闻文章),以便最小化相似项目之间的距离,最大化不同项目之间的距离。目标,或许是深度学习算法最重要的组成部分(除了数据),通常被表达为范数。

来源:檐苔
通用
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-08-26
最近编辑:21小时前
青瓦松
硕士 签名征集中
获赞 14粉丝 1文章 45课程 0
点赞
收藏
作者推荐

线性神经网络2-线性回归的从零开始实现

import randomimport torch# 1. 生成数据集def syntheticData(w:torch.Tensor, b:float, numExaples:int)->tuple[torch.Tensor]: ''' 生成y=Xw+b+噪声 ''' X:torch.Tensor = torch.normal(0, 1, (numExaples, len(w))) y:torch.Tensor = torch.matmul(X, w) + b y += torch.normal(0, 0.01, y.shape) # 添加噪声数据 return X, y.reshape((-1, 1))trueW:torch.Tensor = torch.tensor([2.0, -3.4])trueB:float = 4.2features, labels = syntheticData(trueW, trueB, 1000)# 2. 读取数据集def dataIter(batchSize:int, features:torch.Tensor, labels:torch.Tensor): numExamples:int = len(features) indices:list[int] = list(range(numExamples)) # 样本随机读取无特定的顺序 random.shuffle(indices) for idx in range(0, numExamples, batchSize): batchIndices:torch.Tensor = torch.tensor( indices[idx:min(idx+batchSize, numExamples)]) yield features[batchIndices], labels[batchIndices]# 3. 初始化模型参数initW:torch.Tensor = torch.normal(0.0, 0.01, size=(2, 1), requires_grad=True)initB:torch.Tensor = torch.zeros(1, requires_grad=True)# 4. 定义模型def linearRegModel(X:torch.Tensor, w:torch.Tensor, b:torch.Tensor)->torch.Tensor: ''' 线性回归模型 ''' return torch.matmul(X, w) + b# 5. 定义损失函数def squaredLoss(PreY:torch.Tensor, TrueY:torch.Tensor)->torch.Tensor: ''' 均方损失函数 ''' return (PreY-TrueY.reshape(PreY.shape))**2/2.0# 6. 定义优化算法def SGD(params:list[torch.Tensor], lr: float, batchSize:int): ''' 小批量随机梯度下降法 params: 模型参数集 合 lr: 学习率,确定每一步更新的大小 batchSize: 批量样本大小 ''' with torch.no_grad(): for param in params: param -= lr*param.grad/batchSize param.grad.zero_()# 7. 训练lr:float = 0.03 # 学习率numEporchs:int = 3 # 循环次数batchSize: int = 10 # 小批量样本数net = linearRegModelloss = squaredLossfor epoch in range(numEporchs): for X, y in dataIter(batchSize, features, labels): # a. 计算损失 l = loss(net(X, initW, initB), y) # X和y的小批量损失 # b. 反向传播求导 # 因为l形状是(batchSize, 1),而不是一个标量。l中的所有元素被加到一起, # 并以此计算关于[w,b]的梯度 l.sum().backward() # c. 更新参数 SGD([initW,initB], lr, batchSize) # 使用参数的梯度更新参数 # 每一次循环后计算全局损失的平均值 with torch.no_grad(): train_l = loss(net(features, initW, initB), labels) print(f'epoch {epoch+1}, loss {float(train_l.mean()):f}')# 完成模型训练后显示训练参数和真实参数间的误差print(f'w的估计误差: {trueW - initW.reshape(trueW.shape)}')print(f'b的估计误差: {trueB - initB}')来源:檐苔

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈