机器学习笔记(自用)

222 阅读17分钟

无监督学习

分类与回归的区别

连续变量的预测:回归 离散变量的预测:分类 v2-ce408fc79ac85bd373241dbc4da59b67_720w.webp(该图来自分类与回归区别是什么? - 人民邮电出版社的回答 - 知乎 www.zhihu.com/question/21…)

回归中的代价函数J

代价函数也就是最小二乘法,误差平方和,在这个过程中,我们试图找寻w和b,使得线性拟合效果更好。下面我们会学习梯度下降,来系统的求出w和b

  • w 是权重(weights),表示输入特征(x)对输出(y)的影响程度。
  • x 是输入特征,例如图像像素值、文本单词的词向量等。
  • b 是偏置(bias),表示模型在没有输入时的输出值。

梯度下降

本质:贪心算法+局部最优 首先我们随机选择一个w和b,通常是设为0.我们会在山顶环顾四周,找到我们下一步能下降最多的是哪一步,然后如此循环往下走,最终我们会走到一个最低点,这个点成为局部最优解 我们知道,贪心算法无法得到全局最优,而且在非线性的代价函数下的3D表示中,不会是简单的吊床形状,而是有很多山峰一样的凹凸不平的区域,也就是说,如果我们稍微换个方向走出某一步,就会来到另一个最低点,找到一个新的局部最优解。 我们通常所说的梯度下降是指参数同步更新的梯度下降,所谓参数同步,是指在每一次更新(执行下降)时,更新w和b。更新的公式中,用到了偏导。

image.png image.png

其中的参数α表学习率,通常是小于1大于0

image.png

无论偏导的正负,当我们的w减去偏导乘以小于1的正数后,w的值显然是变小了,就这个图而言,也会慢慢趋向于最低点。

那我们为什么会选择偏导和一个学习率呢?是因为偏导决定了梯度下降的方向,学习率决定了梯度下降的步长。 我们可以很容易的想到,当学习率过大时,会很容易造成找不到局部最优解,更新的值反复横跳。而且学习率如果过小,那么会导致梯度下降的速度很慢,但这并不意味着这就不会导致找不到最优解了,这同样有可能会导致跳过最优解。所以在这个问题的处理上还要有方法去解决,比如看当前的偏导值。

特征放缩

在房价预测的多变量回归模型中,有的变量的影响程度会很大,比如房子的面积,有的则会相对很小,比如卧室的数量。我们要对此设置不同的权重,才能使得预测结果更为准确。但这样会时权重的范围有的很大,成百上千,有的很小,可能在0~1之间。为此,就用到了同数学建模中很常用的方法,归一化来去除单位影响,在这里就叫做特征放缩。

特征放缩的作用

很显然,我们刚提到了梯度下降,特征放缩将特征放缩在一个范围内,有益于使梯度下降更稳定和快速,避免了因为没有归一化造成梯度下降时的不稳定。同时减少了算法更新参数的时间。

逻辑回归

首先由文章一开始的图我们可以知道,逻辑回归不同于线性回归,逻辑回归是属于分类的,名字只是一个历史遗留问题,不要太在意。而我们之前学习的线性回归属于回归,回归试图让每个输入值都能尽可能拟合出一个合适的输出,也就是找到对应的值,这个过程可以理解为回归。与此不同,我们讨论的分类,输出值是离散的,我们也不需要让每一个不同的输入有不同的输出,反而我们需要的是将一个范围内的输入,划分为相同的输出。而这个思路的实现,可以用到激活函数

激活函数的作用在于引入非线性因素,增强神经网络的表达能力,使神经网络能够更好地适应复杂的非线性关系。

那如何能正确分类,就引出了决策边界的概念。

在二分类问题中,决策边界(Decision Boundary)是指分类器在特征空间中所确定的一个边界线(或面),将特征空间划分为两个不同的区域,使得在边界线两侧的样本点被分为两个不同的类别。

决策边界也就是分类的界限。比如大于0.5表示为True,反之为False。

逻辑回归中的代价函数

