java烂了,下一个是机器学习吗

105 阅读7分钟

机器学习全拿下,下一个烂大街的就是他,抽象的外表下,图穷匕现,统计学+业务高阶算法。不断叠轮子,这就是机器学习。

深度学习大流程是方法论,小细节是感觉+证明。

1. 推荐系统整体流程

推荐系统一般的整体流程可以分为以下几个主要步骤:

  • 数据收集与处理:从用户行为、商品特征、用户特征等多个来源收集数据,并进行清洗、去重、归一化等处理。

  • 特征工程:将原始数据转化为特征,包括用户特征、物品特征和交互特征等。常见方法有embedding、统计特征、用户历史行为等。

  • 召回:通过一些简单高效的方式,从海量物品中初步筛选出候选物品,常用的方法包括协同过滤、矩阵分解、基于内容的推荐以及深度学习模型(如DSSM、YouTube DNN)等。

  • 排序:对召回的候选物品进一步进行打分排序,使用更复杂的模型(如GBDT、深度学习模型等),根据用户喜好预测物品的点击率、评分等。

  • 后处理:可能涉及一些业务规则(如多样性、冷启动、实时性等)的处理,确保最终展示的推荐结果符合业务需求。

  • 评估与优化:通过离线评估(如AUC、NDCG等)和在线评估(如AB测试)来不断优化模型。

2. AUC和NDCG指标定义、意义、作用、简化计算方法

  • AUC (Area Under Curve)

    • 定义:AUC是ROC曲线下的面积。ROC曲线是以假阳性率(False Positive Rate)为横轴,真阳性率(True Positive Rate)为纵轴绘制的曲线。
    • 意义:AUC反映了模型对正负样本的排序能力。AUC=0.5表示模型的区分能力与随机猜测一样,AUC=1表示模型完美区分正负样本。
    • 作用:在二分类任务中,AUC是衡量模型性能的常用指标,特别是当数据不平衡时,AUC能够较好地衡量模型的表现。
    • 简化计算方法:可以用sklearn库的roc_auc_score函数直接计算。手动计算时可以通过遍历所有正负样本对,统计正样本得分大于负样本得分的比例。
  • NDCG (Normalized Discounted Cumulative Gain)

    • 定义:DCG (Discounted Cumulative Gain)是考虑位置权重的累计增益值,而NDCG是将DCG值正则化,以便不同查询结果的可比性。
      • DCG公式:DCG=i=1nrelilog2(i+1)DCG = \sum_{i=1}^{n} \frac{rel_i}{\log_2(i+1)},其中(rel_i)表示第i个位置物品的相关性。
      • NDCG公式:NDCG=DCGIDCGNDCG = \frac{DCG}{IDCG},其中IDCG是理想情况下的DCG(即完美排序)。
    • 意义:NDCG是用于评估排序模型的指标,反映了模型给出的推荐列表在前几位位置的准确性。位置越靠前,权重越大。
    • 作用:NDCG常用于推荐系统和信息检索任务,特别是当你需要给用户展示一个有序的推荐列表时。
    • 简化计算方法:简化计算时,可以只考虑前K个推荐结果(即NDCG@K),这样计算复杂度会降低。

3. 特征选择、图召回

4.LightGBM和XGBoost的区别

LightGBM 和 XGBoost 都是非常流行的基于决策树的梯度提升框架(Gradient Boosting Framework),在很多机器学习竞赛和实际应用中表现优异。尽管两者在底层都使用梯度提升算法,但在实现和优化上存在一些关键区别。以下是它们的主要区别:

1. 树的生长方式

  • XGBoost: 使用的是按层生长的方式,意味着每一层的所有叶节点都必须同时分裂。
  • LightGBM: 使用的是按叶生长的方式,它会选择当前误差最大的叶节点进行分裂。这种方式可以更好地降低误差,但有可能导致树的不平衡。

总结: LightGBM 的按叶生长方式通常会生成更深的树,且更有利于处理有噪声的数据。

2. 处理大规模数据的效率

  • LightGBM: 针对大规模数据进行优化,特别是通过基于直方图的算法(Histogram-based algorithm),将连续特征值离散化为离散的区间来加速计算。同时,LightGBM还支持基于特征的并行(Feature Parallelism),使其在大规模数据集上表现非常高效。
  • XGBoost: 采用的是精确分裂算法,即对每个特征的所有可能分割点进行计算,选择最优的分割点。这种方法虽然保证了精度,但在大数据集上计算开销可能会非常大。

