讯飞算法工程师面试题

  1. SVM核函数能否映射到无穷维

    可以的,多项式核函数将低维数据映射到高维(维度是有限的),而高斯核函数可以映射到无穷维。由在这里插入图片描述

  1. 描述下xgb原理,损失函数

    首先需要说一说GBDT,它是一种基于boosting增强策略的加法模型,训练的时候采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前t-1棵树的预测结果与训练样本真实值的残差。XGBoost对GBDT进行了一系列优化,比如损失函数进行了二阶泰勒展开、目标函数加入正则项、支持并行和默认缺失值处理等,在可扩展性和训练速度上有了巨大的提升,但其核心思想没有大的变化。或在这里插入图片描述

  1. 描述下卷积神经网络

    卷积神经网络,通常包含5层,输入层,卷积层,激活层,池化层,全连接F℃层,其中核心部分是卷积层和池化层。优点:共享卷积核,对高维数据处理无压力;无需手动选取特征。缺点:需要调参;需要大量样本。

  1. Tensorflow和Pytorch的区别

    pytorch中是动态图机制,也就是在运行的时候构建,而tensorflow1.x是静态图,需要先构建,再运行。灵活性pytorch:动态计算图,数据参数在CPU与GPU之间迁移十分灵活,调试简便;tensorflow1.X:静态计算图,数据参数在CPU与GPU之间迁移麻烦,调试麻烦。设备管理pytorch:需要明确启用的设备tensorflow:不需要手动调整,简单

  1. 为什么Tensorflow方便部署

    从一开始,TensorFlow就是一个面向部署的首选框架,因为有一系列可以提高端到端深度学习效率的工具,如TensorFlow Serving和TensorFlow Lite。

  1. 静态图和动态图

    目前神经网络框架分为静态图框架和动态图框架,PyTorch和TensorFlow、Caffe等框架最大的区别就是他们拥有不同的计算图表现形式。TensorFlow使用静态图,这意味着先定义计算图,然后不断使用它,而在PyTorch中,每次都会重新构建一个新的计算图。动态图比较方便dbug,同时非常直观,而静态图是通过先定义后运行的方式,之后再次运行的时候就不再需要重新构建计算图,所以速度会比动态图更快。

  1. 简单描述下知识蒸馏、量化、剪枝

    知识蒸馏一般将复杂、学习能力强的网络学到的特征表示“知识”蒸馏出来,传递给参数量小、学习能力弱的网络。量化就是用较低位宽表示典型的32位浮点网络参数。剪枝的主要思想就是将权重矩阵中相对“不重要”的权值剔除。

AI算法岗面试

  1. 描述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层。

  1. CNN家族算法和Transformer家族的算法区别在哪里?

    Transformer模型的核心是self-attention机制,而CNN模型的核心是卷积和池化;(2)Transformer模型可以学习到数据中每个词之间的相关性,而CNN关注于二维局部数据之间的相互关联,随着层的加深,关注区域会更广。

  1. 给定一个递增数组,找出总和为k的最长子数组
class Solution: 
	def maxSubArrayLen(self,nums:List[int],k:int)->int:
		n=len(nums)
		preSum={}#第一次出现和为key的子数组的index(O~index)
		count=0
		ans=0
		preSum[0]=0
		for i in range(n):
			count=count+nums[i]
			if count not in preSum:
				preSum[count]=i+1
			if count-k in preSum:
				ans=max(ans,i-preSum[count-k]+1)
		return ans
  1. Precision和Recall在评价模型指标有什么区别?

在这里插入图片描述
    Precision和Recall通常是一对矛盾的性能度量指标。一般来说,Precision高时,Recall值往往偏低;而Precision值低时,Recall值往往偏高。比如商品推荐系统场景,希望推荐内容的确是用户感兴趣的,侧重Precision;而贷款违约用户识别场景,希望尽可能不放过坏用户,更侧重Recall。

  1. 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的时候。

  1. 并行训练的时候有哪些方法加快训练速度?

    数据并行:将一大块数据切成小份,分发给几个完全相同模型,分别训练,之后聚合梯度。模型并行:模型太大,一张卡放不下,要放到多张卡上去。

风控算法工程师

  1. 了解的社区发现算法有哪些?

    GN算法 Louvain算法 LPA标签传播 SLPA算法 K-L算法

  1. Louvain算法的算法流程
  • 通过局部的更改节点社区分类来优化Modularity:先将每个节点指定到唯一的一个社区,然后按顺序将节点在这些社区间进行移动。以节点i为例,它有三个邻居节点j1,j2,j3,我们分别尝试将节点i移动到j1,j2,j3所在的社区,并计算相应的modularity变化值,哪个变化值最大就将节点i移动到相应的社区中去,如果最大的变化值也为负,则不移动。
  • 按照这个方法反复迭代,直到网络中任何节点的移动都不能再改善总的modularity值为止。
  • 1,2两个步骤看做第一阶段。把第一阶段得到的社区视为一个新的节点。重新构造子图,两个节点之间边的权值为相应两个社区之间各边的权值的总和。
  • 重复1,2,3步骤的操作,直到Modularity不再增加为止。
  1. LPA算法的算法流程
  • 为所有节点指定一个唯一的标签
  • 逐轮刷新所有节点的标签,直到达到收敛要求为止。
  • 对于每一轮刷新,节点标签刷新的规侧如下:
  • 对于某一个节点,考察其所有邻居节点的标签,并进行统计,将出现个数最多的那个标签赋给当前节点。
  • 当个数最多的标签不唯一时,随机选一个。
  1. 线程和进程的区别是什么

    进程是操作系统进行资源分配和调度的基本单位,多个进程之间相互独立:线程是CPU进行资源分配和调度的基本单位,线程是进程的一部分。进程适合计算密集型任务,进程数取决于CPU核数:线程适用于1O操作密集型的任务。

  1. LC124一一二叉树中的最大路径和
class Solution:
	def_init_(self):
		self.maxSum float("-inf")
	def maxPathSum(self,root:TreeNode)->int:
		def maxGain(node):
			if not node:
				return 0
			leftGain max(maxGain(node.left),0)
			rightGain max(maxGain(node.right),0)
			priceNewPath node.val leftGain rightGain
			self.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,cur
		while first<∈n:
			steps +=min(last,n)-first 1
			first *=10
			last last 10 +9
		return steps
	def findKthNumber(self,n:int,k:int)->int:
		cur 1
		k-=1
		while k:
			steps self.getSteps(cur,n)
			if steps <k:
				k-=steps
				cur +1
			else:
				cur *10
				k-=1
		return cur
Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