面试知识点总结(机器学习)

214 阅读15分钟

线性回归与逻辑回归的差异

线性回归公式: y=Xβ+εy = X \beta + \varepsilon

差异:

  1. 线性回归用来做预测(只能用于回归任务),逻辑回归用来做分类(用Sigmoid作为联系函数,把概率映射到0-1之间)。
  2. 线性回归是拟合函数,逻辑回归是预测函数。
  3. 线性回归用最小二乘法(最小化预测和实际之间的欧氏距离)作为参数估计方法,逻辑回归用极大似然估计(最大化预测属于实际的概率来最小化预测和实际之间的“距离”)作为参数估计方法。

注意:逻辑回归仍然是线性函数

判断模型是否是线性的

区分是否是线性模型,主要看乘法因子中,自变量x前面的系数w,如果x被一个w影响,那就是线性的(决策边界是线性的),如果x被多个w影响就是非线性的(决策边界是非线性的)。比如:下面两个曲线,第一个是线性的,第二个是非线性的。

y=11+exp(w0+w1x1+w2x2)y=11+w3exp(w0+w1x1+w2x2)y = \frac{1}{1+\exp{(w_0 + w_1*x_1+w_2*x_2)}} \\ y = \frac{1}{1+w_3*\exp{(w_0 + w_1*x_1+w_2*x_2)}}

参考: www.noobyard.com/article/p-c…

Rouge

衡量生成摘要和参考摘要的“相似度”,即有多少相同的N-gram序列。 Rougerecall=匹配的Ngram数量摘要中Ngram数量Rouge_{recall}=\frac{匹配的N-gram数量}{摘要中N-gram数量}
rouge问题:区分度不高,没有考虑语义层面考虑,当N>3,rouge值非常小。

训练数据是带有噪声的,如何确保在预测时的结果的可靠性?

超大规模(类别数大于10000)的文本分类

few-shot做匹配模型
层次分类

Transformer相比MLP在特征编码上有什么优势?

  1. MLP在小规模可以获得较好的性能,但它在模型尺寸增大时会出现更严重的过拟合现象。过拟合现象是MLP结构取得SOTA表现的主要障碍
  2. 对大模型和大数据的可扩展性,Transformer模型容量最大,可以用来构建超大型模型。并且可以并行化的计算。
  3. Transformer可以用来做序列建模语言模型等,可以通过self-attention机制很好的学习远程依赖性
  4. 更通用和更强的建模能力。文字,图像,
  5. 更好的结合视觉和语言,多模态融合模型大多是给予Transformer。

Transformer相比LSTM有哪些改进和优势?

  1. 对大模型和大数据的可扩展性,堆叠更多的层可以取得更好的效果。
  2. 根本上解决长记忆丢失问题。最早的RNN模型用于信息传输通道只有一条,并且包含多次非线性激活操作,而长记忆丢失的原因就是梯度的消失,而梯度消失的根本原因就是多层激活函数的嵌套,导致梯度反传时越乘越小。LSTM通过引入记忆通道c,来传递长记忆。因为在通道C上计算相对简单,没有太多非线性激活操作,但是有paper证明,LSTM在序列长度300+的场景,仍然会出现长记忆丢失问题(梯度消失)。而Transformer模型,通过引入自注意力机制:直接在完整序列上学习重点位置
  3. 计算并行性。Transformer不在是顺序输入,一次输入完整的序列,所以可以采用并行操作。对于词文本位置信息,采用函数式绝对位置,采用三角函数为每个词计算一个唯一的位置向量表示。

Exposure bias

解释: Seq2seq模型在训练阶段和预测阶段的mismatch,训练阶段使用Teacher Forcing策略,即decoder在某个时刻的输入是上一个时刻的ground truth。然而,在预测阶段decoder在某一时刻只能使用其在上一个时刻的输出作为输入,从而可能导致“一步错,步步错”的错误累积问题。
解决方法: scheduled sampling,即在训练阶段,从第二个时刻开始,decoder的输入有一定概率pp使用ground truth,有1p1-p的概率使用上一时刻的输出(Oracle word)。而一般这个概率pp要随着训练过程递减至0,训练的后面阶段就完全使用模型输出作为输入,就是与预测阶段保持一致了。


如何解决梯度消失问题

为什么梯度消失和梯度爆炸?
目前神经网路的优化方法都是基于BP(反向传播),即根据损失函数计算误差再通过梯度的反向传播,来指导深度网路权重的优化更新。其中,将误差从末层往前传递的过程需要链式法则,而链式法则是连乘的形式,随着层数越深,梯度将以指数形式传播。当梯度值小于1,层数变深,可能出现梯度接近0,也就是梯度消失,相同的原理,当梯度值大于1,层数变神,可能出现梯度值特别大,也就是梯度爆炸

