-
在神经网络 —— 损失函数 & 反向传播中已经介绍了反向传播的基本概念。
反向传播的本质就是条偏导链,通过最后的loss值往前逐层计算梯度,更新权重。
在
PyTorch
中,使用loss.backward()
便是执行反向传播的过程,不过本文的重点主要是了解如何自定义反向传播过程。一般来说,有两种情况我们需要用到自定义反向传播:- 引入了不可微的函数,此时需要自定义求导方式;
- 希望在偏导链中引入新的约束(类似损失函数的惩罚项)。
- 生成对抗网络(GAN,Generative Adversarial Network)是由Ian Goodfellow在2014年提出的一种DL模型。 GAN提出的初衷为解决使用无标签图像训练模型生成新的相似图像的问题。 它包含两个部分:生成器和判别器,它们通过对抗过程相互竞争进行无监督训练。
组成
生成器(Generator,G)
- 生成器可以是任意架构的神经网络,输入为随机噪声,输出为生成样本。其目标是使生成的样本尽可能接近真实样本分布直至能够欺骗判别器。
- 在第一篇 一、PyTorch 基础 中的例子我们已经使用了
nn.Module
来创建了一个线性回归模型。本文将来介绍Module的具体属性以及行为,了解如何搭建一个复杂的机器学习模型。
Module
-
这里我们介绍的是
torch.nn
子包的Module
类,它是所有网络层的基类。我们将通过继承该类来实现自己的网络。class myNet(nn.Module): def __init__(self): pass def forward(self, x): pass
这是一个基本的网络模型结构,对于一般的网络模型,我们只需要在
__init__
定义每一层的结构,在forward
实现具体正向传播预测过程即可。
- 在训练时,我们读取各种不同类型的数据以及需要对数据做一些预处理,这里介绍的便是PyTorch中的数据读取和图像预处理模块。
DataLoader
-
在上一篇博文文末例子中我们已经使用了
torch.utils.data.DataLoader
来处理数据,这个类的初始化参数为DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, collate_fn=<function default_collate>, pin_memory=False, drop_last=False)
其中我们平时会用到的参数如下
dataset
(Dataset) – 加载数据的数据集;batch_size
(int, optional) – 每个batch加载多少个样本(默认: 1);shuffle
(bool, optional) – 设置为True时会在每个epoch重新打乱数据(默认: False);num_workers
(int, optional) – 用多少个子进程加载数据。0表示数据将在主进程中加载(默认: 0);drop_last
(bool, optional) – 如果数据集大小不能被batch size整除,则设置为True后可删除最后一个不完整的batch。如果设为False并且数据集的大小不能被batch size整除,则最后一个batch将更小。(默认: False)。
- 环境安装请自己百度,这里不记录。
张量
-
张量(tensor)是torch中的数据结构,也是最基本的概念,一个张量本质就是一个多维数组,统一了标量、向量、矩阵的概念。
张量 在torch中一个张量包含以下8个属性。
-
data
:数据,带包装类的。 -
dtype
:张量数据类型。 -
shape
:张量的性质。一个n维列表,第i个代表第i维的元素个数。 -
device
:张量所在设备。 -
grad
:数据的梯度。 -
grad_fn
:张量生成的函数过程,如果是用户生成的则为None,依赖于其他张量生成时则为相应操作。通过它可以得到当前张量的梯度。就是记录张量的依赖关系,利用链式法则简化求梯度运算。
-
requires_grad
:是否需要梯度,不需要则不会记录自动生成的grad_fn
属性。 -
is_leaf
:是否为叶节点。
-
-
torch创建张量
torch.tensor() # 直接创建 torch.from_numpy() # 从np创建 torch.zeros() # 根据大小创建全0的张量 torch.ones() # 根据大小创建全1的张量 torch.full() # 根据大小创建自定义填充的张量 torch.arange(start, end) # range语法创建一维张量。 torch.linspace() # 创建均分的1维张量,闭区间。 torch.logspace() # 创建对数均分的1维张量,闭区间。 torch.eye() # 创建单位对角矩阵。 torch.normal(mean, std) # 高斯分布 torch.bernoulli(mean, std) # 伯努利分布
-
torch操作、运算,这些就不写了,不知道就找文档就行,基本你想要的操作/运算都是实现好的了,别想着自己写个函数。
- PCA(Principal Component Analysis)是一种无监督学习的线性变换技术,通过将高维数据投影到低维空间中的主要方向来捕获数据的本质结构。
PCA步骤
特征提取
-
对于一个样本数据,它可以包含很多的特征,例如一个人的身高、体重、性别、年龄,但是并不是每个特征都能用于指定的任务中,例如判断一个人是否患病,身高可能不仅没有作用还会让分类器效果变差,所以对于具体的任务要选择不同的特征输入给模型,这个过程便是特征选择。
而对于特征提取来说,是指从已有的特征中生成新的特征,例如体重和是否应减肥并不是完全相关(不同年龄、身高、性别标准都不一样),更多的我们会用身高和体重计算出新的指标BMI,再更具BMI确定是否应减肥。那么从原有的特征计算出BMI的过程,便是一个特征提取的过程。
-
而PCA也就是干这样一件事,从原有的特征空间进行特征提取得到特征空间,达到减少维度的效果。
- SVM是一种监督学习二元分类器,通过核函数将线性不可分变成线性可分,同时在实践中也是小样本学习效果最好的算法。
支持向量
-
关于线性分类的概念请参考逻辑回归,对于不同的分类器可能会得到不同的拟合结果,例如
线性分类器 上图中是三个分类器得到的决策边界,对于蓝色和黄色分类器,不能将正负类别分开,拟合能力较弱,同时对于黑色分类器来说,其不仅可以达到分类效果,还满足距离两个类别的最近样本最远。而这两个类别中离决策边界最近的样本我们称其为支持向量,其与决策边界之间的距离称为margin。
当从二维扩展到多维空间时,决策边界将变成一个超平面,我们同样是寻找满足下面条件的拟合结果:
- 两类样本分别在超平面的两侧;
- 最大化支持向量与超平面之间的距离。
-
对于一个超平面我们可以用如下线性方程来描述
同时在维空间中,点到这个平面的距离为
其中,我们可以设支持向量到超平面的距离为,其他样本到超平面的距离大于。为了方便我们将正向类别定义为,负向类别定义为,此时我们得到超平面的一个约束
同时我们两边乘以变成
因为是正数,我们可以移走或者说令其等于1简化算式(这对后续的优化没有影响),并且合并两个算式,得到
由于该式恒大于0,故有,所以之前的距离公式可以改为
而我们的目标则是最大化这个距离,同时对于支持向量有,所以最大化的目标为
乘2的目的和MSE中乘2类似,不影响性质的情况下简化后续的运算。
来源【机器学习】支持向量机 SVM -
同时这里还可以进一步转换将目标变为求
去除掉除法,同时为了去除模长的根号可以再添加一个平方变为
其中
-
联邦学习是一种带有隐私保护、安全加密技术的分布式机器学习框架,能够让各参与方在不像其他参与者披露隐私数据的前提下协作进行机器学习模型训练。
要注意联邦学习本身并不是监督学习或非监督学习,它是更高层次的分布式协作框架,使得各个参与者能够将数据本地化的同时进行协作训练,而训练的具体任务所使用的模型和算法取决于训练者,可以是监督或者非监督中的各类模型和算法。
-
联邦学习非常使用运用在一些需要隐私保护的场景,例如Google最早将联邦学习运用在Google键盘上,利用用户本地的数据训练模型,再将训练过程中的模型参数聚合与分发,最终实现精准预测用户下一输入。
-
kMeans是一种无监督学习聚类算法,也就是给样本分簇。是一种适合用在数据分布未知时的聚类算法,聚类的目的是最大化簇的内聚性(同一簇距离近),最小化簇间的耦合性(不同簇距离远)。
kMeans算法过程
工作流程
- 首先随机确定个初始点作为簇心;
- 查询数据集每个点距离最近的簇心点,分配到该簇中;
- 将簇心更新为该簇所有点的特征均值;
- 重复上述流程直到所有点都距离它对应簇心最近时结束(收敛)。