Adaboost算法非技术人员指南

我查看了这些问题 这里这里。但我仍然没有找到让我满意的结果来理解这个算法。我明白了它做了什么,以及它是如何做的总体思路,但我仍然觉得不够自信将其用于项目中。我希望能理解算法如何与其更通俗的描述相对应。我尝试阅读了几个在线资源,但大多数只是重复Schapire和Freund的例子,并没有真正解释发生了什么。这是Schapire在《解释AdaBoost》第2页中给出的算法Adaboost Algorithm

这是我目前对它的理解:
x1,y2,对应于训练集。
当给定x1时,我们观察到y1的输出。

这个x+数字是X集合的成员。
而y+数字是set {-1,+1}的成员,所以在算法的剩余部分,训练集是(x+数字,-1),(x+数字,+1), xm, -1或+1)等。
初始化分布,我不确定这里分布的意思是什么,但我们继续。
D1(i) = 1/m for i = 1, ..., m
我不确定D1的1和1/m的1之间是否有任何关系,但据我所知,i对应于训练集中元素的位置。
我假设t意味着类似于时间或实例,所以我们有t1实例和t2实例等。
通过说使用分布Dt训练弱学习器,我假设我们想要做类似于Dt(i) = t/m的事情?
获取弱假设ht: X -> {-1,+1},意思是如果ht从X输入集合中取一个元素,那么它会给出{-1,+1}作为输出。
目标:选择具有低加权误差的ht:
我真的不明白这里发生了什么。符号”~”通常对应于逻辑运算符中的”非”,有时用作日期中的”大约”,但我假设这里不是这种情况,它对应于类似于给定Dt的i的概率吗?
开头的”et”,我最初以为是熵,但我在这里读到它实际上是误差。”[“用于指示矩阵吗?ht(xi) != yi意味着ht对输入xi产生了错误的输出,因为通常训练集是像x1,y1,xm,ym这样定义的。
对于算法的其余部分,我完全不知道。如果有人能用非技术术语解释剩下的部分就太好了。所谓非技术术语,我的意思是尝试描述算法在每一步相对于前一步做了什么。如果您还能解释为什么使用”ln”和”sign”这样的函数来描述发生了什么,那就太好了。如果您能用一些更具体的东西替换变量,那就更好了。

附注:我添加了代码格式的注释,因为SO坚持认为我的问题包含代码才接受问题


回答:

这个x+数字是X集合的成员。而y+数字是集合{-1,+1}的成员,所以在算法的剩余部分,训练集是(x+数字,-1),(x+数字,+1), xm, -1或+1)等。初始化分布,我不确定这里分布的意思是什么,但我们继续。

看起来是正确的。分布的意义是离散概率质量函数。

D1(i) = 1/m for i = 1, …, m。我不确定D1的1和1/m的1之间是否有任何关系,但据我所知,i对应于训练集中元素的位置。

没有那样的关系。是的,i就是这个意思。

我假设t意味着类似于时间或实例,所以我们有t1实例和t2实例等。

是的,它是“时间”,更准确地说是迭代次数,即将使用的弱学习器的数量。

通过说使用分布Dt训练弱学习器,我假设我们想要做类似于Dt(i) = t/m的事情?

绝对不是。想想Adaboost做了什么:它通过迭代构造弱学习器的方式将弱学习器组合成一个强学习器,使得(比如说)第k个弱学习器在某种程度上弥补了之前的学习器。概率分布是为每个弱学习器加权数据实例的,因此对于当前弱学习器表现不佳的x实例,新弱学习器会更强烈地考虑这些实例。

获取弱假设ht: X -> {-1,+1},意思是如果ht从X输入集合中取一个元素,那么它会给出{-1,+1}作为输出。目标:选择具有低加权误差的ht:我不真的明白这里发生了什么。符号”~”通常对应于逻辑运算符中的”非”,有时用作日期中的”大约”,但我假设这里不是这种情况,它对应于类似于给定Dt的i的概率吗?

不是。确实,~在*编程语言*中是“非”,但在数学中并非如此(它通常是等价关系)。特别是在概率中,它意味着“分布为”。

开头的”et”,我最初以为是熵,但我在这里读到它实际上是误差。”[“用于指示矩阵吗?ht(xi) != yi意味着ht对输入xi产生了错误的输出,因为通常训练集是像x1,y1,xm,ym这样定义的。对于算法的剩余部分,我完全不知道。如果有人能用非技术术语解释剩下的部分就太好了。所谓非技术术语,我的意思是尝试描述算法在每一步相对于前一步做了什么。如果您还能解释为什么使用”ln”和”sign”这样的函数来描述发生了什么,那就太好了。如果您能用一些更具体的东西替换变量,那就更好了。

这里有很多误解。我会尝试描述剩下的步骤(但我确实建议最终还是阅读原始论文)。

-> 计算误差

\epsilon_t = Pr_{i~D_t}[ h_t(x_i) != y_i ]

这就是它的字面意思:第t个弱学习器在数据点x_i上的错误概率。我猜这很 confusing,因为它是一个加权概率,所以具有高D_t的点更有可能被选择,因此在这里对概率度量贡献更多。所以,本质上,我们只是通过查看数据集中的错误(但考虑到某些例子比其他例子更重要,特别是我们表现不佳的那些例子)来估计h_t的性能。

-> 估计加权因子

alpha_t = ln[ (1 - \epsilon_t) / \epsilon_t ] / 2

如前所述,我们试图使新的弱学习器在我们之前的弱学习器(较低的t)失败的数据示例上表现得更好。这个alpha_t是加权因子的一部分。注意:如果误差为1(即它实际上是最糟糕的),那么权重非常小;这意味着“对愚蠢的学习器少关注”。

最终,当我们将所有弱学习器组合在一起时,我们必须对它们进行加权,因为有些会比其他表现得更好,因此应该更强烈地被倾听。这就是alpha_t衡量的东西

ln的具体形式是数学上的;证明最优权重(在一些合理的假设下,例如指数损失)确实是给定的形式是相当简单的(见这里)。但这对你来说现在并不那么重要。

-> 更新概率分布(即数据点加权函数):

D_{t+1}(i) = [D_t(i) exp(-alpha_t y_i h_t(x_i))] / Z_t

同样,我们希望对“难”示例进行更大的加权。所以,看看这个表达式的形式。我们正在更新x_i的概率质量。它取决于

  • D_t(i)x_i的先前概率值(如果它之前重要,现在也应该如此)
  • alpha_y:弱学习器的权重函数(更高的权重学习器意味着x_i的概率质量的变化将更强)
  • y_i h_t(x_i):注意,如果学习器是错误的,那么y_i h_t(x_i)=-1,否则y_i h_t(x_i)=1。在前一种情况下,-alpha_t y_i h_t(x_i)将是正的(所以exp(-alpha_t y_i h_t(x_i))将很大);在后一种情况下,负的(所以exp(-alpha_t y_i h_t(x_i))将很小)。所以,这一切意味着当我们错误时,我们会增加实例的概率,而当我们正确时,我们会减少实例的概率。这是有道理的:如果h_tx_i上是正确的,那么h_{t+1}就不应该那么关心它;它应该关注h_t错误的情况,并试图弥补它!

-> 组合弱学习器

最终的学习器只是弱学习器的加权平均(按alpha_t加权)。就这样。告诉我这是否有意义。

//(天啊,我希望SO有Latex…)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注