目录
- 前言
- 一、[张量的广播&基本运算](https://www.bilibili.com/video/BV1Gg411u7Lr/?spm_id_from=333.999.0.0)
- 1. 张量的广播特性
- 2. 逐点&规约&比较运算
- 二、张量的线性代数运算
- 1. BLAS & LAPACK
- 2. 矩阵形变及特殊矩阵构造
- 3. 矩阵基本运算
- 4. 矩阵的线性代数运算
- 5. 矩阵的分解(eig/svd)
- 三、基本优化思想与最小二乘法
- 1. 简单线性回归的机器学习建模思路
- 2. 机器学习建模一般流程
- 3. 第一个优化算法:最小二乘法
- 4. 反向验证导数为0——autograd求导
- 四、动态计算图与梯度下降入门
- 1. AutoGrad的回溯机制与动态计算图
- 2. 反向传播与梯度计算
- 2.1. 阻止计算图追踪
- 2.2. 识别叶节点(输入节点)
- 3. 梯度下降基本思想
- 4. 梯度下降的数学表示
- 总结
前言
有点Matlab基础,从这里开始刚好
补充点Python中的Numpy/Pandas等基础知识
一、张量的广播&基本运算
1. 张量的广播特性
- 相同形状的张量计算
根据官网说法,“same shapes are always broadcastable”,相同形状数组总是可以进行广播计算。这里简单强调一下,虽然我们往往觉得不同形状之间的张量计算才是应用到广播特性,但其实相同形状的张量计算(一个三维,三个一维),尽管是对应位置元素进行计算,但本质上也是应用到了广播特性。 - 不同形状张量只要 不同的维度为1即可广播
- 利用
reshape
修改张量形状:
2. 逐点&规约&比较运算
这些调整函数不会对原对象进行调整,如果要对原对象进行修改可以加一个下划线方法_()
- 科学运算的静态性(只能是张量参与运算,且要为浮点型的)
- 规约运算(通常后面加一个参数表示计算的维度,默认0按行算)
- 比较运算
二、张量的线性代数运算
1. BLAS & LAPACK
2. 矩阵形变及特殊矩阵构造
- 对角矩阵
dig
- 下三角矩阵
triu
- 下三角矩阵
3. 矩阵基本运算
- 点积
dot/vdot
(复数运算时有差别) - 矩阵乘法
mm
- 矩阵和向量相乘
mv
- 批量矩阵相乘
bmm
- 矩阵相乘后相加
addmm
- 批量矩阵相乘后相加
addbmm
4. 矩阵的线性代数运算
- 矩阵的迹
trace
- 矩阵的秩
matrix_rank
- 行列式
det
- 矩阵表示线性方程组
- 逆矩阵
inverse
(计算y=x+1
)
5. 矩阵的分解(eig/svd)
- 特征分解
eig
- 奇异值分解
svd
三、基本优化思想与最小二乘法
在正式开始进行神经网络建模之前,我们还需要掌握一些基本数学工具,在PyTorch中,最核心的基础数学工具就是梯度计算工具,也就是PyTorch的AutoGrad(自动微分)模块。虽然对于任何一个通用的深度学习框架,都会提供许多自动优化的算法和现成的loss function,PyTorch也不例外,但如果希望能够更深入的理解神经网络、希望对深度学习的建模不仅仅停留在调包和调参的层次,那我们就必须深入一些数学领域、掌握一些数学工具,从底层提升自己的数学能力,以期能够在日后的使用深度学习算法的过程中能够更加灵活的解决问题、取得更好的建模效果。而AutoGrad模块,就是PvTorch提供的最核心的数学工具模块,我们可以利用其编写一系列的最优化方法,当然,要使用好微分工具,就首先需要了解广泛应用于机器学习建模的优化思想。
所谓优化思想,指的是利用数学工具求解复杂问题的基本思想,同时也是近现代机器学习算法在实际建模过程中经常使用基础理论在实际建模过程中,我们往往会先给出待解决问题的数值评估指标,并在此基础之上构建方程、采用数学工具、不断优化评估指标结果,以期达到可以达到的最优结果。本节,我们将先从简单线性回归入手,探讨如何将机器学习建模问题转化为最优化问题,然后考虑使用数学方法对其进行求解。
1. 简单线性回归的机器学习建模思路
- 转化为优化问题
2. 机器学习建模一般流程
在机器学习领域,大多数优化问题都是围绕目标函数(或者损失函数)进行求解。在上述问题中,我们需要围绕SSE求最小值。SSE是一个关于a和b的二元函数,要求其最小值,需要借助数学工具,也就是所谓的最优化方法。选择优化方法并执行相应计算,可以说是整个建模过程中最核心也是相对较难的部分,很多时候这个过程会直接决定模型的性能。
- 最优化问题的求解方法
- 函数的凹凸性
- 凸函数的最小值
- SSE最小值
- 流程梳理
3. 第一个优化算法:最小二乘法
前面提到,利用优化方法求解目标函数其实是机器学习建模过程中最为核心的环节,因此,我们有必要将围绕上述简单线性回归问题,进一步讨论最小二乘法背后的数学逻辑和优化思想,同时简单探讨数据的矩阵表示方法和基本矩阵运算。虽然最小二乘法并不是主流的深度学习损失函数的优化算法,但从最小二乘法入手了解优化算法背后的数学逻辑,却是非常有必要,同时,线性方程也是构建神经网络模型的基础,因此,我们有必要深入探讨线性模型建模细节以及最基本的优化算法:最小二乘法。
-
代数表示方法
-
矩阵表示方法
SSE是求的2范数(先平方后开根号),后面跟了平方,最后就是误差平方和
其中的 X X X必须是满秩的
- 最小二乘法的简单实现
4. 反向验证导数为0——autograd求导
当然,我们也可以反向验证,看下损失的数
SSE
在a=1,b=1
时偏导数是否都为0。此时就需要借助PyTorch中的autograd
模块来进行偏导计算。严格意义上来讲,autograd
模块是PyTorch中的自动微分模块,我们可以通过autograd
模块中的函数进行微分运算,在神经网络模型中,通过自动微分运算求解梯度是模型优化的核心。关于微分计算梯度进而执行优化的相关方法我们会在后续逐步介绍,此处我们仅适用autograd
模块来进行简单的微分计算尝试,也就是对SSE
进行偏导计算,判断a、b
同时取值为1时偏导是否为0。
对于目前我们所适用的PyTorch 1.7.1版本来说,我们可以直接在张量Tensor
中进行微分运算。目前市面上流通的PyTorch教材有些会介绍Variable
类,在进行微分运算时需提前将Tensor
类转化为Variable
类,但其实在PyTorch 0.4版本以后Tensor就已经不仅仅是一个纯计算的载体,而是可以支持微分运算,Variable
的概念被逐渐弱化,可微分性也变成了Tensor
的一个基本属性,我们只需要在创建Tensor时,通过设置requires_grad
属性为True
、规定张量可微分即可。
四、动态计算图与梯度下降入门
1. AutoGrad的回溯机制与动态计算图
新版PyTorch中的张量已经不仅仅是一个纯计算的载体,张量本身也可支持微分运算,这种可微分性其实不仅体现在我们可以使用
grad
函数对其进行求导,更重要的是这种可微分性会体现在可微分张量参与的所有运算中。
-
可微分性
-
张量计算图
2. 反向传播与梯度计算
我们曾使用
autograd.grad
进行函数某一点的导数值得计算,其实,除了使用函数以外,我们还有另一种方法,也能进行导数运算:反向传播。当然,此时导数运算结果我们也可以有另一种解读:计算梯度结果。
注:此处我们暂时不区分微分运算结果、导数值、梯度值三者区别,目前位置三个概念相同,后续讲解梯度下降时再进行区分。
-
反向传播(只保留叶节点的
grad
值)
-
中间节点反向传播和输出节点反向传播的区别
-
中间节点梯度保存
2.1. 阻止计算图追踪
- 创建一个不可导的相同张量
detach()
2.2. 识别叶节点(输入节点)
3. 梯度下降基本思想
- 方向与步长
当然,梯度下降的基本思想好理解,但实现起来却并不容易(这也是大多数机器学习算法的常态)。在实际沿着目标函数下降的过程中,我们核心需要解决两个问题,其一是往哪个方向走,其二是每一步走多远。以上述简单线性回归的目标函数为例,在三维空间中,目标函数上的每个点理论上都有无数个移动的方向,每次移动多远的物理距离也没有明显的约束,而这些就是梯度下降算法核心需要解决的问题,也就是所谓的方向和步长(学习率)。
4. 梯度下降的数学表示
- 代数表示
- 矩阵表示
- 举个栗子
- 编写函数执行梯度下降
总结
对应视频链接🔗,适合入门讲的很细,看完去实战看小土堆刚好