我的面试经(只记得没回答出来的)
讲一下Adam,手撕三个算法题(凑零钱;输出给定数字下一个比它大的数字;赌徒获胜概率计算【有两个技巧相当的赌徒A,B,他们赌博胜率为0.5,现在设定这样的获胜规则:A只要赢了2局或以上就获胜,B只要赢了3局或以上就获胜】)
其他人面经
有哪些优化函数,比较不同
优化方法分为直接法和迭代法,其中迭代法包括一阶法(梯度下降法)和二阶法(牛顿法),基于梯度法的缺陷,出现很多改进算法,比如针对考虑全部训练数据计算梯度计算量很大,可以考虑使用随机梯度下降(方差大,迭代算法稳定性差),进一步还可以使用小批量梯度下降(m一般取2的幂),针对山谷和鞍点,可以考虑动量方法(考虑上一步,即惯性保持,一阶矩估计),adagrad(考虑周围环境,采用了历史梯度的平方和来衡量不同参数的梯度的稀疏性,二阶矩估计),adam(综合前两者)这三种改进方法。
对比:adagrad相比于sgd和momentum更加稳定,即不需要怎么调参。而精调的sgd和momentum系列方法无论是收敛速度还是precision都比adagrad要好一些。在精调参数下,一般Nesterov优于momentum优于sgd。而adagrad一方面不用怎么调参,另一方面其性能稳定优于其他方法。
提高泛化能力的方法(和防止过拟合的含义相同)
使用更小的batch size,正则化模型,减少模型参数,扩大数据集,提早结束训练,droupot,batch normalize,集成学习
Dropout具体的实现与原理(2次),如何保证训练测试的一致性
Dropout:前向传播时,让某个神经元的激活值以一定的概率p停止工作(让它的激活函数值以概率p变为0),使得模型不会依赖有些局部特征,增强模型的泛化能力。每一步只更新未被暂停的神经元的参数,他能解决过拟合的原因:取平均的作用,减少神经元之间复杂的共适应关系,相当于生物进化中的基因突变
保证训练测试的一致性:
GAN的应用场景;文字生成除了GAN还可以使用什么
介绍adam
Adam是一种一阶迭代的梯度下降算法。结合了动量法和adagrad算法,计算梯度时既考虑了惯性保持,也考虑了历史信息(环境因素)。当前时刻的梯度更新利用了上一时刻的平方梯度vt的指数衰减均值vt和上一时刻的梯度mt的指数衰减均值mt。η是学习步长, 剩下的三个参数取值的建议是β1=0.9,β2=0.999,ϵ=10−8, 分母中的ϵ是为了防止除零. 其实这个步长的话,一般来说是建议选η=0.001之类的, 注意βt1,βt2中的t是参与指数运算的
最火的NLP模型
贝叶斯模型
大数据是否了解
使用tensorflow实现Kmeans算法
https://blog.csdn.net/qq_21078557/article/details/85853198
Tensorflow写KNN;KNN算法是否可微
KNN算法分类模型的三要素:a:距离度量 b:K值的选择 c:分类决策的规则。
https://blog.csdn.net/qq_35170267/article/details/84205585
写矩阵乘法;两个上三角矩阵相乘如何优化
介绍一下BERT的模型架构,多少层,怎么预训练,怎么feature based/fine-tune
https://www.jianshu.com/p/160c4800b9b5
模型架构:BERT的模型架构基于了Transformer,实现了多层双向的Transformer编码器
关键技术
1. Masked LM
随机mask15%的词汇,使用其他词汇预测这些被mask的词汇,对于在原句中被抹去的词汇,80%情况下采用一个特殊符号[MASK]替换,10%情况下采用一个任意词替换,剩余10%情况下保持原词汇不变。这么做的主要原因是:在后续微调任务中语句中并不会出现[MASK]标记。预测一个词汇时,模型并不知道输入对应位置的词汇是否为正确的词汇(10%概率),这就迫使模型更多地依赖于上下文信息去预测词汇,并且赋予了模型一定的纠错能力。
2. 下一句预测:使用分割符
论文给出的模型
预训练过程:两个loss的计算(mask loss(输入BERT模型的最后一层encoder,输出遮蔽词预测任务的loss和概率矩阵),classification loss(输入BERT模型CLS的encoder,输出下一句预测任务的loss和概率矩阵)),total loss = mask loss + classification loss
优势:模型的主要创新点都在pre-traing方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。使用的是Transformer,相对于rnn而言更加高效、能捕捉更长距离的依赖。与之前的预训练模型相比,它捕捉到的是真正意义上的bidirectional context信息。
缺点:1)[MASK]标记在实际预测中不会出现,训练时用过多[MASK]影响模型表现;2)每个batch只有15%的token被预测,所以BERT收敛得比left-to-right模型要慢(它们会预测每个token)
13. 什么是self-attention,什么情况下要用,K、Q、V分别是啥
计算attention时主要分为三步,如下图:将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;一般是使用一个softmax函数对这些权重进行归一化;最后将权重和相应的键值value进行加权求和得到最后的attention vector。 目前在NLP研究中,key和value常常都是同一个,即key=value。
bagging boosting 的区别,谁是更关注方差 ,谁是更关注偏差;随机森林和boosting trees的区别
bagging和boosting的区别:
1)样本选择上:Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:Bagging:使用均匀取样,每个样例的权重相等。Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数:Bagging:所有预测函数的权重相等。Boosting:每个弱分类器都有相应的权重,对于分类误差小(准确率达)的分类器会有更大的权重。
4)并行计算:Bagging:各个预测函数可以并行生成。Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
bagging是减少variance(方差),而boosting是减少bias(偏差):高方差是由于模型过于复杂,故而bagging可以解决过拟合问题,高偏差是由于模型过于简单,故而boosting可以解决欠拟合问题。Bagging通过再取样 (Bootstrap) 然后在每个样本上训练出来的模型取平均,所以降低了模型的variance;Boosting 则是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行加权,所以随着迭代不断进行,误差会越来越小,所以模型的 bias 会不断降低。
随机森林(RF)和梯度提升决策树(GBDT)的区别:
GBDT和随机森林最本质的区别是GBDT中的每一棵树学的是之前所有树结论和的残差,残差即指真实值减去预测值。
详细来讲就是:1: 随机森林将多棵决策树的结果进行投票后得到最终的结果,对不同的树的训练结果也没有做进一步的优化提升,将其称为bagging算法。boosting算法是在迭代的每一步构建弱学习器来弥补原有模型的不足。 2: GBDT用到的是boosting算法,在迭代的每一步构建弱学习器弥补原有模型的不足。GBDT中的Gradient Boost就是通过每次迭代的时候构建一个沿梯度下降最快的方向的学习器。并且通过设置不同的损失函数可以处理各类学习任务(多分类、回归等)。
如何防止过拟合,项目中用过哪些手段
扩张训练数据集,降低模型的复杂度,正则化方法(约束参数,比如Batch Normalization,参数范数惩罚等),集成学习(比如bagging),提前终止训练,dropout
W2V 的原理 ,两种生成方式,W2V的思想到底是什么,为什么要这样做,W2V的缺点,W2V中所用的softmax比起普通softmax有何区别,为什么能减少计算量;Word2vec,fasttext,ELMo,GPT,BERT的区别
W2v的原理与基本思想,缺点
包括CBOW 和 Skip-grams,都是浅层神经网络,一个隐层,并且隐层没有激活函数,通过softmax归一化后输出向量,隐层的神经元的个数即为向量的维度,vector 向量其实就是隐藏层和输出层之间的权重矩阵 Hidden-Ouput Matrix。CBOW是给定上下文预测一个词的方法训练神经网络。Skip-gram是使用一个词预测上下文的方法训练神经网络。
采用的softmax与普通的softmax的区别,减少计算量的原因
Word2vec,fasttext,ELMo,GPT,BERT的区别
关于词向量的表示方法:基于one-hot、tf-idf、textrank等的bag-of-words;主题模型:LSA(SVD)、pLSA、LDA;基于词向量的固定表征:word2vec、fastText、glove;基于词向量的动态表征:elmo、GPT、bert
方法的特点:
(1)One-hot 表示 :维度灾难、语义鸿沟;
(2)分布式表示 (distributed representation) :矩阵分解(LSA):利用全局语料特征,但SVD求解计算复杂度大;基于NNLM/RNNLM的词向量:词向量为副产物,存在效率不高等问题;word2vec、fastText:优化效率高,但是基于局部语料; glove:基于全局预料,结合了LSA和word2vec的优点;elmo、GPT、bert:动态特征;
方法的对比:3
1) Word2vec vs fasttext
都可以无监督学习词向量, fastText训练词向量时会考虑subword;fastText还可以进行有监督学习进行文本分类,其主要特点:结构与CBOW类似,但学习目标是人工标注的分类结果;采用hierarchical softmax对输出的分类标签建立哈夫曼树,样本中标签多的类别被分配短的搜寻路径;引入N-gram,考虑词序特征;引入subword来处理长词,处理未登陆词问题;两者都无法解决一词多义等问题(静态的词向量)。
2) elmo vs GPT vs bert
都是动态的词向量,从特征提取器和单/双向语言模型上对比如下
(1)特征提取器:elmo采用LSTM进行提取,GPT和bert则采用Transformer进行提取。很多任务表明Transformer特征提取能力强于LSTM,elmo采用1层静态向量+2层LSTM,多层提取能力有限,而GPT和bert中的Transformer可采用多层,并行计算能力强。
(2)单/双向语言模型:GPT采用单向语言模型,elmo和bert采用双向语言模型。但是elmo实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比bert一体化融合特征方式弱。GPT和bert都采用Transformer,Transformer是encoder-decoder结构,GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子。
FM FFM deep FM
解决特征组合问题
怎么做特征,onehot 特征多了会有什么问题,为什么有时会导致效果下降;特征选择的方法
做特征(获取特征):
One-hot:
特征选择的方法:
1) Filter(自变量和目标变量之间的关联):方差选择法(选出方差大于阈值的特征项);相关系数(根据各个特征对目标值的相关系数以及相关系数的P值选择);卡方检验(检验定性自变量对定性因变量的相关确定性);互信息(同卡方验证)
2) Wrapper(通过目标函数来决定是否加入一个变量):递归特征消除法,使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练
3) Embedded(学习器自身自动选择特征):正则化(L1,L2);决策树(熵,信息增益);深度学习
模型的容量问题
指拟合各种函数的能力,容量低的模型可能很难拟合数据集,但容量高的模型可能会过拟合。
改变模型容量的方法:控制模型的假设空间(学习算法可以选择为解决方案的函数集);添加正则项对模型进行偏好排除。
resnet VGG介绍 主要特色
经典的CNN网络架构,还包括AlexNet,GoogleNet。VGG分为VGG16和VGG19(网络的深度不同),结构为卷积与池化的叠加,最后再加两层全连接,然后softmax输出。它全部使用33的卷积核和22的池化核,通过不断加深网络结构来提升性能
VGG特点:网络深,卷积核小(3X3卷积核,两个3x3卷积核相当于一个5x5卷积核,但前者比后者参数量少,并且可行进行更多地非线性变换,获得更多的复杂特征和特征组合),池化核小(与AlexNet的33池化核相比,VGG全部用的是22的池化层),全连接卷积。
ResNet是对VGG19基础上进行的修改,使用stride=2进行subsampling,使用global average pool layer代替FC layer,引入了highway network结构,使网络变得更深。供给两个连续卷积层的输出,并分流(bypassing)输入进入下一层。
特点:它相比之前NN的层数多了非常多,进行了Residual learning(残差学习,解决网络退化的问题)。网络较深,控制了参数数量。存在明显层级,特征图个数层层递进,保证输出特征的表达能力。使用较少池化层,大量采用下采样,提高传播效率。没有使用dropout,利用BM和全局平均池化进行正则化,加快训练速度。层数较高时减少了3x3卷积核的个数,用1x1卷积核控制3x3卷积的输入输出特征map的数量。
max pooling 梯度传导
最大池化的传导:满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0
平均池化的传导:mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,还是比较理解的
如何防止梯度消失,为什么会有梯度消失
梯度消失产生的原因:神经网络反向传播过程中需要对激活函数求导,若导数小于1,那么随着网络层数的增加梯度值会呈现指数级别衰退,称为梯度消失,根本原因在于反向传播训练
防止梯度消失:预训练加微调(先寻找局部最优,然后整合起来寻找全局最优),使用relu,leakrelu,elu系列激活函数(激活函数的导数为1),batch normalization(通过规范化操作将输出信号x规范化到均值为0,方差为1保证网络的稳定性,消除了w带来的放大缩小的影响),残差结构(使得求导的每一项都添加了一个常数项1),LSTM(通过门控控制导数不是0就是1)
LightGBM, GBDT,XGBoost思想原理(2次),残差怎么用一次和二次梯度,分裂点怎么求。XGBoost实际使用中重要的超参数,目标函数,为什么lightGBM速度更快,其并行计算如何实现;XGBoost和GBDT的区别。
LightGBM, GBDT,XGBoost思想原理:lightGBM是一个实现GBDT算法的框架,支持高效率的并行计算,速度快,消耗的内存小,准确率高,支持分布式,可以处理海量数据;GBDT是所有弱分类器的结果叠加等于预测值,然后下一个弱分类器去拟合误差函数对预测值的残差(预测值与真实值之间的误差,弱分类器可以是各种树);XGBoost(极端梯度提升),由很多CART回归树集成。
XGBoost重要的超参数,目标函数:参数包括一般参数(设置学习器的类型),基学习器参数(设置基学习器的一些个性化参数),任务参数(根据任务,目的设置的参数),命令行参数(用于训练模型和导出模型);目标函数由训练误差和正则化两项组成。
lightGBM速度快的原因:直方图算法,牺牲切分准确性换取训练速度以及节省内存空间消耗。采用了两个策略,分别为GOSS(样本采样,基于梯度的单边采样,对样本进行采样来计算梯度,梯度大的样本点对信息增益的影响大,下采样的时候保留这样的样本点)和EFB(特征抽样,互斥特征捆绑,使用基于直方图的方法将某些特征进行捆绑来降低特征的维度,从而减少寻找最佳切分点的消耗,)
lightGBM的并行实现方案:包括特征并行和数据并行
1) 特征并行:每个worker在基于局部的特征集合找到最优分裂特征;workder间传输最优分裂信息,并得到全局最优分裂信息;每个worker基于全局最优分裂信息,在本地进行数据分裂,生成决策树。
2) 数据并行:LightGBM算法使用Reduce Scatter并行算子归并来自不同worker的不同特征子集的直方图,然后在局部归并的直方图中找到最优局部分裂信息,最终同步找到最优的分裂信息。除此之外,LightGBM使用直方图减法加快训练速度。我们只需要对其中一个子节点进行数据传输,另一个子节点可以通过histogram subtraction得到。LightGBM可以将传输代价降低为O(0.5 * #feature * #bin)。
3) 并行投票:进一步减小了数据并行中额通信代价,通过两轮的投票来减小特征直方图中的通信消耗
GBDT、XGBoost区别:
1)GBDT是机器学习算法,XGBoost是该算法的工程实现。
2)在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,从而提高模型的泛化能力。
3)GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
4)传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器。
5)传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机森林相似的策略,支持对数据进行采样,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
6)传统的GBDT没有设计对缺失值进行处理,XGBoost可以自动学习出它的分裂方向。XGBoost对于确实值能预先学习一个默认的分裂方向。
7)Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
SVM处理异常值的方法
正则化的本质,L1正则化和L2正则化的区别(2次),为什么要用正则化
正则化的本质:加入惩罚项,约束优化空间
L1和L2的区别:他们都可以看做是损失函数的惩罚项,L1正则添加了Laplace先验(结构化风险项)是一个一范数;L2正则添加了Gaussian先验,是一个二范数。使用L1范数,可以使得参数稀疏化(权重稀疏),用L2范数,倾向于使参数稠密地接近于0(权重平滑)。L1减少的是一个常量,L2减少的是权重的固定比例
正则化的目的是防止过拟合
介绍mapreduce和spark
Mappreduce
Spark
Hive如何提高效率
机器学习流程的各个模块的理解,验证集和测试集的划分,区别;怎么论证现有的模型需要多少额外的标注数据
相关系数怎么计算,协方差和它的意义
分类问题的指标
解释MCMC采样
Linux常用命令
Sql查询成绩排名中的前三
解释极大似然估计,为什么概率是0.4
卷积神经网络在maxpooling处怎么反向传播误差;1*1的卷积核 有什么用;为什么选CNN不选RNN,loss的选择,MSE和MAE对学习结果的影响
算法题:背包问题(多元一次方程的解的数目);二叉树的宽度;在数组中找到和为0的三元组;排序算法的各项对比(3次),堆排序找出topk的思路;有序数组中绝对值不相等的元素的个数;二分法;找出一颗完全二叉树最后一个节点,时间复杂度要求 logN的平方(2次);判断实时访问的ip一小时之内的访问次数是不是超过了10000.;分解质因数;判断单链表是否有环;字符串转数字,以及边界条件;搜索数组中的中位数,要求复杂度小于o(n/logn);排序数组中绝对值不同的个数;1,2,…,N中,字符1出现的次数;判断a+b>c?要考虑溢出;买卖股票;由长度为length的array表示的整数,允许相邻位数交换,求n步交换内能得到的最小整数;一亿个浮点数,大小不超过2^32,均匀分布在值域内,求最快的排序方法;求几何分布的期望