字节跳动算法面经秘籍(下)

《AI未来星球》陪伴成长的人工智能社群,价值过万的各种内部资源及活动,限时特惠中,点击查看。

求职跳槽福利:为了便于大家求职、跳槽的准备,大白将45家大厂的面经,按照知识框架,整理成700多页的《人工智能算法岗江湖武林秘籍》,限时开放下载,点击查看下载。


字节跳动算法秘籍(上):点击查看

字节跳动算法秘籍(中):点击查看

5 编程高频问题:Python&C/C++方面

5.1 python方面

5.1.1 网络框架方面

5.1.1.1 Pytorch相关

● torch.Tensor 和torch.tensor 有什么区别?

● torch.no_grad 和 required_grad=False 的区别?

● pytorch里function和module有什么区别?

● pytorch里dataset、dataloader、sampler有什么区别?

5.1.1.2 Tensorflow相关

● 问TensorFlow如何实现并行,我讲了下PS架构,又问梯度更新时是同步还是异步,同步异步的优缺点。最后问到优缺点说明面试官经验还是非常丰富的,刨根问底可以看出你是否真的深入思考过这个问题,抑或是从别人博客看来的人云亦云。

● 用TensorFlow多吗?它的优化器都是什么?分别介绍一下

● TensorFlow怎么实现梯度传递?

● Tf、keras、pytorch区别?

5.1.2 基础知识

5.1.2.1 线程相关

● 你比较熟悉Python?你了解过他的多线程么? 为什么多线程比较鸡肋

● python GIL解释一下

● python里的多线程,怎么让它占满核呢?

● 问了 python中的进程和线程?python中线程有什么缺点吗(全局锁)?

● 既然 python中的线程有全局锁是不是没有啥用(不是,虽然有全局锁但是对于一些 I/O操作较大的应用影响不大,因为他们并不需要真正的并行运算)?

● Python中多进程多线程的应用

5.1.2.2 内存相关

● STL中vector的低层实现,STL中插入的操作时间复杂度,要考虑内存复制扩充,

● 如何实现一个栈,支持动态扩充

● python里面的深拷贝和浅拷贝

● python 的回收机制

5.1.2.3 区别比较

● python是解释语言还是编译语言

● xrange与range的区别,xrange通过什么关键字实现的?yield语句底层如何实现?

● python中 is与== 的区别

● new和malloc区别

● map和unordered_map区别

● 了解 utf8吗?utf8有几位?英文在 utf8中占几位?utf8和 utf16有什么区别?(utf8四连把我给问蒙了,出师不利)

● python2和python3的区别,python2为什么要更新成python3,print为什么要加括号?

5.1.2.4 讲解原理

● python装饰器,python迭代器和生成器介绍一下

● python全局锁是什么?

● python的动态数组是如何实现的

● python中dict的底层是啥

● 问python中list的底层怎么实现

● python有多线程吗?

● python里的生成器是什么?

5.1.2.5 讲解应用

● Python数据结构有哪些?

● python中的C拓展的具体例子

5.1.3 手写代码相关

● 交换a和b两个数,不借助第三个变量

● 用lambda表达式生成奇数的数组

● 实现sqrt函数,结果保留5位小数

5.2 C/C++方面

5.2.1 基础知识

5.2.1.1 内存相关

● C语言的动态内存分配器

● 是否了解虚函数,虚继承,多态。 vector底层如何实现插入的时候不改变内存空间

● C++共享内存实现原理,多线程通信,互斥锁

5.2.1.2 区别比较

● 参数传递时,传值、传引用和传指针的区别

● 函数返回时,返回值、返回引用和返回指针的区别

● dynamic_cast、static_cast和reinterpret_cast区别

● const A&func(const B& b) const 中三个const的区别

● new 和malloc有什么区别

● C++的虚函数和虚继承的作用

● 数组和链表的优缺点?

5.2.1.3 讲解原理

● 重载和重写

● 什么是多态,如何实现多态

● 多态;虚函数表;虚函数表指针大小;gcc编译过程;

● c++11新特性;const;new、malloc区别; 虚继承;四种类型转换;智能指针

● C++ static关键词的作用,初始化参数列表有什么用

● 介绍C++的虚函数,析构函数一定要是虚函数吗?

● C++面向对象介绍下?

● static修饰符有什么用?如果不加会出现什么后果?

● List的底层实现?

● Hashmap特点?HashMap的实现原理?如何解决Hash冲突?

● LRU算法讲一下?

● FFmpeg熟悉程度?