解决方法:

  1. 梯度剪切:解决梯度爆炸问题。梯度超过某个阈值强制剪切。
  2. 权重正则化
  3. 选择Relu等梯度大部分落在常数上的激活函数:比如sigmoid 导数始终小于0.25,就很可能出现梯度消失。
  4. Batch normalization 或 Layer normalization:通过规范化,把输出信号规范化到均值为0方差为1以保证网络的稳定性。
  5. 残差网络:
  6. LSTM的”门“结构
  7. 初始权重设定:比如采用Xavier初始化,使每一层输出的方差尽量相等

特征选择怎么做?

  1. 计算每一个特征与相应变量的相关性:比如皮尔逊相关系数(度量两个变量的相关程度),互信息(评价两个随机变量之间的依赖程度),卡方检验(统计样本的实际观测值与理论推断值之间的偏离程度)等。
  2. 特征重要性排序:如Permutation Importance,在模型训练完成后,保持模型参数不变,对于验证列特征随机打乱,分析对模型结果的影响。
  3. 决策树模型:决策树原理:是以增加不同条件后,熵减少的量(信息增益)来确定哪一个条件对数据分类区分度更大(包含信息更多)来决定每一步选择哪一个特征进行分支。主要思想:训练一系列不同的决策树模型,在每一课数中使用特征集的一个随机子集,最终统计每个特征出现的次数、深度、分离的样本量以及模型的准确率等给出特征的权重值。
  4. 最重要的:根据具体业务和经验分析选择。

Bias(偏差)、Variance(方差)和Error(误差)之间的联系和区别

  1. Error = Bias + Vairance + Noise, 反应了整个模型的准度。
  2. Bias:就是根据当前样本集合拟合的模型的预测结果的期望与样本真实结果的差距,也就是模型在样本上拟合的好不好,反应模型精确度
  3. Variance:描述的是在样本集合上训练的模型在验证集上的表现,反应模型的稳定性

这两者关系就是我们常说的过拟合和欠拟合的关系,想要低Bias,就得增加模型复杂度,就容易过拟合,这样往往有高Variance。想要低Variance,就要简化模型,但这样就容易欠拟合,但往往有高Bias,所以这两者是一个很难同时达成的指标,“按了葫芦起了瓢”,这往往就是一个tradeoff的问题。 [参考1][1]


warm-up解释?以及为什么要做warm-up?

warm-up:就是在训练初期,使用很小的学习率进行预热。
原因:在训练初期,网络参数还比较random,loss比较大,如果学习率太大,梯度偏离真正较优的方向可能性比较大。所以,一开始步子小一点,等模型收敛到合适的位置,再加大学习率开始快速学习。但是在整个模型训练周期中,学习率在训练后期也不是一成不变的,需要根据训练step进行递减,那是因为,在模型训练后期,需要更精细化的更新了。


GBDT原理?XGBoost、LightGBM的区别和联系?

首先,这三者都是Boosting方法,GBDT是机器学习算法,而XGBoost和LightGBM是GBDT的算法实现框架。
GBDT:
XGBoost和LightGBM区别:1.XGBoost采用预排序的决策树算法,每遍历一个特征就要计算一个特征的信息增益,时间复杂度为高。LightGBM是用基于直方图的决策树算法,计算复杂度低。2.XGBoost采用按层(level-wise)的决策树生长策略,LightGBM采用带有深度限制的的按叶子节点(leaf-size)的算法。在分裂次数相同的情况下,leaf-wise可以降低更多的误差,得到更好的精度。leaf-wise的缺点在于会产生较深的决策树,产生过拟合。


dropout在预测时是关闭的,怎么防止训练和预测时候的不一致性?

dropout的作用效果:

截屏2022-03-23 下午5.26.10.png

rescale:
dropout是在训练的时候按一个比例pp随机丢弃一些神经元,这样会导致输出结果变小。而预测阶段dropout是关闭的,因此计算时全部的结点都使用。
所以为了保证结果的一致性:在训练时,直接将dropout后留下的权重扩大1/p1/p倍,预测阶段不变,这样就可以使得两阶段结果的scale保持一致了。

总结来说: dropout做rescale主要保证了神经元的期望均值与无dropout时一致

参考:
blog.csdn.net/qq_31159375…
www.zhihu.com/question/61…


layer norm

深度学习中正则化作用:”通过把一部分不重要的复杂信息损失掉,以此降低拟合难度和过拟合的风险,从而加速模型收敛“。Normalization就是让分布稳定下来,即降低各数据维度的方差。
不同正则化方法的区别只是操作维度的不同,即选择损失信息的维度不同。
选择什么样的归一化方法,取决于你关注哪部分信息。如果某个维度的信息差异性很重要,需要被拟合,那就不要在那个维度进行归一化。

