讯飞算法工程师面试题
- SVM核函数能否映射到无穷维
可以的,多项式核函数将低维数据映射到高维(维度是有限的),而高斯核函数可以映射到无穷维。由
- 描述下xgb原理,损失函数
首先需要说一说GBDT,它是一种基于boosting增强策略的加法模型,训练的时候采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前t-1棵树的预测结果与训练样本真实值的残差。XGBoost对GBDT进行了一系列优化,比如损失函数进行了二阶泰勒展开、目标函数加入正则项、支持并行和默认缺失值处理等,在可扩展性和训练速度上有了巨大的提升,但其核心思想没有大的变化。或
- 描述下卷积神经网络
卷积神经网络,通常包含5层,输入层,卷积层,激活层,池化层,全连接F℃层,其中核心部分是卷积层和池化层。优点:共享卷积核,对高维数据处理无压力;无需手动选取特征。缺点:需要调参;需要大量样本。
- Tensorflow和Pytorch的区别
pytorch中是动态图机制,也就是在运行的时候构建,而tensorflow1.x是静态图,需要先构建,再运行。灵活性pytorch:动态计算图,数据参数在CPU与GPU之间迁移十分灵活,调试简便;tensorflow1.X:静态计算图,数据参数在CPU与GPU之间迁移麻烦,调试麻烦。设备管理pytorch:需要明确启用的设备tensorflow:不需要手动调整,简单
- 为什么Tensorflow方便部署
从一开始,TensorFlow就是一个面向部署的首选框架,因为有一系列可以提高端到端深度学习效率的工具,如TensorFlow Serving和TensorFlow Lite。
- 静态图和动态图
目前神经网络框架分为静态图框架和动态图框架,PyTorch和TensorFlow、Caffe等框架最大的区别就是他们拥有不同的计算图表现形式。TensorFlow使用静态图,这意味着先定义计算图,然后不断使用它,而在PyTorch中,每次都会重新构建一个新的计算图。动态图比较方便dbug,同时非常直观,而静态图是通过先定义后运行的方式,之后再次运行的时候就不再需要重新构建计算图,所以速度会比动态图更快。
- 简单描述下知识蒸馏、量化、剪枝
知识蒸馏一般将复杂、学习能力强的网络学到的特征表示“知识”蒸馏出来,传递给参数量小、学习能力弱的网络。量化就是用较低位宽表示典型的32位浮点网络参数。剪枝的主要思想就是将权重矩阵中相对“不重要”的权值剔除。
AI算法岗面试
- 描述transformer的原理,encoder和decoder是怎样的?
Transformer网络是一个Encoder-Decoder(编码,解码)的结构,整体是由输入部分,Encoder部分和Decoder部分组成。Encoder端和Decoder端均有6个Block,Encoder端的Block包括两个模块,多头self-attention模块以及一个前馈神经网络模块;Decoder端的Block包括三个模块,Masked多头self-attention模块,多头Encoder-Decoder attention交互模块,以及一个前馈神经网络模块;需要注意:Encoder端和Decoder端中的每个模块都有残差层和Layer Normalization层。
- CNN家族算法和Transformer家族的算法区别在哪里?
Transformer模型的核心是self-attention机制,而CNN模型的核心是卷积和池化;(2)Transformer模型可以学习到数据中每个词之间的相关性,而CNN关注于二维局部数据之间的相互关联,随着层的加深,关注区域会更广。
- 给定一个递增数组,找出总和为k的最长子数组
class Solution: def maxSubArrayLen(self,nums:List[int],k:int)->int:n=len(nums)preSum={}#第一次出现和为key的子数组的index(O~index)count=0ans=0preSum[0]=0for i in range(n):count=count+nums[i]if count not in preSum:preSum[count]=i+1if count-k in preSum:ans=max(ans,i-preSum[count-k]+1)return ans
- Precision和Recall在评价模型指标有什么区别?
Precision和Recall通常是一对矛盾的性能度量指标。一般来说,Precision高时,Recall值往往偏低;而Precision值低时,Recall值往往偏高。比如商品推荐系统场景,希望推荐内容的确是用户感兴趣的,侧重Precision;而贷款违约用户识别场景,希望尽可能不放过坏用户,更侧重Recall。
- PR AUC和ROC AUC有什么区别?
ROC AUC:指ROC曲线下的面积。通过在[0,1]范围内选取阈值(threshold)来计算对应的TPR和FPR,最终将所有点连起来构成ROC曲线。PR AUC:指PR曲线下的面积。通过在[0,1]范围内选取阈值(threshold)来计算对应的Precision和Recall,最终将所有点连起来构成ROC曲线。ROC-AUC衡量的是模型排序的能力;当样本不平衡的时候,更适用ROC-AUC,因为其对于正负样本的比例不敏感;当我们关心Positive Samples和Negative Samples时,可以使用ROC-AUC。PR AUC适用于更关心Positive Samples,以及权衡precision和recall的时候。
- 并行训练的时候有哪些方法加快训练速度?
数据并行:将一大块数据切成小份,分发给几个完全相同模型,分别训练,之后聚合梯度。模型并行:模型太大,一张卡放不下,要放到多张卡上去。
风控算法工程师
- 了解的社区发现算法有哪些?
GN算法 Louvain算法 LPA标签传播 SLPA算法 K-L算法
- Louvain算法的算法流程
- 通过局部的更改节点社区分类来优化Modularity:先将每个节点指定到唯一的一个社区,然后按顺序将节点在这些社区间进行移动。以节点i为例,它有三个邻居节点j1,j2,j3,我们分别尝试将节点i移动到j1,j2,j3所在的社区,并计算相应的modularity变化值,哪个变化值最大就将节点i移动到相应的社区中去,如果最大的变化值也为负,则不移动。
- 按照这个方法反复迭代,直到网络中任何节点的移动都不能再改善总的modularity值为止。
- 1,2两个步骤看做第一阶段。把第一阶段得到的社区视为一个新的节点。重新构造子图,两个节点之间边的权值为相应两个社区之间各边的权值的总和。
- 重复1,2,3步骤的操作,直到Modularity不再增加为止。
- LPA算法的算法流程
- 为所有节点指定一个唯一的标签
- 逐轮刷新所有节点的标签,直到达到收敛要求为止。
- 对于每一轮刷新,节点标签刷新的规侧如下:
- 对于某一个节点,考察其所有邻居节点的标签,并进行统计,将出现个数最多的那个标签赋给当前节点。
- 当个数最多的标签不唯一时,随机选一个。
- 线程和进程的区别是什么
进程是操作系统进行资源分配和调度的基本单位,多个进程之间相互独立:线程是CPU进行资源分配和调度的基本单位,线程是进程的一部分。进程适合计算密集型任务,进程数取决于CPU核数:线程适用于1O操作密集型的任务。
- LC124一一二叉树中的最大路径和
class Solution:def_init_(self):self.maxSum float("-inf")def maxPathSum(self,root:TreeNode)->int:def maxGain(node):if not node:return 0leftGain max(maxGain(node.left),0)rightGain max(maxGain(node.right),0)priceNewPath node.val leftGain rightGainself.maxSum max(self.maxSum,priceNewPath)return node.val max(leftGain,rightGain)maxGain(root)return self.maxSum
6、LC440一—字典序的第K小数字,字典树思想
class Solution:def getSteps(self,cur:int,n:int)->int:steps,first,last =0,cur,curwhile first<∈n:steps +=min(last,n)-first 1first *=10last last 10 +9return stepsdef findKthNumber(self,n:int,k:int)->int:cur 1k-=1while k:steps self.getSteps(cur,n)if steps <k:k-=stepscur +1else:cur *10k-=1return cur