背景:提前批投了风控算法工程师,之后被另一个部门捞起来面高性能ai平台开发
下面分享一下两次面试,共四次面试的面经,希望给大家带来帮助
项目
梯度消失、过拟合的处理方法
经典问题,略。
介绍下 BN 和 LN ,是否知道其他的 Normalization 方法
BN:Batch Norm,每次对batch中的数据按维度进行 Normalization,在训练时使用的是 batch 内数据的分布特征,校验和测试时则是全局的数据分布特征;
LN:Layer Norm,每次对单个序列进行 Normalization,训练、校验、测试时操作相同。
其他还有 Instance Norm、Group Norm 等,分别在数据的不同方向上进行 Normalization。
介绍下 SGD 和 Adam ,是否知道其他的优化器
SGD:每次随机使用 Batch 中的一个数据进行梯度下降,现一般使用动量进行优化。
Adam:针对每个参数使用了一阶和二阶动量来自动调整其更新幅度。
GNN
GCN 和 CNN 的区别
GCN 处理的是不规则的拓扑结构数据,CNN 处理的是规则的向量数据。
分别介绍下 GAT、GraphSAGE、HAN
GAT:同质图(Homogeneous Graph)中的 Attention 图神经网络;
GraphSAGE:同质图神经网络,通过采样提高了模型的推理归纳能力,通过采样到的邻居推理当前节点的特征,除了对固定结构的图进行学习外,也能较好地学习新加入节点的特征;
HAN:异质图(Heterogeneous Graph)中的 Attention 图神经网络。
细节可参考 GNN:算法岗GNN高频知识点整理 。
GAT 中的 Attention 是怎么做的
按照每一条边所连接的 u,v 两个节点的特征计算。
HAN 中使用了几个 level 的 attention,分别是啥
Node-level
:在同一种边中,聚合每个节点所有通过该类型边所连接的邻居节点,得到对当前节点每一种异构边的特征,其Attention过程与 GAT 类似。
Semantic-level
:对 Node-Level 聚合的异构边特征进行聚合,其Attention过程是 Additive Attention(对待聚合的元素通过线性变换得到 Attention Score,Softmax 直接后加权求和)。
TCP 三次握手
第一次:客户端->服务器,证明客户端发送功能正常;
第二次:客户端<-服务器,证明服务器收发功能均正常;
第三次:客户端->服务器,证明客户端接收功能正常。
TensorFlow 或者 Pytorch 打包部署后使用多线程还是多进程
使用多进程。
由于GIL锁的存在,无法使用多线程。
可以考虑设置一个超时时间,等待多个数据打包成一个 Batch 进行推理。
python 全局线程锁、锁
GIL 会使得多线程在执行时只有IO操作时多线程并发的,计算时还是单线程依次执行。
此外,theading
模块还提供了五种类型的线程锁:
lock
(一次只能放行一个) rlock
(一次只能放行一个) condition
(一次可以放行任意个) event
(一次全部放行) semaphore
(一次可以放行特定个) 分类问题常用的 Loss
交叉熵。
C++
map 底层的数据结构
红黑树。
vector 和 list 的区别
vector 底层是数组,list 底层是链表。
释放内存
在调用 new、malloc 等动态申请内存的操作后,使用对应的 delete、free 等操作对申请的内存进行释放。
Attention
Softmax 的作用
将值域限制在 之间,用于平滑梯度。
Transformer Encoder 具体包含哪些模块
Multi-Head Attention、MLP、残差连接、Layer Norm、Positional Encoding。
QKV具体怎么计算
通过 Q、K 点积计算得到 Attention Score,经过 Softmax 后和 V 相乘得到输出。
传统机器学习的 LR、SVM 是否熟悉
LR:线性回归,通过学习一个超平面对数据进行划分;
SVM:支持向量机,是在LR 思想的基础上进一步设计的模型,旨在尽可能提高超平面距离不同类数据的间隔。
CV 或者 NLP 的一些经典模型是否熟悉
CV:ResNet 等
NLP:Transformer、BERT 等
算法题:LeetCode 377. 组合总和 Ⅳ
被另一个部门捞起来。
项目
算法题:LeetCode 82. 删除排序链表中的重复元素 II
L1、L2正则化
Sigmoid 导致梯度消失如何处理
替换 Sigmoid 为其他的激活函数,如 ReLU、LeakyReLU 等;
若不考虑替换激活函数,则可以尝试调整模型结构避免使用深层模型,或使用残差连接缩短反向传播链。
进程的地址空间是如何确定的
PCB(Process Control Block,进程控制快)有专门的数据结构用于维护进程的地址空间,进程的内存可划分为堆、栈等部分,通过页表的映射查询其实际的物理地址。
程序数据的寻址
通过分页的映射查询。
C++ 中,申请一部分内存后,在操作系统层面是如何处理的
在申请内存后将对应的存储地址空间标记为“已分配”,但不会立刻对这些内存空间进行初始化并修改页表,在后续读写时触发缺页异常后,在执行页表层面实际地址空间的分配和初始化操作。
SQL 和 NoSQL 的区别,有哪些常用 NoSQL
NoSQL 数据库不要对数据的模式有强制要求,如 MongoDB 中每一条数据都可以是包含任意字段的 Json ,有着比 SQL 数据库更好的灵活性。
常用的有:Json 文档存储的 MongoDB、键值对存储的 Redis、图结构的 Neo4J 等。
编程:找到无向图中所有的环并输出
HTTP 2.0 和 1.0 的区别
HTTP 2.0 加载资源时对 Session 进行了复用,避免每加载一次资源都创建一个 Session,从而提高了加载资源的效率。
并发
Python 中 multiprocessing 和 multithreading 哪一个是真正的并行
multiprocessing。multithreading 由于线程锁(GIL)的存在,无法实现真正意义上的并行。
GIL 锁是在什么时候上锁和释放的
IO 时释放,计算时上锁。
PyTorch 中的数据并行(Data Parallel、Distributed Data Parallel)
将 Batch 中的数据等分输入到不同的模型 Node 中进行前向传播,方向传播时对多个 Node 回传的梯度进行平均。
架构设计:APP 下拉刷新、上划加载历史数据的 Feed 流设计
上划加载时,API 如何设计
API中预留参数用于控制加载的起始起点(当前已加载的最后一条)、本次加载的数据量。
下拉刷新时,在数据传输过程中的新数据是否返回
发送查询请求时附带操作的时间,返回所有在该时间戳之后的新数据。
使用关系型数据库每次查询用户的关注时需要对整张表做遍历,这种查询如何优化
使用图数据库记录用户的关注关系。
是否了解图数据库
图数据库,Graph Database,简称 GDB。
常见的图数据有:Neo4j、JanusGraph、HugeGraph 等。