所以,在NLP任务中,batch中不同样本的信息关联度不大,而且由于不同的句子长度不同,强行在batch维度做归一化,会损失不同样本之间的信息差异性。所以,不用BN而用LN,只在句子内部维度上的做归一化。可以认为,在NLP任务中,一个样本内部维度之间时关联的,所以,在信息归一化时,对样本内部差异进行一些损失,反而能降低方差。

transformer中的根号dk

公式:

Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V) = softmax(\frac{Q*K^T}{\sqrt{d_k}})*V

论文中解释:Q和K的点乘结果很很大,这会将softmax函数的梯度push到很小的区域,这不利于训练。而scale会缓解这种情况。

以数组为例子,两个长度为len、均值为0、方差为1的时数据相乘会产生一个长度为len、均值为0、方差为len的数组。而方差大会导致给softmax的输入推向正无穷和负无穷(更多),这是梯度会无限趋近于0,不利于训练。因此,将结果数据除以len\sqrt{len},可以让结果数组方差为1(参考中有证明),这样有利于训练的收敛。

参考:
zhuanlan.zhihu.com/p/149634836


多标签分类(multilabel)

多标签分类定义:某个sample可能同时属于多个类别,处理这类场景的分类任务。比如,一部电影可能同时属于动作片、犯罪片。

通常处理思路:

  1. 多个二分类问题:当类别之间没有较强的联系时(交叉的可能性很小):把multilabel转化为多个二分类问题,对一个sample用所有类的分类器判断。loss函数就是常规的二分类交叉熵。
  2. 序列标注思路:当类别之间有一定关联时:把multilabel转化为多分类问题,如果有n个类,转化之后可能有2n2^n个类。比如,如果n=3,label用one-hot表示,某个多标签的label是[0,1,1]。loss函数就是常规的多分类交叉熵。
  3. 用seq2seq解码的思路:对每个label看作解码的每个step,计算softmax,每步计算得到所有lable的概率分布。

生成模型和判别模型?

机器学习任务就是根据特征X预测类别Y,即求后验概率P(YX)P(Y|X), 或者决策函数Y=f(X)Y=f(X)
两种的区别是找到决策边界的过程不同。
判别模型:就是直接学习拟合这个后验概率P(YX)P(Y|X)。 典型的判别模型有:决策树,逻辑回归,SVM,神经网络,CRF等。
生成模型:由数据学习联合概率分布P(Y,X)P(Y,X),用贝叶斯公式推导,来求 后验概率P(YX)P(Y|X) 来预测。典型的生成模型有:朴素贝叶斯,隐马尔可夫等。

参考: flyhigher.top/develop/198…

TextCNN实现

class TextCNN(nn.Module):
    def __init__(self, config):
        self.filter_size = 100
        self.kernel_size = [3,4,5]
        self.hidden_size = 128
        self.embedding_size
        self.max_seq_len = 50
        
        # 初始化
        self.embedding = nn.Embedding(config.vocab_size, self.embedding_size)
        
        # 对每种卷积核构建顺序链接模型(Sequential:卷积+Relu+池化)
        self.convs = nn.ModuleList([nn.Sequential(
                    nn.Conv2d(1, self.filter_size, (kernel, self.embedding_size)),
                    nn.Relu(),
                    nn.MaxPool2d((self.max_seq_len - kernel + 1, 1))   # 用kernel卷积之后数量
                    )
                    ] for kernel in self.kernel_size)
        
        self.dropout = nn.Dropout(0.2)
        self.linear = nn.Linear(self.hidden_size * len(self.kernal_size), config.class_num)
        
   def forward(x):
           input = self.embedding(x)  # [bs,max_seq_len,embedding_size]
           input = input.sequeeze(1)  # [bs,1,max_seq_len,embedding_size]
           
           conv_out = [conv(input) for conv in self.convs]  # 3 * [bs, filter_size, 1, 1]
           conv_out = torch.concat(conv_out, dim=1)       # [bs, 3*filter_size,1,1]
           
           conv_out = conv_out.view(x.size(0), -1)  # [bs, 3*filter_size]
           out = self.dropout(conv_out)
           logit = self.linear(out)
           
           return logit
           

