目录
2)解释一下Accuracy、Precision、Recall、Specificity、FPR、FNR、F1这些指标的含义?
3)为啥精确率和召回率是矛盾的?或者说为啥大多数情况下一个指标得到了提高,另一个指标反而下降了?
13)是否存在一种算法|模型,其在所有数据集上都能表现得非常好?
15)机器学习中,为何要经常对数据做归一化?以及有哪些常见的归一化方法?
8)简单介绍一下三种集成学习策略,Bagging、Boosting、Stacking。
10)在k-means或kNN,我们是用欧氏距离来计算最近的邻居之间的距离。为什么不用曼哈顿距离?
17)Google是怎么利用贝叶斯方法,实现”拼写检查”的功能。
5)tensorflow和pytorch两个深度学习训练框架有何区别?
8)介绍一下什么是批梯度下降,什么是小批梯度下降,什么是随机梯度下降
10)CNN最成功的应用是在CV,那为什么NLP和Speech的很多问题也可以用CNN解出来?为什么AlphaGo里也用了CNN?这几个不相关的问题的相似性在哪里?CNN通过什么手段抓住了这个共性?
共通:
1)什么是偏差?什么是方差?以及这两者之间为啥要实现权衡?
在机器学习中,偏差(Bias)和方差(Variance)是模型误差的两个主要组成部分,它们反映了模型在预测过程中的不同类型的误差来源。
偏差(Bias):
偏差是指模型在对数据进行预测时,与真实值之间的系统性误差。高偏差意味着模型对数据的过度简化,可能忽略了数据中的重要模式,导致模型的表现较差。偏差较高的模型通常是欠拟合(Underfitting)的,即它无法在训练集或测试集上表现良好。
- 偏差高的情况: 模型假设过于简单,比如用线性模型去拟合非线性的数据。
- 结果: 模型的预测会出现系统性偏差,即无论在训练集还是测试集上,模型的预测误差都比较大。
方差(Variance):
方差是指模型在不同数据集上的预测结果的变化程度。高方差意味着模型过于依赖训练数据,对训练数据中的噪声敏感,因此在测试集上的表现会不稳定。方差较高的模型通常是过拟合(Overfitting)的,即它在训练集上表现良好,但在测试集上表现较差。
- 方差高的情况: 模型假设过于复杂,比如用高阶多项式模型去拟合简单的数据。
- 结果: 模型在训练集上的表现非常好,但在测试集上可能表现不佳,因为它对训练数据中的噪声过度拟合。
偏差-方差权衡(Bias-Variance Tradeoff):
在模型训练过程中,偏差和方差通常是互相权衡的。增加模型的复杂度可以减少偏差,但可能会增加方差;反之,减少模型的复杂度可以减少方差,但可能会增加偏差。因此,理想情况下,需要找到一个平衡点,使得模型的偏差和方差都在合理范围内,从而提高模型的泛化能力。
总结来说,偏差反映了模型的准确性,而方差反映了模型的稳定性。理解并处理好这两者之间的权衡,是构建高效机器学习模型的关键。
2)解释一下Accuracy、Precision、Recall、Specificity、FPR、FNR、F1这些指标的含义?
在了解这些指标之前,大家应该已经知道了混淆矩阵的含义,这里就不再说明。
Acc应该是大家最常接触和使用的一个指标,它的含义就是所有预测样本中模型正确预测样本所占的比例。也就是(TP+TN)/(TP+TN+FP+FN)。
按道理说有了Acc指标后,为啥还需要别的指标呢?这是因为在不同场景下需要不同的指标来衡量模型的性能好坏。
Pre代表精确率,也可以称为查准率。顾名思义,它代表的含义就是所有预测为正类的样本中实际为正样本的比例。也就是TP/(TP+FP)。
Recall(TPR)代表召回率,也可以称为真阳性率|查全率。顾名思义,它代表的含义就是所有实际为正类的样本中预测为正样本的比例。也就是TP/(TP+FN)。是不是感觉这个指标和Pre有关联,确实如此,具体的关联我们下个问题再探讨。
Specificity(TNR)代表特异度,也可以称为真阴性率。顾名思义,它代表的含义就是所有实际为负类的样本中预测为负样本的比例,也就是TN/(TN+FP)。
FPR代表假阳性率,它代表的含义就是所有实际为负类的样本中预测为正样本的比例。也就是1-Specifity。
FNR代表假阴性率,它代表的含义就是所有实际为正类的样本中预测为负样本的比例。也就是1-Recall。
F1分数是精确率和召回率的调和平均数,其计算公式为2/(1/Recall+1/Precision)。
上述指标的计算公式都是针对二分类问题而言的,如果推广到多分类问题,则可以使用宏平均和微平均的方式获得。
想要深入了解可以参考我另一篇博客:第8章 混淆矩阵
3)为啥精确率和召回率是矛盾的?或者说为啥大多数情况下一个指标得到了提高,另一个指标反而下降了?
鱼和熊掌不可兼得。例如:在垃圾邮件过滤中,如果模型非常谨慎,只在非常确信的情况下才将邮件标记为垃圾邮件,那么几乎所有标记为垃圾邮件的邮件确实是垃圾邮件(高精确率),但同时,很多真正的垃圾邮件会被漏掉(低召回率)。相反,如果模型非常宽松,只要有一点嫌疑就标记为垃圾邮件,那么几乎所有的垃圾邮件都能被检测出来(高召回率),但也会误判许多正常邮件为垃圾邮件(低精确率)。
4)什么是ROC?什么是AUC?
ROC曲线是真阳率TPR与各种阈值下的假阳率NPR之间的对比度的图形表示。 它通常用作代表模型灵敏度(真阳性)与跌落之间的平衡或它将触发误报(假阳性)的概率。
AUC(Area Under the Curve):是 ROC 曲线下的面积,表示模型的总体性能。AUC 的值在 0 和 1 之间,值越大表示模型性能越好。
5)防止过拟合的方法有哪些?
- 采用k折交叉验证,用平均值来衡量模型性能。
- 早停策略。
- 简化模型,例如决策树中使用剪枝技术。
- 数据增强,通过对现有数据进行变换(如旋转、缩放、平移等),生成新的训练样本,从而扩充训练数据集。
- 加入正则化项,可以采用L1、L2、弹性网等正则化手段。
- 改变优化器,例如在深度学习中采用AdamW。
- 改变损失函数,例如在深度学习中采用标签平滑损失函数。
- 集成学习,通过组合多个模型的预测结果来提高整体性能,减少单个模型的过拟合风险。
- 特征选择,选择对模型有用的特征,去除冗余或不相关的特征,减少模型的复杂性。
- drop_out,在训练深度神经网络时,随机丢弃一部分神经元的输出。
- 对数据进行归一化。
6)介绍一下L1正则化、L2正则化、弹性网之间的区别。
L1 正则化通过将特征权重的绝对值之和作为惩罚项,来约束模型的复杂度。这可能会导致模型权重稀疏,即许多权重变为零,使得模型更简单。
L2 正则化通过将特征权重的平方和作为惩罚项,来约束模型的复杂度。L2 正则化通常不会使权重完全为零,而是将权重缩小到较小的值。
弹性网正则化结合了 L1 和 L2 正则化的优点,通过将 L1 和 L2 正则化项同时加入损失函数来进行正则化。适用于高维数据集。
7)第一类误差和第二类误差有什么区别?
第一类误差是假阳性率FPR,第二类误差是假阴性率FNR。
8)如何处理不平衡数据集?
重新采样:包括过采样(增加少数类别的样本数量:最常用的方法是复制少数类别的样本(对图像数据而言可以数据增强:平移、旋转、缩放等),或者使用生成模型来生成新的合成样本。但可能导致过拟合)和欠采样(减少多数类别的样本数量。可以通过随机删除多数类别的样本,或者使用算法来删除那些对分类贡献不大的样本。但可能丢失有用信息,导致模型性能下降),平衡一点的办法是两者结合。
算法层面:包括加权损失函数(训练过程中为不同类别分配不同的权重,使得模型对少数类别样本的错误分类给予更高的惩罚)以及使用一些适用于处理不平衡数据集的算法,如XGBoost。
评价指标:在不平衡数据集中,精确率、召回率、F1-score 等评价指标比准确率更能反映模型的性能。尤其是在少数类别的预测准确性更重要时,应重点关注这些指标。
9)什么时候你应该使用分类而不是回归?
- 分类:
- 当目标变量是离散的类别时,应该使用分类模型。例如,如果你的目标是预测客户的购买意图(如“购买”或“未购买”),或是判断邮件是否是垃圾邮件(“垃圾邮件”或“非垃圾邮件”),这些都是分类任务,因为目标变量是离散的类别。
- 回归:
- 当目标变量是连续的数值时,应该使用回归模型。例如,如果你的目标是预测房价、股票价格或温度,这些都是回归任务,因为目标变量是连续的数值。
10)如何处理数据集中丢失或损坏的数据?
主要包括删除、填充、插补三种方式。
1. 删除缺失数据
删除包含缺失值的行:如果数据集中缺失值的行数很少,可以选择删除这些行。适用于缺失数据较少的情况。
- 优点:简单易行,不需要复杂的处理。
- 缺点:可能丢失有价值的信息,特别是当缺失数据占比高时,可能导致数据不完整。
删除包含缺失值的列:如果某一列缺失值过多,可以选择删除这列数据。
- 优点:避免对缺失数据进行复杂处理,简化数据集。
- 缺点:可能丢失重要的特征信息,影响模型性能。
2. 填充缺失数据
均值填充:用该列的均值替换缺失值。适用于数值型数据。
- 优点:简单易行,保留数据量。
- 缺点:可能引入偏差,特别是当数据分布不均匀时。
中位数填充:用该列的中位数替换缺失值。适用于有离群点的数值型数据。
- 优点:对离群点不敏感,能够更好地处理非对称分布。
- 缺点:无法保留数据的真实分布特征。
众数填充:用该列的众数(最频繁出现的值)替换缺失值。适用于分类数据。
- 优点:处理类别型数据时有效,简单易行。
- 缺点:可能导致类别不平衡。
插值法:使用插值方法(如线性插值、样条插值)来填充缺失值。适用于有序数据或时间序列数据。
- 优点:保留数据的趋势和结构。
- 缺点:可能引入噪声,特别是当数据不规则时。
基于模型的填充:使用机器学习模型(如KNN、线性回归)预测缺失值。适用于复杂数据情况。
- 优点:可以利用其他特征来预测缺失值,较为准确。
- 缺点:需要训练模型,计算复杂性较高。
3. 数据插补
KNN插补:使用最近邻算法,根据相似数据点的值来填补缺失值。
- 优点:能够利用数据点的相似性进行填充,较为准确。
- 缺点:计算开销大,尤其在数据量较大时。
多重插补:生成多个填补数据集,对每个数据集进行分析,然后将结果合并。可以更好地处理数据的不确定性。
- 优点:能够反映填补不确定性,提高填补的准确性。
- 缺点:计算复杂,操作繁琐。
11)为啥有些特征要使用独热编码?
在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
而我们使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。
将离散型特征使用one-hot编码,确实会让特征之间的距离计算更加合理。
比如,有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用one-hot编码,其表示分别是x1 = (1), x2 = (2), x3 = (3)。两个工作之间的距离是,(x1, x2) = 1, d(x2, x3) = 1, d(x1, x3) = 2。那么x1和x3工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到x1 = (1, 0, 0), x2 = (0, 1, 0), x3 = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个工作之间的距离是一样的,显得更合理。
例如:直接使用类别数据(例如,将“红色”、“蓝色”、“绿色”表示为1、2、3)可能会导致模型误解这些数据。模型可能会认为数值之间存在某种顺序关系,而实际上这些类别之间没有自然的顺序。独热编码通过将每个类别表示为一个独立的二进制向量,避免了这种问题。
12)谈谈判别式模型和生成式模型?
判别方法:由数据直接学习决策函数 Y = f(X),或者由条件分布概率 P(Y|X)作为预测模型,即判别模型。
生成方法:由数据学习联合概率密度分布函数 P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型。
由生成模型可以得到判别模型,但由判别模型得不到生成模型。
常见的判别模型有:K近邻、SVM、决策树、感知机、线性判别分析(LDA)、线性回归、传统的神经网络、逻辑斯蒂回归、boosting、条件随机场
常见的生成模型有:朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型(LDA)、限制玻尔兹曼机。
13)是否存在一种算法|模型,其在所有数据集上都能表现得非常好?
根据“无免费午餐定理”,如果所有可能的数据分布都被考虑,那么任何学习算法在某些数据分布上的表现会和其他算法一样好,也会和其他算法一样差。这意味着没有一种机器学习算法可以在所有类型的数据集和任务上都比其他算法表现得更好。
也就是说:对于所有问题,无论学习算法A多聪明,学习算法 B多笨拙,它们的期望性能相同。没有免费午餐定力假设所有问题出现几率相同,实际应用中,不同的场景,会有不同的问题分布,所以,在优化算法时,针对具体问题进行分析,是算法优化的核心所在。
14)什么是共线性?
- 定义: 共线性指的是在回归模型中,自变量(特征)之间存在高度的线性相关性。具体来说,如果两个或多个自变量之间存在强的线性关系,那么它们被认为是共线性的。
- 表现: 高度共线性的自变量可以用一个自变量的线性组合来表达其他自变量,这使得模型的回归系数不稳定,难以解释和预测。
- 检测: 共线性可以通过计算自变量之间的相关系数矩阵、方差膨胀因子(VIF)等方法来检测。VIF值高(通常大于10)表示自变量之间存在较强的共线性。
共线性的影响:
- 系数不稳定: 高度共线性会导致回归系数的估计变得不稳定和不可靠。即使数据集有少许变化,回归系数也可能发生较大变化。
- 模型解释困难: 共线性使得难以确定哪个自变量对因变量有显著影响,因为自变量之间的线性关系使得单独评价它们的贡献变得复杂。
- 线性会造成冗余,导致过拟合。
15)机器学习中,为何要经常对数据做归一化?以及有哪些常见的归一化方法?
为什么要进行归一化
提高模型收敛速度,梯度下降优化:大多数优化算法(如梯度下降)对特征的尺度敏感。如果特征的尺度差异很大,梯度下降可能会在较大的特征上更新过快,而在较小的特征上更新过慢,导致训练过程不稳定或收敛速度缓慢。
避免特征尺度的影响,特征权重不平衡:在一些模型(如线性回归、支持向量机)中,特征的尺度差异会导致模型更关注于尺度较大的特征,忽视尺度较小的特征,从而影响模型性能。
提高模型性能,距离度量:对于基于距离的算法(如 KNN、K-means),特征尺度的差异会直接影响距离计算,从而影响算法的效果。
确保数值稳定性,防止溢出和下溢:归一化有助于确保数据在合理的数值范围内,从而减少数值计算中的溢出和下溢问题。
常见的归一化方法
最小-最大归一化(Min-Max Normalization)
- 公式:
- 范围: 将数据缩放到 [0, 1] 区间。
- 优点: 简单直观,保留了特征的原始分布形状。
- 缺点: 对异常值敏感,异常值会影响缩放范围。
标准化(Z-score Normalization)
- 公式:
- 范围: 将数据转化为均值为 0,标准差为 1 的标准正态分布。
- 优点: 对异常值不太敏感,适用于大多数机器学习算法。
- 缺点: 转换后的数据不在固定的范围内,可能会出现数值偏离。
L2 归一化(L2 Normalization)
- 公式:
- 范围: 将每个样本的特征向量缩放,使得其 L2 范数为 1。
- 优点: 适用于处理文本数据中的特征向量。
- 缺点: 数据的分布被改变,可能不适用于所有模型。
L1 归一化(L1 Normalization)
- 公式:
- 范围: 将每个样本的特征向量缩放,使得其 L1 范数为 1。
- 优点: 对于稀疏数据特别有效。
- 缺点: 同样会改变数据的分布。
对数变换(Log Transformation)
- 公式:
- 范围: 通过对数函数压缩数据的范围。
- 优点: 能处理数据的非线性关系,减少数据的偏斜。
- 缺点: 对数据中包含的负值或零值不适用。
Robust Scaler
- 公式:
- 范围: 使用数据的中位数和四分位数范围(IQR)进行缩放。
- 优点: 对异常值不敏感。
- 缺点: 不适用于所有数据分布类型
16)请简要说说一个完整机器学习项目的流程。
1. 抽象成数学问题
明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。
这里的抽象成数学问题,指的我们明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。
2. 获取数据
数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。数据要有代表性,否则必然会过拟合。而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。
而且还要对数据的量级有一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。如果数据量实在太大,那就要考虑分布式了。
3. 特征预处理与特征选择
良好的数据要能够提取出良好的特征才能真正发挥效力。
特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。
筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。
4. 训练模型与调优
直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。
5. 模型诊断
如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。
过拟合、欠拟合 判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。
误差分析 也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题……
诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。
6. 模型融合
一般来说,模型融合后都能使得效果有一定提升。而且效果很好。
工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。
17)什么是奥卡姆剃刀原理?
奥卡姆剃刀原理,能够很好的解释已知数据并且十分简单才是最好的模型。
奥卡姆剃刀原理强调简洁性和必要性,鼓励在解释现象或选择理论时避免引入不必要的复杂性。在科学研究、机器学习和其他领域中,它都被用来指导理论选择和模型设计,帮助保持解决方案的简单性和有效性。
18)标准化与归一化的区别?
选择使用标准化还是归一化通常取决于具体的模型和数据特性。例如,神经网络和距离度量方法(如KNN)通常使用归一化,而需要假设数据呈正态分布的模型(如线性回归、支持向量机)则常用标准化。
19)什么是凸函数以及如何判断凸函数?
凸函数具备全局最优性,在凸优化问题中,如果目标函数是凸函数,那么任何局部最优解都是全局最优解。相比于非凸问题,凸问题求解起来更加简单且可靠。
如何判断呢?
传统机器学习:
1)KNN和K-means有何不同?
1. 用途
- KNN:是一种监督学习算法,主要用于分类问题。它需要一个带有标签的训练数据集来进行分类。
- K-means:是一种无监督学习算法,主要用于聚类问题。它在没有标签的情况下,根据数据的相似性将数据集分为 K 个簇。
2. 训练过程
- KNN:没有传统意义上的训练过程,它只是保存了训练数据集。分类时,根据测试点与训练点的距离找到最近的 K 个邻居,然后根据这些邻居的标签进行投票分类。
- K-means:有一个明确的训练过程。算法随机初始化 K 个质心,然后迭代更新质心位置,直到簇的分配稳定(收敛)。质心的位置会影响每个数据点的簇分配。
3. 输入输出
- KNN:
- 输入:带标签的训练数据集、未标记的测试数据、参数 K。
- 输出:测试数据的分类标签。
- K-means:
- 输入:未标记的数据集、参数 K(期望分成的簇数)。
- 输出:每个数据点的簇标签及每个簇的质心。
4. 工作原理
- KNN:
- 计算测试点与训练点的距离。
- 选取 K 个最近的邻居,进行投票分类。
- K-means:
- 随机选择 K 个初始质心。
- 迭代更新质心和簇分配,直到所有点分配的簇不再变化或质心的位置稳定。
5. 监督与无监督
- KNN 是监督学习方法,需要带标签的数据来进行分类。
- K-means 是无监督学习方法,不需要标签,仅依据数据的分布进行聚类。
6. 模型复杂度
- KNN:由于需要在分类阶段计算每个测试点到所有训练点的距离,KNN 的计算复杂度较高,特别是当训练集很大时。
- K-means:算法的复杂度主要体现在迭代过程中重新分配数据点到质心,并更新质心的位置。每次迭代的计算量与数据点数和簇数有关。
7. 适用场景
- KNN:适用于分类任务,尤其是当数据有明确的类别标签时。
- K-means:适用于聚类任务,尤其是在想要发现数据中的潜在群体结构时。
8. 结果解释
- KNN:直接预测测试点的类别。
- K-means:输出数据集中的每个点所属的簇,并给出每个簇的中心位置。
例子:
- KNN:如果你有一个标记了猫和狗图片的数据集,你可以用 KNN 来预测新图片是猫还是狗。
- K-means:如果你有一堆未标记的图片,想要找出这些图片自然分成的几类,你可以用 K-means 来进行聚类,可能会得到“猫”、“狗”、“鸟”等类别。
2)什么是贝叶斯定理?它在机器学习环境中如何有用?
可以认为贝叶斯定理的实质就是由果推因,贝叶斯定理主要用于计算在已知某些证据(果)情况下,某个事件(因)发生的概率。这种方法从已知的结果推断可能的原因。
其应用包括朴素贝叶斯分类器、贝叶斯网络等。
3)朴素贝叶斯分类器的前提假设是啥?
朴素贝叶斯分类器(Naive Bayes Classifier)是基于贝叶斯定理的分类算法。它假设特征之间是条件独立的,即每个特征在给定类别的情况下是独立的。但这种情况在现实生活中可能永远不会遇到。正如 Quora 上一些评论者所说的那样,Naive Bayes 分类器发现你喜欢泡菜和冰淇淋之后,可能会天真地推荐你一个泡菜冰淇淋。
4)介绍一个你最喜欢的传统机器学习算法?
这里以SVM为例。
我最喜欢的传统机器学习算法是SVM,在二分类问题中,SVM的原理就是找到一个超平面(在二维空间中是线)来最大化两个类别之间的间隔,从而使分类边界尽可能远离两类样本。SVM 通过最大化分类边界的间隔来实现分类,间隔是指到离分类边界最近的样本点(支持向量)的距离。这个间隔越大,分类器的泛化能力通常越强。
对于线性可分的数据,我们可以使用硬间隔的SVM,确保分类是完全正确的。
而对于小部分数据是线性不可分的情况,我们可以引入松弛变量变为软间隔,在允许一部分样本分类错误的前提下使得模型可以解决线性不可分问题。
若是对于大部分数据都是线性不可分的情况,我们需要使用核函数将数据映射到更高维的特征空间,在这个空间中可以找到一个线性超平面来进行分类。常用的核函数有径向基函数(RBF)、多项式核、高斯核函数等。
SVM的目标函数是最大化间隔,同时最小化分类误差。
大多数情况下,我们希望将该问题转化为拉格朗日对偶问题,这是因为带约束的原问题求解比较困难,变成对偶问题可以把约束条件和待优化的目标融合在一个表达式里面,更容易优化求解,而且对偶问题能自然的引入核技巧,方便后续用来解决低维线性不可分的问题。
支持向量机(SVM)原本是为二分类问题设计的,但在处理多分类问题时,有几种常见的扩展方法:
- 为每对类别训练一个二分类器,每个分类器的任务是区分两个类别。对测试样本进行分类时,每个分类器会给出一个投票结果。最终的类别是获得最多投票的类别。
- 为每个类别训练一个二分类器,每个分类器的任务是将该类别与所有其他类别区分开来。对测试样本进行分类时,每个分类器会给出一个投票结果。最终的类别是获得最多投票的类别。
- 直接修改SVM的目标函数以支持多分类。但这种方法较少使用。
这里以LR为例
我最喜欢的传统机器学习算法是LR,对二分类问题而言,逻辑回归用于预测分类问题中的概率值,即预测样本属于某一类别的概率。逻辑回归模型通过对输入特征进行加权求和,并将结果通过逻辑函数(也称为sigmoid函数)(逻辑回归(广义线性模型的一种)的Logistic函数即为神经元激活函数中的Sigmoid函数)转换为概率值。
- 输出:逻辑回归输出的是一个介于0和1之间的概率值,通过设定一个阈值(通常为0.5),可以将样本分为两个类别。
- 解释性强:逻辑回归模型的参数具有明确的解释性,可以了解每个特征对预测结果的影响。
- 计算简单:逻辑回归计算过程相对简单,易于理解和实现,适合处理线性可分的数据。
对于多分类任务而言,处理方式可以采用上面SVM提到的1对1或1对多,也可以将激活函数改为softmax函数。
5)什么是傅里叶变换?
傅里叶变换的基本思想是把复杂的信号分解成多个简单的正弦波和余弦波。它帮助我们理解信号中的不同频率成分。傅立叶变换将信号从时间域转换为频率域-这是从音频信号或其他时间序列(如传感器数据)中提取特征的一种非常常见的方法。
6)概率和似然有什么区别?
概率和似然都是指可能性,但在统计学中,概率和似然有截然不同的用法。概率描述了已知参数时的随机变量的输出结果;似然则用来描述已知随机变量输出结果时,未知参数的可能取值。例如,对于“一枚正反对称的硬币上抛十次”这种事件,我们可以问硬币落地时十次都是正面向上的“概率”是多少;而对于“一枚硬币上抛十次,其中有6次朝向正面,我们则可以问,这枚硬币正反面对称的“似然”程度是多少。
7)如何对决策树进行剪枝?
剪枝是在决策树中,为了降低模型的复杂度,提高决策树模型的预测精度,去除预测能力较弱的分支后所发生的现象。修剪可以自下而上和自上而下进行,方法包括减少错误修剪和成本复杂度修剪。
减少错误修剪可能是最简单的版本:替换每个节点。如果不降低预测精度,则保持修剪。虽然很简单,但这种启发式方法实际上非常接近于一种可以最大限度地优化准确性的方法。
8)简单介绍一下三种集成学习策略,Bagging、Boosting、Stacking。
Bagging、Boosting 和 Stacking 是三种常见的集成学习方法,它们通过不同的策略结合多个模型的预测来提高整体性能。以下是对这三种方法的详细解释:
1. Bagging(Bootstrap Aggregating)
原理:
- 子集训练:Bagging 通过对原始训练数据集进行有放回的抽样(即 bootstrap 采样)来生成多个不同的训练子集。每个子集用于训练一个基学习器。
- 模型融合:训练完成后,将所有基学习器的预测结果进行结合。对于分类问题,通常使用投票法来决定最终类别;对于回归问题,通常使用平均值来计算最终预测值。
特点:
- 减少方差:通过训练多个不同的模型并结合它们的预测,Bagging 能够减少模型的方差,降低过拟合的风险。
- 并行化:由于基学习器之间相互独立,Bagging 可以方便地进行并行计算。
应用示例:
- 随机森林(Random Forest)就是一种常见的 Bagging 方法,它由多棵决策树构成,每棵树都是在不同的数据子集上训练的。
2. Boosting
原理:
- 逐步训练:Boosting 通过逐步训练多个基学习器,每次训练时关注前一个模型错误分类的样本。每个新模型试图纠正前一个模型的错误。
- 加权更新:在训练过程中,对错误分类的样本给予更高的权重,使得后续的模型更加关注这些难以分类的样本。最终的预测结果是所有基学习器预测结果的加权和。
特点:
- 减少偏差:Boosting 通过逐步改进模型,能够减少模型的偏差,提升预测精度。
- 串行训练:由于每个模型的训练依赖于前一个模型,Boosting 方法通常需要串行计算,不适合并行化。
应用示例:
- AdaBoost 和 Gradient Boosting(如 XGBoost、LightGBM、CatBoost)是常见的 Boosting 方法。它们通过加权训练数据集和逐步改进模型来提高预测性能。
3. Stacking(Stacked Generalization)
原理:
- 多层模型:Stacking 使用多层模型结构,将不同类型的基学习器的预测结果作为新特征,训练一个新的模型(称为“元学习器”或“堆叠模型”)来进行最终预测。
- 模型融合:首先训练多个基学习器,然后将它们的预测结果作为输入特征,训练一个高层模型(元学习器)来综合这些预测结果。
特点:
- 多样性:Stacking 可以使用不同类型的模型作为基学习器,充分利用各种模型的优点。
- 复杂性:由于涉及多个模型和层级,Stacking 方法的训练和调参相对复杂。
应用示例:
- 在 Kaggle 竞赛中,Stacking 常用于将多个不同类型的模型(如决策树、回归模型、神经网络等)的预测结果进行结合,以提高整体预测性能。
总结:
- Bagging:通过对训练数据进行有放回抽样,训练多个子模型并结合它们的预测结果,主要减少方差。如随机森林。
- Boosting:通过逐步训练模型,每个模型关注前一个模型的错误,主要减少偏差。如AdaBoost和XgbBoost、LightGBM等。
- Stacking:将不同模型的预测结果作为新特征,训练一个新的模型来进行最终预测,通过投票利用模型的多样性来提高性能。
9)什么是核技巧,有什么用处?
核技巧(Kernel Trick) 是一种在机器学习中用于处理非线性问题的技术,特别是在支持向量机(SVM)中广泛使用。其核心思想是通过将数据从原始空间映射到一个高维空间,使得在高维空间中数据变得线性可分,从而能够应用线性分类算法解决非线性问题。
核技巧利用核函数(Kernel Function)来计算数据点在高维空间中的内积,而不需要明确地计算映射后的高维特征。这种方法避免了显式地进行高维映射,从而减少了计算复杂性。
10)在k-means或kNN,我们是用欧氏距离来计算最近的邻居之间的距离。为什么不用曼哈顿距离?
曼哈顿距离只计算水平或垂直距离,有维度的限制。另一方面,欧氏距离可用于任何空间的距离计算问题。因为,数据点可以存在于任何空间,欧氏距离是更可行的选择。例如:想象一下国际象棋棋盘,象或车所做的移动是由曼哈顿距离计算的,因为它们是在各自的水平和垂直方向做的运动。 而在中国象棋中,象所做的移动则是由欧氏距离计算的。
11)LR和SVM的联系与区别?
联系:
1、LR和SVM都可以处理分类问题,且一般都用于处理线性二分类问题(在改进的情况下可以处理多分类问题)
2、两个方法都可以增加不同的正则化项,如L1、L2等等。所以在很多实验中,两种算法的结果是很接近的。
区别:
1、LR是参数模型,SVM既可以是参数模型(线性可分情况)也可以是非参数模型(线性不可分时)。
2、从目标函数来看,区别在于逻辑回归采用的是Logistical Loss(对数损失),SVM采用的是hinge loss(合页损失)。这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。
3、SVM的处理方法是只考虑Support Vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。
4、逻辑回归相对来说模型更简单,好理解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。
5、Logic 能做的 SVM能做,但可能在准确率上有问题,SVM能做的Logic有的做不了。
12)线性回归与LR的区别与联系?
联系
线性模型:两者都基于线性模型。它们都通过线性组合输入特征来建模,即对特征进行加权求和,并通过参数调整以拟合数据。
求解方法:两者都使用类似的优化技术来估计参数。线性回归通常使用最小二乘法,而逻辑回归使用最大似然估计(通过梯度下降或其他优化方法)来找到最优参数。
数据输入:两者都使用相似的输入特征格式。输入可以是连续的或者是离散的特征,并且都可以处理多变量的情况。
区别
目标任务:
- 线性回归: 主要用于回归任务,即预测一个连续的数值输出。目标是找到一个线性关系,使得预测值与实际值之间的差异最小化。
- 逻辑回归: 用于分类任务,特别是二分类任务。目标是预测一个离散的类别(通常为0或1)。逻辑回归通过Sigmoid函数将线性组合的结果映射到一个概率值,从而将连续的输入映射到二分类输出。
输出形式:
- 线性回归: 直接输出一个连续的数值,它是输入特征的线性加权和。
- 逻辑回归: 输出的是一个概率值,表示某个样本属于特定类别的概率。这个概率通过Sigmoid函数计算得到,结果在0到1之间。
损失函数:
- 线性回归: 使用的是均方误差(MSE)作为损失函数,目标是最小化预测值与实际值之间的平方差。
- 逻辑回归: 使用的是对数损失函数(Log Loss,也称为二元交叉熵),目标是最大化模型的似然函数,使得模型预测的概率尽可能接近实际标签。
模型结果的解释:
- 线性回归: 系数直接表示每个输入特征对输出的线性贡献,是对输入与输出之间线性关系的解释。
- 逻辑回归: 系数表示特征对事件发生(即属于某个类别)的对数几率的影响,而不是直接对输出的影响。通过指数化系数可以解释特征对结果的影响。
使用场景:
- 线性回归: 用于预测连续变量,如房价预测、温度预测等。
- 逻辑回归: 用于分类任务,如邮件分类(垃圾邮件或正常邮件)、疾病预测(患病或不患病)等。
13)什么叫做“梯度提升”
梯度提升(Gradient Boosting)是一种机器学习算法,用于构建强大的预测模型。它通过逐步改进模型的预测能力来实现。梯度提升的核心思想是通过将多个简单的模型(通常是决策树)结合起来,逐步提高预测的准确性。
梯度提升的名字表明了该算法的核心策略:通过计算梯度来优化模型,并逐步提升模型的准确性。梯度提供了关于如何改进模型的方向,而提升则描述了通过多次迭代和调整来不断增强模型性能的过程。
14) 介绍一下XGBoost
XGBoost的主要特点
基于决策树的集成方法: XGBoost是基于决策树的集成算法。它通过构建多个弱学习器(通常是决策树)并将它们组合起来,形成一个强大的预测模型。每一棵树都试图纠正前一棵树的错误,从而不断提高模型的准确性。
梯度提升框架: XGBoost采用了梯度提升(Gradient Boosting)框架。在每一轮迭代中,XGBoost通过最小化目标函数的残差,构建一棵新的决策树。这个过程通过梯度下降算法进行优化,逐步改进模型的性能。
正则化: XGBoost通过引入正则化项(L1和L2)来控制模型的复杂性,防止过拟合。正则化项使得模型在学习过程中不会变得过于复杂,有助于提高模型的泛化能力。
处理缺失值: XGBoost能够自动处理数据集中的缺失值。在训练过程中,算法会学习最佳的缺失值分裂方向,从而使得缺失值的处理更加灵活和高效。
并行计算: XGBoost利用并行计算技术,在构建决策树时对特征进行并行贪心分裂。这使得XGBoost相比传统的梯度提升算法在训练速度上有了显著的提升。
支持自定义目标函数: XGBoost允许用户定义自己的目标函数和评估指标。这使得XGBoost可以灵活应用于各种任务,不仅限于传统的分类和回归问题。
交叉验证和超参数调优: XGBoost内置了交叉验证功能,并提供了一套强大的超参数调优工具,使得用户可以轻松找到最优的模型参数组合,提高模型的性能。
15)为什么XGBoost要用泰勒展开,优势在哪里?
XGBoost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得二阶倒数形式, 可以在不选定损失函数具体形式的情况下用于算法优化分析.本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了XGBoost的适用性。
16)L1和L2正则先验分别服从什么分布 ?
- L1 正则化:对应于拉普拉斯分布的先验,倾向于产生稀疏的权重(即一些权重为零)。
- L2 正则化:对应于高斯分布的先验,倾向于产生较小的权重,具有平滑的效果。
17)Google是怎么利用贝叶斯方法,实现”拼写检查”的功能。
经常在网上搜索东西的朋友知道,当你不小心输入一个不存在的单词时,搜索引擎会提示你是不是要输入某一个正确的单词,比如当你在Google中输入“Julw”时,系统会猜测你的意图:是不是要搜索“July”,如下图所示:
这叫做拼写检查。根据谷歌一员工写的文章How to Write a Spelling Corrector显示,Google的拼写检查基于贝叶斯方法。请说说的你的理解,具体Google是怎么利用贝叶斯方法,实现”拼写检查”的功能。
用户输入一个单词时,可能拼写正确,也可能拼写错误。如果把拼写正确的情况记做c(代表correct),拼写错误的情况记做w(代表wrong),那么”拼写检查”要做的事情就是:在发生w的情况下,试图推断出c。换言之:已知w,然后在若干个备选方案中,找出可能性最大的那个c,也就是求P(c|w)的最大值。而根据贝叶斯定理,有:
由于对于所有备选的c来说,对应的都是同一个w,所以它们的P(w)是相同的,因此我们只要最大化P(w|c)P(c)即可。其中:
P(c)表示某个正确的词的出现”概率”,它可以用”频率”代替。如果我们有一个足够大的文本库,那么这个文本库中每个单词的出现频率,就相当于它的发生概率。某个词的出现频率越高,P(c)就越大。比如在你输入一个错误的词“Julw”时,系统更倾向于去猜测你可能想输入的词是“July”,而不是“Jult”,因为“July”更常见。
P(w|c)表示在试图拼写c的情况下,出现拼写错误w的概率。为了简化问题,假定两个单词在字形上越接近,就有越可能拼错,P(w|c)就越大。举例来说,相差一个字母的拼法,就比相差两个字母的拼法,发生概率更高。你想拼写单词July,那么错误拼成Julw(相差一个字母)的可能性,就比拼成Jullw高(相差两个字母)。值得一提的是,一般把这种问题称为“编辑距离”,参见程序员编程艺术第二十八~二十九章:最大连续乘积子串、字符串编辑距离。
http://blog.csdn.net/v_july_v/article/details/8701148#t4
所以,我们比较所有拼写相近的词在文本库中的出现频率,再从中挑出出现频率最高的一个,即是用户最想输入的那个词。具体的计算过程及此方法的缺陷请参见How to Write a Spelling Corrector。
18)协方差和相关性有什么区别?
相关性是协方差的标准化格式。协方差本身很难做比较。例如:如果我们计算工资($)和年龄(岁)的协方差,因为这两个变量有不同的度量,所以我们会得到不能做比较的不同的协方差。为了解决这个问题,我们计算相关性来得到一个介于-1和1之间的值,就可以忽略它们各自不同的度量。
19)哪些机器学习算法不需要做归一化处理?
概率模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、RF、朴素贝叶斯。
20)机器学习中常见的最优化算法有哪些?
1. 梯度下降(Gradient Descent)
基本梯度下降(Batch Gradient Descent):
- 描述: 每次迭代使用整个训练集计算梯度,更新参数。
- 优点: 精确,但计算成本高。
- 缺点: 对大数据集计算开销大,可能不适用于大型数据集。
随机梯度下降(Stochastic Gradient Descent, SGD):
- 描述: 每次迭代仅使用一个样本计算梯度,更新参数。
- 优点: 计算效率高,适用于大数据集,更新频繁。
- 缺点: 收敛路径不稳定,可能在最优点附近振荡。
小批量梯度下降(Mini-Batch Gradient Descent):
- 描述: 每次迭代使用一个小批量样本计算梯度,结合了批量和随机梯度下降的优点。
- 优点: 计算效率高,更新频繁,收敛稳定。
- 缺点: 需要调整小批量的大小。
2. 动量法(Momentum)
- 描述: 在梯度下降的基础上,使用历史梯度的加权平均来更新参数,减少振荡,加速收敛。
- 优点: 能够在曲面中快速穿越平坦区域,减小梯度下降的振荡。
- 缺点: 需要选择动量因子(通常为0.9),可能会在某些情况下产生过冲。
3. AdaGrad
- 描述: 自适应调整学习率,依据每个参数的历史梯度调整其学习率。
- 优点: 对稀疏数据效果好,自动调整学习率。
- 缺点: 学习率可能过早降低,导致收敛缓慢。
4. RMSprop
- 描述: 通过对梯度的平方进行滑动平均来调整学习率,克服了 AdaGrad 学习率衰减过快的问题。
- 优点: 比 AdaGrad 更稳定,适用于非平稳目标。
- 缺点: 需要调整衰减因子(通常为0.9)。
5. Adam(Adaptive Moment Estimation)
- 描述: 结合了动量法和 RMSprop,通过计算梯度的一阶矩和二阶矩的移动平均来调整学习率。
- 优点: 结合了动量法和 RMSprop 的优点,收敛速度快,适用性广。
- 缺点: 需要调整多个超参数(如学习率、β1、β2)。
6. Adadelta
- 描述: 对 AdaGrad 进行改进,通过限制累积的梯度信息来避免学习率过早衰减的问题。
- 优点: 自适应调整学习率,避免了 AdaGrad 的学习率衰减问题。
- 缺点: 需要设置衰减因子(通常为0.95)。
7. Nesterov Accelerated Gradient (NAG)
- 描述: 在动量法的基础上,首先使用当前参数预估位置,然后计算梯度来更新参数。
- 优点: 提高了动量法的收敛速度,能够更快找到最优解。
- 缺点: 计算复杂度增加,需要调整动量因子和学习率。
8. L-BFGS(Limited-memory Broyden-Fletcher-Goldfarb-Shanno)
- 描述: 一种拟牛顿法,通过有限的内存来近似计算逆Hessian矩阵,适用于优化大规模无约束问题。
- 优点: 对于小到中型数据集效果很好,能够快速收敛。
- 缺点: 对于大规模数据集,内存需求较高,计算复杂度高。
9. 牛顿法(Newton's Method)
- 描述: 使用二阶导数信息(Hessian矩阵)来找到函数的最优点。
- 优点: 具有更快的收敛速度,适用于无约束优化问题。
- 缺点: 计算Hessian矩阵和其逆的开销大,不适用于大规模问题。
10. 共轭梯度法(Conjugate Gradient)
- 描述: 解决大型线性系统的优化问题,通过共轭方向的梯度下降法进行优化。
- 优点: 适用于大规模稀疏线性问题,避免了计算Hessian矩阵的开销。
- 缺点: 对问题的条件数敏感,可能在复杂问题上表现较差。
21)什么是拟牛顿法?
拟牛顿法(Quasi-Newton Method)是一类用于优化问题的迭代算法,主要用于寻找无约束优化问题的最优解。它通过近似牛顿法来避免计算和存储Hessian矩阵(即二阶导数矩阵),从而降低计算复杂度。拟牛顿法在每一步迭代中构造一个对Hessian矩阵的近似,以便在计算时只需用到一阶导数(梯度信息),而不需要完整的二阶导数信息。
22)解释对偶的概念。
对偶问题(Dual Problem) 是与原始优化问题(主问题)相关联的另一个优化问题。对偶问题通常是通过原始问题的拉格朗日对偶性构造的,它可以提供主问题最优值的下界。对于凸优化问题,强对偶性可能成立,这使得对偶问题的解能够给出主问题的最优解。
对偶性的重要性质
弱对偶性(Weak Duality):
- 对偶问题的最优值总是小于或等于原始问题的最优值。
强对偶性(Strong Duality):
- 如果强对偶性成立,原始问题和对偶问题的最优值相等。
- 强对偶性通常在凸优化问题中成立,特别是当满足一定的条件(如 Slater 条件)时。
应用实例:支持向量机(SVM)
在支持向量机(SVM)的优化过程中,原始问题是一个带有约束的凸优化问题。通过将其转化为对偶问题,可以利用以下优势:
- 引入核函数: 在对偶问题中,优化问题可以通过内积的形式表达,从而方便地引入核函数,实现非线性分类。
- 提高计算效率: 对偶问题通常转化为一个具有更少变量的优化问题,有时计算效率更高。
23)特征比数据量还大时,选择什么样的分类器?
当特征的数量比数据量还多时,通常称为“高维小样本”问题。在这种情况下,特征维度的增加可能会导致过拟合,影响分类器的性能。因此,需要选择能够处理高维数据的分类器,并采取措施来降低维度或减轻过拟合。可以采用线性分类器,因为维度高的时候,数据一般在维度空间里面会比较稀疏,很有可能线性可分。例如逻辑回归和SVM线性分类器。
深度学习:
1)对抗神经网络中判别模型和生成模型是什么?
生成对抗网络(GANs)是一个用于生成数据的机器学习模型,由两部分组成:生成器和判别器。这两个部分相互对抗,就像一个制作假币的人(生成器)和一个鉴定假币的人(判别器)之间的关系。
制作假币的人(生成器)的目标:创造出做工严谨的假币,争取可以骗过鉴定假币的人(判别器)。
鉴定假币的人(判别器)的目标:提高鉴别假币的技术,争取可以鉴别出制作假币的人所制造的假币。
具体过程是什么样呢?我们以手写数字体生成为例。
第一步:训练判别器
输入:一批真实的数字图像和生成器生成的假图像。
目标:判别器要能够正确识别真实图像(输出接近1)和生成的假图像(输出接近0)。
损失函数:判别器的损失函数衡量其分类真实和生成图像的准确性。通过优化这个损失函数,判别器的参数得到更新,使其能够更好地区分真实和生成图像。
第二步:训练生成器
输入:生成器从随机噪声中生成一批图像。
目标:生成器希望欺骗判别器,让判别器认为生成的图像是真实的(输出接近1)。
损失函数:生成器的损失函数衡量判别器对生成图像判断的结果。通过反转判别器的输出(让生成器得到较高分),优化生成器的损失函数,生成器的参数得到更新,以生成更逼真的图像。
这个过程交替进行,知道模型收敛。
2)介绍一下神经网络中常见的激活函数。
1. Sigmoid 函数
- 公式:
- 特点:
- 输出范围在0和1之间。
- 常用于二分类问题的输出层。
- 具有梯度消失问题,特别是在深层网络中。
2. Tanh 函数(双曲正切函数)
- 公式:
- 特点:
- 输出范围在-1和1之间。
- 相比于Sigmoid,Tanh的梯度较大,梯度消失问题较轻。
- 常用于隐藏层的激活函数。
3. ReLU 函数(修正线性单元)
- 公式:
- 特点:
- 输出范围在0和正无穷之间。
- 计算简单,收敛速度快。
- 可能导致"死亡神经元"问题,即某些神经元在训练过程中可能永远不激活。
4. Leaky ReLU 函数
- 公式:
- 特点:
- 在x <= 0的情况下输出一个很小的负斜率,解决了ReLU的"死亡神经元"问题。
- 保持了ReLU的计算效率和非线性特性。
5. Parametric ReLU (PReLU) 函数
- 公式:
- 特点:
- 允许模型自适应地学习负斜率,提高了模型的灵活性。
6. ELU 函数(指数线性单元)
- 公式:
- 特点:
- 负部分的输出接近于-α,减少了"死亡神经元"问题。
- 输出更平滑,提升了训练速度和效果。
7. Softmax 函数
- 公式:
- 特点:
- 将输出值转换为概率分布,适用于多分类问题的输出层。
- 输出值在0和1之间,且所有类别的概率和为1。
8. Swish 函数
- 公式:
- 特点:
- 在多个任务中表现出优于ReLU的性能。
- 结合了线性和非线性的特性。
3)介绍一下神经网络中常见的损失函数。
1. 均方误差(Mean Squared Error, MSE)
- 公式:
- 应用:主要用于回归问题,度量预测值与真实值之间的平均平方误差。
- 特点:对离群点敏感,因为误差的平方会放大大误差的影响。
2. 均绝对误差(Mean Absolute Error, MAE)
- 公式:
- 应用:用于回归问题,度量预测值与真实值之间的平均绝对误差。
- 特点:对离群点不如MSE敏感,因为它不对误差进行平方操作。
3. 对数损失(Log Loss, Logistic Loss)
- 公式:
- 应用:主要用于二分类问题,度量预测概率与真实标签之间的差距。
- 特点:适用于逻辑回归模型,通过最大化类别概率的对数似然来优化模型。
4. 交叉熵损失(Cross-Entropy Loss)
- 公式:
- 应用:用于分类问题(特别是多分类),度量真实标签的概率分布与预测概率分布之间的差距。
- 特点:在神经网络的分类任务中常用,能够有效处理类别间的差异。
5. Hinge 损失
- 公式:
- 应用:用于支持向量机(SVM)的分类任务,尤其是在二分类任务中。
- 特点:鼓励正确分类,并且对不正确分类的样本给予较大的惩罚。
6. Huber 损失
- 公式:
- 应用:用于回归问题,结合了MSE和MAE的优点。
- 特点:对离群点有一定的鲁棒性,当误差较小时,表现为平方误差,误差较大时,表现为绝对误差。
7. 均方根误差(Root Mean Squared Error, RMSE)
- 公式:
- 应用:用于回归问题,与MSE类似,但通过取平方根将误差单位转换回原始数据单位。
- 特点:提供了对模型预测准确性的直观衡量,特别适用于实际应用中。
8. Kullback-Leibler 散度(KL Divergence)
- 公式:
- 应用:用于度量两个概率分布之间的差异,常用于生成模型的训练。
- 特点:对概率分布的差异进行量化,通常用于复杂的模型训练。
4)你觉得逻辑回归和神经网络之间有联系么?说说看
实际上,可以将Logistic Regression看做是仅含有一个神经元的单层的神经网络!
从该图中可以看到,LR结构图的前半部分(不包含step function的部分)其实就是一个简单的神经元模型
而Softmax regression其实是多维的Logistic regression,它其实可以看做是单层多个神经元的神经网络!
5)tensorflow和pytorch两个深度学习训练框架有何区别?
1. 开发背景
- TensorFlow:
- 由Google Brain团队开发并在2015年发布。
- 被广泛应用于工业界和学术界,是大规模分布式训练和生产环境中的常用工具。
- PyTorch:
- 由Facebook's AI Research (FAIR) 团队开发并在2016年发布。
- 受到研究人员和开发者的青睐,因其灵活性和易用性而成为深度学习研究的首选工具之一。
2. 编程风格与动态计算图
TensorFlow:
- 早期版本使用静态计算图(Static Computational Graph),即在运行模型之前需要定义整个计算图。这种方式适合在生产环境中进行优化和部署,但调试较为困难。
- TensorFlow 2.x版本引入了Eager Execution模式,使得TensorFlow也支持动态计算图,更接近于PyTorch的风格。
PyTorch:
- 使用动态计算图(Dynamic Computational Graph),即每次操作都会即时构建计算图。这种方式更接近Python的编程风格,便于调试和灵活地进行实验。
- 这种动态特性使得PyTorch在研究和开发阶段更具吸引力。
3. 易用性与灵活性
TensorFlow:
- TensorFlow 2.x版本简化了很多API,使得用户体验得到了很大改善。
- 拥有Keras高级API,适合快速构建和训练模型。
- 具有丰富的工具生态,如TensorBoard(用于可视化)、TensorFlow Serving(用于模型部署)等,适合工业级应用。
PyTorch:
- 以其简单易用而著称,代码更具Python风格。
- 允许用户通过较少的代码实现复杂的模型,特别是研究阶段的原型开发。
- PyTorch社区活跃,更新频繁,很多前沿研究工作都是基于PyTorch完成的。
4. 生态系统与支持
TensorFlow:
- 拥有庞大的生态系统,包括用于移动和嵌入式设备的TensorFlow Lite,分布式训练的TensorFlow Distributed,云端服务的TensorFlow Serving等。
- 被广泛应用于生产环境,提供了多种工具来支持模型部署和优化。
PyTorch:
- PyTorch的生态系统相对较小,但在研究和实验领域十分强大。
- 支持分布式训练的框架(如TorchElastic),并且通过PyTorch Hub和TorchServe支持模型的发布和部署。
5. 性能与分布式训练
TensorFlow:
- 在性能优化和分布式训练方面表现强劲,特别是用于大规模生产应用时。
- 支持各种硬件加速(如GPU、TPU),并有成熟的分布式训练工具。
PyTorch:
- 在较新的版本中,PyTorch也逐渐改进了分布式训练和性能优化,虽然它起步稍晚,但已经与TensorFlow缩小了差距。
- 提供了简单的API进行多GPU训练。
6. 模型部署
TensorFlow:
- TensorFlow在模型部署方面表现强大,提供了TensorFlow Serving、TensorFlow Lite、TensorFlow.js等多种工具,支持在服务器、移动设备、浏览器等多种环境中部署模型。
PyTorch:
- PyTorch的TorchServe用于模型的部署,虽然没有TensorFlow的工具链那么全面,但正在逐渐完善。
7)请简要介绍下Tensorflow的计算图。
计算图的基本概念
节点(Node): 计算图中的每个节点通常代表一个操作(Operation),例如加法、乘法、矩阵乘法等。在深度学习中,节点还可以表示激活函数、卷积、池化等神经网络层操作。
边(Edge): 图中的边表示数据(或张量)的流动方向。数据在节点之间流动,作为输入传递到操作中,并输出结果到下一个节点。
输入节点: 这些节点表示计算图的输入数据,例如模型的输入特征或训练数据。
输出节点: 这些节点表示计算图的最终输出,例如模型的预测结果。
计算图的功能
组织计算: 计算图帮助将复杂的数学计算组织成一个结构化的流程。每个节点代表一个操作,边表示数据流动,整个图描述了计算从输入到输出的过程。
自动微分: 在深度学习中,计算图被用来计算导数或梯度,这对训练神经网络非常重要。通过计算图,框架可以自动地通过反向传播计算梯度,从而更新模型的参数。
优化: 计算图可以在执行之前进行优化。框架可以对图进行分析,减少冗余计算,合并操作,或在硬件上进行更高效的执行。
可视化: 计算图可以被可视化工具(如TensorFlow的TensorBoard)展示出来,帮助开发者理解模型结构、调试模型、以及优化计算过程。
8)介绍一下什么是批梯度下降,什么是小批梯度下降,什么是随机梯度下降
- 批梯度下降:使用整个数据集计算梯度,计算准确但可能很慢,适用于小规模数据集。
- 小批梯度下降:使用小批次数据计算梯度,结合了批梯度下降的稳定性和随机梯度下降的速度,适用于大规模数据集。
- 随机梯度下降:使用单个样本计算梯度,计算速度快,但收敛可能不稳定,适用于大规模数据集。
9)梯度下降和反向传播的联系是什么?
反向传播是通过链式法则计算得到梯度,然后梯度下降是利用反向传播计算得到的梯度套用梯度下降计算公式对参数(权重)进行更新。
深入了解可以参看:反向传播理论更新梯度分析(超级详细附图)_梯度反向传播-CSDN博客
10)CNN最成功的应用是在CV,那为什么NLP和Speech的很多问题也可以用CNN解出来?为什么AlphaGo里也用了CNN?这几个不相关的问题的相似性在哪里?CNN通过什么手段抓住了这个共性?
以上几个不相关问题的相关性在于,都存在局部与整体的关系,由低层次的特征经过组合,组成高层次的特征,并且得到不同特征之间的空间相关性。如下图:低层次的直线/曲线等特征,组合成为不同的形状,最后得到汽车的表示。
CNN通过局部连接、权重共享、池化操作和多层次结构的特性,能够有效地从不同类型的数据中提取有用的特征。这使得它不仅在计算机视觉领域表现优秀,还在自然语言处理、语音识别和复杂游戏(如AlphaGo)中展现了强大的能力。通过这些特性,CNN能够抓住数据中的共性,从而在各种应用中取得成功。
11)什麽样的资料集不适合用深度学习?
数据集太小时的情况
- 现象: 深度学习模型通常需要大量的数据来训练,以便能够学习到复杂的特征和模式。当数据集非常小的时候,深度学习模型容易过拟合,即在训练数据上表现很好,但在新数据上可能表现不佳。
- 比较: 传统的机器学习算法,如支持向量机(SVM)、随机森林或逻辑回归,通常在数据较少的情况下表现更稳定,因为这些算法对数据量的需求相对较小,并且有较强的正则化能力。
缺乏局部相关性的数据集
- 现象: 深度学习特别擅长处理具有局部相关性的任务。例如,卷积神经网络(CNN)在图像处理中表现优异,因为图像的局部区域(如边缘和纹理)对整体图像的识别非常重要。类似地,递归神经网络(RNN)在自然语言处理(NLP)中表现良好,因为单词的顺序和上下文信息对理解句子至关重要。
- 比较: 在没有局部相关性的数据集上,深度学习的优势可能不明显。例如,在预测一个人的健康状况时,特征(如年龄、职业、收入等)之间的关系可能没有明显的局部相关性。此时,使用传统的机器学习方法,如回归分析或决策树,可能更为合适。
12)解释一下梯度消失和梯度爆炸。
1. 梯度消失
定义: 梯度消失指的是在反向传播过程中,梯度值逐渐变得非常小,甚至接近于零。这会导致网络的权重更新变得非常缓慢,从而影响模型的训练效果。
原因:
- 激活函数: 使用不合适的激活函数,如 sigmoid 或 tanh,其梯度在饱和区域(即输出值接近0或1)时非常小。
- 深层网络: 在深层网络中,梯度在反向传播时会逐层传递,每层的梯度都可能被缩小,导致梯度逐渐变小。
影响:
- 训练缓慢: 网络的学习速度变慢,可能需要非常长的时间才能达到好的性能。
- 难以训练深层网络: 深度网络中的前层可能不会有效地更新,导致模型无法有效学习复杂的特征。
解决方法:
- 使用合适的激活函数: 如 ReLU(Rectified Linear Unit)及其变种(如 Leaky ReLU、ELU),这些函数在正区域的梯度为常数,不容易消失。
- 权重初始化: 采用合理的权重初始化策略(如 He 初始化、Xavier 初始化),以保持梯度在合理范围内。
- 使用归一化技术: 如 Batch Normalization,可以在训练过程中帮助稳定梯度。
2. 梯度爆炸
定义: 梯度爆炸指的是在反向传播过程中,梯度值变得非常大,导致权重更新幅度过大,模型参数可能变得不稳定。
原因:
- 激活函数: 某些激活函数可能会导致梯度的急剧变化,特别是在深层网络中。
- 权重初始化: 不适当的权重初始化可能导致梯度过大。
- 深层网络: 在深层网络中,梯度在传播过程中可能会因乘积过大而爆炸。
影响:
- 训练不稳定: 网络参数更新过大,可能导致训练过程不稳定,甚至训练失败。
- 模型收敛问题: 网络难以收敛,训练误差可能波动较大。
解决方法:
- 梯度裁剪: 对梯度值进行限制,如果梯度超过一定阈值,则进行裁剪,使其不超过预设值。
- 使用归一化技术: 如 Batch Normalization,可以稳定梯度的大小。
- 合理的权重初始化: 采用适当的权重初始化方法来防止梯度爆炸。
13)深度学习中,常见的权重初始化方式有哪些?
1. 零初始化(Zero Initialization)
- 定义: 将所有权重初始化为零。
- 缺点: 如果所有权重都初始化为零,神经网络的每个神经元在开始时都是对称的,导致网络每个神经元在训练过程中更新相同的方式,无法学习到有用的特征。这会使得网络无法学习到复杂的模式。
2. 随机初始化(Random Initialization)
- 定义: 使用小的随机值初始化权重,通常从均匀分布或正态分布中采样。
- 优点: 破坏了对称性,使每个神经元的权重不同,有助于网络学习更复杂的模式。
- 缺点: 初始化范围的选择对训练过程有影响,不当的选择可能导致梯度消失或梯度爆炸。
3. 均匀分布初始化(Uniform Initialization)
- 定义: 权重从均匀分布中采样。例如,
W ~ U(-a, a)
,其中a
是一个预设的范围。- 优点: 确保初始权重在一个合理的范围内,避免过大的初始值引发梯度爆炸。
4. 正态分布初始化(Normal Initialization)
- 定义: 权重从正态分布(高斯分布)中采样。例如,
W ~ N(0, σ²)
,其中σ²
是方差。- 优点: 根据实际需求设置均值和方差,可以更好地控制初始化权重的范围。
5. Xavier 初始化(Xavier Initialization)
- 定义: 权重初始化为均匀分布或正态分布,标准差为
sqrt(2 / (n_in + n_out))
,其中n_in
是输入神经元的数量,n_out
是输出神经元的数量。也称为 Glorot 初始化。- 优点: 旨在保持每层输出的方差不变,有助于防止梯度消失或爆炸。
6. He 初始化(He Initialization)
- 定义: 权重初始化为正态分布或均匀分布,标准差为
sqrt(2 / n_in)
,其中n_in
是输入神经元的数量。也适用于 ReLU 激活函数。- 优点: 比 Xavier 初始化更适合 ReLU 激活函数,能更好地避免梯度消失问题。
7. LeCun 初始化(LeCun Initialization)
- 定义: 权重初始化为正态分布,标准差为
sqrt(1 / n_in)
,适用于 Leaky ReLU 和 SELU 激活函数。- 优点: 适用于特定的激活函数(如 SELU),可以保持网络训练稳定。
8. Orthogonal 初始化(Orthogonal Initialization)
- 定义: 权重矩阵初始化为正交矩阵,即矩阵的行或列彼此正交。
- 优点: 在深层网络中,正交初始化有助于保持信号的传播稳定,减少梯度消失或爆炸的风险。
9. Sparse Initialization(稀疏初始化)
- 定义: 只初始化网络的一部分权重,其余权重保持为零。
- 优点: 减少计算复杂度,适用于需要稀疏网络的场景。
总结
- 零初始化: 不推荐使用,因为会导致对称性问题。
- 随机初始化: 常用的基础方法,具体的分布选择会影响训练效果。
- Xavier 和 He 初始化: 适用于不同类型的激活函数,能够改善训练过程中的梯度问题。
- Orthogonal 和 LeCun 初始化: 适用于特定的激活函数或网络架构,能有效提高训练稳定性。
14)简单说说RNN的原理。
RNN 的核心特性是其循环结构。在传统的前馈神经网络中,信息从输入层流向输出层,中间没有反馈连接。而在 RNN 中,每个时间步的输出不仅依赖于当前的输入,还依赖于前一个时间步的隐藏状态。这种循环连接使得 RNN 能够捕捉序列数据中的上下文信息。
然而,RNN 的训练可能会受到梯度消失或爆炸的问题影响,为了克服这些问题,LSTM 和 GRU 等改进型 RNN 变体被广泛应用。
参考文献:
为什么说 交叉验证能 防止过拟合 呢?_交叉验证为什么可以避免过拟合-CSDN博客
手撕SVM公式——硬间隔、软间隔、核技巧_svm硬间隔和软间隔方程-CSDN博客
机器学习常用评估指标AUC简析——看懂AUC一文就够了_auc得分-CSDN博客
逻辑回归和神经网络之间有什么关系?_逻辑回归和神经网络的关系-CSDN博客
机器学习:数据预处理之独热编码(One-Hot)详解-CSDN博客
反向传播理论更新梯度分析(超级详细附图)_梯度反向传播-CSDN博客
深度学习岗位面试问题整理笔记 - 知乎 (zhihu.com)
为什么一些机器学习模型需要对数据进行归一化? - zhanlijun - 博客园 (cnblogs.com)