我正在参加中秋创意投稿大赛,详情请看:中秋创意投稿大赛
助力金九银十,一有空就分享面试题,来吧xdm,请看题:
1、介绍word2vec,负采样的细节
word2vec是google于2013年开源推出的一个词向量表示的工具包,其具体是通过学习文本来用词向量的方式表征词的语义信息,即通过一个低维嵌入空间使得语义上相似的单词在该空间内的距离很近。有两种模型:CBOW和Skip-Gram,其中CBOW模型的输入是某一个特征词的上下文固定窗口的词对应的词向量,而输出就是该特定词的词向量;Skip-Gram模型的输入是特定的一个词的词向量,输出就是特定词对应的上下文固定窗口的词向量。
现在我们看下Word2vec如何通过Negative Sampling负采样方法得到neg个负例;如果词汇表的大小为V,那么我们就将一段长度为1的线段分成V份,每份对应词汇表中的一个词。当然每个词对应的线段长度是不一样的,高频词对应的线段长,低频词对应的线段短。每个词w的线段长度由下式决定:
在word2vec中,分子和分母都取了3/4次幂如下:
在采样前,我们将这段长度为1的线段划分成M等份,这里M>>V,这样可以保证每个词对应的线段都会划分成对应的小块。而M份中的每一份都会落在某一个词对应的线段上。在采样的时候,我们只需要从M个位置中采样出neg个位置就行,此时采样到的每一个位置对应到的线段所属的词就是我们的负例词。
在word2vec中,M取值默认为10^8。
2、fasttext的改进,特征hash的作用
fastText模型架构和word2vec中的CBOW很相似, 不同之处是fastText预测标签而CBOW预测的是中间词,即模型架构类似但是模型的任务不同。
对于word2vec来说,词向量的加和求平均会丢失词顺序的信息,为了弥补这一点Fasttext增加了N-gram特征,将n-gram当成一个词,也用embedding来表示,所以look-up矩阵为[vocab+n_gram_num, dim]。由于n-gram的数量远大于word的数量,完全存储不现实,所以fasttext采用hash桶的方式,将所有n-gram都哈希到buckets桶中,哈希到同一个桶中的n-gram共享embedding vector,潜在的问题是存在哈希冲突,当然如果桶buckets取足够大时,可以避免这个问题。
3、用rand7实现rand10
该题为leetocde470. 用 Rand7() 实现 Rand10(),下面给出解法。
首先需要找到两个规律,规律一:
已知 rand_N() 可以等概率的生成[1, N]范围的随机数
那么:
(rand_X() - 1) × Y + rand_Y() ==> 可以等概率的生成[1, X * Y]范围的随机数
即实现了 rand_XY()
规律二:
要实现rand10(),就需要先实现rand_N(),并且保证N大于10且是10的倍数。这样再通过rand_N() % 10 + 1 就可以得到[1,10]范围的随机数了。
最后,由于生成的49不是10的倍数,故需要采用‘拒绝采样’,也就是说如果某个采样结果不在范围内就要丢弃它,如代码如下:
Pythonclass Solution:
def rand10(self) -> int:
while True:
idx = (rand7() - 1) * 7 + rand7()
if idx <= 40:
return 1 + idx % 10
时间复杂度:O(1)
空间复杂度:O(1)
参考:leetcode-cn.com/problems/im…
4、介绍一下Bert以及三个下游任务
Bert模型是一种自编码语言模型,其主要结构是transformer的encoder层,其主要包含两个训练阶段,预训练与fine-tuning,其中预训练阶段的任务是Masked Language Model(完形填空) 和 Next Sentence Prediction。
下游任务:句子对分类任务,单句子分类任务,问答任务,单句子标注任务。
5、除了Bert,其他预训练模型的拓展
RoBERTa 模型在 Bert 模型基础上的调整:
-
训练时间更长,Batch_size 更大,(Bert 256,RoBERTa 8K)
-
训练数据更多(Bert 16G,RoBERTa 160G)
-
移除了 NPL(next predict loss)
-
动态调整 Masking 机制
-
Token Encoding:使用基于 bytes-level 的 BPE