【读书笔记】动手学深度学习(阿斯顿·张,李沐等)第二章(更新中)

2023-05-16

本文旨在记录阅读本书过程中遇到的在以往学习和使用中忽略的知识点,也包括一些需要加强记忆的重点。
此外,原书中主要基于深度学习框架mxnet,但官方网站和对应代码中也提供了pytorch对应的版本,本文主要基于pytorch对应部分进行汇总和整理。(持续更新中)

2.2.5 运算的内存开销

运行一些操作可能会导致为新结果分配内存
例如,如果我们用Y = X + Y,我们将取消引用Y指向的张量,而是指向新分配的内存处的张量。

在下面的例子中,我们用Python的id()函数演示了这一点,
它给我们提供了内存中引用对象的确切地址。
运行Y = Y + X后,我们会发现id(Y)指向另一个位置。
这是因为Python首先计算Y + X,为结果分配新的内存,然后使Y指向内存中的这个新位置。

before = id(Y)
Y = Y + X
id(Y) == before # False

这可能是不可取的,原因有两个:

  1. 首先,我们不想总是不必要地分配内存。在机器学习中,我们可能有数百兆的参数,并且在一秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新
  2. 如果我们不原地更新,其他引用仍然会指向旧的内存位置,这样我们的某些代码可能会无意中引用旧的参数。

幸运的是,执行原地操作非常简单。我们可以使用切片表示法将操作的结果分配给先前分配的数组,例如Y[:] = <expression>
如果在后续计算中没有重复使用X
我们也可以使用X[:] = X + YX += Y来减少操作的内存开销。

before = id(X)
X += Y
id(X) == before # True

2.3.10 范数

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

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

f ( α x ) = ∣ α ∣ f ( x ) . f(\alpha \mathbf{x}) = |\alpha| f(\mathbf{x}). f(αx)=αf(x).

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

f ( x + y ) ≤ f ( x ) + f ( y ) . f(\mathbf{x} + \mathbf{y}) \leq f(\mathbf{x}) + f(\mathbf{y}). f(x+y)f(x)+f(y).

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

f ( x ) ≥ 0. f(\mathbf{x}) \geq 0. f(x)0.

最后一个性质要求范数最小为0,当且仅当向量全由0组成。

∀ i , [ x ] i = 0 ⇔ f ( x ) = 0. \forall i, [\mathbf{x}]_i = 0 \Leftrightarrow f(\mathbf{x})=0. i,[x]i=0f(x)=0.

范数听起来很像距离的度量。
欧几里得距离和毕达哥拉斯定理中的非负性概念和三角不等式可能会给出一些启发。事实上,欧几里得距离是一个 L 2 L_2 L2范数:
假设 n n n维向量 x \mathbf{x} x中的元素是 x 1 , … , x n x_1,\ldots,x_n x1,,xn,其** L 2 L_2 L2范数是向量元素平方和的平方根:
∥ x ∥ 2 = ∑ i = 1 n x i 2 , \|\mathbf{x}\|_2 = \sqrt{\sum_{i=1}^n x_i^2}, x2=i=1nxi2 ,
其中,在 L 2 L_2 L2范数中常常省略下标 2 2 2,也就是说 ∥ x ∥ \|\mathbf{x}\| x等同于 ∥ x ∥ 2 \|\mathbf{x}\|_2 x2。在代码中,我们可以按如下方式计算向量的 L 2 L_2 L2范数。

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

深度学习中更经常地使用 L 2 L_2 L2范数的平方,也会经常遇到 L 1 L_1 L1范数,它表示为向量元素的绝对值之和:
∥ x ∥ 1 = ∑ i = 1 n ∣ x i ∣ . \|\mathbf{x}\|_1 = \sum_{i=1}^n \left|x_i \right|. x1=i=1nxi.

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

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

L 2 L_2 L2范数和 L 1 L_1 L1范数都是更一般的 L p L_p Lp范数的特例:

∥ x ∥ p = ( ∑ i = 1 n ∣ x i ∣ p ) 1 / p . \|\mathbf{x}\|_p = \left(\sum_{i=1}^n \left|x_i \right|^p \right)^{1/p}. xp=(i=1nxip)1/p.

