[转]矩阵求导---通过一个例子快速上手

[转]http://blog.youkuaiyun.com/nomadlx53/article/details/50849941

前提及说明

第一次遇见矩阵求导,大多数人都是一头雾水,而搜了维基百科看也还是云里雾里,一堆的名词和一堆的表格到底都是什么呢?这里总结了我个人的学习经验,并且通过一个例子可以让你感受如何进行矩阵求导,下次再遇到需要进行矩阵求导的地方就不会措手不及。

在进行概念的解说之前,首先大家需要先知道下面的这个前提:

前提: 若 x 为向量,则默认 x 为列向量, xT 为行向量

布局的概念

布局简单地理解就是分子 y 、分母 x 是行向量还是列向量。

  • 分子布局(Numerator-layout): 分子为 y 或者分母为 xT (即,分子为列向量或者分母为行向量)
  • 分母布局(Denominator-layout): 分子为 yT 或者分母为 x (即,分子为行向量或者分母为列向量)

为了更加深刻地理解两种布局的特点和区别,下面是从维基百科中布局部分拿来的例子:

分子布局

  • 标量/向量: 标量/向量 (分母的向量为行向量)

  • 向量/标量: 向量/标量 (分子的向量为列向量)

  • 向量/向量: 向量/向量 (分子为列向量横向平铺,分母为行向量纵向平铺)

  • 标量/矩阵: 标量/矩阵 (注意这个矩阵部分是转置的,而下面的分母布局是非转置的

  • 矩阵/标量: 矩阵/标量

分母布局

  • 标量/向量: 标量/向量 (分母的向量为列向量)

  • 向量/标量: 向量/标量 (分子的向量为行向量)

  • 向量/向量: 向量/向量 (分子为行向量纵向平铺,分母为列向量横向平铺)

  • 标量/矩阵: 标量/矩阵 (矩阵部分为原始矩阵

一个求导的例子

问题

 

 

 

说明: yw为列向量,X为矩阵

式子演化

看到这个例子不要急着去查表求导,先看看它的形式,是u(w)v(w)的形式,这种形式一般求导较为复杂,因此为了简化运算,我们先把式子展开成下面的样子(注意:(Xw)T=wTXT): 

 

然后就可以写成四个部分求导的形式如下(累加后求导=求导后累加): 

 

 

求导

  •  

说明:分子部分为标量,分母部分为向量,找到维基百科中的Scalar-by-vector identities表格,在表格中匹配形式到第1行的位置,因为分母为列向量,因此为分母布局,对应的求导结果就是 0 。


  •  

说明:同样的,在维基百科中的Scalar-by-vector identities表格,在表格中匹配形式到第11行的位置,对应的求导结果就是 XTy 。


  •  

说明:因为分子为标量,标量的转置等于本身,所以对分子进行转置操作,其等价于第二部分。


  •  

说明:同样的,在维基百科中的Scalar-by-vector identities表格,在表格中匹配形式到第13行的位置,矩阵的转置乘上本身(XTX)为对称矩阵当做表格中的A ,所以得到求导结果 2XTXw 。

整合

把四个部分求导结果进行相应的加减就可以得到最终的结果: 

 

 

现在你再看看维基百科里那成堆的表格,是不是觉得异常实用了!

https://www.zhihu.com/question/39523290

 

<think>嗯,用户问的是PyTorch怎么快速入手。首先,我需要确定用户的基础。可能他们已经有一些编程经验,尤其是Python,因为PyTorch是基于Python的。但可能对深度学习框架不太熟悉,或者刚接触PyTorch。 用户的需求是快速上手,所以应该从最基础的部分开始,但也不能太冗长。需要分步骤,结构清晰。可能包括安装、基本概念、简单例子、资源推荐这些部分。 首先安装PyTorch是必须的。官网的安装命令会根据用户的环境不同而变化,所以应该建议他们去官网生成对应的安装命令。这样可以避免提供错误的指令。 接下来是基本概念,比如张量(Tensor),这是PyTorch的核心数据结构。需要介绍如何创建张量,基本操作,以及GPU的支持。然后自动求导(Autograd),这是训练模型的关键,需要解释Variable和backward()的作用。 然后是神经网络部分,用nn.Module来构建模型,可能需要一个简单的例子,比如全连接层。接着是数据加载,用Dataset和DataLoader,这对处理大数据集很重要。优化器和损失函数也是必须的,比如SGD和交叉熵损失。 接下来,一个完整的训练示例很重要。用户可能想看到从数据准备到训练循环的整个流程。用MNIST作为例子比较合适,因为它是标准数据集,容易获取,而且例子简单。 然后,常见的调试技巧,比如检查张量形状,使用detach()和numpy()换,以及使用torchsummary查看模型结构。这些对新手来说很实用,可以帮助他们避免一些常见错误。 学习资源方面,官方教程和文档是首要推荐的,还有社区资源如论坛和GitHub。实践项目建议从简单的开始,逐步深入。可能用户需要这些资源来进一步学习。 最后,注意事项,比如版本兼容性,GPU的使用,以及PyTorch的动态图特性。这些都是新手容易遇到的问题,提前指出可以节省他们的时间。 需要确保整个回答结构清晰,步骤明确,代码示例正确,并且用中文口语化表达,避免使用专业术语过多,或者在必要时解释术语。同时,注意使用PyTorch的最新版本,但代码例子应该兼容较广的版本,或者指出版本差异。 可能还需要检查是否有遗漏的部分,比如模型保存和加载,或者部署相关的内容,但考虑到快速入手,这些可能属于进阶内容,可以暂时不提,或者简要提及。 总之,回答需要覆盖从安装到训练一个简单模型的整个流程,重点突出关键概念和步骤,让用户能够快速上手实践,再通过进一步的学习资源深入。</think>以下是PyTorch快速入手的步骤指南,分模块讲解,附带代码示例: --- ### 一、安装PyTorch 访问[PyTorch官网](https://pytorch.org),根据你的环境(CPU/GPU、操作系统、包管理工具)生成安装命令。例如: ```bash # 典型CPU版本安装 pip install torch torchvision torchaudio ``` --- ### 二、核心概念快速理解 #### 1. 张量(Tensor) PyTorch的基础数据结构,类似NumPy数组但支持GPU加速: ```python import torch # 创建张量 x = torch.tensor([[1, 2], [3, 4]]) # 标量 y = torch.rand(2, 3) # 2x3随机矩阵 # 运算 z = x + y # 逐元素加法 matmul = torch.mm(x, y.T) # 矩阵乘法 # GPU支持(如果有) if torch.cuda.is_available(): x_gpu = x.to('cuda') ``` #### 2. 自动求导(Autograd) ```python x = torch.tensor(2.0, requires_grad=True) y = x**2 + 3*x + 1 y.backward() # 自动计算梯度 print(x.grad) # 输出导数 dy/dx = 2x+3 → 7.0 ``` #### 3. 神经网络模块(nn.Module) ```python import torch.nn as nn class SimpleNet(nn.Module): def __init__(self): super().__init__() self.fc = nn.Linear(784, 10) # 全连接层 def forward(self, x): return self.fc(x) ``` --- ### 三、完整训练流程示例(MNIST分类) ```python import torch from torch import nn, optim from torchvision import datasets, transforms from torch.utils.data import DataLoader # 1. 数据准备 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) train_set = datasets.MNIST('./data', train=True, download=True, transform=transform) train_loader = DataLoader(train_set, batch_size=64, shuffle=True) # 2. 模型定义 model = nn.Sequential( nn.Flatten(), nn.Linear(784, 128), nn.ReLU(), nn.Linear(128, 10) ) # 3. 训练配置 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # 4. 训练循环 for epoch in range(5): for batch, (images, labels) in enumerate(train_loader): # 前向传播 outputs = model(images) loss = criterion(outputs, labels) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() if batch % 100 == 0: print(f'Epoch {epoch}, Batch {batch}, Loss: {loss.item():.4f}') ``` --- ### 四、实用调试技巧 1. **形状检查**:`print(tensor.shape)` 随时查看张量维度 2. **梯度可视化**: ```python for name, param in model.named_parameters(): if param.grad is not None: print(f"{name} gradient mean: {param.grad.mean().item()}") ``` 3. **设备管理**: ```python device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = model.to(device) ``` --- ### 五、学习资源推荐 1. **官方教程**:[PyTorch Tutorials](https://
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值