关键:

  1. Conv2d是对输入embedding矩阵上下滑动,计算卷积(加权和), 得到shape=[max_seq_len-kernel+1,1]的feature map。 有filter_size个卷积和,就得到 filter_size * [max_seq_len-kernel+1,1] 个feature map。
  2. 再使用MaxPool2d对featue map做池化,每个feature map得到一个max_value,MaxPool2d的kenel_size为feature map的size,得到shape=[1,1]的结果。对每个feature map计算,最终得到一个Sequential组合的结果:[bs, filter_size,1,1]。
  3. forward中对每组卷积核计算 卷积+Relu+池化 的组合。

image.png

工业界关于文本分类

  • 新类发现
    margin softmax,本质上就是找出与已知类分布差异较大的样本,可以用异常检测思路来做。

zhuanlan.zhihu.com/p/201239352

Pearson相关系数和Spearman相关系数

  • Pearson相关系数
    度量两个变量X和Y之间的线性关系。值介于-1到1之间,-1是完全负相关,0不相关,1是完全相关。
    特点:
    1. Pearson只能用来评估线性关系。对于曲线相关(非线性)等更为复杂情形,Pearson系数大小并不能代表相关性强弱。因此可能丢失信息
    2. 样本中的极端值对Pearson系数影响极大,对离群点敏感。所以,需要谨慎处理,要不然可能得到错误结论。
  • Spearman相关系数
    是使用两个变量的秩次(相对次序) 大小来做线性相关性统计,不是使用原始变量,属于非参数统计方法。比如 orginal value(1,3,5,8,20,30,...),会变成ranked value (1,2,3,4,5,6...)。值也是介于-1到1之间。
    特点:
    1. 可以很好的解决Pearson的缺点。适应范围更广
    2. 统计效能低,不能检测出两个变量实际的线性关系

【参考】

  1. zhuanlan.zhihu.com/p/34717666
  2. zhuanlan.zhihu.com/p/465213120

解决数据不平衡问题

  1. 数据重采样
  2. 代价敏感学习:
    a. class weight: 对数据量小的类别赋予更大权重,让训练目标更加关注小样本类别。weighted-cross-entropy: αiy{0,1}yijlogpij-\alpha_i \sum_{y\in{\{0,1\}}}{y_{ij}\log{p_{ij}}},其中αi\alpha_i表示一个类别的权重,用样本总数和i类别样本数量计算得到。
    b. facol loss:在训练阶段不断调整各样本的权重,使模型更加关注困难样本。
    c. Dice loss: 解决训练和测试指标不一致的问题,使用一种近似F1的指标Dcie coefficient。
    参考:
    zhuanlan.zhihu.com/p/165312837
    www.zhihu.com/search?type…
  3. 集成学习:
  4. 评价指标:
  5. 极度不平衡:转化为异常点检测任务,采用孤立森林等算法。

数据缺失

低资源处理方案

  1. Data Augmentation。
  2. 远程监督。
  3. Learning with noisy lables(噪音标注学习):对于自动生成包含noise的标注,采用置信学习,co-teaching等思路。
  4. 迁移学习。
  5. Meta-learning。
  6. Adapter:
    在fine-tuning的时候,将预训练模型参数冻结,只更新Adapter模块和LayerNorm层。在模型结构上,Adapter层就是两层神经网络+非线性激活函数,Adapter结果嵌入到Transformer中每个LayerNorm层之前。
    Adapter的优势: 1.针对不同下游任务,保持原预训练模型不变,仅训练训练Adapter模块和少量参数,训练代价小,同时效果也不错。2. 避免预训练模型灾难遗忘,对应不同任务的持续学习,只需要训练特定的Adapter就行了。

image.png

参考: 《A Survey on Recent Approaches for Natural Language Processing  in Low-Resource Scenarios》

激活函数

juejin.cn/post/710055…

如何评估分布相似度

  • 距离
  1. 欧式距离
  2. 曼哈顿距离
  3. 编辑距离
  • 相似度(similarity)
  1. 余弦相似度
  2. 协方差
  3. 皮尔逊相关系数(Pearson correlation)
  4. 斯皮尔曼相关系数(Spearman)
  5. 卡方检验
  • 集合距离
  1. Jaccard系数: s=XYXYs=\frac{|X \cap Y|}{X \cup Y}
  2. Dice系数: s=2XYX+Ys=\frac{2|X \cap Y|}{|X| + |Y|}
  • 信息论距离
  1. 互信息
  2. KL散度(相对熵)
  3. JS散度
  4. 交叉熵

集成学习

集成学习就是构建多个学习器,通过一定策略结合完成学习任务,提高精确度和鲁棒性。主要思想是:将这些弱学习期的偏差和方差结合起来,从而学习一个强学习期,提高性能

按照个体学习器之间的关系,集成学习分为三种:

  1. 用于减少方差的Bagging。如随机森林,
  2. 用于减少偏差的Boosting
  3. 用于提升预测结果的Stacking