类似于向量的 L 2 L_2 L2范数,矩阵 X ∈ R m × n \mathbf{X} \in \mathbb{R}^{m \times n} XRm×n(Frobenius范数(Frobenius norm)是矩阵元素平方和的平方根:)

∥ X ∥ F = ∑ i = 1 m ∑ j = 1 n x i j 2 . \|\mathbf{X}\|_F = \sqrt{\sum_{i=1}^m \sum_{j=1}^n x_{ij}^2}. XF=i=1mj=1nxij2 .

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

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

范数和目标

在深度学习中,我们经常试图解决优化问题:最大化分配给观测数据的概率;
最小化预测和真实观测之间的距离。用向量表示物品(如单词、产品或新闻文章),以便最小化相似项目之间的距离,最大化不同项目之间的距离。目标,或许是深度学习算法最重要的组成部分(除了数据),通常被表达为范数。

2.5 自动微分

求导是几乎所有深度学习优化算法的关键步骤。虽然求导的计算很简单,只需要一些基本的微积分。但对于复杂的模型,手工进行更新是一件很痛苦的事情(而且经常容易出错)。深度学习框架通过自动计算导数,即自动微分(automatic differentiation)来加快求导。实际中,根据设计好的模型,系统会构建一个计算图(computational graph),来跟踪计算是哪些数据通过哪些操作组合起来产生输出。自动微分使系统能够随后反向传播梯度。这里,反向传播(backpropagate)意味着跟踪整个计算图,填充关于每个参数的偏导数。

2.7 查阅文档

查找模块中的所有函数和类。
为了知道模块中可以调用哪些函数和类,可以调用dir函数。例如,我们可以查询随机数生成模块中的所有属性:

import torch
print(dir(torch.distributions))

通常可以忽略以“_ ”(双下划线)开始和结束的函数,它们是python中的特殊对象,或以单个“”(单下划线)开始的函数,它们通常是内部函数。根据剩余的函数名或属性名,大概可以猜测到各方法的用途。

有关如何使用给定函数或类的更具体说明,可以调用help函数。例如:

help(torch.ones)

