2019年8月16日

236 阅读4分钟

8月16日讯飞面经

感觉是个主管,主要问了我:

  • 对话系统的项目内容
  • NLP模型压缩的工作
  • BERT的改进(我说了最近的全词mask模型,xlnet,以及最近的去掉NSP任务的BERT)
  • 每周读多少篇论文,读的论文来源是哪里(我说精读两到三篇,读的论文主要来自于最新的NLP会议以及谷歌学术订阅)。
  • 然后问了感兴趣的方向(我回答是机器阅读理解和对话系统结合的方向)
  • 平时写代码用什么框架(TF)
  • 工作地点选择
  • 家住何处,家里几个兄弟姐妹
  • 有没有女朋友,为什么没有女朋友
  • 反问。我反问的内容:1.面试官所在的小组做的内容(他说主要做的就是对话系统和语义理解方向)2.我问他们在车载语音上用的模型主要是云模型吗(他说云+端,也有模型压缩的内容)

8月15日网易云面经

网易云机器学习一面(42分钟) 面试官是个小姐姐。

  • 自我介绍
  • 最有成就感的项目(对话系统项目,做的比较完整)
  • 简单说一下BERT
  • 说一下Transfomer的优点(基于Attention,词距为1,并行性好,速度快,可以叠加层增加模型容量而不容易产生梯度消失问题)
  • 梯度消失和梯度爆炸问题的原因(BPTT的梯度连乘,梯度小于1梯度消失,大于1梯度爆炸)
  • 对应的解决方案(梯度消失:1.换激活函数,例如Sigmoid和tanh换成ReLU,2.换网络结构,如LSTM和残差网络)
  • LSTM公式,LSTM和RNN的区别(增加了门机制,可以选择性的保留之前的信息,增大了模型的容量和长期信息的保留度,缓解了RNN的梯度消失问题问题)
  • 线性回归和逻辑回归的区别(逻辑回归的激活函数的是sigmoid,线性回归的输出域是无穷,逻辑回归输出域为[0,1],逻辑回归用于分类,线性回归用于回归,逻辑回归的损失函数是交叉熵,线性回归的损失函数是最小二乘)
  • 有没有用过Hadoop和Spark(Hadoop使用map reduce做过朴素贝叶斯文本分类实验,用过Spark的mllib)
  • 反问。1.面试官所在的group做的内容(网易云推荐),2.线上NLP的内容用的多吗(之前尝试把评论数据作为加入,但是效果不好,最近在重新做)

快速排序和三路快排

快速排序是非常常用的排序方法, 采用分治法的策略将数组分成两个子数组, 基本 思路是:

  • 从数组中取一个元素作为基准元素, 通常取数组的第一个或者最后一个元素;
  • 分区, 即将数组中比基准元素小的元素放到基准元素的左边, 比基准元素大的元素放 到右边;
  • 递归, 分别对比基准元素小的部分和比基准元素大的子数组用相同的方式进行排序;

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归 下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素 摆到它最后的位置去。

快速排序最大的优点速度快, 通常能够达到 O(NlogN) 的速度,原地排序,不需要额外的空间。 缺点:

  • 首先就是不稳定,会打乱数组中相同元素的相对位置;
  • 算法的速度严重依赖分区操作, 如果不能很好的分区, 比如数组中有重复元素的情况, 最坏情况下(对于已经排序的数组), 速度有可能会降到 O(N^2) 。

三路快排

适用于两种情况:近乎有序的数组和有大量重复数组的元素排序问题

## 快速排序
def q_sort(alist):
    if len(alist)<=1:
        return alist
    base = alist[0]
    l = [i for i in alist[1:] if i<base]
    r = [i for i in alist[1:] if i>=base]
    return q_sort(l) + [base] + q_sort(r)

## 三路排序
def tri_q_sort(alist):

    if len(alist)<=1:
        return alist

    base = alist[0]
    l = [i for i in alist if i<base]
    mid = [i for i in alist if i==base]
    r = [i for i in alist if i>base]
    return tri_q_sort(l) + mid + tri_q_sort(r)

A = [0,1,2,0,1,2,0,0,1,2,2,0]

print(q_sort(A))
print(tri_q_sort(A))