常见算法技术问题(秋招面试几十家互联网总结)

一、过拟合和欠拟合

过拟合:在训练数据集上能够很好的拟合, 但是在测试数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:在训练数据集上不能很好的拟合,并且在测试数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)

欠拟合解决办法
增加数据的特征数量
过拟合解决办法
一是采用正则化方法。正则化方法有L1正则和L2正则,但是在机器学习中一般用L2正则。
二是采用dropout方法。这个方法在神经网络中很常用。

二、L1和L2正则化的区别是什么

L1 正则化是模型各个参数的绝对值之和,可以使得其中一些W的值直接为0,删除这个特征的影响
L2 正则化是模型各个参数的平方和,可以使得其中一些W值都很小,都接近于0,削弱某个特征的影响
为什么参数越小代表模型越简单?
    越是复杂的模型,越是尝试对所有样本进行拟合,包括异常点。这就会造成在较小的区间中产生较大的波动,这个较大的波动也会反映在这个区间的导数比较大。只有越大的参数才可能产生较大的导数。因此参数越小,模型就越简单。

三、怎么做特征工程

1、特征提取:将任意数据(文本图像)转换为机器学习的数字特征
字典特征提取、文本特征提取等,利用sklearn就可以实现。实例化类,利用fit_transform方法即可
2、特征预处理:
特征数据归一化:通过对原始数据进行变换把数据映射到(默认为[0,1])之间,缺点是最大值与最小值非常容易受异常点影响,鲁棒性较差。
特征数据标准化:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
目的:特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征。
降维:
主成分分析:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
3、特征选择:
过滤式:低方差过滤特征;相关系数(相关程度大的可以删除也可以合并新的特征)
嵌入式:决策树里的信息增益

四、如何处理数据不均衡的

1、样本的上采样和下采样
上采样:将稀有类别的样本进行复制,通过增加此稀有类样本的数量来平衡数据集。
下采样:从丰富类别的样本中随机选取和稀有类别相同数目的样本,通过减少丰富类的样本量来平衡数据集。
  上采样,下采样,都存在相应的问题。上采样:可能会存在过拟合问题。下采样:可能会存在信息减少的问题。
  有以下两种方法可以解决下采样所带来的问题。
  方法一:模型融合
思路:从丰富类样本中随机的选取(有放回的选取)和稀有类等量样本的数据。和稀有类样本组合成新的训练集。这样我们就产生了多个训练集,并且是互相独立的,然后训练得到多个分类器。若是分类问题,就把多个分类器投票的结果(少数服从多数)作为分类结果。若是回归问题,就将均值作为最后结果。
  方法二:增量模型
  思路:先通过一次下采样产生训练集,训练一个分类器,对于那些分类正确的大众样本不放回,然后对这个更小的大众样本下采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。
2、数据合成:SMOTE算法和ADASYN算法,都是对少数类别的样本进行分析,并根据少数类样本合成新样本
3、加权:对不同类别分错的代价不同,缺点是权值不太容易设定
4、一分类:对其中一个类别进行建模,使用异常检测的思路
5、在数据平衡的分类问题中,分类器好坏的评估指标常用准确率,但是对于数据不平衡的分类问题,准确率不再是恰当的评估指标。针对不平衡数据分类问题不平衡问题的评价指标。
准确度这个评价指标在样本不均衡的分类任务中并不能work。几个比传统的准确度更有效的评价指标:
混淆矩阵:使用一个表格对分类器所预测的类别与真实类别的样本统计,分别为:TP、FN、FP与TN。
  精确度:TP/(TP+FP)
  召回率:TP/(TP+FN)
  F1得分:精确度与找召回率的加权平均。2PR/(P+R)
  ROC曲线:ROC曲线的横轴就是FPR,纵轴就是TPR,当二者相等时,表示的意义则是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的,此时AUC为0.5
AUC:AUC的最小值为0.5,最大值为1,取值越高越好。AUC=1,完美分类器,绝大多数预测的场合,不存在完美分类器,0.5<AUC<1,优于随机猜测。

五、为什么梯度的负方向是局部下降最快的方向?可以用泰勒展开解释一下吗?

https://zhuanlan.zhihu.com/p/36503663

六、softmax是什么,用过softplus吗

在机器学习尤其是深度学习中,softmax是个非常常用而且比较重要的函数,尤其在多分类的场景中使用广泛。他把一些输入映射为0-1之间的实数,并且归一化保证和为1,因此多分类的概率之和也刚好为1。
softplus函数:y(x)=log(1+e^x),平滑的relu函数

七、梯度消失和梯度爆炸

在反向传播过程中需要对激活函数进行求导,如果导数大于1,那么随着网络层数的增加梯度更新将会朝着指数爆炸的方式增加这就是梯度爆炸。同样如果导数小于1,那么随着网络层数的增加梯度更新信息会朝着指数衰减的方式减少这就是梯度消失。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。

  1. 梯度消失:梯度太小,无法进行参数的更新,梯度小到数据类型无法表示出现Nan
  2. 梯度爆炸:梯度太大,大到数据类型无法表示,出现Nan
    解决方法:
    a. 使用更加容易计算梯度的激活函数:替换sigmoid为relu,elu函数
    b. 使用梯度裁剪(更多用于梯度爆炸)
    c.使用batch normalization
    加速模型的训练,把参数进行规范化的处理,让参数计算的梯度不会过小
