工作笔试面试经验
1.关于复习。可以去网上找点你要面的岗位的面经,花半天时间去研究这些面经,研究面经主要是看基础的东西主要会问哪些方面,然后按类别分一下,针对性的先把这些复习熟悉,基础知识就那些,网络,操作系统,语言,基本的算法这些,没什么太大的难度.
2.怎么学习。大家都有自己的学习方法,怎么学才能记得住,大家都知道,我想说的是大家在学一个东西之前一定先了解这个东西是为什么出现的,他的出现是为了解决什么问题,这个一定要搞明白,这样的话学的会更快,理解的更透彻,面试的时候在回答这一相关问题时就可以从这一点切入。
3.要学会分析。这一点很重要,很容易让你在面试的时候掌握主动权。打个比方,你面试在回答一个问题的时候,能解决这个问题的方法可能有很多,同一个方法的变种也会有很多,那么你有没有想过这些方法为什么会存在,而且还使用的比较频繁,所以我们就要学会着去分析,这些方法之间的性能差异,举个简单栗子,快排一定会比冒泡快吗,肯定是不对的,为什么不对,大家可以试着去实践,写来看看。就是类似的问题,我们面试要达到什么程度,问一个问题,从头到尾差不多能讲20分钟。可以不断把相似的东西放进来给他对比着讲,把这些技术试用的场景给他分析出来,这样面试效果就非常好。
4.算法题,笔试。这种真的没办法,就是刷题,多总结,多刷一下一维dp,二维dp,dfs,bfs,回溯,剪枝,数据结构相关的,常见排序,搜索算法的应用,算法题我总结的经验就是,刷着刷着就入门了,笔试大家可以想想办法呀,给你个眼神,自己体会。
参考:https://www.nowcoder.com/discuss/217469?type=7
深度学习面试题(模型评估方法、基本方法、优化方法、深度学习基础、CNN、RNN)
模型评估方法例题
- Accuracy作为指标有哪些局限性?
https://blog.csdn.net/qq_29678299/article/details/88732290
前提问题分析:
Hulu的奢侈品用户广告主们希望把广告定向投放给奢侈品用户。Hulu通过第三方数据平台(DMP)拿到了一部分奢侈品用户的数据,并以此为训练集合测试集,训练和测试奢侈品用户的分类模型。该模型的分类准确率超过了95%,但在实际广告投放过程中,该模型还是把大部分广告投给了非奢侈品用户,还可能是什么原因造成的?
准确率的局限性
准确率是指分类正确的样本占总样本的比例:
Accuarcy=
Nc是正确分类的样本个数,Nt是总样本的个数
准确率是样本分类问题中最简单也是最直观的评价指标。但存在明显的缺陷。
比如负样本占99%时,分类器把所有样本都预测为负样本也可以获得99%的准确率。所以,当不同类别的样本比例非常不均衡时。占比大的类别往往成为影响准确率的最主要因素。
明确了这一点,这个问题就解决了。显然奢侈品用户只占hulu会员的一小部分,虽然模型的整体分类准确率高,但不代表对奢侈品用户分类准确率也很高,在线上投放过程中,我们之后对模型判定的奢侈品用户进行投放,因此,对奢侈品用户 判定的准确率不够高就放大了。为了解决这个问题,可以使用更为有效的平均准确率(每个类别下的样本准确率的算术平均)作为模型评估的指标。
- ROC曲线和PR曲线各是什么?
https://blog.csdn.net/qq_27575895/article/details/81476871
- 编程实现AUC的计算,并指出复杂度?
- AUC指标有什么特点?放缩结果对AUC是否有影响?
- 余弦距离与欧式距离有什么特点?
机器学习
https://www.jianshu.com/p/b9e9958ba50c
-
SVM!
参考资料支持向量机通俗导论(理解SVM的三层境界)
参考资料支持向量机(SVM)从入门到放弃再到掌握
支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的。
1.支持向量机主要是解决什么问题的?
SVM主要用于解决分类问题,它的目的是学会一个分类函数或分类模型(或者叫做分类器) 。
2.应用场景
支持向量机本身便是一种监督式学习的方法,它广泛地应用于统计分类以及回归分析中。
3.分类性质
通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
以二维平面为例,如下图所示,二维空间中有粉色和蓝色的点,我们想用一条线来将他们分隔开,也就是图中红色这条直线,这条直线就是一个分类器。
此时我们称这些数据是线性可分的。
在一维空间中,分类器是一个点;在二维空间中,分类器是一条直线;在三维空间中,分类器是一个平面;在多维空间中,分类器是一个超平面。
5.分类中会有许多个线性分类函数都满足要求,该如何选择?
在多维空间中,能够划分样本集的超平面有许多个,而我们要选择的,就是划分间隔最大的,也就是说这个超平面离两类样本都足够远,使得“间隔”最大。
7.何为支持向量(Support Vector)
支持向量是一些点。如下图所示,黑色的实线是划分数据集最大间隔的超平面,存在这些点(紫色虚线和粉色虚线上的红蓝点)到超平面的距离为几何间隔,则这些点就是支持向量。
8.线性不可分
我们知道,数据是线性可分的是十分理想的情况,我们通常用到的数据都是线性不可分的。
再来看一下我们的目标函数:
这样问题就转变成了一个凸优化问题,目标函数是二次的,约束条件也是线性的,因此是一个凸二次规划问题,因此这个问题可以用任何现成的QP (Quadratic Programming) 的优化包进行求解,归结为一句话即是:在一定的约束条件下,目标最优,损失最小。然而,能解决是能解决,解决起来的代价会非常大。由于它有特殊结构,Lagrange Duality 变换到对偶变量(dual variable) 的优化问题之后,可以找到一种更加有效的方法来进行求解,而且通常情况下这种方法比直接使用通用的QP 优化包进行优化要高效得多。
-
交叉熵损失函数
参考CSDN简单的交叉熵损失函数,你真的懂了吗?
1.交叉熵公式
4.对于多分类问题
上面我们讨论了,对于二分类问题,我们使用sigmoid函数作为概率计算函数,Sigmoid函数的表达式和图形如下所示:
那么对于多分类任务,该怎么办呢。
这时候要使用的是Softmax函数。Softmax函数的表达式如下所示:
5.补充
Sigmoid和Softmax并不能作为损失函数,与损失函数没有关系,只是在分类任务中常常使用Softmax输出+交叉熵损失函数的求导。
-
LR
Logistic Regression逻辑回归
原文CSDN逻辑回归(Logistic Regression, LR)简介
分类和回归是机器学习可以解决两大主要问题,从预测值的类型上看,连续变量预测的定量输出称为回归;离散变量预测的定性输出称为分类。
线性回归(Linear Regression)
1.目标
在多维空间,线性回归表示为
利用梯度下降法,逐步最小化损失函数,找准梯度下降方向,即偏导数的反方向,每次前进一小步,直到收敛:
迭代更新的方式有多种
批量梯度下降(batch gradient descent),也就是是梯度下降法最原始的形式,对全部的训练数据求得误差后再对θθ进行更新,优点是每步都趋向全局最优解;缺点是对于大量数据,由于每步要计算整体数据,训练过程慢;
随机梯度下降(stochastic gradient descent),每一步随机选择一个样本对θθ进行更新,优点是训练速度快;缺点是每次的前进方向不好确定,容易陷入局部最优;
微型批量梯度下降(mini-batch gradient descent),每步选择一小批数据进行批量梯度下降更新θθ,属于批量梯度下降和随机梯度下降的一种折中,非常适合并行处理。
除了梯度下降法,还有其他的一些用来求代价函数最小时参数θ的方法,如牛顿法、共轭梯度法(Conjugate Gradietn)、局部优化法(BFGS)和有限内存局部优化法(LBFGS)等。
-
SVM和LR之间的比较
原文:[机器学习笔记] 支持向量机SVM 和逻辑回归LR的异同
LR与SVM的异同
1.相同点
①都是线性分类器。本质上都是求一个最佳分类超平面。
②都是监督学习算法。
③都是判别模型。通过决策函数,判别输入特征之间的差别来进行分类。
常见的判别模型有:KNN、SVM、LR。
常见的生成模型有:朴素贝叶斯,隐马尔可夫模型。
2.不同点
①优化目标不同
LR的损失函数是交叉熵
-
逻辑回归和线性回归之间的比较
线性回归用来做预测,LR用来做分类。
线性回归是来拟合函数,LR是来预测函数。
线性回归用最小二乘法来计算参数,LR用最大似然估计来计算参数。
线性回归更容易受到异常值的影响,而LR对异常值有较好的稳定性。
-
生成模型和判别模型基本形式
生成式:朴素贝叶斯、HMM、Gaussians、马尔科夫随机场
判别式:LR,SVM,神经网络,CRF,Boosting
-
分类算法列一下有多少种?
单一的分类方法主要包括:LR逻辑回归,SVM支持向量机,DT决策树、NB朴素贝叶斯、NN人工神经网络、K-近邻
集成学习算法:基于Bagging和Boosting算法思想,RF随机森林, GBDT,Adaboost, XGboost。
-
XGBoost和GBDT的区别
机器学习算法总结(四)——GBDT与XGBOOST
1)将树模型的复杂度加入到正则项中,来避免过拟合,因此泛化性能会由于GBDT。
2)损失函数是用泰勒展开式展开的,同时用到了一阶导和二阶导,可以加快优化速度。
3)和GBDT只支持CART作为基分类器之外,还支持线性分类器,在使用线性分类器的时候可以使用L1,L2正则化。
4)引进了特征子采样,像RandomForest那样,这种方法既能降低过拟合,还能减少计算。
5)在寻找最佳分割点时,考虑到传统的贪心算法效率较低,实现了一种近似贪心算法,用来加速和减小内存消耗,除此之外还考虑了稀疏数据集和缺失值的处理,对于特征的值有缺失的样本,XGBoost依然能自动找到其要分裂的方向。
6)XGBoost支持并行处理,XGBoost的并行不是在模型上的并行,而是在特征上的并行,将特征列排序后以block的形式存储在内存中,在后面的迭代中重复使用这个结构。这个block也使得并行化成为了可能,其次在进行节点分裂时,计算每个特征的增益,最终选择增益最大的那个特征去做分割,那么各个特征的增益计算就可以开多线程进行。
数据不平衡怎么做?
https://www.jianshu.com/p/53bffd95d6f5
https://www.toutiao.com/a6638156367561507341/
(1)利用GAN生成
(2)利用欠采样和过采样
欠采样使用场景:
常常当数据量足够多时使用这个方法。通过在多数类样本中随机选择和少数类样本相同数量的样本。
可多次放回地抽取不同的训练集,训练不同的分类器进行组合,会减少信息的损失。
过采样使用场景:
常常当数据量不足时会使用这个方法。通过重复、bootstrap或SMOTE数据合成等方法生成新的数据。运气好的话能分对很多,否则会分错很多。可在每次生成新数据点的时候加入轻微的随机扰动。
Note:
有时,结合使用欠采样和过采样也会有很好的效果。采样的优点是简单;缺点是过采样会反复出现一些样本,可能会出现一定程度的过拟合;欠采样会丢失数据,只学到了总体模式的一部分。
为什么引入非线性激活函数?
https://blog.csdn.net/qq_28778507/article/details/84136810
https://blog.csdn.net/e01528/article/details/89313518
介绍faster rcnn的流程以及损失函数,为什么这样设计损失函数
论文地址:
Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks
Python实现:
https://github.com/rbgirshick/py-faster-rcnn
Pooling层的作用主要有两个
https://www.jianshu.com/p/9db81f1bb439
- 引入invariance,包括translation-invariance,rotation-invariance,scale-invariance。
- 完成feature map的聚合,实现数据降维,防止过拟合。
- 介绍yolo的流程
- 介绍resnet,resnet为何效果会更好,为什么要有残差块
- 介绍batch normalization
- 说一说常见的正则化手段,L1和L2正则化的不同
- 了不了解PCA,SVM ,adaboost
- 给一张散点图,怎么做方差最大的回归
- 智力题:怎么用筛子摇出七个均匀分布的数字
- 编程题:求正整数(浮点数)的平方根
- CNN为什么要做卷积,为什么要有步长,为什么不用全连接层,它的反向传播是什么
- 说一下交叉熵损失函数,什么是交叉熵
- faster rcnn中为什么会有anchor,没有anchor会怎样
- faster rcnn中ROI pooling层有什么不足,什么是ROI align,什么是双线性插值
- 二叉树的同构子树
- 怎么处理样本的不均衡,尤其是各个图像检测模型中
- 求CNN中的参数个数
- tensorflow的流程,读取数据的方式,调用的库
- 图象图形学相关知识,eg(边缘检测)
- SVM和LR的区别,SVM损失函数的约束条件
- 机器学习XGboost,LGB
- BN层学习参数只是为了还原原有分布么
- 人脸识别的各种loss:centor loss ;cosface;arcface
- nonlocal
- SEnet
- SKnet
- attention
- unet;HRnet
- 参数初始化方式,为何不能初始化为一样的,为何不能初始化为0
- 反卷积:C++实现 ;deeplab v1 v2的改进
- nms 代码实现;soft nms
- tensorflow session 流程
- inception系列
- xception系列
- resnet1;resent2;resnext
- mobilenet系列,shufflenet
- 反向传播的过程
百度/拼多多/优酷/顺丰/作业帮/巨人网络
方向:ML/CV/NLP
- mIoU 如何计算?
- 介绍一下反卷积的操作
- 有哪些聚类算法,各有什么优缺点?
- 聚类算法的参数怎么调?
- inception里如何减少计算量?
- LightGBM和XGBoost,GBDT的区别
- 梯度下降法,牛顿法和拟牛顿法的区别
- 介绍一下线性回归和逻辑回归的损失函数
- 词性标注(序列标注问题),分词一般你是怎么分的,用什么工具。
C++面试题
1. c++中list和vector的区别
vector
vector与数组类似,拥有一段连续的内存空间,并且起始地址不变。便于随机访问,时间复杂度为O(1),但因为内存空间是连续的,所以在进入插入和删除操作时,会造成内存块的拷贝,时间复杂度为O(n)。
此外,当数组内存空间不足,会采取扩容,通过重新申请一块更大的内存空间进行内存拷贝。
List
list底层是由双向链表实现的,因此内存空间不是连续的。根据链表的实现原理,List查询效率较低,时间复杂度为O(n),但插入和删除效率较高。只需要在插入的地方更改指针的指向即可,不用移动数据。