4 月 22 日 -5 月 7 日腾讯 nlp 算法实习面试题

评论有奖:评论区回复 “ 1 1”,领取最新升级版《名企 AI 面试 100 题》电子书!!

本文目录:

问题 8:介绍下 bert 位置编码和 transformer 的区别,哪个好,为什么?

问题 9:sigmod 函数的缺点,为什么会产生梯度消失?不是以 0 为中心的话,为什么会收敛慢。

问题 10:LN 和 BN 的区别。

问题 11:Leetcode 8. 字符串转换整数 (atoi),考虑科学计数法。

问题 12:最长递增子序列。

问题 13:全排列。

问题 14:合并两个有序数组并去重。

答案解析:

问题 8:介绍下 bert 位置编码和 transformer 的区别,哪个好,为什么?

Transformer 解决并行计算问题的法宝,就是 Positional Encoding,简单点理解就是,对于一句文本,每一个词语都有上下文关系,而 RNN 类网络由于其迭代式结构,天然可以表达词语的上下文关系,但 transformer 模型没有循环神经网络的迭代结构,所以我们必须提供每个字的位置信息给 transformer,才能识别出语言中的顺序关系,为了解决这个问题,谷歌 Transformer 的作者提出了 position encoding。

原版的 Transformer 中,谷歌对 learned position embedding 和 sinusoidal position encoding 进行了对比实验,结果非常相近。而 Sinusoidal encoding 更简单、更高效、并可以扩展到比训练样本更长的序列上,因此成为了 Transformer 的默认实现。对于机器翻译任务,encoder 的核心是提取完整句子的语义信息,它并不关注某个词的具体位置是什么,只需要将每个位置区分开(三角函数对相对位置有帮助);而 Bert 模型对于序列标注类的下游任务,是要给出每个位置的预测结果的。

问题 9:sigmod 函数的缺点,为什么会产生梯度消失?不是以 0 为中心的话,为什么会收敛慢。

sigmoid 函数特点:它能够把输入的连续实值变换为 0 和 1 之间的输出,特别的,如果是非常大的负数,那么输出就是 0;如果是非常大的正数,输出就是 1。

缺点:缺点 1:在深度神经网络中梯度反向传递时导致梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。缺点 2:Sigmoid 的 output 不是 0 均值(即 zero-centered)。缺点 3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

问题 10:Layer Normalization 和 Batch Normalization 的区别

Batch Normalization 是对这批样本的同一维度特征做归一化, Layer Normalization 是对这单个样本的所有维度特征做归一化。

BatchNorm 的缺点:

1、需要较大的 batch 以体现整体数据分布 2、训练阶段需要保存每个 batch 的均值和方差,以求出整体均值和方差在 infrence 阶段使用 3、不适用于可变长序列的训练,如 RNNLayer NormalizationLayer Normalization 是一个独立于 batch size 的算法,所以无论一个 batch 样本数多少都不会影响参与 LN 计算的数据量,从而解决 BN 的两个问题。

LN 的做法是根据样本的特征数做归一化。LN 不依赖于 batch 的大小和输入 sequence 的深度,因此可以用于 batch-size 为 1 和 RNN 中对边长的输入 sequence 的 normalize 操作。但在大批量的样本训练时,效果没 BN 好。实践证明,LN 用于 RNN 进行 Normalization 时,取得了比 BN 更好的效果。但用于 CNN 时,效果并不如 BN 明显。

问题 11:Leetcode 8. 字符串转换整数 (atoi),考虑科学计数法解析:

有三种方法:正常遍历、有限状态机和正则表达式,这里只提供正则表达式的参考答案。

s.lstrip()表示把开头的空格去掉

使用正则表达式:

^:匹配字符串开头

[+-]:代表一个 + 字符或-字符?:前面一个字符可有可无

\d:一个数字 +:前面一个字符的一个或多个 max(min(数字, 231 - 1), -231) 用来防止结果越界

代码如下:

4 月 22 日-5 月 7 日腾讯 nlp 算法实习面试题 ( 下 )

问题 12:最长递增子序列

4 月 22 日-5 月 7 日腾讯 nlp 算法实习面试题 ( 下 )

如上图所示,用 nums 表示原数组,results[i]表示截止到 nums[i] 当前最长递增子序列长度为 results[i],初始值均为 1;

因为要找处递增序列,所以我们只需要找出 nums[i]>nums[j](其中 j < i)的数,并将对应的 results[j]保存在 tmp 临时列表中,然后找出最长的那个序列将 nums[i]附加其后面;示例:假设 nums[i] = 5, i = 3

更新 results[i]时只需要考虑前面小于 results[i]的项,所以 results[0-2]均为 1;

此时 nums[i]前面小于 5 的项有 nums[2],需要将 results[2]保存报 tmp 中,然后选取 tmp 中最大的数值并加 1 后赋值给 results[i], 即 results[5] = 2

tmp 是临时列表更新 results 之后需要清空;

4 月 22 日-5 月 7 日腾讯 nlp 算法实习面试题 ( 下 )

根据上述流程更新所有 results[i],即可得到下图:

4 月 22 日-5 月 7 日腾讯 nlp 算法实习面试题 ( 下 )

此时我们只需要找出 results 中最大的那个值,即为最长递增子序列的长度。

参考代码如下:

4 月 22 日-5 月 7 日腾讯 nlp 算法实习面试题 ( 下 )

问题 13:全排列

解析 1:定义一个长度为 len(nums)的空表 output,从左往右一次填入 nums 中的数字,并且每个数只能使用一次。可以枚举所有困难,从左往右每一个位置都一次填入一个数,用 used 表记录 nums[i]是否已填入 output 中,如果 nums[i]木有填入 output 中则填入并标记,当 output 的长度为 len(nums)时,得到一个满足条件的结果,将 output 存入最终结果。然后将 output 回溯到未添加 nums[i]状态,used 回溯为未标记 nums[i]状态,继续下一次尝试。

4 月 22 日-5 月 7 日腾讯 nlp 算法实习面试题 ( 下 )

解析 2:在解析 1 中,我们使用了两个辅助空间,output 和 used;为节省空间,我们可以除掉他们;我们可以将给定的 nums 数组分成左右两个部分,用 n 表示数组个数,depth 表示当前需要填充的位置,左边表示已经填好的内容[0depth), 右边表示待填充的内容[depthn),假设当前填充的位置是 i,填充后为了保持上述结构,需要 nums[i]和 nums[depth]交换,在完成一次填充后的回溯过程,还需要再次交换,保持原有内容。整个流程如下图所示:

4 月 22 日-5 月 7 日腾讯 nlp 算法实习面试题 ( 下 )

参考代码:

4 月 22 日-5 月 7 日腾讯 nlp 算法实习面试题 ( 下 )

问题 14:合并两个有序数组并去重

4 月 22 日-5 月 7 日腾讯 nlp 算法实习面试题 ( 下 )

评论有奖:评论区回复 “ 11 ”,领取最新升级版《名企 AI 面试 100 题》电子书!!

  • 推广
    117 引用 • 469 回帖 • 6 关注

广告 我要投放

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...