2021秋招-Bigo-面试总结
Published:
Bigo 深度学习算法研究员 面经
部门概况:部门主要是负责 Bigo 产品的视觉相关技术。分为前端和后端两块,后端部分包含一些内容的风控,审核等。前端的部分包含类似抖音这种的各种玩法特效,具体技术上比如人脸检测、关键点识别、美妆特效等。团队规模北京、上海、新加坡加起来大概几十人。北京可能 20 人左右。工作节奏的话基本 10-9-5. 但是也看项目紧急程度。今年开始除了业务开始慢慢也支持可以做一些科研或者比赛。
一面 (2020 年 9 月 18 日)
面试主要是三个部分:
- 算法题
'''
第一问:二维的矩阵中保存着-1 和 1 两种值,-1表示不能走,给定一个起始位置(a,b)和一个目标位置(c,d)判断从 起始位置到目标位置的最短需要走多少步?
这个可以简单实用BFS解决。
第二问: 如果矩阵中保存的是-1 和 其他正整数,正整数表示从当前点走到邻居节点的cost,问从起始位置到目标位置的最小cost是多少。
'''
import heapq
import sys
def func(matrix,a,b,c,d):
if matrix[a][b]==-1 or matrix[c][d]==-1:
return -1
if a==c and b==d:
return 0
n=len(matrix)
m=len(matrix[0])
dist=[[sys.maxsize]*m for i in range(n)]
dist[a][b]=0
min_heap=[(0,a,b)]
directions=[(-1,0),(1,0),(0,-1),(0,1)]
while len(min_heap)>0:
cur_dist,x,y=heapq.heappop(min_heap)
if cur_dist>dist[x][y]:
continue
for dx,dy in directions:
nx=x+dx
ny=y+dy
if nx>=0 and nx<n and ny>=0 and ny<m and matrix[nx][ny]!=-1:
new_dist=cur_dist+matrix[x][y]
if new_dist<dist[nx][ny]:
dist[nx][ny]=new_dist
heapq.heappush(min_heap,(new_dist,nx,ny))
return -1 if dist[c][d]>=sys.maxsize else dist[c][d]
- 堆的构建的复杂度是多少,堆的插入的复杂度,过程是什么样子?
- C++中 STL 实现的数据结构有哪些
- C++11 中有什么新的特性
- 进程和线程的区别
- 进程之间如何通信
- python 里如何实现多线程,编程实现的过程,运行结束后怎么操作(join 等待所有子线程结束)
- python 里多进程的通信怎么实现
- 归并排序和快速排序分别有啥优缺点,归并排序通常有哪些应用场景?
- 矩阵的秩是什么概念,怎么直观理解他
- SVD 分解是啥,他有那些作用?
- 传统机器学习了解多少,怎么利用多个模型提升最终的性能(Bagging , Boosting)
- 如何评价一个样本不平衡的分类模型的性能
- AUC
- 为什么 AUC score 是合适的一个评价指标?
- 有哪些解决样本不平衡问题的策略?
- 讲了一下论文。
- 讲了一下阿里实习的工作。
二面 (2020 年 9 月 24 日)
数学题: 一个很大的文件可能好几十个 G,如何随机的取出其中的一行。
- 蓄水池抽样问题。 对于第一行直接选择放在内存中,后面的第 n 行以 1/n 的概率选择保留下来替换内存中的那一行,所有的行处理完之后留在内存中的就是随机采样的结果。
数学题: 一个红绿灯只有红色和绿色两种状态,相互切换,一天中有 N 辆车路过该路口,记录下来他们的等红灯时间,推算红灯 和 绿灯分别的时间长度。
- 我给出的答案是,首先选择 N 个记录中非零的值假设有 a 个,0 的值设有 b 个, 假设红灯的时间长度是 x 秒,那么如果 N 足够大的情况下等红灯的时间长度应该是在 0-x 之间的均匀分布。因此 a 辆车等红灯的时间长度的和 应该是(0+x)*n/2 那么这个值应该是等于所有 a 个值的和, 所以有$\frac{(0+x)n}{2} = \sum_{i=1}^a a_i$ 。通过这个公式可以求出 x,那么绿灯时间长度应该是$\frac{x}{a} * b$。
- 但是面试官表示这样求出的 x 应该是小于$max(a_i)$的,但是实际上的红灯时间应该是大于等于$max(a_i)$的,好像也有道理。但是当 N 趋于无穷的时候这两个值应该是趋于相同。
算法题
'''
往一个完全二叉树中插入一个结点,保持其仍然是一个完全二叉树
'''
def insert_tree(root,val):
if root is None:
return TreeNode(val)
if is_full_tree(root):
p=root
while p.left is not None:
p=p.left
p.left=TreeNode(val)
else:
if is_full_tree(root.left):
insert_tree(root.right,val)
else:
insert_tree(root.left,val)
return root
def is_full_tree(root):
if root is None:
return False
l=get_depth(root,1)
r=get_depth(root,-1)
if l==r:
return True
else:
return False
def get_depth(root,flag):
if root is None:
return 0
if flag==1:
return 1+get_depth(root.left,flag)
elif flag==-1:
return 1+ get_depth(root.right,flag)
- 上面的算法时间复杂度是多少
(log(N))^2
- 证明 $ (log(N))^2 < N $
三面(2020 年 9 月 30 日)
- 自我介绍
- 介绍实习做的相关项目
- 为什么研究领域跨度这么大
- C 语言中的 union 了解吗,有什么用?
- C 语言能够实现面向对象吗
- 好像真的可以Link
- C++中的 static 修饰的变量有什么用,放在哪个内存区
- 类内的共享变量,多个不同的实例共享的数据,不会重复保存。可以通过类名来访问。保存在全局数据区。Link
- 如何将 softmax 得到的分数转换成概率。Temperature scaling 了解过吗。
- 对 GAN 有啥了解,判别器比较强导致容易训练失败,有啥策略可以处理?
- 两步迭代 G,一步迭代 D. WGAN 这种策略提升稳定性 More TIps
- 分割中对于那种前景比较小的情况有啥处理策略
- weighted loss,高分辨率的 feature map。Focal Loss 这种。
- 对底层的图像处理有多少了解,自己实现过相关算法嘛。
- pytorch 和 TensorFlow 的区别
- 静态图的特点有哪些?自己是否深入了解过静态图的计算优化
- python 的 GIL(全局解释器锁)有了解吗?
- 如何解决 python 的伪多线程问题。
- 使用 multi-processing 多进程,或者使用其他语言实现然后用 python 调用。