在jupyter记事本中,可以使用?指令在另一个浏览器窗口中显示文档。例如,list?指令将创建和help(list)指令几乎相同的内容,并在新的浏览器窗口中显示它。此外,如果我们使用两个问号,如list??,将显示实现该函数的python代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【读书笔记】动手学深度学习(阿斯顿·张,李沐等)第二章(更新中) 的相关文章

  • vncserver 使用遇到的问题

    今天使用vncserver遇到了几个问题 xff0c 如下 xff1a 1 使用普通账户无法修改该账户下的vncpasswd xff1a 解决方法 xff1a 打开 vnc目录 xff0c ls l看一下发现 passwd这个文件的用户和用
  • slf4j的MDC对象和ThreadLocal简单分析

    MDC xff08 Mapped Diagnostic Context xff0c 映射调试上下文 xff09 是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能 某些应用程序采用多线程的方式来处理多个用户的请求
  • springboot中@bean的lite模式

    当 64 Beans相互依赖时 xff0c 表示依赖关系就像一个bean方法调用另一个方法一样简 单 xff1a 64 Configuration public class AppConfig 64 Bean public Foo foo
  • spring bean解析源码分析

    转自https www jianshu com p 19e01388ccc5 前言 Spring源码分析是一个系列 xff0c 源码是Spring 4 X xff0c 本系列主要分析Spring的代码执行流程 xff0c 过于细节的内容将不
  • springboot remote shell简单实例

    springboot项目可以使用远程shell进行监控和管理 xff08 在2 0版本就不可以使用了 xff0c 此处要注意 xff09 使用时先添加spring boot remote shell 的依赖 xff0c gradle项目自己
  • 2021-08-30 创建tensor时,注意不要让梯度消失了

    下面这种是错误的 xff0c 梯度会消失 data span class token operator 61 span torch span class token punctuation span tensor span class to
  • 嵌入式学习项目实战 --- 在线词典

    目录 一 前言 二 项目功能 三 程序流程 1 客户端 2 服务器 四 代码实现 1 客户端代码 2 服务器代码 3 Makefile 一 前言 本文学习自 华清远见 的一个开源嵌入式项目在线词典综合实战 xff0c 涵盖了网络编程 文件I
  • hexo博客的制作

    安装Hexo 首先来看看我的hexo的博客演示 地址 xff1a http 91lyj xyz 我的ssm博客地址 xff1a www iclyj cn a target blank href http 91lyj xyz http 91l
  • win10系统CUDA10.0安装教程(for tensorflow2.0)

    前言 xff1a 目前最新的CUDA版本是10 1 xff0c 但是出于某种神秘的原因 xff0c 目前tensorflow2 0仅支持CUDA10 0 这个已经在我的电脑与一部分网友的反馈中得到了证实 tensorflow2 0不仅绑定了
  • 数学学习——Borel-Cantelli 引理证明

  • linux中的设备名称和设备号

    看赵炯博士的 linux 0 11 源代码注释 已经两三周了 xff0c 从今天起开始将一些个人总结和感悟分小标题写出来 xff0c 聊作记忆以供后来查看 在linux0 11源码的 linux boot bootsect s中 xff0c
  • python学习——numpy savetxt 追加模式

    因为savetxt的第一个参数f xff0c 可以是file handle xff0c 也可以是file name 所以用以下的这个代码就可以 xff1a span class token keyword with span span cl
  • 量化投资学习——A股H股套利年化100%

    一 交易对象选取 首先是选取数据 xff0c 选取数据的来源是wind xff1a 从wind中的交易数据 AH比较 里面可以看到历史收盘价和A H溢价率 xff0c 考虑到在2008年金融危机之后 xff0c 全球市场发生了较大的变化 x
  • C++学习——介绍一些C++内存检测工具

    1 C C 43 43 内存治理神器 Google Sanitizers Santizers是由Google开发的开源工具 xff0c 集成在LLVM项目中 xff0c 来检查内存泄漏和其他内存错误 Sanitize工具是一组用于检测内存错
  • C++学习——如何增加堆栈大小来避免内存分配的问题

    为了避免程序在运行过程中内存分配不足的问题 xff0c 你可以增加程序分配的内存量 在CMake中 xff0c 你可以通过在CMakeLists txt文件中添加设定来实现 你可以通过添加以下代码来增加程序分配的内存量 xff1a set
  • C++学习——解决一个double free or corruption (!prev)错误

    在我的场景下 xff0c 出现问题的地方是一个for循环 xff0c 代码如下所示 xff1a span class token keyword for span span class token punctuation span span
  • 量化投资学习——股指期货研究(九)

    基差增强策略的增强相对收益一般使用两种方法计算 xff1a 第一种是股指期货与现货收敛造成的期货价格相对指数价格上涨的部分 xff0c 此时关注的指标为年化基差率 xff0c 方法为计算期指合约收益率与指数收益率之差 xff1b 第二种是考
  • opencv无法打开源文件opencv2/opencv.hpp文件

    今天在使用vs2015配置OpenCV的时候遇到了这个问题 xff1a 无法打开 源 文件 34 opencv2 opencv hpp 34 解决方式 xff1a 前面都已经将Opencv的路径配置完毕后 xff0c 将Debug的默认 8
  • 简述计算机三大变换的联系和区别 (傅里叶变换 拉普拉斯变换 z变换)

    Q 简述计算机三大变换的联系和区别 傅里叶变换 拉普拉斯变换 z变换 xff08 1 xff09 傅里叶变换定义 xff1a 表示能将满足一定条件的某个函数表示成三角函数 xff08 正弦和 或余弦函数 xff09 或者它们的积分的线性组合
  • python数据处理——按列名选取dataframe的多列

    这是一个经常遇到的问题了 xff0c 但是为什么专门拿出来写一个博客呢 xff0c 因为啊 xff0c 博主啊博主 xff0c 你太笨了 xff0c 总是忘 xff01 最后一次啊 xff0c 不能再忘了 xff01 data 39 w 3

随机推荐