2021年10月中旬—字节AI LAB NLP算法面试题10道

2,399 阅读6分钟

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

周末闲暇时间,整理了10道七月在线社区学员分享的字节跳动NLP方向算法面试题,答案仅供参考,欢迎评论区指正交流。 目录大致列了一下,方便大家择需看。

目录:

  • 1、bert的架构是什么 目标是什么 输入包括了什么 三个embedding输入是怎么综合的?
  • 2、transformer里面每一层的主要构成有哪些
  • 3、Seq2seq模型中decode和encode的差别有哪些
  • 4、leetcode.121. 买卖股票的最佳时机
  • 5、求数组中所有子数组和的最大值 leetcode 剑指 Offer 42. 连续子数组的最大和
  • 6、编辑距离 leetcode 72
  • 7、bert有什么可以改进的地方
  • 8、bert的mask策略
  • 9、Word2vec的两种训练目标是什么 其中skip-gram训练的loss function是什么
  • 10、BPE分词了解吗?

1、bert的架构是什么 目标是什么 输入包括了什么 三个embedding输入是怎么综合的?

Bert的结构主要是Transformer的encoder部分,其中Bert_base有12层,输出维度为768,参数量为110M,Bert_large有24层,输出维度为1024,参数总量为340M。

Bert的目标是利用大规模无标注语料训练,获得文本包含丰富语义信息的表征。

Bert的输入:token embedding,segment embedding,position embeddimg,三个向量相加作为模型的输入。

2、transformer里面每一层的主要构成有哪些

Transformer本身是一个典型的encoder-decoder模型,Encoder端和Decoder端均有6个Block,Encoder端的Block包括两个模块,多头self-attention模块以及一个前馈神经网络模块;Decoder端的Block包括三个模块,多头self-attention模块,多头Encoder-Decoder attention交互模块,以及一个前馈神经网络模块;需要注意:Encoder端和Decoder端中的每个模块都有残差层和Layer Normalization层。

3、Seq2seq模型中decode和encode的差别有哪些

encoder是对输入的序列进行编码,编码的时候不仅可以考虑当前状态,还可以考虑前后状态,在进行decoder的时候不能看到当前状态之后的信息,考虑的是encoder的context vector和decoder上一个时刻的信息。

4、leetcode.121. 买卖股票的最佳时机

方法一:暴力解法

对数组进行遍历,找到后一个数与前一个数的最大差值,返回。

注意遍历 j 时要从 i + 1 进行遍历。

代码如下:

Pythonclass Solution:
 def maxProfit(self, prices: List[int]) -> int:
        res = 0
 for i in range(len(prices)):
 for j in range(i+1,len(prices)):
                res = max(res,prices[j] - prices[i])
 return res

在 leetcode 上运行上面代码会出现超出时间限制的问题。

时间复杂度:O(n^2)

空间复杂度:O(1)

方法二:

只进行一次遍历,在遍历过程中更新两个值,股票最小值和差值最大值,更新到最后即可。

Pythonclass Solution:
 def maxProfit(self, prices: List[int]) -> int:
        res = 0
        minPrice = prices[0]
 for i in range(len(prices)):
            res = max(res, prices[i] - minPrice)
            minPrice = min(minPrice, prices[i])
 return res

时间复杂度:O(n)

空间复杂度:O(1)

5、求数组中所有子数组和的最大值 leetcode 剑指 Offer 42. 连续子数组的最大和

本题为剑指offer42题,和Leetcode第53题相同。

题目描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

解析:本题在面试时要求使用动态规划的方法,因此需要找到对应的状态定义(子问题)和状态转移方程(子问题之间的关系)

状态定义:dp[i]:表示以 nums[i] 结尾的连续子数组的最大和。

状态转移方程:

分两种情况考虑:dp[i-1] <= 0 和 dp[i-1] > 0

如果 dp[i - 1] > 0,那么可以把 nums[i] 直接接在 dp[i - 1] 表示的那个数组的后面,得到和更大的连续子数组;

如果 dp[i - 1] <= 0,那么 nums[i] 加上前面的数 dp[i - 1] 以后值不会变大。于是 dp[i] 「另起炉灶」,此时单独的一个 nums[i] 的值,就是 dp[i]。

得到状态转移方程如下:

整理可得:

代码如下:

Pythonclass Solution:
 def maxSubArray(self, nums: List[int]) -> int:
        size = len(nums)
        pre = 0
        res = nums[0]
 for i in range(size):
            pre = max(nums[i], pre + nums[i])
            res = max(res, pre)
 return res

6、编辑距离 leetcode 72

编辑距离 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

示例:

Python输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

解题思路:

编辑距离样例网址:alchemist-al.com/algorithms/…

图中数字表示序列“TAGGA”依次更改为“GCCCGT”对应的编辑距离。

  • 第一行数字和第一列数字表示将空字符串变成相应字符所需要的编辑距离;

上述解题思路对应的代码如下:

Pythonclass Solution:
 def minDistance(self, word1: str, word2: str) -> int:
        n1 = len(word1)
        n2 = len(word2)
 # 存储当前元素的编辑距离
        dp = [[0] * (n2 + 1) for _ in range(n1 + 1)]
 # 第一行
 for j in range(1, n2 + 1):
            dp[0][j] = dp[0][j-1] + 1
 # 第一列
 for i in range(1, n1 + 1):
            dp[i][0] = dp[i-1][0] + 1


 for i in range(1, n1 + 1):
 for j in range(1, n2 + 1):
 # 相等时copy左上角的值
 if word1[i-1] == word2[j-1]:
                    dp[i][j] = dp[i-1][j-1]
 # 不相等时:mmin(上,左、左上角) + 1
 else:
                    dp[i][j] = min(dp[i][j-1], dp[i-1][j], dp[i-1][j-
 1] ) + 1
 #print(dp)      
 return dp[-1][-1]       

7、bert有什么可以改进的地方

问题:中文BERT是以汉字为单位训练模型的,而单个汉字是不一表达像词语或者短语具有的丰富语义。

改进:ERNIE模型,给模型输入知识实体,在进行mask的时候将某一个实体的汉字全都mask掉,从而让模型学习知识实体。

BERT-WWM:短语级别遮盖(phrase-level masking)训练。

问题:NSP任务会破坏原本词向量的性能。

改进:RoBERTa,移除了NSP任务,同时使用了动态Mask来代替Bert的静态mask。

8、bert的mask策略

随机mask每一个句子中15%的词,用其上下文来做预测,其中,

80%的是采用[mask] ,my dog is hairy → my dog is [MASK]

10%的是随机取一个词来代替mask的词,my dog is hairy -> my dog is apple

10%的保持不变,my dog is hairy -> my dog is hairy

9、Word2vec的两种训练目标是什么 其中skip-gram训练的loss function是什么

CBOW和Skip-Gram模型。

10、BPE分词了解吗?

BPE与Wordpiece都是首先初始化一个小词表,再根据一定准则将不同的子词合并。词表由小变大。

BPE与Wordpiece的最大区别在于,如何选择两个子词进行合并:BPE选择频数最高的相邻子词合并,而WordPiece选择能够提升语言模型概率最大的相邻子词加入词表。