我们先前已经了解过一种代价函数,是在线性回归中。在那里我们知道我们的预测函数是线性的,当我们把预测函数放入代价函数中,会得到一个凸函数,很容易能过通过梯度下降找到合适的最小值。 但是当我们把逻辑回归中的预测函数(也就是激活函数)放入代价函数中,会得到一个凹凸不平的函数。

image.png 很明显,我们在后者中使用梯度下降时,找到全局最小值是比较困难的。 我们想做的是,通过修改代价函数,使得逻辑回归中的代价函数,同样是凸起的。 首先,我们引入一个新的定义,叫做损失函数L

image.png

image.png

当我们对每个损失函数L进行求和并除以个数后,就得到了代价函数的值。这也就是新的代价函数,他同意是凸函数,便于求出全局最小值。

过拟合

与过拟合相对应的的欠拟合,也称之为拟合不足高偏差。在训练数据得到的训练结果中,算法到达的效果不能很好的拟合给出的数据。而我们训练数据的目的也是希望能够得到一个拟合程度更好的模型,用于预测未知数据,我们将这种能力称为泛化。但当我们数据拟合的过于好的时候,这时候并不是炼丹结束的时刻,因为还要评测模型的表现能力,也就是建议泛化能力如何,比如一个二次函数就可以拟合的训练集,用到了更高次的函数,虽然训练效果很好,但是泛化能力很差,这样的表现我们称为过拟合,也叫高方差(因为对于稍有不同的数据集,效果显示差别很大)。

降低过拟合

  1. 增大数据集
  2. 减少特征
  3. 正则化减小参数的系数

正则化

使用正则化来解决过拟合的问题,首先我们要知道为什么会过拟合,这是因为模型训练时,提供了最高次过高的函数,导致训练效果很好,泛化能力很差。这是我们不希望看到的结果,我们希望在训练效果不错的前提下,泛化也有着不错的表现。而训练效果不错体现在我们的代价函数最小化,找到全局最优解。泛化效果不错体现在我们的预测效果很好,另一方面,泛化效果很差意味着参数过于多了,我们可以通过约束参数的影响,来提高泛化的效果。 所以我们要保证在找到全局最优解的同时,尽可能的限制参数的大小。 但问题依然存在的是,我们并不知道哪个参数更重要一些,显然我们也不可能一个一个的尝试。于是正则化提出,在代价函数中加入一个正则项,如下图所示。

image.png 当Lambda参数很大时,因为要求J的最小值,就会使得与之相乘的wj变小。 当Lambda参数很小时,也就是这一项对J没有太大的影响,可以任凭模型朝着提高泛化能力的方向发展。 既然无法知道哪个参数更重要,那就约束所有的参数。 在逐渐增加训练的参数想要提高精度的同时(也可以说是逐渐走向过拟合的路上),正则化则对此加以约束限制,考虑了模型的复杂度,进而找到泛化能力和预测准确率的一个平衡点。

前向传播

输入层通过中间的隐藏层到最后的输出层,输入的数据,在这个从左向右的传播过程,称为前向传播。数据是从前方不断计算提供的。

激活函数

激活函数是指神经网络中的一种非线性函数,用于将神经元的输入转换为输出。激活函数是深度学习中必不可少的组成部分,它的作用是增加网络的非线性能力,使得神经网络能够学习更为复杂的函数关系。常用的激活函数有sigmoid、ReLU、tanh等。

Softmax

在我们刚了解了激活函数后,我们又看到了一种新的函数softmax,这种函数通常不称为激活函数,而是属于归一化函数,它常用用于输出层,将神经网络的输出转换为各个类别的概率,用于多分类任务。激活函数用于提高非线性能力,当我们提高后,肯定需要一个函数,来展示这种非线性能力。

Softmax是一种常用的归一化函数,通常用于多分类问题中。给定一个实数向量z=(z1,z2,...,zk)z=(z_1,z_2,...,z_k),Softmax函数将其映射为一个概率分布向量p=(p1,p2,...,pk)p=(p_1,p_2,...,p_k),其中pip_i表示ziz_i属于各个类别的概率,计算公式为:

pi=ezij=1kezjp_i=\frac{e^{z_i}}{\sum_{j=1}^k e^{z_j}} , i=1,2,...,ki=1,2,...,k

其中,ee是自然常数,j=1kezj\sum_{j=1}^k e^{z_j}是向量zz中所有元素的指数和,这样计算可以保证pp是一个有效的概率分布,即所有概率值pip_i都是非负的且总和为1。

在深度学习中,Softmax函数通常用于将神经网络的输出转换为概率分布,使得可以将神经网络输出解释为各个类别的概率。在训练过程中,Softmax函数的输出可以用来计算交叉熵损失函数(Cross-Entropy Loss),从而进行模型的优化。

Adam算法

在前面我们学习了梯度下降的算法和思想,其中有一个很重要的问题,当学习率过大时,可能造成梯度下降左右横跳,找不到最小值,学习率太小则会使得梯度下降很慢。我们当时提过特征放缩来提高梯度下降的稳定性和速度。这里我们给出了Adam算法。 Adam算法可以自动调节学习率,对于每一层不同的(w,b),会有不同的学习率,通过自动调整,能过提高梯度下降的速度和稳定性。

交叉验证

在使用数据集时,我们一般会将数据集分成三个部分。

  • 训练集

    用于训练模型,这很容易理解。

  • 交叉验证集

我们假设我们在选择模型的过程中,有很多的超参数和模型结构,交叉验证集的作用就是来帮我们选择最佳的参数和结构。你可能会觉得,这个工作测试集一样可以完成,为什么还要单独划分一个验证集?这是由于很多原因决定的。比如:1.假设我们有10个(w,b),我们直接使用测试集,会输出10个预测结果。但是我们如果先用验证集验证出最好的一个模型,然后再放入测试集测试,那么只会得到一个测试结果。后者比前者节省了资源和时间,节省了不必要的开销。

  • 测试集

检验模型效果。

高偏差(欠拟合)与高方差(过拟合)

在机器学习中,偏差和方差是两个重要的性能指标,它们分别反映了模型在训练和测试中的表现情况。

高偏差意味着模型在训练集上的表现不好,即模型无法准确地捕捉训练数据中的特征和规律,通常是由于模型过于简单或者欠拟合的原因造成的。如果模型的偏差较高,那么在训练集和测试集上的性能都会比较差,此时需要考虑增加模型的复杂度或者使用更加复杂的算法来提高模型的性能。

高方差意味着模型在交叉验证集的表现比在训练集上的差得多,即模型过于敏感,对训练数据的噪声或者细节过于敏感,通常是由于模型过于复杂或者过拟合的原因造成的。如果模型的方差较高,那么在训练集上的性能会很好,但是在测试集上的性能会较差,此时需要考虑减少模型的复杂度或者增加数据量等方式来提高模型的泛化能力。

因此,高偏差和高方差都不是理想的情况。在机器学习中,我们需要平衡模型的偏差和方差,以达到最佳的性能和泛化能力。

正则化应用于调Lambda

image.png

在上面这张图中,右侧有的函数图是我们上面讨论交叉验证集选择最佳的模型所用的图,我们来回顾一下,随着degree of polynomial(多项式次数)的升高,训练误差越来越小,也就是训练集的表现越来越好。交叉验证集中的代价函数的值,随着多项式次数的升高,开始是下降,后来升高。所以我们通过这里,找到了最合适的最高次方。

在左侧的图中,我们引入的正则化,以解决可能发生的过拟合情况。在获得较为合适的最高次方模型后,我们引入正则项,通过修改Lambda的值,去看训练集和验证集的代价函数变化,以此来确定最合适的Lambda。

这里就有一个让人不解的问题,你也可以思考一下。在右侧的图中,我们已经找到了最合适的最高次方的函数,为什么还会发生过拟合?

这是因为导致过拟合发生的原因有很多,最高次过高只是其中之一。最高次方函数的复杂度取决于数据的性质和分布,不同的数据集可能需要不同的最高次方函数来进行拟合。此外,即使最高次方函数是最佳的模型,如果训练数据集过小,仍然可能会导致过拟合的问题。

