少女祈祷中...

实习前的面试

一面

流水线一般为几段?为什么要设计那么多段?为什么MEM和WB不是一个段的?流水线出现数据相关如何解决?如何尽可能的保持并行性地去解决数据相关?出现控制相关怎么办?可以重定向吗?如何从软件和硬件去优化控制相关?(解释一下动态分支预测和延迟槽)如何对数组操作的for循环做优化?解释一下向量加速器?

64位电脑的虚存空间?虚存溢出了该怎么办?如何对页表访存做优化?TLB表和cache的区别?cache如何做优化以提高命中率?

数据库:逻辑计划和物理计划是什么?有什么联系。

C++:程序有什么空间?操作系统是怎么管理程序的空间的,比如说段错误是怎么一回事?

1
2
3
4
5
struct{
int64 i;
char j;
int k;
}a;

sizeof?解释一下这个sizeof

为什么不能在头文件里写static int a = 1;

算法题:1、memmove
2、有序链表求和

二面

项目遇到的技术难点-谈谈解决方案
GDB调试-对多进程多线程程序的调试支持
进程队列实现

算法
两个线程交叉输出一个数组(条件变量)
一个数组,元素值范围为数组长度范围,统计每个数出现次数,时间复杂度O(n),空间复杂度O(1),可以利用原数组空间
原数组递增,左移n位,查最小的元素,时间复杂度O(logn)

实习的工作梗概

  • 链路构建:搭建离线链路dump数据
  • 样本构造:从线上构造训练用的样本
  • 架构优化:优化线上服务的工程表现

推荐系统的流程

该部分会进行脱敏处理,里面只会讲述通用的推荐流程,而非字节跳动内部的解决方案。从大体上来讲,推荐架构可以分为召回、粗排、精排、混排这四个部分。

推荐系统究竟是在做什么?

其实本质上推荐系统就是给用户输出一个队列,这个队列我们称之为推荐的结果。推荐系统希望能优化这个队列,然后在算法层面上表现得更好。这个表现得更好是有很多方面的,比如说DAU等。

特征处理

在做推荐系统的时候必须得有一个特征系统来对推荐做基础的数据支持。一般来说特征可以分成两个部分,一个是g(group)侧的一个是u(user)侧的。g侧的特征一般是直播间、视频、短文本的一些相关特征、例如:点赞数等等。u侧的特征就是用户方面的特征,比如说用户的年龄、性别和学历等等。

召回

召回的本质是希望能够在浩如烟海的groups中找到一系列可能适合这个用户的group。一般来说的召回是基于倒排索引的。倒排索引可以理解为一般的索引的“反函数”。比如说一般的索引是(id:1->直播间),而倒排索引可能组织了若干个可能的反函数,比如说(年龄18->id:1,id:3)等等,以此可以很方便的根据u侧特征,获得可以被推荐的group。

这个倒排索引对于召回来说非常关键,在运行的过程中倒排索引也会动态改变,比如说这个视频可能现在适合18岁的看,但是之后就可能不适合,或者有一个新的视频,需要插入到倒排索引中(冷启)

粗排精排

粗排精排收到了召回传来的直播间,对这个直播间会进行一个排序。排序的依据是根据一个root分来进行计算。这个root分的定义是非常抽象和复杂的。一般来说$root = \sum a_iK_i$,其中$a_i$是权重,$K_i$指的是小分。

比如说$root = 5K_{isliked} - 20 K_{isdislike}$,那么这个root分就依赖于用户喜欢的概率和用户不喜欢的概率。这个小分的计算一般是通过一个机器学习模型来进行计算:$K_{islike} = f(f_g,f_u)$,并且机器学习模型的输入是u侧和g侧的特征。

粗排和精排的区别就来源于root分的定义。一般来说粗排的root分比较简单,精排的root分比较复杂。

混排

混排接受截断之后的精排数据。根据来源不同的精排队列进行混合,这个混合就是做一次搜索,这个搜索可以是简单的BFS、DFS(或者是BS搜索),但是我们一般使用启发式的搜索,这个启发式的搜索有一个启发函数,这个启发函数可以我们自己定义。最后这个搜索结果出来了。

上述语言只是用一个简单的语言去介绍一个搜索系统是如何构成的,帮大家简单地理解一个推荐系统的构造。其中比较核心的策略构造(例如root分等)、AML(模型工程)和特征工程都需要细细的研究。