为什么深度学习中要用Tensor,而不是直接用 numpy?

作者 | 锦恢  编辑 | 自动驾驶之心

原文链接:https://www.zhihu.com/question/598278407/answer/3573288190

点击下方卡片,关注“自动驾驶之心”公众号

戳我-> 领取自动驾驶近15个方向学习路线

>>点击进入→自动驾驶之心深度学习技术交流群

本文只做学术分享,如有侵权,联系删文

我发现很多人没有说到重点,首先,数学上的 tensor 和编程上的(pytorch)内的 tensor 是两个概念。数学上的 tensor 是用来研究高维矩阵之间的一些表达方式和运算性质的(比如高维空间的度量如何更加通用的定义),pytorch 里面的 tensor 是一个数据结构,不严谨且不恰当地讲,这个 class 是 numpy 的 np.ndarray 的子类。

请阁下备好红茶,然后回答我这么几个问题,当然我也附上了答案。

深度学习框架最重要的是什么?答:是自动求导系统。

为什么要自动求导系统?答:因为目前的损失函数的优化方法全都基于一阶梯度信息进行梯度下降。

如何实现梯度的计算?答:计算图。

因此,pytorch 的 tensor 和 numpy 最大的区别在于当你使用 tensor 进行加减乘除运算时,torch 后台会自动帮你构建出计算图,当你计算完成后,通过运算结果的 backward 函数反向传播后,你就可以得到一路上所有 requires_grad=True 的 tensor 的梯度了(必须是叶子节点)。因为这个过程中,每个 tensor 是计算图上的一个节点,在 HPC 或者 infra 工程师的语境中,我们更喜欢用 node 而非 tensor 来描述参与运算的单元。

具体的内部原理可以看我之前写的专栏,2024年了,计算图技术已经不是什么高深技术了:

K的深度学习框架
www.zhihu.com/column/c_1486851133511995393

用代码演示就是这个样子的,比如我们计算一个标量乘法的运算:

8d2bd838f5fcc4ec744ee212422bce85.png 0ee7e315cc98935dce6bf29e0af24084.png
import torch

a = torch.tensor(1., requires_grad=True)
b = torch.tensor(2., requires_grad=True)
c = a * b

c.backward()

print(a.grad)
print(b.grad)
494a68463df5ad062ab1a16a3121a6ef.png

那么回到最初的问题,tensor 和 numpy 的区别是什么?主要在于两点:

  1. tensor 在运算时会构建计算图,numpy 不会。

259b04088f0c94c63d76e1f5d3d591b9.png

当然,你说我用 tensor 就是进行普通矩阵运算,不要什么计算图,可以吗?当然可以,你套上一个 no_grad() 的 上下文就 bingo 了:

with torch.no_grad():
    # 此上下文中将不会生成计算图

反向计算很废的 =_=,不仅要把 grad_fn 一个个写出来,你还得考虑该死的广播运算呀,运算溢出如何处理呀。我开发自动求导系统时最怕遇到指数函数了。。。

最后多提一句,除了上面的不同外,pytorch 的 tensor 的基础运算在底层也做了一点点的优化。具体表现为,在 CPU 上,比较大的三维数组的计算(比如爱因斯坦乘),tensor 的速度显著优于 numpy。可以看我曾经给 CT 的 FBP 算法进行优化加速的博客:

kirigaya.cn/blog/article

而且 torch 的 tensor 还可以吃到 intel 的 mkldnn 驱动或者 nvidia 的 cuda 驱动的红利。这些都是一些数值计算上的优化差异了。

至于为什么这个领域的数组被叫成了 张量 tensor,楼上 酱紫君 的回答已经说得很到位了。毕竟,你们懂的,人们总是需要通过附庸风雅或者叶公好龙之为来弥补自己脆弱的认同感和安全感。MBTI 这种廉价的人格量表技术能如此流行也是大抵如此。3ccb43018e5d8903f4e5b32b6d81c4a8.jpeg

投稿作者为『自动驾驶之心知识星球』特邀嘉宾,欢迎加入交流!重磅,自动驾驶之心科研论文辅导来啦,申博、CCF系列、SCI、EI、毕业论文、比赛辅导等多个方向,欢迎联系我们!

282f2fc22dfe36e7f24fbbcab4f4cc4d.jpeg

① 全网独家视频课程

BEV感知、BEV模型部署、BEV目标跟踪、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测车道线检测轨迹预测在线高精地图世界模型点云3D目标检测目标跟踪Occupancy、cuda与TensorRT模型部署大模型与自动驾驶Nerf语义分割自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

cd42af11d778550a31da35bc89a74a1d.png

网页端官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

国内最大最专业,近3000人的交流社区,已得到大多数自动驾驶公司的认可!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知2D/3D检测、语义分割、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案大模型、端到端等,更有行业动态和岗位发布!欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频

db73b41a9f6dac283f687024bef41e3e.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦感知、定位、融合、规控、标定、端到端、仿真、产品经理、自动驾驶开发、自动标注与数据闭环多个方向,目前近60+技术交流群,欢迎加入!扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

59206e70ed50143aa0a7b7ab800297dd.jpeg

④【自动驾驶之心】全平台矩阵

8fd048ee1e9a7fec006ae41bfb39edd0.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值