我查看了这些问题 这里 和 这里。但我仍然没有找到让我满意的结果来理解这个算法。我明白了它做了什么,以及它是如何做的总体思路,但我仍然觉得不够自信将其用于项目中。我希望能理解算法如何与其更通俗的描述相对应。我尝试阅读了几个在线资源,但大多数只是重复Schapire和Freund的例子,并没有真正解释发生了什么。这是Schapire在《解释AdaBoost》第2页中给出的算法
这是我目前对它的理解:
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_t
在x_i
上是正确的,那么h_{t+1}
就不应该那么关心它;它应该关注h_t
错误的情况,并试图弥补它!
-> 组合弱学习器
最终的学习器只是弱学习器的加权平均(按alpha_t加权)。就这样。告诉我这是否有意义。
//(天啊,我希望SO有Latex…)