● 研究过h264,h265和h266吗?写过解码器吗?

● 设计一个带TTL的容量有限的hash map,在TTL=0后从map中移除。在装满后,如果还有元素进入,将TTL最小的元素移除。

5.2.1.4 讲解应用

● C语言中结构体struct{int i; bool b}一共占几个字节?

● C++的析构函数一定要是虚函数吗?

● 如何从用户态进入内核态?

● C++定义图和节点

● 这样声明变量有没有问题:int a[10000000]?

● C++ map中自定义的class 为什么不能作为key?

5.2.2 手写代码相关

● 实现一个C++双向链表类

● 手写双向链表插入新元素;

● 稀疏向量的点乘。先要我自定义存储的结构体,然后写函数头,再编程,本来要我用template但我不会就算了

● 如果实现c++中的vector,只需push_back和查找两个功能,底层如何实现。

● 实现memcpy

● 手写拓扑排序?

● 底层基于xnor运算的二值化卷积算子你是怎么实现的? 可以简单实现一下吗?现场用CUDA写了  底层基于位运算的GEMM kernel ,实现im2col的矩阵乘法。

6 操作系统高频问题:数据库&线程&常用命令等

6.1 数据库方面

6.1.1 基础问题

6.1.1.1 区别比较

● SQL中count(1), count(*), count(列)区别

6.1.1.2 讲解原理

● Mysql的数据存储结构

● MySQL底层是什么、B树和B 树的区别(因为我回答MySQL用B 树)

6.1.2 手写代码

● SQL如何取出成绩表中各科的前三名?

6.2 操作系统方面

6.2.1 TCP协议相关

● TCP和UDP的区别:一个面向连接,一个面向无连接。

● 为什么TCP比较慢,另外怎么保证可靠性

● TCP如何保证消息安全?

● 拥塞控制,流量控制,然后问流量控制会不会发生死锁?

● 三次握手和四次挥手的原理?

6.2.2 线程和进程相关

6.2.2.1 区别比较

● 线程和进程的区别和联系,进程和线程相比有什么好处?

● 同步 IO 和异步 IO

6.2.2.2 讲解原理

● 进程之间的通信方式 ,进程之间的序列

● 常见的进程调度算法?公平调度?时间片调度?

● 32位操作系统和64位操作系统的寻址范围?

● 线程如何保证原子性?

6.2.2.3 讲解应用

● 讲一下进程和线程的应用场景(多线程爬虫)。

● 加问死循环发生原因:

● 多个线程执行put操作时同时触发了rehash方法,可能会生成环形链

● 两个线程,每个线程有一个数组,交替输出,怎么做?

(问操作系统、数据库、网络哪个比较会。。答差不多都忘了,随便问吧,应该就是跪在这里了吧?所以说投算法的同学还是要复习计算机基础的,基础不能放下啊)

6.2.3 常用命令

● Linux系统怎么查看进程CPU使用率?

7 技术&产品&开放性问题

7.1 技术方面

● 电梯算法设计,机器学习怎么搞?

● 听音乐,怎么推荐,10亿首,怎么设计方案(K-D树以及实现)

● 有一个1000w的视频库,每个视频3-5分钟。 新来一个视频,我们需要去这1000w的视频库里查询,是否存在相同视频。 1.选择使用什么样的特征 。 2.设计一个好的index,使得查询尽可能快 (这1000w视频可以离线处理)-抽帧+Pooling+相似性哈希

● 工程中遇到了哪些优化复杂度的方法。

● 正负样本数据不均衡怎么处理。说了几种方案,欠采样,负采样,生成负样本等。接着问我怎么生成负样本,说了图像处理,GAN等等。就问我生产样本需要注意什么,我说最重要的是要和原始样本的分布保持一致。接着问我怎么能保证分布一致,到这基本就是我的知识盲区了,靠着经验和理解开始扯,期间他一直盯着屏幕打字,中间还打了几个哈欠,让我一直纠结还要不要接着说下去,最后实在扯不下去了,经历了十几秒尴尬的沉默之后。他说,问你道题吧。

● 如果遇到一个模型的归回效果特别差,怎么考虑和解决?A:首先考虑模型的选取是否符合问题,然后考虑数据样本映射到更易回归的空间中(后来觉得应该是:先看数据是否有很多异常值、离群点影响模型效果,然后再看模型的复杂度够不够,通过增加模型复杂度来提升模型拟合能力,好了,我不瞎说了,说的都是皮毛,纸上谈兵罢了,自行百度,真的可以很复杂)

● 如何判断机器是大端模式还是小端模式

