机器学习总结(算法):聚类、决策树、能量模型、LSTM等
聚类
K最近邻(KNN)
KNN找到k个最近邻,利用它们的标签进行预测。例如,下面的黑点应该通过简单多数投票被分类为蓝色。
有不同的指标来衡量距离。最常见的是欧氏距离(L2)。其他指标还包括曼哈顿距离、余弦距离、文本编辑距离、距离相关性等(更多的指标可以在scikit中找到)。通常,如果我们在进行预测时增加k的数量,则偏差会增加,而方差降低。
K均值聚类
K-均值聚类使用以下算法将数据点分组为K个聚类:
对质心进行重新估计,对数据点进行重新聚类。这个过程不断地重复,直到收敛为止。
凸性
K均值聚类的成本函数为
其中cᵢ是数据点i的聚类分配,而μⱼ是聚类j的质心。K-均值聚类算法在步骤中改进了cᵢ和μⱼ。因此,成本单调下降。但是,成本函数是非凸的。因此,该算法保证仅达到局部最优。不同的随机种子可能会导致不同的聚类。但是,通过对质心的初始猜测进行合理的随机初始化,可以产生高质量的结果。
我们还可以使用不同的随机种子重复该过程,并在选择最佳模型时使用相应的质心的总欧几里德距离。
K值
那么K在K均值聚类中的合适值是多少呢?如果我们在样本中有N个数据点,如果我们使用N个聚类,我们可以训练模型为零成本。但这不是我们想要的。
K的选择可以由明确的目标确定。例如,我们要制造尺码为XS,S,M,L和XL的T恤。因此K为5。我们可以研究成本下降的速度。我们可以在拐点处停下来,成本的进一步下降将有少得多的回报。
我们还可以监视训练数据集和验证数据集之间的误差差距。如果验证训练数据集中的误差趋于平坦或增大,则不应进一步增大K。
K-median聚类
使用中位数,而不是均值聚类避免outliners。 我们还使用L1来测量距离和成本,以减少outliners的影响。
K-均值++聚类
在K-均值聚类中,我们不是一开始就随机初始化K个质心,而是一次随机选择一个质心。对于下一个质心,我们仍然随机地选择它,但是我们更倾向于选择离前一个平均值更远的数据点。这是算法
二分K均值(bisecting k-means)
我们将每个聚类分成两个,但仅提交一个可以最大程度降低成本的聚类。
高斯混合模型(GMM)
高斯混合模型是一种概率模型,它假设所有数据点都是从高斯分布的混合中生成的。
对于K= 2,我们将具有2个高斯分布G 1=(μ1,σ2)和G 2=(μ2,σ2)。我们从参数μ和σ的随机初始化开始,然后计算数据点可能属于哪个聚类的概率。然后,我们根据该概率重新计算每个高斯分布的参数μ和σ。将数据点重新拟合到不同的聚类,并再次重新计算高斯参数。迭代一直持续到解收敛为止。让我们使用EM算法来详细说明此方法。
期望最大化(EM)算法(GMM)
EM算法在执行期望估计(E-step)和最大化(M-step)之间交替进行。E-step计算
概率p是使用高斯分布,通过使用相应聚类的xᵢ与μ之间的距离来计算的。
我们可以比较xᵢ的q(aᵢ)和q(bᵢ)并选择它应该属于哪个聚类。在所有计算之后,将训练数据分配给a或b。这称为hard assignment。然后,我们根据其拥有的数据点为每个聚类重新计算μ和σ。但是,这并不是GMM所做的。我们没有为一个聚类分配数据点,而是跟踪概率q(aᵢ)和q(bᵢ),即即数据点i是否属于a或b的概率。一般而言,我们计算聚类分配的概率分布而不是点估计。这称为soft assignment。我们将使用此分布作为权重,以求xᵢ在计算相应聚类的μ和σ中有多大影响。例如,聚类A的平均值是权重等于q(aᵢ)的所有数据点的加权平均值。概率模型通常具有更平滑的成本函数和较小的曲率。这使得训练更稳定。通过不将xᵢ确定地分配给一个聚类,我们允许训练更快地收敛。这是GMM的算法。
以下是适用于任何混合模型(非高斯模型)的EM算法。
对于GMM,假定聚类j的数据分布p(xᵢ|θⱼ)是高斯分布。
为了模拟随机变量的分布,我们可以收集样本来拟合GMM。相应的模型将比简单的高斯模型更加复杂,并且仍然是密集的(只需要很少的模型参数)。这就是为什么它在分布建模中很受欢迎,特别是对于多模态变量。
自组织映射(SOM)
SOM为高密度输入提供了一种低维表示。例如,我们希望计算39种索引颜色来表示图像的RGB值。我们从39个节点开始,每个节点由一个与输入维数相同的权向量表示(dim=3)。因此,对于每个节点,它都持有一个RGB值。
直观地,我们随机初始化所有节点。 然后我们遍历训练数据集中的所有数据点(图像的每个像素)。 我们将节点closet定位到当前数据点RGB值。 我们将当前节点及其相邻的RGB值更新为该RGB值。当我们遍历训练数据时,节点的值会发生变化,更能代表训练数据中图像像素的颜色。这里是一个概述
- 我们从图像中随机采样一个数据点(一个像素)。
- 我们使用L2距离找到权重与输入接近的节点。
- 我们更新周围节点的权重以使其更接近输入。但是随着我们远离中心,变化下降。
- 我们采样下一个数据点并重复迭代。
- 最终,每个节点中的权重代表索引颜色的RGB值。
我们使用学习率来控制变化,并且该变化将随着距离的增加而减少,并且随着时间的推移也会减少。
基于密度的聚类(DBSCAN)
K均值聚类无法发现流形。基于密度的聚类将相邻的高密度点连接在一起形成一个聚类。直观地说,我们逐渐向聚类添加邻近的点。这种方法允许结构在发现相邻以及流形时缓慢增长。如下所示,DBSCAN可以发现K均值无法发现的U形结构。
若半径r内有m个可达点,则数据点为core点。core点(深绿色)与相邻的core点(浅绿色)连接形成聚类。
如果我们有很多数据点,那么计算一个数据点到另一个数据点的距离就很耗时。而是将数据点划分为多个区域。我们仅连接位于相同或相邻区域中的点。
基于密度的层次聚类
基于密度的聚类最困难的部分是确定半径r。
我们可以使用自上而下的层次结构方法将大型聚类分解为多个子聚类。因此,我们可以从大的r开始,然后在分解层次结构中的聚类时逐渐减小它。
层次聚类
还有许多其他的层次聚类方法,包括自顶向下或自下而上。这些是算法
集成聚类(UB聚类)
集成聚类使用不同的随机种子运行m次K均值以生成m个模型。如果大多数模型都同意两个点应属于同一类,则可以确保它们属于同一类。集成聚类从没有聚类开始,
- 如果两个点应该在一起,但是没有任何聚类分配,我们将为它们创建一个新的聚类。
- 如果分配了其中一个而没有分配另一个,我们将未分配的放到已分配的聚类中。
- 如果将它们分配给不同的聚类,我们会将两个聚类合并在一起。
Canopy聚类
聚类是昂贵的。我们可以先应用Canopy聚类来形成某种形式的聚类,然后再使用更昂贵的方法来改进它。
TF-IDF
TF-IDF对搜索查询中文档的相关性进行评分。为了避免搜索词被利用,如果搜索词在文档中普遍存在,则得分会下降。因此,如果这个词不常见,它的得分会更高。
决策树
从技术上讲,我们将在每个决策树桩上将输入分解到两个空间
决策树也称为分类和回归树(CART)。决策树易于解释,易于准备数据,推理速度快。由于采用贪心法选择决策残差,且分支条件简单,模型可能精度不高,方差较大。过度拟合也是决策树中的一个常见问题。
为了进行回归,我们在特定阈值处拆分了特定特征的数据。我们通过蛮力尝试不同的特征和阈值组合,并选择最贪婪地减少L2误差的特征和阈值。树叶处的预测将是该分支中剩余数据点的平均值或中位数。
在分类决策树中,我们可以使用不同的标准来选择决策树桩。例如,我们可以计算分类误差,基尼系数或熵(稍后详细说明)。树预测将是分支数据集的多数表决。
在选择决策树桩之前,我们可以创建一个散点图矩阵来发现属性之间的相关性,从而使我们对如何拆分树有一些见解。
基尼系数
如果我们知道90%的数据属于第i类,其余的10%属于第j类,则可以使用相同的比率对标签进行随机猜测。实际上,我们可以做得很好。基尼系数(Gini index)衡量了我们使用这种方案做出预测的可能性有多大。如果数据很可能预测,则基尼系数会很低。
例,假设一班有60名学生。其中40名是男性,其中22名稍后进入engineering school,而20名女学生中有8名进入engineering school。加权基尼系数为
要选择决策树桩,我们选择权重最低的基尼系数。如果来自每个分支的数据属于同一类,则基尼系数等于零。
信息增益
我们可以选择信息增益最高的决策树桩。
换句话说,我们希望分支后的条件熵最小
在分支之后,我们希望熵最小。
例如,我们要预测是否要打网球。如果选择有风(true or false)作为决策树桩,则以下是信息增益的计算。首先,考虑有风,我们计算熵。然后我们计算一下,如果不刮风。然后,我们将它们组合为条件熵H(Y | X)。然后信息增益计算为:
这是每个步骤的详细计算
然后,我们继续其他可能的树桩,并贪婪地选择具有最高值的树桩。
减少方差
减少方差可在连续空间中工作。它测量拆分之前和之后的方差。我们想选择方差减少最大的决策树桩。
剪枝
在叶子节点包含红色或蓝色点之前,以下数据点将至少占用4级的决策树桩。在前三个拆分中,每个分支将包含相等数量的红点和蓝点。在此示例中,直到达到第四级,我们都看不到任何进展。
为避免此问题,我们可以使树更深,并使用pruning。
过度拟合
对于分类问题,我们拆分树,直到每个分支的数据点属于同一类,或它们的输入属性都相同,直到我们无法进一步区分。由于数据中的噪声,这种方法很容易使机器学习模型过拟合。如前所述,我们可以在构建树后prune它。如果测试数据的验证性能得到改善,我们将从叶子到根部删除决策树桩。
其他方法包括
- 对树的深度有严格的上限。
- 如果数据点数降至阈值以下,则停止进一步拆分。
- 要求每个叶节点具有最少数量的数据点。
- 设置叶节点的最大数量。
卡方检验
我们还可以通过卡方检验来验证决策树桩是否具有统计学意义。我们可以使用卡方来度量其父代和子代之间数据分布的差异。我们评估差异是否主要是偶然的。在一定的置信水平(比如95%),如果我们认为分布的差异可能是偶然发生的,我们应该去掉树桩。
例
如果卡方小于阈值T,则将删除决策树桩,因为数据分布的差异在统计上并不显着。在查找对应置信度的值T时,我们经常参考表格或卡方分布计算器。
我们还可以在选择决策树桩时使用卡方值。我们将选择价值最高的一个。
弱学习者
在机器学习(ML)中,我们可以构建一个弱学习器(复杂度较低的模型)以避免过度拟合。对于决策树,我们可以限制树的深度和输入特征的数量,以降低模型的复杂性。然而,这些学习者很可能带有偏见。在机器学习(ML)中,我们可以将模型捆绑在一起进行预测。如果他们是独立训练的,那么训练后的模型之间的相关性很小,他们就不太可能犯同样的错误。简单的多数表决可以消除错误并创建强有力的预测。
集成方法
有许多方法可以创建不同的训练模型实例。我们可以使用不同的算法、不同的种子和配置,以及在不同迭代中保存的不同模型来构建这些模型。注意避免强相关性,我们可以使用简单多数投票来解决分类问题。对于回归问题,我们可以计算平均值、加权平均值或中位数值来进行预测。
Stacking
在stacking中,我们在第一轮中使用多种机器学习(ML)方法进行预测。然后,我们将这些预测作为输入提供给另一个模型,以进行最终决策。
Bagging
Bootstrapping是随机抽样和替换的通用技术。我们从数据集中选择数据,但是,可以再次选择(替换)选取的数据。即,我们一次又一次地从同一组数据中选择数据。
Bagging (Bootstrap aggregated) 仅将这种技术应用于通过随机采样和替换来收集数据点。采样的数据点可以重复。如果此样本数据集的大小与原始训练数据集的大小相同,我们应该期望原始数据集中只有63.2%的数据会出现在此样本数据集中。
Bagging降低了训练模型之间的相关性,因为现在输入的样本并不相同。如果我们还降低了树的深度,也可以避免过度拟合。通过使用不同采样数据集训练的捆绑模型,我们可以期望在进行预测时具有更强大的aggregated模型。
例如,我们可以有B个bootstrap数据集,每个数据集包含n个数据点。每个bootstrap均从大小为n的原始数据集中进行替换。建立B模型后,我们可以使用它们进行B独立预测。我们的最终答案可以是这些答案的中位数。
随机森林
随着bootstrap数据集数量的增加,由于许多数据集确实高度相关,因此集成树的性能达到了平稳状态。随机森林使用上面提到的bagging以及其他技巧。每个模型仅使用部分特征进行训练。每个模型只使用一个特征子集进行训练。如果数据有K个特征,我们将随机选择其中的平方根(K)。所以在训练一个模型之前,我们随机地预选一个特征子集并用这个特征子集训练模型。这进一步降低了模型的相关性,不同的模型会找到不同的方法来确定类。将其与bagging相结合,可提高集成方法的准确性。
Boosting
建立第一个模型时,我们从训练集中统一采样数据。但是对于下一次迭代,我们将更频繁地对具有错误预测的数据点进行采样。在更好地关注我们所缺乏的地方之后,第二种模式应该在那些领域表现得更好。经过k次迭代后,便建立了k个模型。在每次迭代中,我们都会跟踪每个模型的准确性,并以此来计算权重。在推理过程中,我们使用这些权重来计算使用这些模型进行预测的加权平均值。
AdaBoost
通常,对于任何分类错误的数据,我们为下一次迭代设置更大的采样权重。
AdaBoost训练误差的上限是
虽然我们可能在每一步都学到一个弱学习者,但是如果我们学习了足够多的机器学习模型,误差就会显著减少。
基于梯度的模型
在AdaBoost中,我们从表现不佳的数据点中学习。在基于梯度的模型中,我们对预测中的误差进行建模。
假设我们有一个训练数据集y = [f(100), f(200),…,f(800)],用于输入100,…到800。我们想要建立一个f的模型,我们的第一个模型是使用y的平均值来建立简单的f模型,这是一个好的开始,但并不准确。接下来,我们计算预测中的残差(误差),并用另一个模型对其进行建模。
我们将继续从残差中构建简单模型,而我们的预测将所有模型结果相加。
简而言之,第一个模型输出y的平均值。第二个模型预测第一个模型的残差。第三个模型预测了第二个模型的残差。
我们将让您查看图中的解释
这里有一种可能的方法可以建立一个回归树,在树桩条件为x>500的情况下对左边的残差进行建模。在这个模型中,当x>500时,它返回22,否则返回-13。
但还有其他的可能性。我们不是为残差建立模型,而是只为残差的sign建立模型。这有点奇怪,但是当我们建立足够多的残差模型时,它得到了与我们之前的例子类似的结果。
这些解之间有什么区别,为什么我们将这些方法称为基于梯度的方法呢?如果我们将这些基于梯度的模型与梯度下降进行比较,则它们看起来相似。
如下所示,我们可以从L2或L1损失函数开始。如果我们采用这些损失函数的导数,则这些成本函数的梯度只是我们在先前示例中用于对残差进行建模的项的负数。对于L2损失,等效值为残差。对于L1损失,等效值是残差的sign。因此,我们的方法只是相应选定成本函数的负梯度。这就是为什么将其称为基于梯度的原因。
因此,我们可以将基于梯度的方法的概念扩展到其他成本函数,例如Huber损失。通用算法为:
局部集束搜索(Local beam search)
搜索空间就像围棋游戏一样巨大。在局部集束搜索中,我们仅探索最有前途的搜索。
回归树
除了分类,我们还可以使用决策树将模型分解为sub-cases,并使用回归模型求解每个叶节点。
监督和无监督机器学习
监督学习在给定输入(y = f(x))的情况下预测标签时建立模型f。训练数据集包含输入和标签(xᵢ,yᵢ)对。从概念上讲,监督学习是对P(y | x)的研究。无监督学习可以找到训练数据的模式和趋势,没有标签,我们可以将其归纳为分布P(x)的研究。在K均值聚类中,我们用K近似P(x)质心。无监督学习包括聚类,矩阵分解和序列模型。根据此分类,这里有不同的算法。
在HMM中,我们对内部状态感兴趣。例如,在语音识别中,我们的观察是音频,内部状态是相应的单词。通常,此训练数据集不提供音频的字幕,因此可以归类为无监督学习。但是,监督学习和非监督学习之间的界限可能是模糊的,并且通常不是很重要。
半监督机器学习
在某些情况下,我们可以收集大量的培训数据,但是我们只有有限的预算来标注其中的一小部分。半监督学习使用这一小组标签来标记那些没有标记的。这里有两种不同的可能性。
模型复杂度
当我们增加机器学习模型复杂度时,我们可能会面临过度拟合的风险,例如,GMM中的高斯模型数量,HMM中的隐藏状态数量或矩阵分解中的秩等,随着模型复杂度的增加,训练误差会减小。但是,当我们使用验证数据集验证机器学习模型时,我们将意识到验证误差会增加。在深度学习(DL)中,我们经常需要大量数据。因此,其数据集通常很大,我们经常将一部分数据专用于验证。
AIC和BIC
与DL问题相比,在ML中,我们收集的数据量可能少得多。 如果我们有足够的数据,则可以使用专用的验证数据集。 否则,我们可以使用rotated hold-out数据集(交叉验证)或从完整数据集(bootstrap)中随机选择验证数据。 我们可以使用这些数据来选择适当的模型复杂性,从而获得最佳性能。 为了降低复杂度,我们在成本函数中添加了正则惩罚项。 以下是两种可能的正则化。
在此公式化中,仅当成本下降大于模型参数增加的数量时,才应增加模型复杂度。 在BIC中,我们还将K乘以lnN。
能量模型
利用能量函数E(x),将x的概率分布定义为
在这样的模型中,高能量E(x)导致状态x的可能性很小。 我们对能量函数建模,该函数使训练数据集的P(x)最大化。 我们称Z为配分函数。 基本上,它对0到1之间的概率分布进行归一化。它对x的所有可能配置的指数函数求和。 对于具有许多状态的系统,计算Z并不容易。 通常使用近似值来解决这些问题。 接下来,让我们讨论如何对能量函数进行建模和定义。
玻尔兹曼机
为了提高能量模型的表示能力,我们将不可见变量(下方蓝色的隐藏单元)添加到Boltzmann机器中。白色节点是可见单元。它们代表训练数据集中的数据样本,观察到的状态或特征。
隐藏单元是不可见的,代表我们可见单元的潜在因子。每个单元都处于二元状态sᵢ∈ {0,1}之一。单元通过边缘Wᵢⱼ与其他单元完全连接。Wᵢⱼ的值表示两个节点是如何关联的。如果节点sᵢ和sⱼ正相关,我们希望Wᵢⱼ> 0。 如果它们负相关,我们希望Wᵢⱼ<0。 如果有独立的,Wᵢⱼ应为零。 从概念上讲,我们希望根据其他单元及其相关性来on/off一个单元。 玻尔兹曼机的能量函数E(X)和概率分布P(X)定义为:
它以线性形式表示节点和连接的能量
节点是on还是off取决于其连接节点的值
通过用数据训练模型,我们为训练数据集建立了能量最低的Wᵢⱼ和bᵢ值。
从某些角度看,玻尔兹曼机训练W来提取可见单元的潜在因子。 但是,玻尔兹曼机器彼此完全互连,很难训练。
受限玻尔兹曼机(RBM)
RBM从输入v(the observable)中提取潜在特征h。可见单元之间没有相互联系,隐藏单元也一样。它有更多的限制,但模型比玻尔兹曼机简单得多,也更容易训练。构型(v, h)的能量E(v, h)等于
为了训练模型,我们优化了训练数据的最大对数似然度(log p(v))。该目标函数(关于wᵢⱼ)的梯度等于
我们将在此梯度上使用梯度下降以稍后更新wᵢⱼ。
要计算下面的第一项
v只是训练数据集中的样本。然后,我们使用以下公式计算隐藏节点j的概率分布p(hⱼ| v)。
第二项是通过Gibbs采样计算的。 我们使用梯度下降来更新模型参数wᵢⱼ
第二项使用当前模型对v和h进行采样以计算期望值。即我们需要知道p(v,h | w)。分析上很难找到它。但是我们可以使用Gibbs采样估计这种期望。
Gibbs采样的一般思想是,对于联合概率p(X =x₁,x²,x₂,…,xᵢ,…),我们固定除一个参数xᵢ之外的所有X值。在某些问题中,当我们除了一个外固定其余参数,(p,…,xᵢ,...) 可能很容易建模。我们从该分布中抽取一个值,并将xᵢ设置为该采样值。然后,我们选择另一个参数,然后再次固定其余参数。我们重复该过程很多次,并且每次获得X样本。
如下所示,我们将采样的X绘制为红色点。每个X仅更改X =(x₁,x²,x₃,…,xᵢ,…)中的一个值。如图所示,采样数据将类似于联合概率p(x₁,x²,x₃,…)!
对比散度
因此,我们将结合吉布斯采样的概念和梯度下降法来训练RBM。这叫做对比散度。在RBM中,我们使用RBM模型对h和v进行交替采样。
首先,我们从v的任意值开始,然后我们可以计算每个隐藏节点的概率
然后我们对隐藏节点的值进行采样,形成h。在第二步中,我们再次使用采样的h对v进行采样
即使我们之做了几次,也可以在RBM中生成良好的模型参数。RBM的确切算法与所描述的略有不同。以下是训练中的算法
训练模型参数中使用的公式为:
其中k是迭代的第k次。
自由能
能量模型中另一个经常提到的是下面的自由能F
对数似然的梯度可以以自由能的形式表示
简而言之,可以使我们可以通过构建能量模型(通过模型参数)来最大程度地提高对数似然性。
卷积神经网络(CNN)
我们在每一层中使用k×k卷积来提取特征图。通过使用stride或max-pooling,我们逐渐减小了空间维度。因为CNN有很多好的资源,所以这里的描述非常简短。想知道更多细节,可参考理解神经网络和卷积神经网络概述及示例教程。
LSTM和GRU
LSTM包含一系列LSTM单元。单元t在时间t负责处理输入数据x t,并且每个单元在上一个时间步都连接到LSTM单元。每个单元具有内部单元状态c t并输出隐藏状态ht。LSTM使用三个门来控制信息流。它们是forget gate,input gate和output gate。它们在图中以符号⊗表示。每个门的形式为
在分别将它们与Wx和Wh相乘之后(每个门具有不同的Wx和Wh),在当前数据输入和先前的隐藏状态上应用S型函数。每个门通过与门控制执行分段乘法来控制可以传递哪些信息。
简而言之,forget gate会忘记来自前一个内部单元状态的部分信息。input gate控制将处理输入的哪一部分和先前的隐藏状态来创建单元状态。output gate控制内部单元状态ct的哪一部分将作为隐藏状态ht输出。
在每个时间步,我们都需要创建一个单元状态。通过忘记旧单元状态的一部分以及来自当前输入和先前隐藏的附加信息来进行计算,所有这些都由下面的相应门控制。
然后,我们输出由输出门控制的新单元状态
GRU是RSTM(递归神经网络)的LSTM的替代方案。与LSTM相比,GRU不会维持单元状态C,使用2个门而不是3个门。在每个时间步,我们都基于先前的隐藏状态和当前输入来计算隐藏状态。
最后
以下是机器学习(ML) /深度学习( DL)项目的典型流程