深度学习-2
线性代数
- torch.tensor()
- 构建张量
- torch.tensor([3.0])
- 标量由只有一个元素的张量来表示
- torch.arange()
- torch.arange(4): tensor([0, 1, 2, 3])
- 向量可视为标量值组成的列表
- 用张量的索引访问任一元素
- torch.arange(4): tensor([0, 1, 2, 3])
- len(x):张量的长度
- x.shape:张量的形状
- torch.arange(20).reshape(5, 4)
- 构建m x n的矩阵
- 矩阵的转置
- A.T
- 对称矩阵等于其转置
- torch.arange(24).reshape(2, 3, 4)
- 更多轴的数据结构
- clone()
- 克隆
- 哈达玛积:两个矩阵的按元素乘法
- A * B,两个矩阵中的对应位置的元素相乘
- 得到的是一个矩阵
- 求和
- 计算矩阵中元素的和
- sum()
- 指定轴进行求和
- A.sum(axis = 0)
- A.sum(axis = 1)
- A.sum(axis = [0, 1])
- 计算矩阵中元素的和
- 平均值
- mean()
- 指定列进行求平均值
- A.mean(axis = 0)
- 计算总和或均值时保持轴数不变
- A.sum(axis = 1, keepdims=True)
- 通过广播除法
- 相同轴数的张量相除
- A / sum_A
- sum_A = A.sum(axis = 1, keepdims = True)
- 某个轴计算A元素的累计总和
- A.cumsum(axis = 0)
- 点积
- torch.dot(A, B)
- 相同位置的按元素乘积的和
- 矩阵的向量积
- torch.mv(A, x)
- 矩阵-矩阵乘法AB
- torch.mm(A, B)
- 范数
- L2范数是向量元素平方和的平方根
- torch.norm()
- L1范数是向量元素的绝对值之和
- torch.abs(u).sum()
- 弗罗贝尼乌斯范数(Frobenius norm)
是矩阵元素平方和的平方根
- torch.norm(torch.ones((4, 9)))
- L2范数是向量元素平方和的平方根
导数
导数和亚导数
- 亚导数:将原函数分段


梯度
- 将导数扩展到向量
- 粗体是向量,普通为标量


- 样例:


- 扩展到向量对向量的求导

- 样例:

- 扩展到矩阵

向量的链式法则



符号求导和数值求导
数值求导:用极限的方法
计算图

自动求导
前向:从最里面的开始求导
反向:从最外面的开始求导

总结
- 前向:执行图,存储中间结果
- 反向:从相反方向执行图,去除不需要的枝

复杂度
反向:
- 计算复杂度:O(n),n是操作子个数
- 内存复杂度:O(n),需要存储正向的所有中间结果
正向:
计算复杂度:O(n),用来计算一个变量的梯度
内存复杂度:O(1)
自动求导的实现
存储梯度: x = torch.arange(4.0, requires_grad = True)
梯度:x.grad(默认是None)
反向传播函数:y.backward()
清除之前的梯度:x.grad.zero_()
y.detach(),将y视为一个常
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yeの博客!