● 优化搜索引擎时,如何从用户的行为上判断用户对我们提供的搜索结果的满意程度?很实际的问题,但对我而言是完全陌生的领域,估计研究推荐系统的人都懂这个,我当时绞尽脑汁:如果用户经常点开的链接不是第一个结果,而是后面的若干结果,那么说明用户对结果不满意。

● 三维视觉,你的研究方向在我们的产品中可以用到哪里?

回答了抖音的动态贴图和头部三维建模

现在大部分手机都是单目摄像头没有深度摄像头,怎么解决,来应用你的算法

回答了模型需要通过三维数据进行训练,但是应用模型时可以直接单张图片重建三维模型

了解动作捕捉吗?现在有一个人在做表情,有一个动画模型,怎么让动画模型做出人脸同样的表情?

回答了3DMM的表情系数

● 现代cpu算力在什么量级

● 开放题:有一个1000w的视频库,新来一个视频,我们需要去库里查询是否存在相同视频。存储这么多视频时应该选择什么样的特征,查询要用什么方法。(这个回答的还行,楼主大致说了一下用LSTM提特征再哈希的思路,面试官没说什么就过了)

● 开放题:磁盘上有M个数组(M很大),每个数组长度不确定,数组内数值不会重复。现在要求其中n个数组的交集。设计算法使这个求交集的速度最快,另外有内存限制。(这题真的雪崩!楼主在看题的时候把交集当成了并集来做,所以思路完全跑偏了。。。后面是快结束的时候面试官一提醒才发现的。。。然后赶紧说了一个两个数组求交集的实现就结束了)

● 开放题:你觉得影响模型效果的因素有什么,并排个序。(我回答的是特征>模型>优化器,才疏学浅只答了这些)

●  开放式问题:怎么论证现有的模型需要多少额外的标注数据

● 给你一亿个特征,现在来了一个新的特征如何处理。

● 2.5亿个整数找不重复的整数,内存无法一下存下这2.5亿个数,怎么做。

● 写一个函数,输入是N个文件,每个文件中是很多float的数值,文件内部无序。输出是一个有序的大文件,内存约束2个G,磁盘可以随便用,具体怎么实现比较高效?

● 设计一个函数,判断传入的IP地址在过去一个小时之内的访问次数是否大于10000次。这个问题没有做出来。(还是没有get到面试官出这个题的点,当时自己想的太过于复杂,就不知如何去实现了)

● 推荐系统方面:具体场景应用是由词向量引出的,首先问了词向量负采样的细节,数学原理,然后问大规模的用户导致维度爆炸怎么处理?如果让你设计一个推荐系统怎么做?

● NLP方面:设计一个系统来筛选抖音中的低俗视频?(从视频帧,图片,文字三方面来提取特征)

● NLP方面:现在有一些新闻,包含军事、体育、经济等,想分出它属于哪个类,该怎么做?

● 开放题:在一个只能传输0,1的信道里面,如何传输两个数字?(面试AI Lab机器学习实习生时问的,非常规)

7.2 产品方面

● 模型升级后,放到线上使用,发现线上效果不好,此时你该怎么办?

● 给图片去水印怎么去?

● 面试官解释题目:假如抖音里面有5亿用户,那么每个用户打开一次抖音就有5亿条记录,如果每个用户打开两次抖音,就有10亿条记录。也就是说,用户每打开一次抖音,就记录一下他的uid。请找出打开抖音次数最频繁的前10个用户。

● 聊了一些开放性问题,问抖音APP的冷启动怎么做。如何推测用户的性别,怎么手机训练模型用的数据。你觉得你使用抖音有什么问题,有什么解决方案。

● 怎么推测抖音用户是男性还是女性?怎么确认判断结果的靠谱程度?

● 从一段长视频中截取或者拼凑10s-20s的短视频用于广告投放,吸引用户点击下载app,怎么得到目标短视频?

● 任务,找出大量数据中的宠物猫

7.3 开放性问题

● 抖音你觉得如何刻画用户画像?用户在不同时间段刷,怎么理解用户的属性?如果一个时间段用户活跃度不高,怎么从数据挖掘角度看呢?

● 如何给主播打标签?

● 给你一个产品,作为一个算法工程师,你会做些什么,来让你的产品变得更好?

本文由 大白智能 作者:凯哲 发表,其版权均为 大白智能 所有,文章内容系作者个人观点,不代表 大白智能 对观点赞同或支持。如需转载,请注明文章来源。

发表评论

This site is protected by wp-copyrightpro.com