迁移学习

当我们想要实现一个神经网络,比如手写数字的识别,但是我们的数据集很小很有限,不能带来很好的效果,这个时候就可以尝试迁移学习。 使用过程:

  1. 拿一个很大的数据集和对应的网络进行学习,比如一百万张图,有猫猫狗狗公交车……,当我们训练完成后,把这个网络的隐藏层拿来用,最后一层输出层进行替换,替换成我们的手写体的输出。

  2. 训练新的网络。

这里有两个方法:

1. 当数据集比较小时,隐藏层中的(w,b)参数使用原有的,只需要通过训练更新最后一层的(w,b),通过梯度下降或者Adam算法,降低代价函数。
2. 当数据集较大时,可以对所有参数进行训练更新,但是隐藏层中的(w,b)需要初始化为大模型的训练结果的值。

监督预训练:首先在大型数据集上进行训练,然后在较小的数据集上进一步参数调优(微调),这两个步骤称为监督预训练。

精度和召回率

image.png

精度:真阳性在所有检测为阳性中的数量。 召回率:真阳性在所有阳性个体中所占的比例。

比较容易理解的一点去看,精度就是我们平常在算法中做调整的iou(二分类中两者概念较为相似,但本质不是一回事),提高了iou,预测的框框会少一些。从直观的检测效果来看,这样做会让依旧存在的框的准确率都是很高的,就是提高了精度,但是框少了,有很多本来正确预测的,被判定为负类,产生了假阴性,召回率就降低了。本来在iou较低的情况下,可以预测到10个人,现在提高后只剩2个了,召回率从字面意思上看,也是下降了。

image.png

决策树

决策树是一种基于树形结构的分类和回归算法,其中每个节点代表一个属性或特征,每个分支代表这个属性或特征的一个取值,而每个叶子节点代表一个类别或值。在构建决策树的过程中,需要选择合适的属性或特征来作为节点,以便对样本进行分类或回归。

不纯度

不纯度是用于度量样本集合中不同类别或取值的不确定性的指标。在构建决策树时,通常使用不纯度来评估选择每个节点的最佳属性或特征。选择最佳属性或特征的目的是将样本尽可能地划分为纯净的类别或值,从而使决策树的分类或回归性能更好。

常见的不纯度包括:

基尼不纯度(Gini Impurity):表示从样本集合中随机选择两个样本,其类别不同的概率。Gini不纯度越小,样本的纯度越高。

信息熵(Entropy):表示从样本集合中随机选择一个样本,其所属类别所需要的平均信息量。信息熵越小,样本的纯度越高。

分类误差(Classification Error):表示样本集合中样本所属的主要类别的比例。分类误差越小,样本的纯度越高。

在构建决策树时,通常选择最小化不纯度的属性或特征作为节点,以便使决策树的分类或回归性能更好。

在这个基础概念提出后,会有很多新的想法和问题出现在决策树上。比如怎样选择决策节点才更合适,当分支一直延伸下去,什么时候停止是比较合适的?当然也包括前面提到的纯度问题,纯度越高,肯定决策树的性能会更好。我们还要考虑持续的延伸会不会导致过拟合,会不会导致模型臃肿但是效果也没有很好……

在机器学习中,我们常用熵衡量数据集的纯度,熵越高,说明数据越分散,纯度越低。

信息增益

熵的减少,称为信息增益。

image.png 当我们用节点的熵减去该节点分支的熵和,就能得到信息增益值,我们希望通过这个值的大小,反映出熵减的多少,如果熵减很多,达到我们的预期,就是我们想要的结果。因为我们希望节点传递时,熵减越大越好。

决策树中关于连续值的处理

通常情况下,我们使用决策树处理离散值,根据离散值来划分数据集。但是这样离散的处理问题,显然对于连续值是不合适的,连续值离散化后可能会导致信息丢失,从而影响决策树的准确度和精度。 所以,在处理连续值时,我们借鉴了二分的思想,将数据从小到大排序后,尝试选择数据相邻的中间值划分为两个子集,不断尝试不同的划分,找到信息增益最大的分割点。

image.png