喜马拉雅搜广推算法
一、GBDT为什么叫做梯度提升决策树,梯度用在什么地方
GBDT(Gradient Boosting Decision Tree,梯度提升决策树)是一种基于决策树的集成学习算法。它的名字中包含“梯度”和“提升”两个关键词,分别对应其核心思想和优化方法。
1.1. 为什么叫“梯度提升决策树”?
(1)提升(Boosting)
- 提升是一种集成学习技术,通过串行训练多个弱学习器(如决策树),每个弱学习器都试图修正前一个模型的错误,最终组合成一个强学习器。在 GBDT 中,每一棵决策树都是基于前一棵树的残差(预测误差)进行训练的,逐步提升模型的性能。
(2)决策树(Decision Tree)
- GBDT 的基学习器是决策树(通常是 CART 回归树),每一棵树都用于拟合当前模型的残差。决策树具有非线性拟合能力,能够捕捉复杂的特征交互关系。
(3)梯度(Gradient)
- GBDT 的核心思想是通过梯度下降来优化模型。在每一轮迭代中,GBDT 计算当前模型的损失函数的负梯度(即残差),然后用一棵新的决策树拟合这些负梯度,从而逐步减少损失函数的值。
1.2. 梯度用在什么地方?
GBDT 的梯度体现在损失函数的优化过程中。具体来说,梯度用于指导每一棵新树的训练目标。
(1)损失函数的梯度
- 假设损失函数为 L ( y , F ( x ) ) L(y, F(x)) L(y,F(x)),其中 y y y 是真实值, F ( x ) F(x) F(x) 是当前模型的预测值。
- 在每一轮迭代中,GBDT 计算损失函数关于模型预测值
F
(
x
)
F(x)
F(x) 的负梯度:
r i = − ∂ L ( y i , F ( x i ) ) ∂ F ( x i ) r_i = -\frac{\partial L(y_i, F(x_i))}{\partial F(x_i)} ri=−∂F(xi)∂L(yi,F(xi))
其中 r i r_i ri 是第 i i i 个样本的负梯度(即残差)。
(2)拟合负梯度
- 每一棵新的决策树的目标是拟合这些负梯度
r
i
r_i
ri,即:
h m ( x i ) ≈ r i h_m(x_i) \approx r_i hm(xi)≈ri
其中 h m ( x i ) h_m(x_i) hm(xi) 是第 m m m 棵树的预测值。通过拟合负梯度,GBDT 能够逐步减少损失函数的值。
(3)更新模型
- 将新树的预测值
h
m
(
x
i
)
h_m(x_i)
hm(xi) 乘以一个学习率
η
\eta
η(通常 ( 0 <
η
≤
1
\eta \leq 1
η≤1),加到当前模型的预测值上:
F m ( x i ) = F m − 1 ( x i ) + η ⋅ h m ( x i ) F_{m}(x_i) = F_{m-1}(x_i) + \eta \cdot h_m(x_i) Fm(xi)=Fm−1(xi)+η⋅hm(xi)
其中 F m ( x i ) F_{m}(x_i) Fm(xi) 是第 m m m 轮迭代后的模型预测值。
1.3. GBDT 的伪代码
以下是 GBDT 的训练过程伪代码:
# 初始化模型
F_0(x) = argmin_c L(y, c) # 初始模型为一个常数(如均值)
for m in range(1, M+1): # M 是树的个数
# 计算负梯度(残差)
r_i = y_i - F_{m-1}(x_i) # 以平方损失为例
# 训练一棵新树拟合负梯度
h_m = DecisionTree.fit(X, r_i)
# 更新模型
F_m(x) = F_{m-1}(x) + eta * h_m(x) # eta 是学习率
二、Boosting 和 GBDT的区别,各自的代表算法是什么?
传统的 Boosting 和 GBDT(Gradient Boosting Decision Tree) 都是基于 Boosting 的集成学习方法,但它们在思想、实现方式和应用场景上存在显著区别。以下是两者的详细对比以及各自的代表算法。
2.1. 传统 Boosting 和 GBDT 的区别
2.1.1. 优化目标
- 传统 Boosting:
- 主要通过加权调整样本权重来优化模型:每一轮迭代中,错误分类的样本会被赋予更高的权重,使得后续模型更加关注这些“难分样本”。
- GBDT:
- 使用梯度下降的思想优化损失函数:每轮迭代中,构建新的树来拟合当前模型的残差(即损失函数的负梯度方向),逐步逼近最优解。
2.1.2. 基学习器的训练方式
- 传统 Boosting:
- 基学习器通常是简单的弱分类器(如决策树桩或线性分类器):每个基学习器根据样本权重*重新分布进行训练。
- GBDT:
- 基学习器通常为回归树:每个基学习器拟合的是前一轮模型的残差(伪残差),而不是直接调整样本权重。
2.1.3. 损失函数的支持
- 传统 Boosting:
- 通常支持特定的损失函数(如 AdaBoost 使用指数损失函数):算法设计与损失函数紧密绑定,扩展性有限。
- GBDT:
- 支持任意可导的损失函数(如平方损失、对数损失等):通过梯度下降的方式优化损失函数,灵活性更高。
2.2. 代表算法
2.2.1. 传统 Boosting 的代表算法
- AdaBoost(Adaptive Boosting):
- 提出者:Yoav Freund 和 Robert Schapire(因此获得了哥德尔奖)。
- 核心思想:通过调整样本权重来逐步提升模型性能。
- 适用场景:主要用于二分类问题。
- 特点:
- 损失函数为指数损失函数。
- 每轮迭代中,错误分类的样本权重增加,正确分类的样本权重减少。
- 最终模型是所有弱分类器的加权组合。
2.2.2. GBDT 的代表算法
-
GBDT(Gradient Boosting Decision Tree):
- 提出者:Jerome Friedman。
- 核心思想:通过梯度下降优化损失函数,逐步构建回归树。
- 适用场景:回归、分类、排序等多种任务。
- 特点:
- 支持多种损失函数。
- 每轮迭代中,构建新的树来拟合当前模型的残差(伪残差)。
- 最终模型是所有回归树的加权组合。
-
XGBoost(eXtreme Gradient Boosting):
- 在 GBDT 的基础上进行了优化和扩展。
- 引入了正则化项以降低过拟合风险。
- 支持并行计算,提升了训练效率。
- 特点:
- 使用二阶泰勒展开优化损失函数。
- 支持自定义损失函数。
- 提供列采样和缩减策略以提高模型泛化能力。
-
LightGBM:
- 由微软提出,专注于高效性和大规模数据处理。
- 使用直方图算法加速树的分裂过程。
- 特点:
- 训练速度快,内存占用低。
- 支持类别特征的高效处理。
-
CatBoost:
- 由 Yandex 提出,专为处理类别特征设计。
- 自动处理类别特征编码,无需手动预处理。
- 特点:
- 减少类别特征的目标泄漏问题。
- 性能优越,尤其在高维类别特征场景下。
2.3. 总结对比表
特性 | 传统 Boosting | GBDT |
---|---|---|
优化目标 | 调整样本权重 | 梯度下降优化损失函数 |
基学习器类型 | 决策树桩或其他弱分类器 | 回归树 |
损失函数支持 | 特定损失函数(如指数损失) | 任意可导损失函数 |
适用任务 | 主要用于二分类 | 回归、分类、排序等多种任务 |
代表算法 | AdaBoost | GBDT、XGBoost、LightGBM、CatBoost |
三、svm的核函数,升维到高维空间,理论上一定可分吗
3.1. SVM 的核函数与高维空间可分性分析
在支持向量机(SVM)中,核函数的作用是通过隐式地将数据映射到高维空间,从而使得原本在低维空间中线性不可分的数据在高维空间中可能变得线性可分。
3.1.1. 核函数的定义与作用
核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj) 是一种计算方法,用于衡量两个样本点在高维特征空间中的相似性,而无需显式地进行高维映射。常见的核函数包括:
- 线性核: K ( x i , x j ) = x i ⊤ x j K(x_i, x_j) = x_i^\top x_j K(xi,xj)=xi⊤xj
- 多项式核: K ( x i , x j ) = ( x i ⊤ x j + c ) d K(x_i, x_j) = (x_i^\top x_j + c)^d K(xi,xj)=(xi⊤xj+c)d
- RBF(径向基函数)核: K ( x i , x j ) = exp ( − ∥ x i − x j ∥ 2 2 σ 2 ) K(x_i, x_j) = \exp\left(-\frac{\|x_i - x_j\|^2}{2\sigma^2}\right) K(xi,xj)=exp(−2σ2∥xi−xj∥2)
- sigmoid核: K ( x i , x j ) = tanh ( α x i ⊤ x j + c ) K(x_i, x_j) = \tanh(\alpha x_i^\top x_j + c) K(xi,xj)=tanh(αxi⊤xj+c)
核函数的核心思想是通过一个非线性映射 ϕ ( x ) \phi(x) ϕ(x),将原始输入空间中的数据点 x x x 映射到一个更高维的特征空间 H \mathcal{H} H,然后在这个高维空间中寻找一个线性分类超平面。
3.1.2. 升维后是否一定可分?
(1)理论上的可分性
根据数学理论,在无限维的特征空间中,任何数据集都可以被线性分离。这是因为:
- 在高维空间中,数据点之间的自由度增加,因此更容易找到一个超平面将数据分开。
- 如果选择一个足够复杂的核函数(如 RBF 核),它能够将数据映射到一个非常高维甚至无限维的空间,从而保证数据线性可分。
(2)实际中的限制
尽管理论上可以实现完全分离,但在实际应用中存在以下限制:
- 过拟合问题:如果强行追求完全分离,可能会导致模型过于复杂,无法泛化到新的数据。
- 计算成本:随着维度的增加,计算核函数和优化目标函数的成本也会显著上升。
- 有限样本的影响:即使数据在高维空间中理论上可分,由于样本数量有限,可能存在噪声或重叠,导致实际中难以实现完全分离。
3.2. 核函数的选择对可分性的影响
不同的核函数对数据的映射能力不同,因此是否能实现完全分离取决于核函数的选择:
- 线性核:仅适用于线性可分的情况。
- 多项式核:适合处理具有一定非线性关系的数据,但维度扩展有限。
- RBF 核:具有强大的非线性映射能力,能够将数据映射到无限维空间,因此几乎可以处理任意复杂的数据分布。
- sigmoid核:类似于神经网络的激活函数,适合某些特定场景,但并不总是有效。
3.3. 软间隔 SVM 的引入
在实际应用中,即使数据在高维空间中理论上可分,我们也通常不追求完全分离,而是引入软间隔 SVM来允许一定程度的误分类。原因如下:
- 数据中可能存在噪声或异常值,强行分离会导致模型过拟合。
- 软间隔 SVM 通过引入松弛变量 ξ i \xi_i ξi 和正则化参数 C C C,在分类准确性和模型复杂度之间取得平衡。
3.4. 总结
- 理论上:通过合适的核函数(如 RBF 核),数据可以被映射到一个高维甚至无限维的空间,在该空间中数据总是线性可分的。
- 实际上:由于计算成本、噪声、样本数量等限制,完全分离并不总是可行或有意义。因此,我们通常使用软间隔 SVM 来平衡分类性能和模型复杂度。
四、dropout在预测时候是怎么预测的
Dropout 是一种常用的正则化技术,用于减少神经网络的过拟合。
- 在训练阶段,Dropout 通过随机“丢弃”一部分神经元来强制网络学习更鲁棒的特征。
- 而在预测阶段,Dropout 的行为与训练阶段不同。
4.1. 训练阶段的行为
- 在训练时,Dropout 随机以一定的概率(例如 0.5)将某些神经元的输出置为 0。
- 被保留的神经元的输出会被缩放,通常乘以 1 1 − p \frac{1}{1 - p} 1−p1(其中 p p p 是丢弃概率)【放大】,以保持整体输出的期望值不变。这种随机性使得网络在每次前向传播中都相当于在训练一个不同的子网络。
4.2. 预测阶段的行为
在预测阶段,Dropout 不再随机丢弃神经元,而是使用整个网络进行推理。为了保证预测结果的一致性,模型会对权重进行调整,具体方式如下:
4.2.1. 权重缩放(Weight Scaling)
- 在训练阶段,由于部分神经元被丢弃,保留的神经元的输出被放大了 1 1 − p \frac{1}{1 - p} 1−p1 倍。
- 在预测阶段,所有神经元都会参与计算,因此需要对权重进行缩放,使其与训练阶段的期望输出一致。具体来说,每个神经元的输出会乘以 ( 1 − p ) (1 - p) (1−p),以补偿训练阶段的放大效应。
4.3. 总结:Dropout 在预测阶段的核心思想
- 不丢弃任何神经元:预测阶段使用完整的网络结构。
- 权重缩放:通过对神经元输出进行缩放,确保预测阶段的输出与训练阶段的期望一致。
- 目的:在预测时利用整个网络的知识,而不是依赖于训练阶段的随机子网络。
五、为什么使用 LayerNorm 而不使用 BatchNorm?
Layer Normalization(LayerNorm)和 Batch Normalization(BatchNorm)是两种常用的归一化技术,它们在神经网络中用于加速训练、稳定梯度以及提高模型性能。
5.1. Batch Normalization 的局限性
(1)依赖于批量大小
- BatchNorm 的核心思想是对每个 mini-batch 内的数据进行统计(均值和方差),因此其效果高度依赖于批量大小。当批量大小较小时(如在资源受限的设备上或序列建模任务中),BatchNorm 的统计量可能变得不稳定,从而影响模型的性能。
(2)不适合长序列数据
- 在处理长序列数据(如自然语言处理中的 Transformer 模型)时,BatchNorm 的效果可能会受到限制。这是因为它需要对整个 mini-batch 进行归一化,而序列长度的变化会导致 mini-batch 内的统计量不稳定。
(3)推理阶段的复杂性
- 在推理阶段,BatchNorm 需要使用训练阶段计算的全局均值和方差(通过移动平均估计),这增加了实现的复杂性,并且可能导致训练和推理阶段的行为不一致。
5.2. Layer Normalization 的优势
(1)独立于批量大小
- LayerNorm 对单个样本内部的特征进行归一化,而不是基于 mini-batch 的统计量。因此,它的表现不受批量大小的影响,适用于小批量甚至单样本的情况。
(2)更适合长序列数据
- LayerNorm 可以沿着序列维度对特征进行归一化,因此非常适合处理变长序列数据(如文本、语音等)。例如,在 Transformer 模型中,LayerNorm 被广泛应用于每一层的输入和输出归一化。
(3)简化推理阶段
- LayerNorm 不需要维护全局均值和方差,因此在推理阶段的实现更加简单,且训练和推理阶段的行为完全一致。
5.3. 为什么 Transformer 使用 LayerNorm?
Transformer 模型广泛使用 LayerNorm 的主要原因包括:
(1)序列数据的特点
- Transformer 处理的是变长序列数据,BatchNorm 的 mini-batch 统计量在这种情况下可能不稳定。LayerNorm 可以针对每个样本单独归一化,避免了序列长度变化带来的问题。
(2)逐层归一化的必要性
- Transformer 的每一层都有多个子模块(如自注意力机制和前馈网络),LayerNorm 能够在每一层的输入和输出之间引入稳定的归一化操作,从而加速收敛并提高模型性能。
(3)小批量训练的需求
- 在 NLP 任务中,由于内存限制或硬件资源的约束,通常使用较小的批量大小。在这种情况下,BatchNorm 的效果会显著下降,而 LayerNorm 不受批量大小的影响。
5.4. 总结
- BatchNorm 更适合图像分类等任务,尤其是在批量大小较大且数据分布较为稳定的情况下。
- LayerNorm 更适合序列建模任务(如 NLP 和语音识别),尤其是当批量大小较小或数据长度变化较大时。
六、70. 爬楼梯(hot100_动态规划_简单)
# 当爬到n层f(n),前面一步只能是在n-1层爬一步f(n-1),或者n-2层爬两步f(n-2)。
# 那么f(n) = f(n-1)+f(n-2)
# f(0) = 1
# f(1) = 1
class Solution:
def climbStairs(self, n: int) -> int:
f = [0]*(n+1)
f[0],f[1] = 1,1
for i in range(2, n+1):
f[i] = f[i-1]+f[i-2]
return f[n]