总结: LightGBM在处理大规模数据时通常比XGBoost更快,占用内存更少。

3. 速度和内存占用

  • LightGBM: 由于采用了基于直方图的分裂算法,LightGBM在速度和内存消耗上通常表现得更优。其训练速度比XGBoost快,特别是在特征数量和样本数量较大的情况下。
  • XGBoost: 虽然XGBoost也有一些优化(如支持多线程、block-based优化等),但在大规模数据集上,速度和内存消耗通常不如LightGBM。

总结: 在大数据集上,LightGBM的速度和内存利用率通常优于XGBoost。

4. 支持类别特征

  • LightGBM: 原生支持类别特征,无需对类别特征进行额外的独热编码(one-hot encoding),这使其在处理含有大量类别特征的数据时拥有优势。
  • XGBoost: 不直接支持类别特征,用户需要将类别特征转化为数值特征(通常通过独热编码)。

总结: LightGBM在处理包含类别特征的数据时更加方便和高效。

5. 分布式训练

  • LightGBM: 支持高效的分布式训练,利用特征并行和数据并行技术,可以轻松扩展到多个节点上进行训练。
  • XGBoost: 也支持分布式训练,但在实现上较为复杂,性能也不如LightGBM的分布式训练高效。

总结: LightGBM的分布式训练更简单且更高效。

6. 过拟合控制

  • LightGBM: LightGBM通过提供多种参数(如max_depthmin_data_in_leaflambda_l1lambda_l2等)来控制过拟合,但由于其按叶生长的特性,LightGBM有时可能更容易过拟合,尤其是在小数据集上。
  • XGBoost: 通过max_depthmin_child_weight等参数可以较好地控制树的复杂度,从而防止过拟合。由于其按层生长的方式,XGBoost在某些情况下不太容易过拟合。

总结: 在小数据集上,XGBoost的过拟合控制通常表现得更好,而LightGBM更适合大数据集。

7. 支持的损失函数

  • LightGBM: 支持多种损失函数,包括分类、回归、排序等。LightGBM在排序任务(如学习排序,Learning to Rank)上有专门的优化。
  • XGBoost: 也

5.crossEntropy及其对logits的求导

Cross Entropy 及其对 Logits 的求导

Cross Entropy (交叉熵) 是一种用于衡量两个概率分布之间差异的损失函数,常用于分类问题中。在机器学习中,我们通常使用它来衡量模型预测的概率分布与真实标签的概率分布之间的差异。

Logits 是指神经网络最后一层输出的原始分数,尚未经过 softmax 函数转换为概率。

Cross Entropy 公式

对于二分类问题,交叉熵损失函数的公式如下:

Loss = -[y * log(p) + (1-y) * log(1-p)]

其中:

  • y 是真实标签 (0 或 1)
  • p 是模型预测为正类的概率

对于多分类问题,交叉熵损失函数的公式如下:

Loss = - Σ (y_i * log(p_i))

其中:

  • y_i 是真实标签的 one-hot 编码 (例如,[0, 0, 1])
  • p_i 是模型预测为第 i 类的概率

Cross Entropy 对 Logits 的求导

在实际应用中,我们通常使用 logits 来计算交叉熵损失,并对其进行求导以更新模型参数。

假设 z 是 logits 向量,p 是经过 softmax 函数得到的概率向量:

p_i = softmax(z_i) = exp(z_i) / Σ exp(z_j)

那么,交叉熵损失函数对 logits 的求导可以表示为:

∂Loss / ∂z_i = p_i - y_i

推导过程 (以多分类为例):

  1. Loss 对 p_i 的求导:
∂Loss / ∂p_i = -y_i / p_i
  1. p_i 对 z_j 的求导:

当 i = j 时:

∂p_i / ∂z_i = p_i * (1 - p_i)

当 i ≠ j 时:

∂p_i / ∂z_j = -p_i * p_j
  1. Loss 对 z_i 的求导 (链式法则):
∂Loss / ∂z_i = Σ (∂Loss / ∂p_j) * (∂p_j / ∂z_i) 
           = (-y_i / p_i) * (p_i * (1 - p_i)) + Σ_{j≠i} (-y_j / p_j) * (-p_j * p_i)
           = -y_i + y_i * p_i + Σ_{j≠i} y_j * p_i
           = -y_i + p_i * (y_i + Σ_{j≠i} y_j)
           = -y_i + p_i * Σ y_j
           = -y_i + p_i  (因为 Σ y_j = 1)
           = p_i - y_i

2021动手学深度学习的回忆击中我。