八、tensorflew与pytorch区别

PyTorch真的比Tensorflow好用多了, 因为Tensorflow属于静态图, 建模和调试都很麻烦.
尤其是序列模型要定义很多variable scope和name scope之类的, 也就是张量的作用域, 这些东西命名搞不好一不小心就会有bug, 而且有些bug不会报错, 当你发现计算结果不对, 要再返回头debug, 而且Tensorflow的静态图不支持调试, 要用sess.run把想要的结果计算出来才可以.
但是PyTorch是动态图, 就和写numpy一样, 非常方便调试, 而且用class面向对象方式建模, 先声明操作再执行操作, 这样基本不容易在数据流图上出现bug.
PyTorch 具体教程官方文档中的快速入门(英文)写的就很好, https://pytorch.org/tutorials/:

九、常见的优化算法有哪些

梯度下降算法(GD)
全部数据样本去迭代,求得全局最优
随机梯度下降法(SGD)
GD算法训练速度过慢,从样本中随机抽出一组,梯度更新后,在随机抽取一组。提高了训练速度。
小批量梯度下降(MBGD)
SGD中随机抽取的数据样本可能是噪声或者异常数据,并不是每次都向最优方向优化,因此在开始时收敛很快,后期收敛很慢。
动量法(Momentum)
采用梯度移动指数加权平均对梯度进行平滑处理,让梯度摆动幅度更小。
AdaGrad
自适应学习率:学习率除以一个梯度累加和,越到后面,学习率越小。
RMSProp
对动量法改进,梯度采用平方加权平均数,让步长越来越小,类似于自适应步长,把梯度下的数放学习率下就类似于自适应学习率。
Adam
将Momentum法和RMSProp结合

十、什么是激活函数?激活函数的作用?常用的激活函数有哪些?有什么区别

激活函数:在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数
作用:增加模型的非线性能力,如果没有激励函数,在这种情况下你每一层节点的输入都是上层输出的线性函数,无论你神经网络有多少层,输出都是输入的线性组合,相当于没有隐藏层,网络的学习能力有限。
sigmiod函数:输出0到1,缺点一是容易导致梯度消失梯度爆炸,二是含有幂运算,计算比较复杂
tanh函数:输出-1到1,缺点同sigmiod函数
relu函数:优点是解决了梯度消失问题,计算速度快,缺点一是原点不可导,二是dead relu问题,比如初始化权重都为负值 relu(x)=max(0,x)
leaky relu函数:f(x)=max(αx,x),解决了dead relu问题
elu函数:优点解决了dead relu问题,缺点一是计算量稍大,二是原点不可导 f(x)={x,ifx>0α(ex−1),otherwise​

十二、batchNormalization与layerNormalization的区别

Batch Normalization 的处理对象是对一批样本, Layer Normalization 的处理对象是单个样本。
Batch Normalization 是对这批样本的同一维度特征做归一化, Layer Normalization 是对这单个样本的所有维度特征做归一化。

十三、k-means中,k是怎么确定的,初始点怎么确定的
最简单的确定初始类簇中心点的方法是随机选择K个点作为初始的类簇中心点。
K值的确定:
《大数据》中提到:给定一个合适的类簇指标,比如平均半径或直径,只要我们假设的类簇的数目等于或者高于真实的类簇的数目时,该指标上升会很缓慢,而一旦试图得到少于真实数目的类簇时,该指标会急剧上升。
类簇的直径是指类簇内任意两点之间的最大距离。
类簇的半径是指类簇内所有点到类簇中心距离的最大值。
确定K个初始类簇中心点:

  1. 选择批次距离尽可能远的K个点
    首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。
  2. 选用层次聚类或者Canopy算法进行初始聚类,然后利用这些类簇的中心点作为KMeans算法初始类簇中心点。
    常用的层次聚类算法有BIRCH和ROCK,在此不作介绍,下面简单介绍一下Canopy算法:
    首先定义两个距离T1和T2,T1>T2.从初始的点的集合S中随机移除一个点P,然后对于还在S中的每个点I,计算该点I与点P的距离,如果距离小于T1,则将点I加入到点P所代表的Canopy中,如果距离小于T2,则将点I从集合S中移除,并将点I加入到点P所代表的Canopy中。迭代完一次之后,重新从集合S中随机选择一个点作为新的点P,然后重复执行以上步骤。
    Canopy算法执行完毕后会得到很多Canopy,可以认为每个Canopy都是一个Cluster,与KMeans等硬划分算法不同,Canopy的聚类结果中每个点有可能属于多个Canopy。我们可以选择距离每个Canopy的中心点最近的那个数据点,或者直接选择每个Canopy的中心点作为KMeans的初始K个类簇中心点。
posted @ 2020-11-26 15:51  时光如你般美好  阅读(300)  评论(0编辑  收藏  举报