当前位置:   article > 正文

面试题汇总2(吐血整理)_所给数据data为10000个样本的特征数据,每一行表示一个样本的3维特征。请对数据进

所给数据data为10000个样本的特征数据,每一行表示一个样本的3维特征。请对数据进

2021届校招算法岗知识点总结:

机器学习基础

统计学习 方法(LR,SVM,EM,最大篇,集成学习等),值得反复看好几遍,每一遍都会加深理解;尤其是学习理论:贝叶斯决策理论/假设空间概念/经验风险,结构风险/各类损失函数之间的区别与联系/极大似然估计,最大后验估计,贝叶斯估计的区别与联系。

·树模型系列论文深入理解,gbdt,xgboost,lightgbm;

·深度学习基础:过拟合解决方法,dropout,bn,In等;学习器,各种optimizer原理及对比;BP原理;各种激活函数等,最好用numpy手写一遍MLP,包括rain+infer。

·概率图模型:LDA,ELBO,KL散度(e.g,最小化KL散度和极大似然法联系),变分推断,吉布斯采样等。

·评估体系:Precision,Recall,F1,AUC(实现+内在含义,多种角度理解,如正负样本偏序关系角度),还包括交叉验证等。

可在牛客网刷,尤其是链表、树、动规。

如何使用transformer,需提前下载,但是龟速。后面解决。

import torch
from transformers import BertModel, BertTokenizer
# 这里我们调用bert-base模型,同时模型的词典经过小写处理
model_name = 'bert-base-uncased'
# 读取模型对应的tokenizer
tokenizer = BertTokenizer.from_pretrained(model_name)
# 载入模型
model = BertModel.from_pretrained(model_name)
# 输入文本
input_text = "Here is some text to encode"
# 通过tokenizer把文本变成 token_id
input_ids = tokenizer.encode(input_text, add_special_tokens=True)
# input_ids: [101, 2182, 2003, 2070, 3793, 2000, 4372, 16044, 102]
input_ids = torch.tensor([input_ids])
# 获得BERT模型最后一个隐层结果
# 对文本的每一个token生成768维的向量,如果是二分类任务,我们接下来
# 就可以把第一个token也就是[CLS]的768维向量,接一个linear层,预测出分类的logits,或者根据标签进行训练。
with torch.no_grad():
    last_hidden_states = model(input_ids)[0]  # Models outputs are now tuples

""" tensor([[[-0.0549,  0.1053, -0.1065,  ..., -0.3550,  0.0686,  0.6506],
         [-0.5759, -0.3650, -0.1383,  ..., -0.6782,  0.2092, -0.1639],
         [-0.1641, -0.5597,  0.0150,  ..., -0.1603, -0.1346,  0.6216],
         ...,
         [ 0.2448,  0.1254,  0.1587,  ..., -0.2749, -0.1163,  0.8809],
         [ 0.0481,  0.4950, -0.2827,  ..., -0.6097, -0.1212,  0.2527],
         [ 0.9046,  0.2137, -0.5897,  ...,  0.3040, -0.6172, -0.1950]]]) 
	shape: (1, 9, 768)     
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

1.三次握手与四次挥手

所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。

  • 第一次握手(SYN=1, seq=x):

    客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。

    发送完毕后,客户端进入 SYN_SEND 状态。

  • 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):

    服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。

  • 第三次握手(ACK=1,ACKnum=y+1)

    客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1

    发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。

三次握手的过程的示意图如下:

three-way-handshake

TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),也叫做改进的三次握手。客户端或服务器均可主动发起挥手动作,在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作。

  • 第一次挥手(FIN=1,seq=x)

    假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。

    发送完毕后,客户端进入 FIN_WAIT_1 状态。

  • 第二次挥手(ACK=1,ACKnum=x+1)

    服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。

    发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。

  • 第三次挥手(FIN=1,seq=y)

    服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。

    发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。

  • 第四次挥手(ACK=1,ACKnum=y+1)

    客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。

    服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

    客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。

四次挥手的示意图如下:

four-way-handshake

0.随机森林的随机体现在哪里

随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。**随机森林的随机性体现在每颗树的训练样本是随机的,树中每个节点的分裂属性集合也是随机选择确定的。**有了这2个随机的保证,随机森林就不会产生过拟合的现象了。

随机森林是用一种随机的方式建立的一个森林,森林是由很多棵决策树组成的,每棵树所分配的训练样本是随机的,树中每个节点的分裂属性集合也是随机选择确定的。

简述xgboost的推导过程
lstm和rnn的区别
对nlp的理解是多少
手撕代码(1)反转链表 (2)快速排序 (3)用神经网络搭建一个LR
对pytorch和keras了解多少

1.比较Boosting和Bagging的异同

二者都是集成学习算法,都是将多个弱学习器组合成强学习器的方法。

Bagging:从原始数据集中每一轮有放回地抽取训练集,训练得到k个弱学习器,将这k个弱学习器以投票的方式得到最终的分类结果。

Boosting:每一轮根据上一轮的分类结果动态调整每个样本在分类器中的权重,训练得到k个弱分类器,他们都有各自的权重,通过加权组合的方式得到最终的分类结果。

2.无监督学习中存在过拟合吗?

存在。我们可以使用无监督学习的某些指标或人为地去评估模型性能,以此来判断是否过拟合。

3.什么是k折交叉验证?

将原始数据集划分为k个子集,将其中一个子集作为验证集,其余k-1个子集作为训练集,如此训练和验证一轮称为一次交叉验证。交叉验证重复k次,每个子集都做一次验证集,得到k个模型,加权平均k个模型的结果作为评估整体模型的依据。

4.关于k折交叉验证,需要注意什么?

k越大,不一定效果越好,而且越大的k会加大训练时间;在选择k时,需要考虑最小化数据集之间的方差,比如对于2分类任务,采用2折交叉验证,即将原始数据集对半分,若此时训练集中都是A类别,验证集中都是B类别,则交叉验证效果会非常差。

5.对于一个二分类问题,我们定义超过阈值t的判定为正例,否则判定为负例。现在若将t增大,则准确率和召回率会如何变化?

准确率 = TP / (TP + FP),召回率 = TP / (TP + FN),其中TP表示将正例正确分类为正例的数量,FP表示将负例错误分类为正例的数量,FN表示将正例错误分类为负例的数量。

准确率可以理解为在所有分类为正例的样品中,分类正确的样本所占比例;召回率可以理解为在所有原始数据集中的正例样品中,正确挑出的正例样本的比例。

因此若增大阈值t,更多不确定(分类概率较小)的样本将会被分为负例,剩余确定(分类概率较大)的样本所占比例将会增大(或不变),即准确率会增大(或不变);若增大阈值t,则可能将部分不确定(分类概率较小)的正例样品误分类为负例,即召回率会减小(或不变)。

6.以下关于神经网络的说法中,正确的是( )?

A.增加网络层数,总能减小训练集错误率

B.减小网络层数,总能减小测试集错误率

C.增加网络层数,可能增加测试集错误率

C。增加神经网络层数,确实可能提高模型的泛化性能,但不能绝对地说更深的网络能带来更小的错误率,还是要根据实际应用来判断,比如会导致过拟合等问题,因此只能选C。

7.说明Lp范数间的区别

L1范数:向量中各个元素绝对值之和

L2范数:向量中各个元素平方和的开二次方根

Lp范数:向量中各个元素绝对值的p次方和的开p次方根

8.用梯度下降训练神经网络的参数,为什么参数有时会被训练为nan值?

输入数据本身存在nan值,或者梯度爆炸了(可以降低学习率、或者设置梯度的阈值)

9.卷积神经网络CNN中池化层有什么作用?

减小图像尺寸即数据降维,缓解过拟合,保持一定程度的旋转和平移不变性。

10.请列举几种常见的激活函数。激活函数有什么作用?

sigmoid,relu,tanh,非线性化

11.神经网络中Dropout的作用?具体是怎么实现的?

防止过拟合。每次训练,都对每个神经网络单元,按一定概率临时丢弃。

12.利用梯度下降法训练神经网络,发现模型loss不变,可能有哪些问题?怎么解决?

很有可能是梯度消失了,它表示神经网络迭代更新时,有些权值不更新的现象。

改变激活函数,改变权值的初始化等。

13.如何解决不平衡数据集的分类问题?

可以扩充数据集,对数据重新采样,改变评价指标等。

14.残差网络为什么能做到很深层?

神经网络在反向传播过程中要不断地传播梯度,而当网络层数加深时,梯度在逐层传播过程中会逐渐衰减,导致无法对前面网络层的权重进行有效的调整。 残差网络中, 加入了short connections 为梯度带来了一个直接向前面层的传播通道,缓解了梯度的减小问题。

15.相比sigmoid激活函数ReLU激活函数有什么优势?

(1) 防止梯度消失 ( sigmoid的导数只有在0附近的时候有比较好的激活性,在正负饱和区的梯度都接近于0)

(2) ReLU的输出具有稀疏性

(3) ReLU函数简单计算速度快

16.卷积神经网络中空洞卷积的作用是什么?

空洞卷积也叫扩张卷积,在保持参数个数不变的情况下增大了卷积核的感受野,同时它可以保证输出的特征映射(feature map)的大小保持不变。一个扩张率为2的3×3卷积核,感受野与5×5的卷积核相同,但参数数量仅为9个。

17.解释下卷积神经网络中感受野的概念?

在卷积神经网络中,感受野 (receptive field)的定义是 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。

18.模型欠拟合什么情况下会出现?有什么解决方案?

模型复杂度过低,不能很好的拟合所有的数据

增加模型复杂度,如采用高阶模型(预测)或者引入更多特征(分类)等

19. 适用于移动端部署的网络结构都有哪些?

Mobilenet(https://arxiv.org/abs/1704.04861

Shufflenet(https://arxiv.org/abs/1707.01083

Xception(https://arxiv.org/abs/1610.02357

20. 卷积神经网络中im2col是如何实现的?

使用im2col的方法将划窗卷积转为两个大的矩阵相乘,见下图:

img

21.多任务学习中标签缺失如何处理?

一般做法是将缺失的标签设置特殊标志,在计算梯度的时候忽略。

22.梯度爆炸的解决方法?

针对梯度爆炸问题,解决方案是引入Gradient Clipping(梯度裁剪)。通过Gradient Clipping,将梯度约束在一个范围内,这样不会使得梯度过大。

23.深度学习模型参数初始化都有哪些方法?

(1)Gaussian 满足mean=0,std=1的高斯分布x∼N(mean, [公式] )

(2)Xavier 满足x∼U(−a,+a)x∼U(−a,+a)的均匀分布, 其中 a = sqrt(3/n)

(3)MSRA 满足x∼N(0, [公式] )x∼N(0,[公式])的高斯分布,其中σ = sqrt(2/n)

(4)Uniform 满足min=0,max=1的均匀分布。x∼U(min,max)x∼U(min,max)

等等

24.注意力机制在深度学习中的作用是什么?有哪些场景会使用?

深度学习中的注意力机制从本质上讲和人类的选择性视觉注意力机制类似,核心目标是从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息。目前在神经机器翻译(Neural Machine Translation)、图像理解(Image caption)等场景都有广泛应用。

25.卷积神经网络为什么会具有平移不变性?

MaxPooling能保证卷积神经网络在一定范围内平移特征能得到同样的激励,具有平移不变形。

26.神经网络参数共享(parameter sharing)是指什么?

所谓的权值共享就是说,用一个卷积核去卷积一张图,这张图每个位置是被同样数值的卷积核操作的,权重是一样的,也就是参数共享。

27.如何提高小型网络的精度?

(1)模型蒸馏技术(https://arxiv.org/abs/1503.02531

(2)利用AutoML进行网络结构的优化,可将网络计算复杂度作为约束条件之一,得到更优的结构。(https://arxiv.org/abs/1807.11626

28.什么是神经网络的梯度消失问题,为什么会有梯度消失问题?有什么办法能缓解梯度消失问题?

在反向传播算法计算每一层的误差项的时候,需要乘以本层激活函数的导数值,如果导数值接近于0,则多次乘积之后误差项会趋向于0,而参数的梯度值通过误差项计算,这会导致参数的梯度值接近于0,无法用梯度下降法来有效的更新参数的值。

改进激活函数,选用更不容易饱和的函数,如ReLU函数。

29.列举你所知道的神经网络中使用的损失函数

欧氏距离,交叉熵,对比损失,合页损失

30.对于多分类问题,为什么神经网络一般使用交叉熵而不用欧氏距离损失?

交叉熵在一般情况下更容易收敛到一个更好的解。

31.1x1卷积有什么用途?

通道降维,保证卷积神经网络可以接受任何尺寸的输入数据

32.随机梯度下降法,在每次迭代时能保证目标函数值一定下降吗?为什么?

不能,每次迭代时目标函数不一样

33.梯度下降法,为什么需要设置一个学习率?

使得迭代之后的值在上次值的邻域内,保证可以忽略泰勒展开中的二次及二次以上的项

34.解释梯度下降法中动量项的作用

利用之前迭代时的梯度值,减小震荡

35.为什么现在倾向于用小尺寸的卷积核?

用多个小卷积核串联可以有大卷积核同样的能力,而且参数更少,另外有更多次的激活函数作用,增强非线性

36.解释GoogLeNet的Inception模块的原理

对输入图像用多个不同尺寸的卷积核、池化操作进行同时处理,然后将输出结果按照通道拼接起来

37.解释反卷积的原理和用途

反卷积即转置卷积,正向传播时乘以卷积核的转置矩阵,反向传播时乘以卷积核矩阵

由卷积输出结果近似重构输入数据,上采样

38.解释批量归一化的原理

在数据送入神经网络的某一层进行处理之前,对数据做归一化。按照训练样本的批量进行处理,先减掉这批样本的均值,然后除以标准差,然后进行缩放和平移。缩放和平移参数同训练得到。预测时使用训练时确定的这些值来计算

39.解释SVM核函数的原理

核函数将数据映射到更高维的空间后处理,但不用做这种显式映射,而是先对两个样本向量做内积,然后用核函数映射。这等价于先进行映射,然后再做内积。

40.什么是过拟合,过拟合产生的原因是什么?有什么方法能减轻过拟合?

过拟合指在训练集上表现的很好,但在测试集上表现很差,推广泛化能力差。产生过拟合的原因是训练样本的抽样误差,训练时拟合了这种误差。增加训练样本,尤其是样本的代表性;正则化

41.什么样的函数可以用作激活函数?

非线性,几乎处处可到,单调

42.什么是鞍点问题?

梯度为0,Hessian矩阵不定的点,不是极值点

43.在训练深度神经网络的过程中,遇到过哪些问题,怎么解决的?

不收敛,收敛太慢,泛化能力差。调整网络结构,调整样本,调整学习率,调整参数初始化策略

44. SVM如何解决多分类问题

多个二分类器组合。1对1方案,1对剩余方案,多类损失函数

45.列举你知道的聚类算法

层次聚类,k均值算法,DBSCAN算法,OPTICS算法,谱聚类

46.K均值算法中,初始类中心怎么确定

随机选择K个样本作为类中心,将样本随机划分成K个子集然后计算类中心

47.简述EM算法的原理

EM算法用于求解带有隐变量的最大似然估计问题。由于有隐变量的存在,无法直接用最大似然估计求得对数似然函数极大值的公式解。此时通过jensen不等式构造对数似然函数的下界函数,然后优化下界函数,再用估计出的参数值构造新的下界函数,反复迭代直至收敛到局部极小值点

48网易互娱 - ailab - 人工智能研究工程师

一面50分钟

  1. 自我介绍
  2. 介绍腾讯实习内容
  3. Attention机制的原理
  4. 介绍艾耕实习内容
  5. Fasttext原理,相比于word2vec有什么优势
  6. 文本分类除了CNN和RNN还知道哪些方法?
  7. BILSTM + CRF模型的原理
  8. 多任务学习和对抗网络了解不
  9. 给定两个命名实体识别任务,一个任务数据量足够,另外一个数据量很少,可以怎么做
  10. 隐马尔可夫模型了解吗,和CRF的区别
  11. word2vec是有监督的还是无监督的?
  12. 思考题:有A(红)B(蓝)两瓶墨水,从A中取一勺倒到B中,混匀后,再从B中取等量墨水,倒到A中。问,是A中蓝墨水多还是B中红墨水多?

二面55分钟

  1. 自我介绍
  2. 摘要抽取怎么做的
  3. 命名实体的应用场景,泛化能力怎么样
  4. CRF模型说一下,优化目标是什么,怎么训练的?
  5. CRF和HMM的区别
  6. HMM做了哪些独立性假设
  7. HMM的训练方法
  8. CRF的预测方法,维特比算法的过程
  9. 画Transformer的结构图,讲一下原理,为什么self-attention可以替代seq2seq
  10. 机器翻译的Attention机制,里面的q,k,v分别代表什么
  11. Fasttext原理,cbow和skipgram的区别,分层softmax和負采样,負采样的采样原理,为什么要这样采样,Fasttext哈希规则,怎么把语义相近的词哈希到一个桶里。
  12. 讲一下腾讯的实习
  13. 模型怎么实现的,有没有优化矩阵的运算
  14. 为什么要用Fasttext做文本分类,是因为训练快还是预测快
  15. 推导lr
  16. 智力题:蓄水池采样

49网易云音乐 - nlp算法工程师

一面50分钟

  1. 自我介绍
  2. 讲一下随机森林,GBDT,XGBoost
  3. XGBoost相比于GBDT有哪些改进
  4. Adaboost和XGBoost的区别
  5. Adaboost和XGBoost是怎么进行预测的
  6. 讲一下Textcnn的运算过程
  7. 文本分类的评价指标
  8. 讲一下AUC
  9. 过拟合的解决方法
  10. 稳定和非稳定的排序算法有哪些
  11. 二分查找递归和非递归的时间和空间复杂度
  12. 手写冒泡排序,写完问这个程序要上线还需要考虑哪些东西

二面30分钟

劝退

49.拼多多 - 算法工程师

一面75分钟

  1. 全程讲实习
  2. LDA的词表示和word2vec的词表示有什么区别;
  3. Fasttext 原理,为什么用skipgram不用cbow,負采样怎么做到,公式是什么?
  4. 画Transformer结构图
  5. 代码题:给定字符串 s ,求与 s 编辑距离为2的字符串集合。

二面45分钟

  1. 全程讲实习…
  2. 代码题:一个圆被分成M个扇形,一共有N种颜色,相邻扇形不同色,一共有几种涂法?

三面hr

  1. 还在面哪些公司
  2. 有offer了吗
  3. 最理想的公司是哪?
  4. 选择offer最看重哪些因素
  5. 我们公司加班很多,你怎么看
  6. 女朋友去哪?(并没问是否单身就直接问了这个问题)
  7. 期望薪资多少?

50.追一科技 - 自然语言处理工程师

一面50分钟

  1. 讲实习
  2. 为什么Attention的结果和TextCNN的结果相差不大(不太明白什么意思,就讲了下两者对信息提取范围大小的区别)
  3. Fasttext和word2vec的区别
  4. Fasttext怎么做分类的
  5. 词向量用什么训练的,维度多大
  6. XGBoost和随机森林的区别
  7. XGBoost相对于GBDT的区别
  8. XGBoost工程方面的改进有哪些?
  9. XGBoost和随机森林的特征重要性是怎么计算的?
  10. 输入补全可以用哪个数据结构来做?(字典树)
  11. 假如有10亿条搜索请求,怎么找出最热的前10条?
  12. 问问题得到的信息:上海那边的部门主要是做金融保险业的定制化的智能客服,偏工程方向。主要工作内容有客服系统开发、知识图谱搭建、三元组抽取等,基本上会用到所有的NLP知识。。。
  13. 补充:梯度消失和梯度爆炸的原因,为什么rnn比cnn和全连接层神经网络更容易发生梯度消失或爆炸
  14. 补充:怎么判断过拟合,怎么防止过拟合,说一下dropout

二面30分钟

聊实习

51.百度 - 算法工程师

一面60分钟

  1. 讲项目
  2. 如果再给一次机会,你觉得这个项目还有什么可以改进的点?
  3. 代码题:二分查找
  4. 代码题:旋转数组的二分查找
  5. 代码题:给定长度为n的数组,求所有可能长度为m的排列组合的情况

二面60分钟

  1. 讲项目
  2. 讲fasttext,词向量,文本分类原理
  3. 文本分类CNN,LSTM和Attention的区别
  4. 代码题:有n枚硬币,每次从左边或右边拿一枚,一共拿m次,求能拿到的最高价值

三面60分钟

经理面

  1. 讲项目
  2. 讲比赛,现在来看有什么可以改进的点
  3. 智力题:圆盘涂色问题
  4. 一些hr题

52.英语流利说

一面20分钟

  1. 实验室方向
  2. 详细讲一下Transformer模型;transformer中句子的encoder表示是什么;怎么加入词序信息的。
  3. 讲一下BLEU;
  4. 怎么用数据处理的trick提升了NER的表现
  5. 摘要抽取可读性问题怎么回事?

二面60分钟

  1. 手撕代码:二叉搜索树转有序双向链表,要求不能创建新的节点
  2. 做过的nlp任务中,哪个任务最难?你觉得有哪些可以改进的点,怎么改进?
  3. 摘要生成怎么做的?
  4. 讲一下SVM
  5. 概率图模型,有向图模型和无向图模型分别作了哪些假设?CRF的训练目标是什么?
  6. BILSTM+CRF的训练目标?状态转移矩阵是joint learn的吗?维度是多少?
  7. 维特比算法的时间复杂度
  8. LSTM相比于传统RNN解决了什么问题?怎么解决的?
  9. Attention模型和CNN 的区别?

53.欢聚时代

一面40分钟

  1. 讲一下tag提取怎么做的,讲一下LDA,讲一下隐狄利克雷分布,里面有个辛普森采样了解吗
  2. 讲事件分类。数据有多少,样本不平衡怎么解决的,CNN用在文本里和用在图像里有什么区别,用在文本里时卷积核的宽度代表什么,你怎么选的,为什么要这么选?CNN和LSTM都可以用于分类,两者用于分类有什么区别?说一下Attention,Attention有哪些变种,为什么Attention模型的F指标还比不上作为baseline的textCNN?最后为什么选择Attention模型?词向量用什么训练的,数据量有多少,怎么评价词向量的质量的?词向量的维度是多少,为什么要选这个维度?文本分类中的多义词问题可以怎么解决?
  3. 讲讲CRF。CRF和HMM的区别,从有向无向图的角度呢?从其他角度呢?。CRF和深度学习的结合还知道哪些?
  4. 讲讲python的垃圾回收机制,讲讲装饰器

54. ROC是什么?

  • 阳性 (P, positive)
  • 阴性 (N, Negative)
  • 真阳性 (TP, true positive) 正确的肯定。又称:命中 (hit)
  • 真阴性 (TN, true negative) 正确的否定。又称:正确拒绝 (correct rejection)
  • 伪阳性 (FP, false positive) 错误的肯定,又称:假警报 (false alarm),第一型错误
  • 伪阴性 (FN, false negative) 错误的否定,又称:未命中 (miss),第二型错误
  • 真阳性率 (TPR, true positive rate) 又称:命中率 (hit rate)、敏感度(sensitivity)
    TPR = TP / P = TP / (TP+FN)
  • 伪阳性率(FPR, false positive rate) 又称:错误命中率,假警报率 (false alarm rate) FPR = FP / N = FP / (FP + TN)
  • 准确度 (ACC, accuracy) ACC = (TP + TN) / (P + N) 即:(真阳性+真阴性) / 总样本数
  • 真阴性率 (TNR) 又称:特异度 (SPC, specificity) SPC = TN / N = TN / (FP + TN) = 1 - FPR
  • 阳性预测值 (PPV) PPV = TP / (TP + FP)
  • 阴性预测值 (NPV) NPV = TN / (TN + FN) 假发现率 (FDR) FDR = FP / (FP + TP)

基本概念

分类模型(又称分类器,或诊断)将实例映射到特定类。ROC分析的是二元分类模型,也就是输出结果只有两种类别的模型,例如:(阳性/阴性) (有病/没病) (垃圾邮件/非垃圾邮件) (敌军/非敌军)。

当讯号侦测(或变量测量)的结果是连续值时,类与类的边界必须用阈值来界定。举例来说,用血压值来检测一个人是否有高血压,测出的血压值是连续的实数(从0~200都有可能),以收缩压140/舒张压90为阈值,阈值以上便诊断为有高血压,阈值未满者诊断为无高血压。二元分类模型的个案预测有四种结局:

真阳性(TP):诊断为有,实际上也有高血压。
伪阳性(FP):诊断为有,实际却没有高血压。
真阴性(TN):诊断为没有,实际上也没有高血压。
伪阴性(FN):诊断为没有,实际却有高血压。

这四种结局可以画成2 × 2的混淆矩阵

imgimg

ROC空间

ROC空间将伪阳性率(FPR)定义为 X 轴,真阳性率(TPR)定义为 Y 轴。

给定二元分类模型和它的阈值,就能从所有样本的(阳性/阴性)真实值和预测值计算出(X=FPR, Y=TPR) 座标点。

从 (0, 0) 到 (1,1) 的对角线将ROC空间划分为左上/右下两个区域,在这条线的以上的点代表了一个好的分类结果(胜过随机分类),而在这条线以下的点代表了差的分类结果(劣于随机分类)。

完美的预测是在左上角的点,在ROC空间座标 (0,1)点,X=0 代表着没有伪阳性,Y=1 代表着没有伪阴性(所有的阳性都是真阳性);也就是说,不管分类器输出结果是阳性或阴性,都是100%正确。一个随机的预测会得到位于从 (0, 0) 到 (1, 1) 对角线(也叫无识别率线)上的一个点;最直观的随机预测的例子就是抛硬币。

让我们来看在实际有100个阳性和100个阴性的案例时,四种预测方法(可能是四种分类器,或是同一分类器的四种阈值设定)的结果差异:

imgimg

55.京东金融NLP实习面试

1。自我介绍

2。然后直接问了下研二实习导师同意了吗

3。然后让介绍项目,平安车险的一个比赛

4。对Y值聚类是什么思路具体介绍一下,kmeans了解吗,自己实现的吗,K值取多少怎么确定的,kmeans的特征?(这里其实没太懂,可能是问kmeans用的什么聚类?我说可能是密度聚类,调用的sklearn)

5。为什么想到用AUC做评价指标,AUC应该是做二分类的吧,讲一下AUC和ROC(前一天晚上准备看,结果忘了,路上太热了也没看)

6。说一下lightgbm吧,讲一下GBDT,和决策树的区别。

7。比赛的数据是怎么个方式,线上平台是怎么操作,用什么处理的数据,对数据进行过清洗吗。

8。我看你简历上写了深度学习,有做过什么项目吗。(讲了一个课程作业)

9。用了gensim的词向量模型,有一个score函数,说了一下这个函数是干嘛的,他说他印象中没这个东西。然后说了另外一个LSTM的模型,让我把整个数据处理、模型训练、测试、损失函数讲一下。我一开始一会让我讲LSTM,开始画LSTM的图,然后说这个当成个黑盒子就行,你讲一下整个流程。这个作业一共花的时间不到一周,所以有点忘了,也没写到简历里面,顺口说的,讲的不是很好,当时傻了说最后是一个sigmoid,他愣了一下,最后他说最后应该个是softmax吧,我说对对对。

10。然后问我用keras做的还是tf。然后问还有没有别的项目,没了,做一个算法题。

11。一个贼他妈简单的归并排序,提醒了我三次,说排序、nlogn的排序、归并排序你学过吗。(考研的时候学过)你写一写吧(我好像忘了)。面试官好像无语了,然后让我就写一个n方的吧。

12。最后问我有什么想问的,我说那边现在在做什么,实习生平时做什么。他又问了我有没有用c++写过大项目,因为那边目前有个项目要用c++。

13。然后问了我为啥转专业,我想了想是不是应该说我热爱编程,热爱数学,热爱计算机,还是算了,然后说本科工科很苦逼,深山老林发电厂,计算机钱多。面试官笑了笑,就完了。

56.八大面经总结

  1. 简历,其实简历很重要,我有同学各种简历挂,连面试的机会都没有。所以要尽量把自己认为重要的东西都写在上面,突出自己想要在面试过程中展现出来的内容。主要就是项目/实习、论文、博客文章之类的。因为个人感觉我的博客还算可以,所以第一部分就写了自己的博客、知乎、github、国奖、论文(如果项目那块不够丰富的话可以把论文当做一个项目经验来写,因为我的论文比较水所以就在这里随便提了一下),所以还是推荐大家在平时学习的过程中写写博客做个记录;第二部分主要写了自己的项目和实习经历,因为正好研究生期间学过的东西可以分为文本分类、对话系统两个大的模块,再加上一个京东的实习,构成了项目部分,这里想说的是不一定非得是具体的项目才能写到这里,只要是你认为自己掌握的还算成体系的东西,在面试过程中可以讲出来的都可以写上去,唯一的缺点就是面试官会认为工程能力偏弱,但是当面试效果很好的时候这些东西是可以被弥补的。第三部分是额外加的,凸显了几个写的不错的文章和github上面的代码,这部分主要是为了过简历筛选,面试过程中很少有面试官会问到。最后就是要找一个还算不错的模板。
  2. 刷题,相比简历更重要的一环,基本上面试的时候如果一道编程题都做不出来的话跟挂了没什么区别。这部分没什么好说的,如果提前有准备的话,建议在研一或者研二开始就坚持刷LeetCode,我找工作的时候刷了200道左右。然后临时抱佛脚的话就是兼职offer了,这本书一定要多看几遍,很多面试过程中遇到的题目就是原题。这部分没什么好的方法,就是要增强自己的基本能力,不过面试的时候一道两道做不出来也没什么,不要着急,可以跟面试官交流一下,他一句话可能就会点醒你,千万不要一直憋着,交流之后写出来代码比憋了半天写不出代码给面试官留下的印象会好很多。而且很多时候代码不一定要写的很精确,大概一个思想正确就好,面试官一般不会抠细节。
  3. 深度学习与NLP基础,这部分怎么说呢,更是要靠平时的积累吧,临时突击无外乎是一些正则化、dropout、BN、LR推导、SVM推导、交叉熵损失函数、softmax求导、BP反向传播、过拟合、BPTT反向传播、梯度爆炸和梯度弥散、ReLu、激活函数、文本分类、对话系统评价指标、word2vec、attention、seq2seq、优化算法、GBDT、Bagging、Boosting等等等等,但是我感觉临时突击这些东西价值不大,主要还是看面试的一个整体效果,这些东西是要临时看看掌握一下,但绝对不是全部,更多的东西是在平时学习过程中积累下来的,而不是这些零散的点。要学会把他们连接起来,融会贯通(请允许装逼),更多可以看我之前写过得博客之类的。对了,还有面试官会让你现场写tf代码,不会很难,所以大家千万不要在github上面找个代码跑一下就算会了,一定要自己写,要懂。这部分我的感觉就是,平时积累很重要,但是在面试之前也一定要把这些基本概念再看一遍,像我一开始面试的时候就完全没有去准备这些知识点,有的时候就会卡壳,会给面试官留下不好的印象。
  4. 面试,这个基本上是按照简历部分进行准备,简历上一定不要写自己不是很懂得东西,不然真的会很尴尬。个人看法要在面试之前按照简历上面的内容自己能够讲一个小故事。3主要体现自己的深度学习的基础知识,这一部分要结合项目经验进行拔高,让面试官看到你的能力和特点。这里要做到面试官不打断的情况下每个项目自己可以说10分钟以上,一充斥整个面试,特别是当你掌握的不是很扎实的时候,把大部分时间留给自己。另外就是学会把面试官引到自己擅长的问题上面,在自己讲的过程中特意流出几个面试官可以问的问题,不要讲得太满,不然面试官问的很可能就是你不会的了。这里就要自己把握了,按照自己的经历,讲一个让面试官满意的故事。

上面就是我暂时能想到的一些点,也是自己在面试的过程中不断碰壁遇到的一些问题,然后整理下来的。对于基础知识这一块,可能会有很多同学问机器学习和深度学习之间如何权衡,其实我想说的是看你自己想找什么工作,我给自己的定位是深度学习与NLP,所以面试之前只看了SVM,然后在所有面试中也只有个别的面试官会问到机器学习的东西。怎么说呢,我的看法是,要学,要懂,但是次要,你只需要在整个面试过程中不断地展现自己在深度学习上的造诣,不给面试官留下时间去问机器学习就好。当然,如果你有足够的时间去准备,看看是最好的,毕竟你所有的准备都可能在面试中给自己增光添彩,按照自己的时间精力去分配就好。

面经&&跪经

这部分会按照面试时间的先后顺序大概说一下,先大体上说一下,拿到的offer有竹简智能-对话方向、阿里小蜜-对话方向、阿里新零售-NLP算法、滴滴AILab-对话方向、美团点评AI平台-对话方向、百度NLP部分-NLP算法、百度度秘事业部-对话方向、搜狗-机器翻译。跪了的有微信搜一搜看一看(面到了HR,现在还没给消息,暂时当他是跪了吧)、京东AILab-对话方向(跪的有点不知所措,虽然我也并不想去这里)。微软亚研(上周刚一面,就当是跪了吧,希望是一波毒奶)。怎么说呢,面的公司有点多,整个过程很累,但是由于offer的时间线原因,几个想要去的offer都是到最后才拿到,所以面了比较久。整体上感觉面试还算比较轻松,主要原因是找的实习大部分跟自己做的方向很match,所以整体上能够发挥出自己所学的东西,所以面试的结果也都还挺好的。下面就各自介绍一下:

一、2018.3.8 竹简智能 算法实习生

算法题:股票买卖获最大利润

一面:先简单介绍了一下Memory Network的相关知识,然后结合key-value MemNN模型介绍了一下自己做的基于KB知识库的问答系统,主要讲了以下其模型和工作原理。然后接下来聊了聊seq2seq模型,并主要介绍了一下attention机制,让写了下attention的公式,怎样计算得分和权重,说了下soft attention和hard attention的区别。然后聊了下tensorflow里面seq2seq的借口,吐了吐槽也介绍了自己实现的模型里面的一些细节和方法。

二面:主要针对我的京东实习和文本分类方面的问题进行提问,先问我都用过那些模型实现文本分类,当时卡克了只说出来了两个,尴尬==****(fasttext TextCNN RCNN HAN DMN EntityNetwork charCNN charRNN)。需要在总结一下各个模型的优缺点****。然后问了我觉得现在文本分类中还有哪些没有解决的问题,我想了会说样本不平衡问题(应该进行下采样来解决,他问我还有什么办法,我说这块没有尝试过只是在网上见到过一些介绍),和多类别分类问题(这里引入了知乎竞赛),多标签分类确实是一个很难的问题,面试官让我写损失函数,我当时由于紧张和时间久远也没有回答上来,算是整个面试过程中唯一回答的不好的问题吧。

三面:技术总监,到没有聊什么技术,拿着简历随便问了点项目和实习相关的东西,然后主要聊了公司的一些情况之类的,表达了对我很满意想让我留下来然后协调了一下实习时间之类的,算是发了口头offer。后面HR打电话问我的意向的时候拒了。

二、2018.3.13 阿里智能服务部–阿里小蜜 算法实习生

一面:面试官很亲和,上来主要是简历面,可以说是面面俱到,基本上简历上的东西都被问了个遍,而且还会眼神的考察一些基础知识,比如说介绍一下某些模型的细节、原理等等,稍微扩展了一下简历之外的东西看看知识的了解情况吧,比如说问了我句子相似度、传统方法做文本分类、SVM、word2vec等几个并没有出现在我简历中的知识点。然后也有几个开放性的问题,比如说我在京东的实习,如果让我采取方案的话我会使用什么方案,fasttext、CNN、RNN的优缺点各是什么等等,也都简单的聊了一下,感觉整体上来讲面试的效果还算可以,基本上问题的回答上来了。面试官也没有深究细节,点到为止。最后问了我关于实习地点在杭州是否可以,可是我还有别的选择吗==#

二面 2018.3.31 今天终于接到了二面的电话,记得是一个阳光明媚的中午_,面试大概持续了半个小时,先让我讲了一下attention的原理,接着讲了一下seq2seq的缺点,如何改进;如何实现再已知答案的情况下进行答案生成。然后问如何加速预测速度(其实这两个问题我也不是很清楚,只是很模糊的打了一下);接下来聊了一下京东的实习情况,为什么fasttext速度很快,然后问了下如果现在在做会采用什么样的方案;说一说RNN和LSTM的区别和原理;说一下自己的未来规划;感觉整个面试更偏向于理解,而不会是非在意细节,更不会具体到公式,但是还是会比较关注优模型化和性能方面。整体来讲,还不错??

三面 2018.4.7 一周后接到了三面电话,面试官应该很忙,毕竟清明节面试,而且感觉还有很多个人要面试的样子。面试大概持续了半个小时,上来让我讲一下最近做的对话系统的项目,我已开始说了一下模型的细节,面试官打断了我说相听一下具体的实现细节,不要讲论文的模型,然后我就把自己实现seq2seq时遇到的deepcopy和beam_search两个问题以及解决方案大概讲了一下,面试官到没有提什么问题,只是问了一下最后的真实效果,以及怎么评价之类的问题。然后就问了一下能不能去杭州实习,三面就结束了。

四面 2018.5.2 有过了快一个月才收到4面电话,直接是HR面,先是自我介绍,然后问了一下基本情况,发论文学习成绩之类的,然后问现在都有什么offer了,如何选择云云,20分钟左右让我等通知。

2018.5.3,今天有个小蜜部门的工程师加我微信,说我的面试通过了,口头发了offer,说后面会有后续的offer流程。

三、2018.3.30 阿里零售通 算法实习生

今天是阿里校招北邮行,貌似可以当场面试,所以就抱着试一试的心态去看看,本来想着去找智能服务部问一下自己简历的情况,结果智能服务部的人没去,却被零售通的人拉过去面试了一会。很轻松,负责人大概聊了一会就让我去二面,貌似是HR,也很随意,主要是他在讲他们部门,我基本上没说什么,然后他就说让他们部门总监给我三面,下午收到电话,面了50分钟左右。整体感觉上他们的算法部门应该是刚成立不久,挺缺人的,主要做推荐和物流这块,面试应该问题不大。但是我还是更想去智能服务部那边,毕竟方向更对口,所以跟他们说需要在考虑靠考虑。

4.3号又接到了零售通HR的电话,表示他们那边已经同意给我发offer,如果我也接受的话就把阿里小蜜的校招流程停掉转到他们那里去,在接受一轮交叉面试就可以了。我跟HR沟通了一下,说希望在考虑一下(因为我感觉阿里小蜜的人肯定会在清明节给我面试电话,所以想在等一下)。然后面试官就说那就等清明节结束之后让我给他一个回复。

2018.4.10 虽然小蜜那边的面试还没结束,offer也不一定能拿到,但一狠心还是把零售通的offer给拒了。

四、2018.3.15 滴滴AILab 自然语言处理实习生(对话方向)

整个面试过程只有一面,面试官把我接上来之后先让我介绍一下自己之前做过的一个项目,我就说了一下使用seq2seq实现对话系统的模型,接着讲了讲模型的缺点以及使用MMI的改进方案(这里自己当时没说好,感觉自己把自己绕进去了==),然后介绍完整个项目的细节之后,面试官提出了一个问题,说Attention机制的计算细节和公式是怎样的,然后我就介绍了一下公式的计算方法,然后说了一下改进的方案等。面试官就没有再问相关问题,感觉他好像也不是特别懂的样子,然后就说出一道算法题目做做吧。题目是有两个有序的集合,集合的每个元素都是一段范围,求其交集,例如集合{[4,8],[9,13]}和{[6,12]}的交集为{[6,8],[9,12]}。然后我就开始做,先写了个暴力解法,然后面试官让我想想有没有什么改进可以把时间复杂度改善。想了几分钟,说了一下自己的大致思路,其实并没有想到方案==不过交流的过程中得到一个很重要的信息就是这些范围是排序而且互相之间不会重合。所以这里也是给大家提个醒,一定要先把题目搞清楚再开始做题,不然很可能像我这样吧。然后搞清楚之后题目就很简单了,写一个循环就可以了,时间复杂度是O(N+M),然后就结束了,面试官让我问几个问题,然后又问了我关于实习时间的问题,就让我走了。整个面试时间持续了一个小时多一点,算法和编程差不多各占一半吧。

3.16号收到了offer,后来拒掉了

五、2018.3.16 腾讯搜一搜看一看 算法岗实习生

一面是个比较年轻的人,感觉挺厉害的,很关注算法效果、性能等方面,话语之间透露出一种刁刁的味道。上来看了看我的简历,让我讲一讲对话系统方面的工作。照常讲模型推公式,说完之后,面试官问了我关于MMI模型第一个改进目标函数中P(T)是如何计算的,我说每个词的联合概率分布乘积,当时他面露疑问,我还没反应过来是什么意思,到后面有说到这个问题才明白,原来他的意思是P(T)应该是单纯语言模型学习出来的结果,而按照我的说法,P(T)是在输入的基础上进行计算的,不得不说,面试官的水平很好,完全没接触过的东西竟然能一阵见血的指出我的纰漏,这个地方之前确实没怎么注意过,回来查了一下,计算P(T)的时候确实应该直接输入一个全零的初始化状态,这样才是一个语言模型学习到的概率。然后又接着问了文本分类的东西,我主要讲了一下TextCNN,TextRNN的模型,然后接下来讲了一下知乎竞赛的东西,感觉这块介绍的还算可以,然后又聊了下相关的一些问题。对了,这个面试官十分关注数据集的问题,比如我介绍到的movieQA数据集是一个什么形式,有多少QA对等等,还有知乎竞赛用到的数据集有大概多少个文本,数量是多大,但是平时有没有关注过这些问题,所以基本上没有答上来==接下来面试官出了一道K个有序链表的合并问题,手撕代码。

二面是个年纪比较大的程序员,整体感觉他不是很懂深度学习,机器学习应该是个高段位选手。主要问了我文本分类和论文方面的东西,到没有问出什么很有难度的问题。最后说让我讲一下底层优化方面的知识,我说是优化算法还是类似于tensorflow底层算法优化,他说前者,然后我就吧啦吧啦讲了一堆SGD,动量,AdaGrad,RMS,Adam之类的。然后问我会不会C++,我说不常用但是能读懂程序,他应该是想问我道算法题,但是他又不会java之类的??没搞懂,问了一句之后就说第一个面试官已经问完算法题了是吗,那我就不问了,然后就走了,说去找三面面试官,但是过了一会又说今天面试先结束,不知道是不是挂了还是大家已经下班了==

两面基本都是持续一个小时多一点,没有特别的压迫感和难度,基本都能答上来。但是我同学也是面的这个部门,说上来就给了5道算法题让做,然后全程面试官各种懂,问各种问题。我,也是一脸懵逼,同一个部门面试差别这么大的嘛,反正先等消息吧还是。

2018.3.21 二面,前两天收到了复试的通知,貌似是面试委员会面试,后面再有一个HR面试就结束了,然后开开心心去面试。到了之后发现短信和邮件中没有面试官联系方式(因为经过初面之后简历直接交给总部开始走校招流程,所以总部的电话也打不通,总之就是联系不上,也怪我一开始没有注意到联系方式这件事情了),连楼都进不去,无奈之下联系了初面的面试官,跟他说明了情况,最后又被他接到了一面的地方让我等一会他问一下情况,过了一会说要再加一轮技术面,我不知道具体的情况是什么,反正当时心态是崩了的,该参加的面试没参加还要临时再加一轮技术面试什么鬼。

然后面试官就来了,上来就让推导word2vec反向传播,讲实话我上周刚推完还给实验室的同学讲了一遍,奈何当时的情况下自己一紧张怎么推都感觉是错的,唉很尴尬,卡了很久最后算是勉强退了出来,不过面试官又让我写Embedding矩阵的梯度,这块之前也没在意过,只是知道更新当前单词对应的词向量即可,最后也没写上来其梯度公式,面试官让我回来再想想。然后开始问简历,他可能没接触过问答和对话系统,也没问我相关经历,一直针对文本分类这块再问,虽然也都算答上来了,但总感觉少点什么,一种说不上来的感觉。最后问我要是现在在做京东实习的工作我会怎么做,感觉也答得不是很好,然后问我FastText,CNN,RNN的区别,我感觉说的还不错,但是面试官好像还不是很满意==,最后送我出去的时候说还是要好好把基础打扎实。

等了很久吧,我一度以为已经挂了,结果4月18号收到了一次面试,貌似是因为之前提前批已经结束了,而我的面试流程也随之终止,所以一直拖到校招才又开始面。先电话面了一轮,很水,基本上就是问简历,然后第二天去HR面,这个过程自己表现得有点嚣张了貌似,具体不详说,反正估计是把HR惹到了,然后应该也是挂了~~

六、2018.3.20 美团点评 AI平台 算法实习生面试

一面面试官应该是搞后台开发的吧,深度学习一点不懂,上来就开始专业歧视,问我通信工程的会不会编程==,然后让我自己介绍,我说要讲模型的细节吗,他说不用,我看是讲了你也不懂吧,然后又说,你会数据结构吗,你们通信工程应该不学吧,你补这方面知识了吗?我++,你是猴子派来的逗比吧,然而我已经对他失望了,并不想理他。然后他貌似也不知道问什么了,开始看我的简历,又用电脑看我的专栏文章,说你对这个领域还挺了解的是吗,我说是啊,然后他就问我如果给你一个新的领域你该怎么上手,当时心里就想这个面试官真是没话找话,于是我啪啪啪又是一顿吹比。然后他竟然问,Redis你懂吗,让你学你怎么学,当时我就觉得聊不下去了。随便说了两句,然后他有看了看电脑我以为要出道编程题,结果他就直接走了,走了,了。

二面是部门老大,基本上不能算是面试吧,大概聊了一下,也没有算法题什么的,然后就互相问了几个问题,然后就结束了,面试官表达了想要我的意愿,说之后应该会有HR联系我之类的。这个人貌似挺厉害的,MSRA+Facebook的工作经历,今年刚回国开始成立美团的这个部门,直接给CEO汇报。

整个面试刨去等待应该不到40分钟吧,这可能是我面过的最水的一次面试了,可能是因为部门刚成立,二面人也说了,一切都是刚起步。回来之后就接到了offer,但是对这边并无好感,所以就拒了,后来那个leader又给我打电话表达了想让我过去的意愿,顺带diss了一下我面试的其他公司,虽然感觉他很有诚意,我去了之后应该也会被重视,但还是拒绝了,因为实习还是想找一个比较稳定成熟的部门多学点东西。

七、2018.4.17 百度自然语言处理部算法实习生

这个是在官网投的简历,到了那才发现自己好像投递错了,投成了校招==捞我简历的组是做query理解的,怎么说呢,整体感觉这个任务比较简单,基本用不上什么深度学习的技术,甚至面试过程中面试官一直在劝退我学深度学习,还是简单说一下面试过程吧。

一面,日常介绍了一下自己以前的工作,面试官更关注于文本分类这部分的工作,简单问了一下。然后就开始劝退了,说你是遇到什么任务都会使用深度学习模型吗,我说也用过机器学习的方法,比如VSM向量空间模型,但是比对结果发现深度学习的效果更好。然后就问我如果现在让我负责一个项目,主要是判断一个句子是否为问句,让我设计一套方案,并且给出所需要的时间,准确度要达到95%以上。然后我就扯了一堆,分词,词性标注,训练模型之类的。他说你怎么保证95%的准确率呢,我说二分类很简单,稍微调下参数应该就可以。考虑到面试官对深度学习的厌恶,我又补充说也可以使用机器学习的方法去做,比如说句法解析等技术,甚至网上应该已经有现成的问句识别的方案可以使用之类的。然后面试官就说,其实是一个比较简单的任务,用很简单的技术就可以达到95%,没必要上深度学习模型之类的。然后又说深度学习的缺点,什么端到端不可控,在很多任务里面有些特例是解决不了的,我说可以加bad case,他说有些情况加不完,比如机器翻译里面balabala,然后我就说,据我所知很多大公司的机器翻译用的完全是深度学习模型,他一时语塞,我也并不想给他面子。然后就说那你设计一个框架吧,会有很多任务,每次回调用其中的一个或几个,然后返回结果。其实没太高明白他想问什么,我随便说了下,什么传参啊,并行化啊之类的。然后他就说需要考虑可扩展性,比如说方便的新增模型之类的,后来闹了半天才知道他是想问继承和接口方面的问题,自己也没有打的很好。然后出了一个字符串反转的编程题。

二面,应该是他们小组的leader,上来还是一波自我介绍和聊项目,然后又进入了一波日常劝退,我心里就想你们这个组是有毒吧,说让我好好了解一下NLP原本的东西,这个倒是有些道理,可奈何时间精力有限啊。然后接下来就可以说是很逗了,感觉是一波深度学习基础知识点考查,dropout、正则化、过拟合、CNN、bagging和boosting的区别、优化算法通通问了一遍。然后出了一道二叉搜索树删除一个节点的编程题。接下来问问题,这个过程里面给我的感受就是,他们本身query这个任务偏简单,所以用一些简单的工程上的手段就可以解决,不需要上深度学习模型,然后就是搜索需要的时间反应很短,深度学习速度往往跟不上,所以就,嗯,怎么说呢,跟自己方向不太搭吧。

三面,应该不是他们组而是整个自然语言处理部的领导,但万万没想到是个小女生,我本以为他是HR。还是范范的聊了一下项目,然后他告诉我说他们整个部门是在做对话,我当时真的是听得一脸懵逼,怎么就直接从query理解跳到了对话了,然后说了一堆,我其实还是主要关注我去了之后干什么,但是他全程不给我明确的回复,一直在回避,然后我就直接问,我来了是不是跟前两面的面试官在同一个组,做同样的事情,然后他还是在回避,说这个会根据每个组的实际需求安排。然后面试就结束了

2018.4.23 今天收到了三面面试官的电话通知,拿到了他们部门的offer。后来考虑了两天还是拒掉了。

八、2018.4.23 百度度秘部门 对话系统算法实习生

前两天因为对NLP部门的岗位不是很满意所以又投了度秘,今天面试了一下,总共面了四面,四个半小时,可以说是很吐血了,全程问了很多开放性问题,我也尽量的回忆一下,复个盘==

一面,上来写了一道判断树B是否为树A的子树,一个坑是树不一定是二叉树,需要自己定义树的结构,其实就是剑指offer上题目的变种。写完之后开始问项目,主要关注于seq2seq做对话这个项目,我讲了一下attention、怎么做多轮、怎么解决类似于“I don’t know”等等几个问题,然后面试官就开始问一些开放性的问题,比如他们在做任务型的多轮对话,让我去设计这样一个系统,应该包含哪些模块,内各模块的功能,如何判断一句话是否跟上一句话处在同一个场景下,如何消歧等等,自己也是胡乱的说,有的没的都在扯。最后又问了下LR、SVM、极大似然估计等相关的一些问题。

二面,面试官好像主要是看到我之前做过知乎的看山杯竞赛,好像他也做过,然后比较感兴趣就过来聊了一下,我就把当时用过的一些模型还有两个主要的创新点介绍了一下,他闻了一下目标函数怎么选、多标签分类的特点、CNN如何做Padding、dropout具体的实现方法等问题。

三面,面试官是我将来的leader,感觉面试官很注重对损失函数的理解,整个面试过程中就一直在问各种损失函数。这个面试官主要针对我简历中京东的实习开始,但是又完全跟京东实习没有关系,而是单纯地提了一个问题,让我去建模,如何设计目标函数,并且把一些商家的信息添加到目标函数中进行惩罚。这个地方还是自己的短板吧,感觉自己想了很久最后在面试官的提示下也算是做出来了,然后面试官又问我SVM和LR的损失函数分别是什么,让我用tensorflow实现一个SVM,我想了一会感觉不会,他说那你实现一个LR吧,我大概写了一下。然后面试官又提出了一个问题,有一堆半监督的样本,即50%有类别ABC等,50%的样本没有类别,现在要使用tensorflow实现一个模型,去实现两个任务,第一个是首先要区分该样本是否为标记样本,可以理解为一个二分类,然后如果是有标注的样本的话在求出其类别。然后自己也是硬着头皮瞎写了一堆。最后应该就是写到算法题,一个无序数组找到其最大值和最小值,我卡了很久,因为不可能直接遍历一遍,这样太简单了,但是有想不到O(logn)的解决方法,也不可能使用排序,然后问了下面试官,他说先两两比较,然后我说这样仍然是O(N)啊,他说那肯定啊,但是总的比较次数降低了。

四面,四面面试官是临时拉过来帮忙面试的,好像之前的面试官有事,然后他全程就各种开放性问题,感觉更偏底层的NLP处理的技术一点,有很多小问题自己也没答到点子上。然后就是三道编程题,第一道是100亿个数中寻找最大的10000个,剑指offer原题,借助堆排序进行做,分析了一下时间复杂度。然后是对100亿个数做排序,但是内存只有4G,这道题没思路,面试官说是外排序,没接触过就过了,最后一个是字符串转整型,自己实现一下。

第二天收到了offer,如果不出意外应该回去度秘实习吧先。

总结

总结一下这个找工作的过程,因为自己平时积累的比较多,所以整个面试还相对来说比较轻松。然后就是想说一下对话系统这个方向,各大公司都有再发力,个人也认为这将是未来一段时间内深度学习在NLP领域的一个爆发点,而且很多创业公司已经在吃这块蛋糕,李纪为大神也拿到了风投建立了自己的公司。但不得不说,这里面还是有很多待解决的问题,如何做到理解是很重要的一块。深度学习在当前对话系统中也只是占一部分,端到端更是还没有到应用的程度,特别是在多轮对话和任务导向的对话系统中。单说公司的话,百度的度秘、阿里的小蜜、微软的小冰应该算是做得比较不错的,度秘侧重于智能家居,旨在做一个操作系统,小蜜主要在智能客服领域发力,在电商领域有着很大的应用场景,小冰现在不是很清楚,只知道技术应该挺吊的;接下来向京东、美团、滴滴,也都有在做,不断地投入很多精力搞这一块,但整体的效果应该比不上前面两个;再就是小的创业公司,都会找一个自己的着力点,比如个人助手等,但如何生存下去、如何盈利还是一个问题。(以上均为个人看法==不喜勿喷)。

57.GBDT vs Xgboost

另一种方法:XGBoost在寻找splitpoint的时候,不会枚举所有的特征值,而会对特征值进行聚合统计,按照特征值的密度分布,构造直方图计算特征值分布的面积,然后划分分布形成若干个bucket(桶),每个bucket的面积相同,将bucket边界上的特征值作为split
point的候选,遍历所有的候选分裂点来找到最佳分裂点。

上图近似算法公式的解释:将特征k的特征值进行排序,计算特征值分布,rk(z)表示的是对于特征k而言,其特征值小于z的权重之和占总权重的比例,代表了这些特征值的重要程度,我们按照这个比例计算公式,将特征值分成若干个bucket,每个bucket的比例相同,选取这几类特征值的边界作为划分候选点,构成候选集;选择候选集的条件是要使得相邻的两个候选分裂节点差值小于某个阈值

传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。

  • 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
  • xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
  • Shrinkage(缩减),相当于学习速率(xgboost中的eta)。每次迭代,增加新的模型,在前面成上一个小于1的系数,降低优化的速度,每次走一小步逐步逼近最优模型比每次走一大步逼近更加容易避免过拟合现象;
  • 列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样(即每次的输入特征不是全部特征),不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
  • 忽略缺失值:在寻找splitpoint的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个工程技巧来减少了为稀疏离散特征寻找splitpoint的时间开销
  • 指定缺失值的分隔方向:可以为缺失值或者指定的值指定分支的默认方向,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,分到那个子节点带来的增益大,默认的方向就是哪个子节点,这能大大提升算法的效率。
  • 并行化处理:在训练之前,预先对每个特征内部进行了排序找出候选切割点,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行,即在不同的特征属性上采用多线程并行方式寻找最佳分割点。

58.nlp模型

作者:JayLou娄杰
链接:https://zhuanlan.zhihu.com/p/57153934
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1、word2vec和tf-idf 相似度计算时的区别?

word2vec 1、稠密的 低维度的 2、表达出相似度; 3、表达能力强;4、泛化能力强;

2、word2vec和NNLM对比有什么区别?(word2vec vs NNLM)

1)其本质都可以看作是语言模型;

2)词向量只不过NNLM一个产物,word2vec虽然其本质也是语言模型,但是其专注于词向量本身,因此做了许多优化来提高计算效率:

  • 与NNLM相比,词向量直接sum,不再拼接,并舍弃隐层;
  • 考虑到sofmax归一化需要遍历整个词汇表,采用hierarchical softmax 和negative sampling进行优化,hierarchical softmax 实质上生成一颗带权路径最小的哈夫曼树,让高频词搜索路劲变小;negative sampling更为直接,实质上对每一个样本中每一个词都进行负例采样

3、 word2vec负采样有什么作用?

负采样这个点引入word2vec非常巧妙,两个作用,1.加速了模型计算,2.保证了模型训练的效果,一个是模型每次只需要更新采样的词的权重,不用更新所有的权重,那样会很慢,第二,中心词其实只跟它周围的词有关系,位置离着很远的词没有关系,也没必要同时训练更新,作者这点非常聪明。

4、word2vec和fastText对比有什么区别?(word2vec vs fastText)

1)都可以无监督学习词向量, fastText训练词向量时会考虑subword;

2)fastText还可以进行有监督学习进行文本分类,其主要特点:

  • 结构与CBOW类似,但学习目标是人工标注的分类结果;
  • 采用hierarchical softmax对输出的分类标签建立哈夫曼树,样本中标签多的类别被分配短的搜寻路径;
  • 引入N-gram,考虑词序特征;
  • 引入subword来处理长词,处理未登陆词问题;

5、glove和word2vec、 LSA对比有什么区别?(word2vec vs glove vs LSA)

1)glove vs LSA

  • LSA(Latent Semantic Analysis)可以基于co-occurance matrix构建词向量,实质上是基于全局语料采用SVD进行矩阵分解,然而SVD计算复杂度高;
  • glove可看作是对LSA一种优化的高效矩阵分解算法,采用Adagrad对最小平方损失进行优化;

2)word2vec vs LSA

  • 主题模型和词嵌入两类方法最大的不同在于模型本身。
  • 主题模型是一种基于概率图模型的生成式模型。其似然函数可以写为若干条件概率连乘的形式,其中包含需要推测的隐含变量(即主题)
  • 词嵌入模型一般表示为神经网络的形式,似然函数定义在网络的输出之上。需要学习网络的权重来得到单词的稠密向量表示。

3)word2vec vs glove

  • word2vec是局部语料库训练的,其特征提取是基于滑窗的;而glove的滑窗是为了构建co-occurance matrix,是基于全局语料的,可见glove需要事先统计共现概率;因此,word2vec可以进行在线学习,glove则需要统计固定语料信息。
  • word2vec是无监督学习,同样由于不需要人工标注;glove通常被认为是无监督学习,但实际上glove还是有label的,即共现次数[公式]
  • word2vec损失函数实质上是带权重的交叉熵,权重固定;glove的损失函数是最小平方损失函数,权重可以做映射变换。
  • 总体来看,glove可以被看作是更换了目标函数和权重函数的全局word2vec

imgelmo vs GPT vs bert

6、 elmo、GPT、bert三者之间有什么区别?(elmo vs GPT vs bert)
之前介绍词向量均是静态的词向量,无法解决一次多义等问题。下面介绍三种elmo、GPT、bert词向量,它们都是基于语言模型的动态词向量。下面从几个方面对这三者进行对比:

(1)特征提取器:elmo采用LSTM进行提取,GPT和bert则采用Transformer进行提取。很多任务表明Transformer特征提取能力强于LSTM,elmo采用1层静态向量+2层LSTM,多层提取能力有限,而GPT和bert中的Transformer可采用多层,并行计算能力强。

(2)单/双向语言模型

  • GPT采用单向语言模型,elmo和bert采用双向语言模型。但是elmo实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比bert一体化融合特征方式弱。
  • GPT和bert都采用Transformer,Transformer是encoder-decoder结构,GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子。

7、LSTM和GRU的区别?

  • GRU和LSTM的性能在很多任务上不分伯仲。
  • GRU 参数更少因此更容易收敛,但是数据集很大的情况下,LSTM表达性能更好。
  • 从结构上来说,GRU只有两个门(update和reset),LSTM有三个门(forget,input,output),GRU直接将hidden state 传给下一个单元,而LSTM则用memory cell 把hidden state 包装起来。

样本选择上:

Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。

Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

样例权重:

Bagging:使用均匀取样,每个样例的权重相等

Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

预测函数:

Bagging:所有预测函数的权重相等。

Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。

并行计算:

Bagging:各个预测函数可以并行生成

Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮

59.十分钟了解文本分类通用训练技巧

欢迎大家来到预训练语言模型的专题系列分享,本篇推送是该专题系列的第三篇。在前两篇推送[萌芽时代],[风起云涌]中,我们分享了该领域的奠基文章以及声名鹊起却生不逢时的ELMo模型,本期我们带来的文章将会让大家了解文本分类的一些通用技巧,希望大家看完后炼丹技术都能更上一层楼!

同时感谢清华大学自然语言处理实验室整理的体系图,我们将沿此脉络前行,探索预训练语言模型的前沿技术,本期的第一篇文章处于图中绿色框内,另一篇为课外阅读。红色框内的论文在前几期中介绍,大家有兴趣的可以前去一看。

img

Universal Language Model Fine-tuning for Text Classification (2018)

前几期介绍的大多是模型或结构,而这篇文章由 Jeremy Howard 和 Sebastian Ruder 发表于2018年,介绍的是文本分类中语言模型的通用训练技巧。其中的一些技巧,吴老师和我在kaggle 的jigsaw 文本分类比赛中也有应用,并在比赛中拿到了金牌。在未来的推送中,可能还会有详细介绍。

这篇文章认为,目前语言模型在finetune时经常会过拟合到小数据集上,而且容易导致灾难性遗忘。相比于CV模型,NLP模型层数较少,所以需要更多的训练技巧来使其表现更好。而他们在本文中提出了fine-tuning 语言模型的关键技术 ULMFiT,可以大大地提高六个文本分类任务的效果,并且用更少的数据训练就可以达到相当的效果,加强了泛化能力。

首先介绍下ULMFiT的总体框架。之前的很多论文提出的都是预训练 + finetune 两个阶段的训练,而本文提出使用三阶段训练

  • 第一个阶段,首先在一个很庞大的通用领域无关语料上,进行语言模型的训练,以捕捉语言的通用规律
  • 第二个阶段,在特定任务的领域相关语料上,进行语言模型的finetune,来学习任务数据的特定语言特征分布
  • 第三个阶段,进行目标任务分类器的总体学习,直接学习到任务的分类目标。

文章认为上述第二个阶段很有必要。因为无论通用的语料多样性多么好,都和你目标任务的数据分布有区别。而且在比较小的特定任务数据上finetune语言模型可以很快得到收敛,成本较低。同时,这样finetune以后,即使对比较小的数据集,语言模型也能变得比较鲁棒。

img

ULMFiT的总体框架(来自论文)

其次,在ELMo,GPT的介绍中我们都提到过,语言模型的不同层其实能够捕捉不同级别的语义特征,比如ELMo底层LSTM更多捕捉语法和词层面的特征,而上层LSTM更多捕捉整句话的语言的特征。既然是不同类型的信息,就应该区分地去进行参数的finetune,所以文章提出了discriminative fine-tuning,即对不同的层使用不同的学习率去学习。因为越靠近最下层Embedding层,模型参数就会含有更多通用信息,不应随任务目标发生很大变化。所以为了降低灾难性遗忘的可能,越下层,就会用更小的学习率来学习,而上层为了让模型能够更快地学习到目标任务的独有信息,会用相对大的学习率。一般层之间的学习率会等比地变化,在这篇文章里,这个比值为2.6, 即上一层参数学习率为下一层的2.6倍。

再者,为了让语言模型能更好地学习到特定任务相关的特征,文章使用了Slanted triangular learning rates (SLTR),让模型在训练初期快速收敛到一个合适的参数区域,接着再进行细致地优化。在现在看来这就是一种warmup策略。warmup已经在神经网络模型中被广泛应用了,huggingface的transformers也有现成的函数来对warmupscheduler进行控制。

img

SLTR示意图(来自论文)

最后,在目标任务的直接优化过程中,文章提出了几种辅助训练技巧,其中这些我认为比较简单通用。

  • 第一个是Concat pooling,一般文本分类的分类器会接在语言模型最后一层LSTM或transformer之后,但是其实很多信息蕴含在之前的层或时间步中。所以将几个时间步或者几层进行concat,再接上全连接层一般会获得更好的结果。这一点在BERT论文和我们之前比赛中也有验证,根据实验,将BERT的后四层concat起来再接上全连接层,会得到更好的效果。
  • 第二个是Gradual unfreezing。一下子把模型的全部层一起训练,通用信息容易丢失,从而增加灾难性遗忘的风险。所以文章提出,可以慢慢地从最后一层开始“解冻”,因为最后一层含有最少的 “general knowledge”,让它先去拟合任务目标比较合适。具体做法是第一个epoch,“解冻”最后一层进行训练(只改变了最后一层参数)。接着“解冻”倒数第二层训练(改变了最后两层参数)。直到把所有层“解冻”为止。

文章接下来的篇幅从各方面比较了文中技巧对任务的提升,我们可以大致看一下。其中,full 是指优化整个模型,last指只优化最后一层,discr指discriminative fine-tuning, sltr指slanted triangular learning rates,cos指cosine annealing schedule。可以看到,文中提到的几个技术都对误差率的下降有明显的效果。

img

不同策略下验证错误率(来自论文)

这篇文章的贡献是深远的,它提出了预训练语言模型比较通用的训练方法和技术。这篇文章虽然早于GPT和BERT发表,但是它的框架完全可以在后来的强大模型中提供帮助,让我们NLP的炼丹之旅轻松又愉快!

How to Fine-Tune BERT for Text Classification(2019)

本篇文章是由复旦计算机系的多位作者发表的。讨论如何在文本分类任务中对BERT模型进行finetune。虽然这篇文章不在体系图,但与第一篇文章在内容上比较相关,而且我们在kaggle比赛中也应用到了,所以一起在这里介绍。我们长话短说,直接来总结一下这篇文章的几个贡献点和有用的技巧。

第一个贡献是,框架相比于上篇文章进行了微调。在通过任务相关数据进行语言模型finetune后,多加了一步可选的stage: 把BERT在领域内相关的其他任务上进行多任务的训练,我认为这是对于ULMFiT的补充。

img

BERT finetune框架(来自论文)

第二个贡献是对长文本的处理,我们在之后BERT文章中将会介绍,BERT模型能一次处理的最长文本长度为512,有时我们为了降低模型运行时间和占用空间,有可能将这个长度变得更短,这时候就可能要对文本进行截断。文章的结论就是最好的截断方式既不是截头,也不是截尾,应该头尾都截一部分保留最重要信息。

img

长文本不同处理方式的错误率(来自论文)

第三个贡献是在任务上详细分析了BERT的不同层****对文本分类任务的效果。具体做法是,在某一层后直接接分类器进行分类。单层中,以最后一层的效果最好,因为文本分类是更贴近语言层面的任务。而在文章尝试的其他几种选择中,把最后四层concat或者max pooling效果最好。

img

不同层向量用以分类的错误率(来自论文)

第四个贡献其实是借鉴discriminative fine-tuning,进行层间学习率的下降。越接近底层,含有的通用信息越多,越不应该随着特定任务进行大规模的参数改变,否则有灾难性遗忘风险。在他们的尝试中,学习率2e-5,层间学习率变化因数0.95对BERT来说比较合适的。

img

不同学习率设置的分类错误率(来自论文)

总之,这篇文章进行了很多完备的实验,来提出和验证了在文本分类任务上,BERT的较好的finetune策略及其效果。文章验证了 : 1) 对于文本分类,BERT的最高层的效果最好 2) 使用合适的层间学习率下降策略,BERT能够克服灾难性遗忘的问题 3) 任务相关或领域内相关数据的语言模型finetune可以大大提升效果 4) 相关的多任务学习也对特定任务有提升效果 5) BERT只需少量的特定数据就可以预训练以提升任务。文章对我们训练BERT模型有很好的指导意义,以后再也不用担心炸炉啦!

未完待续

本期的论文就给大家分享到这里,感谢大家的阅读和支持,下期我们会给大家带来预训练语言模型其他的论文阅读分享,敬请大家期待!

欢迎关注晴天1号,这里有很多最新最热的论文阅读分享,有问题或建议可以在公众号下留言。

参考资料
  1. Universal Language Model Fine-tuning for Text Classification (2018)

    https://www.aclweb.org/anthology/P18-1031.pdf

  2. How to Fine-Tune BERT for Text Classification(2019)

    https://arxiv.org/pdf/1905.05583.pdf

  3. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    https://arxiv.org/pdf/1810.04805.pdf

推荐阅读

60.[预训练语言模型专题] BERT 一切过往,皆为序章

谢清华大学自然语言处理实验室对预训练语言模型架构的梳理,我们将沿此脉络前行,探索预训练语言模型的前沿技术,红色框为前期脚印,绿色框为本期介绍,欢迎大家留言讨论交流。

img

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (2018)

本期将要介绍的就是在NLP领域无人不知,无人不晓的预训练语言模型BERT了,由Google AI在2018年底推出,刚出现就刷新了一大批榜单,甚至在一些任务上超过了人类的表现,令人惊艳。谷歌团队成员Thang Luong在推特上表示,BERT模型开启了NLP的新时代。就其效果、易用性、通用性各方面来说,在当时不愧称为预训练语言模型的王者,压服众多的模型。让我们花十分钟一起,跟着论文来体会BERT的设计思路和重点。

文章在一开始概括了当时的两种不同的预训练语言模型的策略,feature-based 策略及 fine-tuning 策略。

  1. feature-based策略的代表模型为ELMo,它把预训练得到的“向量表示”作为训练下游任务的额外特征。训练下游任务时使用新的任务相关模型,并基于得到的特征来进行进一步的训练。
  2. fine-tuning策略的代表模型为GPT,它则是在训练语言模型后,只改变极少的任务相关的层与参数,直接对下游任务训练整个原来的语言模型。

BERT使用的是后者,因为这种策略需要改变的参数量较少,迁移也较为简单。同时他们指出,现在限制这种策略性能的主要问题是。如GPT这种模型,它预训练时使用了标准语言模型的目标,导致它只能是单向的。在Transformer层中,每个token在self attention 时都只能关注其之前的token,会严重损害在一些任务上如问答上的效果,在之前的不少论文中都佐证了这个观点。所以,使模型能够学习一个文本双向的信息是非常关键的一点。

BERT模型的几大核心贡献:

  1. BERT揭示了语言模型的深层双向学习能力在任务中的重要性,特别是相比于同样在fine-tuning范畴内使用单向生成式训练的GPT以及浅层的双向独立训练并 concat 的ELMo,BERT的训练方法都有了很大的进步,BERT是通过改进训练目标来实现深层双向的语言模型训练,待会会单独介绍
  2. BERT再次论证了fine-tuning的策略是可以有很强大的效果的,而且再也不需要为特定的任务进行繁重的结构设计。BERT也是使用fine-tuning策略的模型中第一个无论在句级别或在词级别都获得了state-of-art效果,胜过了不少专为相关任务设计的模型。
  3. BERT在11个NLP任务上获得了state-of-art的效果,在SQuAD v1.1 问答任务上超过人类水平

BERT如此受大家推崇的原因之一当然是其强劲的性能,但另外突出的是其易用性和通用性。BERT的预训练和下游特定任务的训练,在模型上的差别仅仅是顶层的output layer ,而且可以在很多任务上通用。

img

BERT的最大创新是在预训练的时候使用了两个非监督任务

  1. Masked LM (MLM)

在前面的介绍也讲到,作者认为无论是单向的生成式语言模型,还是独立的left-to-right和right-to-left的进行拼接都不如真正的深层双向联合训练。但以标准的语言模型目标,没办法实现双向的训练,因为模型在预测某个单词时,会间接地在多层的上下文中看见“自己”,导致泄露

BERT提供的解决方案就是Mask LM 任务,它会随机mask掉一定比例的token,让它在训练的时候不在输入中出现,并把它们作为目标来训练,这样就可以防止泄露,mask的方式是把token替换成一个固定的token [MASK]。在实际使用的过程中,这会带来一个问题,因为MLM任务是语言模型的训练任务,也就是说[MASK] 这种token只会在语言模型训练时有,在下游模型的fine-tuning时是不会出现的,这就会导致预训练和fine-tuning的数据分布不匹配。为了弥补这个问题,这15%应该被mask掉的token有80%的可能被替换成[MASK],有10%的可能被替换成另外一个随机的token,另有10%的可能会维持原样不变。这样做,可以让Transformer的encoder无法去知道哪个token是要被预测的,也不知道哪个词被替换成随机词了,使它不得不对每一个token都形成一个较好的向量表示,没法取巧。

  1. Next Sentence Prediction (NSP)
    很多任务,包括问答、自然语言推断等是基于理解两句句子之间关系的,不能直接被语言模型所建模,所以BERT还有另外一个二分类任务NSP来捕捉句子间的关系。在构造这个任务的数据集时,会有50%的概率,提供正样本,即某句句子和其下一句句子的组合,50%的概率在语料中选择任意一句句子构成负样本。这个任务相较MLM来说还是相当简单的。

BERT模型细节:

img

我一直认为BERT论文中的这张图画得非常好,将三种模型的结构描绘得十分清楚,我们从右到左再来重温一下,如果对细节想要进一步了解,建议回顾前几期的推送。

  • ELMo模型的核心组件是LSTM。最下方的Embedding层为字向量;中间是两层LSTM,分别有独立的left-to-right 和 right-to-left 的双向网络;双向LSTM的输出在最上方连接,形成包含上下文语义的向量表示。

  • GPT模型的核心组件首次使用了Transformer。最下方的Embedding层为token embedding与position embedding 相加,token embedding的vocab为BPE算法所得;中间为12层的Transformer,语言模型目标为标准的单向条件概率,没有双向的语义能力。

  • BERT模型的核心组件是Transformer。最下方的Embedding为token embedding、segment embedding和position embedding 相加。token embedding的vocab为30000个左右词的Wordpiece embedding;中间的Transformer层取决于两个模型的尺度;因为MLM任务,所以BERT能够捕捉双向的语义特征。

    • BERT-base 12层,hidden size 768,attention heads 12,总参数110M。base的所有尺度都是和GPT做对标的
    • BERT-large 24层,hidden size 1024,attention haads 16,总参数量340M。

BERT的输入也与GPT类似都用了[CLS]和[SEP],相比之下在预训练和finetune都做了规范化和处理,以应对不同的任务。句子开头的token为[CLS],结尾的token为[SEP]。如果输入仅有一句话,那规范化后的tokens是[CLS] [Sentence1] [SEP],如果为两句话,那么规范后的tokens是 [CLS] [Sentence1] [SEP] [Sentence2] [SEP] 。另外,BERT模型还需要输入segment_id,以标识token的每一个位置是属于第一句话还是第二句话的,第一句话的位置上segment_id都是0,第二句话的位置都是1。具体的细节,下一期我打算结合hugging face的transformers的代码来进行进一步的分享。

BERT预训练所用的数据更大了,包含BookCorpus(800M words)和English Wikipedia(2500M words)

对比实验

接下来,文章对BERT模型中对性能产生影响的各个因素进行了对比试验。

首先是预训练任务的影响。LTR指的是Left-to-Right,可以看出最大的收益来源于Transformer替代了BiLSTM,其次是MLM任务带来的双向深层训练,再其次是NSP任务带来的收益。

img各预训练任务带来的影响

接着是模型尺度的影响,可以很明显的在图中看出,总体来说是越大的模型会获得越好的效果。

img模型尺度带来的影响

最后,如果把BERT当作feature-based模型来用,不同层的向量表征所影响的效果,可以看到最好的是最后四层concat起来的结果,其实我们在[文本分类训练技巧] 一文中,专门就这个进行过讨论,有兴趣可以移驾一看。

img不同层向量选择对feature-base模型带来的影响

不得不说,BERT的来到在2018年底给NLP的格局带来了巨大的变化,它让人们对NLP的前景充满了信心和期待,机器在NLP领域真的有了超越人类的可能,令人振奋。但BERT预训练的代价可不小,文中写道,模型batch size为256:(256 sequences * 512 tokens = 128,000 tokens/batch),总共大概在33亿左右的单词上训练了40个epoch。BERT-base在4 Cloud TPUs (16 TPU chips total)上,BERT-large在 16 Cloud TPUs (64 TPU chips total),都训练了大概4天左右才训练完毕。

这么多算力的消耗说实话也让人大吃一惊,换成普通的GPU时间简直是令人绝望的数字。不过下游的任务的预训练和特定任务训练就很快了。对于一般的开发者来说,只要下载在通用语料上预训练的模型,接着进行时间上可接受的下游训练即可,这也就是预训练语言模型给我们带来的魅力!

未完待续

本期的论文就给大家分享到这里,感谢大家的阅读和支持,下期我们大概率会给大家带来实打实的huggingface transformers上相关代码分析,敬请大家期待!

欢迎关注朴素人工智能,这里有很多最新最热的论文阅读分享,有问题或建议可以在公众号下留言。

参考资料

  1. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
    https://arxiv.org/pdf/1810.04805.pdf

推荐阅读

61.[预训练语言模型专题] BERT,开启NLP新时代的王者

本文为预训练语言模型专题系列第五篇

前期回顾:[萌芽时代]、[风起云涌]、[文本分类通用技巧] 、[GPT家族]

感谢清华大学自然语言处理实验室对预训练语言模型架构的梳理,我们将沿此脉络前行,探索预训练语言模型的前沿技术,红色框为前期脚印,绿色框为本期介绍,欢迎大家留言讨论交流。

img

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (2018)

本期将要介绍的就是在NLP领域无人不知,无人不晓的预训练语言模型BERT了,由Google AI在2018年底推出,刚出现就刷新了一大批榜单,甚至在一些任务上超过了人类的表现,令人惊艳。谷歌团队成员Thang Luong在推特上表示,BERT模型开启了NLP的新时代。就其效果、易用性、通用性各方面来说,在当时不愧称为预训练语言模型的王者,压服众多的模型。让我们花十分钟一起,跟着论文来体会BERT的设计思路和重点。

文章在一开始概括了当时的两种不同的预训练语言模型的策略,feature-based 策略及 fine-tuning 策略。

  1. feature-based策略的代表模型为ELMo,它把预训练得到的“向量表示”作为训练下游任务的额外特征。训练下游任务时使用新的任务相关模型,并基于得到的特征来进行进一步的训练。
  2. fine-tuning策略的代表模型为GPT,它则是在训练语言模型后,只改变极少的任务相关的层与参数,直接对下游任务训练整个原来的语言模型。

BERT使用的是后者,因为这种策略需要改变的参数量较少,迁移也较为简单。同时他们指出,现在限制这种策略性能的主要问题是。如GPT这种模型,它预训练时使用了标准语言模型的目标,导致它只能是单向的。在Transformer层中,每个token在self attention 时都只能关注其之前的token,会严重损害在一些任务上如问答上的效果,在之前的不少论文中都佐证了这个观点。所以,使模型能够学习一个文本双向的信息是非常关键的一点。

BERT模型的几大核心贡献:
  1. BERT揭示了语言模型的深层双向学习能力在任务中的重要性,特别是相比于同样在fine-tuning范畴内使用单向生成式训练的GPT以及浅层的双向独立训练并 concat 的ELMo,BERT的训练方法都有了很大的进步,BERT是通过改进训练目标来实现深层双向的语言模型训练,待会会单独介绍
  2. BERT再次论证了fine-tuning的策略是可以有很强大的效果的,而且再也不需要为特定的任务进行繁重的结构设计。BERT也是使用fine-tuning策略的模型中第一个无论在句级别或在词级别都获得了state-of-art效果,胜过了不少专为相关任务设计的模型。
  3. BERT在11个NLP任务上获得了state-of-art的效果,在SQuAD v1.1 问答任务上超过人类水平

BERT如此受大家推崇的原因之一当然是其强劲的性能,但另外突出的是其易用性和通用性。BERT的预训练和下游特定任务的训练,在模型上的差别仅仅是顶层的output layer ,而且可以在很多任务上通用。

img

BERT的最大创新是在预训练的时候使用了两个非监督任务
  1. Masked LM (MLM)

在前面的介绍也讲到,作者认为无论是单向的生成式语言模型,还是独立的left-to-right和right-to-left的进行拼接都不如真正的深层双向联合训练。但以标准的语言模型目标,没办法实现双向的训练,因为模型在预测某个单词时,会间接地在多层的上下文中看见“自己”,导致泄露

BERT提供的解决方案就是Mask LM 任务,它会随机mask掉一定比例的token,让它在训练的时候不在输入中出现,并把它们作为目标来训练,这样就可以防止泄露,mask的方式是把token替换成一个固定的token [MASK]。在实际使用的过程中,这会带来一个问题,因为MLM任务是语言模型的训练任务,也就是说[MASK] 这种token只会在语言模型训练时有,在下游模型的fine-tuning时是不会出现的,这就会导致预训练和fine-tuning的数据分布不匹配。为了弥补这个问题,这15%应该被mask掉的token有80%的可能被替换成[MASK],有10%的可能被替换成另外一个随机的token,另有10%的可能会维持原样不变。这样做,可以让Transformer的encoder无法去知道哪个token是要被预测的,也不知道哪个词被替换成随机词了,使它不得不对每一个token都形成一个较好的向量表示,没法取巧。

  1. Next Sentence Prediction (NSP)

    很多任务,包括问答、自然语言推断等是基于理解两句句子之间关系的,不能直接被语言模型所建模,所以BERT还有另外一个二分类任务NSP来捕捉句子间的关系。在构造这个任务的数据集时,会有50%的概率,提供正样本,即某句句子和其下一句句子的组合,50%的概率在语料中选择任意一句句子构成负样本。这个任务相较MLM来说还是相当简单的。

BERT模型细节:

img

我一直认为BERT论文中的这张图画得非常好,将三种模型的结构描绘得十分清楚,我们从右到左再来重温一下,如果对细节想要进一步了解,建议回顾前几期的推送。

  • ELMo模型的核心组件是LSTM。最下方的Embedding层为字向量;中间是两层LSTM,分别有独立的left-to-right 和 right-to-left 的双向网络;双向LSTM的输出在最上方连接,形成包含上下文语义的向量表示。

  • GPT模型的核心组件首次使用了Transformer。最下方的Embedding层为token embedding与position embedding 相加,token embedding的vocab为BPE算法所得;中间为12层的Transformer,语言模型目标为标准的单向条件概率,没有双向的语义能力。

  • BERT模型的核心组件是Transformer。最下方的Embedding为token embedding、segment embedding和position embedding 相加。token embedding的vocab为30000个左右词的Wordpiece embedding;中间的Transformer层取决于两个模型的尺度;因为MLM任务,所以BERT能够捕捉双向的语义特征。

    • BERT-base 12层,hidden size 768,attention heads 12,总参数110M。base的所有尺度都是和GPT做对标的
    • BERT-large 24层,hidden size 1024,attention haads 16,总参数量340M。

BERT的输入也与GPT类似都用了[CLS]和[SEP],相比之下在预训练和finetune都做了规范化和处理,以应对不同的任务。句子开头的token为[CLS],结尾的token为[SEP]。如果输入仅有一句话,那规范化后的tokens是[CLS] [Sentence1] [SEP],如果为两句话,那么规范后的tokens是 [CLS] [Sentence1] [SEP] [Sentence2] [SEP] 。另外,BERT模型还需要输入segment_id,以标识token的每一个位置是属于第一句话还是第二句话的,第一句话的位置上segment_id都是0,第二句话的位置都是1。具体的细节,下一期我打算结合hugging face的transformers的代码来进行进一步的分享。

BERT预训练所用的数据更大了,包含BookCorpus(800M words)和English Wikipedia(2500M words)

对比实验

接下来,文章对BERT模型中对性能产生影响的各个因素进行了对比试验。

首先是预训练任务的影响。LTR指的是Left-to-Right,可以看出最大的收益来源于Transformer替代了BiLSTM,其次是MLM任务带来的双向深层训练,再其次是NSP任务带来的收益。

img

各预训练任务带来的影响

接着是模型尺度的影响,可以很明显的在图中看出,总体来说是越大的模型会获得越好的效果。

img

模型尺度带来的影响

最后,如果把BERT当作feature-based模型来用,不同层的向量表征所影响的效果,可以看到最好的是最后四层concat起来的结果,其实我们在[文本分类训练技巧] 一文中,专门就这个进行过讨论,有兴趣可以移驾一看。

img

不同层向量选择对feature-base模型带来的影响

不得不说,BERT的来到在2018年底给NLP的格局带来了巨大的变化,它让人们对NLP的前景充满了信心和期待,机器在NLP领域真的有了超越人类的可能,令人振奋。但BERT预训练的代价可不小,文中写道,模型batch size为256:(256 sequences * 512 tokens = 128,000 tokens/batch),总共大概在33亿左右的单词上训练了40个epoch。BERT-base在4 Cloud TPUs (16 TPU chips total)上,BERT-large在 16 Cloud TPUs (64 TPU chips total),都训练了大概4天左右才训练完毕。

这么多算力的消耗说实话也让人大吃一惊,换成普通的GPU时间简直是令人绝望的数字。不过下游的任务的预训练和特定任务训练就很快了。对于一般的开发者来说,只要下载在通用语料上预训练的模型,接着进行时间上可接受的下游训练即可,这也就是预训练语言模型给我们带来的魅力!

未完待续

本期的论文就给大家分享到这里,感谢大家的阅读和支持,下期我们大概率会给大家带来实打实的huggingface transformers上相关代码分析,敬请大家期待!

欢迎关注朴素人工智能,这里有很多最新最热的论文阅读分享,有问题或建议可以在公众号下留言。

参考资料
  1. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    https://arxiv.org/pdf/1810.04805.pdf

推荐阅读

62.一步步解析Attention is All You Need!

img小小挖掘机2018-12-11

本文将通过细节剖析以及代码相结合的方式,来一步步解析Attention is all you need这篇文章。

这篇文章的下载地址为:https://arxiv.org/abs/1706.03762

本文边讲细节边配合代码实战,代码地址为:https://github.com/princewen/tensorflow_practice/tree/master/basic/Basic-Transformer-Demo

数据地址为:https://pan.baidu.com/s/14XfprCqjmBKde9NmNZeCNg密码:lfwu

好了,废话不多说,我们进入正题!我们从简单到复杂,一步步介绍该模型的结构!

1、整体架构

模型的整体框架如下:

img

整体架构看似复杂,其实就是一个Seq2Seq结构,简化一下,就是这样的:

img

Encoder的输出和decoder的结合如下,即最后一个encoder的输出将和每一层的decoder进行结合:

img

好了,我们主要关注的是每一层Encoder和每一层Decoder的内部结构。如下图所示:

img

可以看到,Encoder的每一层有两个操作,分别是Self-Attention和Feed Forward;而Decoder的每一层有三个操作,分别是Self-Attention、Encoder-Decoder Attention以及Feed Forward操作。这里的Self-Attention和Encoder-Decoder Attention都是用的是Multi-Head Attention机制,这也是我们本文重点讲解的地方。

在介绍之前,我们先介绍下我们的数据,经过处理之后,数据如下:

img

很简单,上面部分是我们的x,也就是encoder的输入,下面部分是y,也就是decoder的输入,这是一个机器翻译的数据,x中的每一个id代表一个语言中的单词id,y中的每一个id代表另一种语言中的单词id。后面为0的部分是填充部分,代表这个句子的长度没有达到我们设置的最大长度,进行补齐。

2、Position Embedding

给定我们的输入数据,我们首先要转换成对应的embedding,由于我们后面要在计算attention时屏蔽掉填充的部分,所以这里我们对于填充的部分的embedding直接赋予0值。Embedding的函数如下:

在本文中,Embedding操作不是普通的Embedding而是加入了位置信息的Embedding,我们称之为Position Embedding。因为在本文的模型中,已经没有了循环神经网络这样的结构,因此序列信息已经无法捕捉。但是序列信息非常重要,代表着全局的结构,因此必须将序列的分词相对或者绝对position信息利用起来。位置信息的计算公式如下:

其中pos代表的是第几个词,i代表embedding中的第几维。这部分的代码如下,对于padding的部分,我们还是使用全0处理。

所以对于输入,我们调用上面两个函数,并将结果相加就能得到最终Position Embedding的结果:

3、Multi-Head Attention

3.1 Attention简单回顾

Attention其实就是计算一种相关程度,看下面的例子:

img

Attention通常可以进行如下描述,表示为将query(Q)和key-value pairs映射到输出上,其中query、每个key、每个value都是向量,输出是V中所有values的加权,其中权重是由Query和每个key计算出来的,计算方法分为三步:

1)计算比较Q和K的相似度,用f来表示:

2)将得到的相似度进行softmax归一化:

3)针对计算出来的权重,对所有的values进行加权求和,得到Attention向量:

img

计算相似度的方法有以下4种:

img

在本文中,我们计算相似度的方式是第一种,本文提出的Attention机制称为Multi-Head Attention,不过在这之前,我们要先介绍它的简单版本Scaled Dot-Product Attention。

计算Attention首先要有query,key和value。我们前面提到了,Encoder的attention是self-attention,Decoder里面的attention首先是self-attention,然后是encoder-decoder attention。这里的两种attention是针对query和key-value来说的,对于self-attention来说,计算得到query和key-value的过程都是使用的同样的输入,因为要算自己跟自己的attention嘛;而对encoder-decoder attention来说,query的计算使用的是decoder的输入,而key-value的计算使用的是encoder的输出,因为我们要计算decoder的输入跟encoder里面每一个的相似度嘛。

因此本文下面对于attention的讲解,都是基于self-attention来说的,如果是encoder-decoder attention,只要改一下输入即可,其余过程都是一样的。

3.2 Scaled Dot-Product Attention

Scaled Dot-Product Attention的图示如下:

img

接下来,我们对上述过程进行一步步的拆解:

First Step-得到embedding

给定我们的输入数据,我们首先要转换成对应的position embedding,效果图如下,绿色部分代表填充部分,全0值:

img

得到Embedding的过程我们上文中已经介绍过了,这里不再赘述。

Second Step-得到Q,K,V

计算Attention首先要有Query,Key和Value,我们通过一个线性变换来得到三者。我们的输入是position embedding,过程如下:

img

代码也很简单,下面的代码中,如果是self-attention的话,query和key-value输入的embedding是一样的。padding的部分由于都是0,结果中该部分还是0,所以仍然用绿色表示.

Third-Step-计算相似度

接下来就是计算相似度了,我们之前说过了,本文中使用的是点乘的方式,所以将Q和K进行点乘即可,过程如下:

img

文中对于相似度还除以了dk的平方根,这里dk是key的embedding长度。

这一部分的代码如下:

你可能注意到了,这样做其实是得到了一个注意力的矩阵,每一行都是一个query和所有key的相似性,对self-attention来说,其效果如下:

img

不过我们还没有进行softmax归一化操作,因为我们还需要进行一些处理。

Forth-Step-增加mask

刚刚得到的注意力矩阵,我们还需要做一下处理,主要有:

query和key有些部分是填充的,这些需要用mask屏蔽,一个简单的方法就是赋予一个很小很小的值或者直接变为0值。

对于decoder的来说,我们是不能看到未来的信息的,所以对于decoder的输入,我们只能计算它和它之前输入的信息的相似度。

我们首先对key中填充的部分进行屏蔽,我们之前介绍了,在进行embedding时,填充的部分的embedding 直接设置为全0,所以我们直接根据这个来进行屏蔽,即对embedding的向量所有维度相加得到一个标量,如果标量是0,那就代表是填充的部分,否则不是:

这部分的代码如下:

经过这一步处理,效果如下,我们下图中用深灰色代表屏蔽掉的部分:

img

接下来的操作只针对Decoder的self-attention来说,我们首先得到一个下三角矩阵,这个矩阵主对角线以及下方的部分是1,其余部分是0,然后根据1或者0来选择使用output还是很小的数进行填充:

得到的效果如下图所示:

img

接下来,我们对query的部分进行屏蔽,与屏蔽key的思路大致相同,不过我们这里不是用很小的值替换了,而是直接把填充的部分变为0:

经过这一步,Encoder和Decoder得到的最终的相似度矩阵如下,上边是Encoder的结果,下边是Decoder的结果:

img

接下来,我们就可以进行softmax操作了:

Fifth-Step-得到最终结果

得到了Attention的相似度矩阵,我们就可以和Value进行相乘,得到经过attention加权的结果:

img

这一部分是一个简单的矩阵相乘运算,代码如下:

不过这并不是最终的结果,这里文中还加入了残差网络的结构,即将最终的结果和queries的输入进行相加:

所以一个完整的Scaled Dot-Product Attention的代码如下:

3.3 Multi-Head Attention

Multi-Head Attention就是把Scaled Dot-Product Attention的过程做H次,然后把输出合起来。论文中,它的结构图如下:

img

这部分的示意图如下所示,我们重复做3次相似的操作,得到每一个的结果矩阵,随后将结果矩阵进行拼接,再经过一次的线性操作,得到最终的结果:

img

Scaled Dot-Product Attention可以看作是只有一个Head的Multi-Head Attention,这部分的代码跟Scaled Dot-Product Attention大同小异,我们直接贴出:

4、Position-wise Feed-forward Networks

在进行了Attention操作之后,encoder和decoder中的每一层都包含了一个全连接前向网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出:

代码如下:

5、Encoder的结构

Encoder有N(默认是6)层,每层包括两个sub-layers:

1 )第一个sub-layer是multi-head self-attention mechanism,用来计算输入的self-attention;

2 )第二个sub-layer是简单的全连接网络。

每一个sub-layer都模拟了残差网络的结构,其网络示意图如下:

img

根据我们刚才定义的函数,其完整的代码如下:

6、Decoder的结构

Decoder有N(默认是6)层,每层包括三个sub-layers:

1 )第一个是Masked multi-head self-attention,也是计算输入的self-attention,但是因为是生成过程,因此在时刻 i 的时候,大于 i 的时刻都没有结果,只有小于 i 的时刻有结果,因此需要做Mask.

2 )第二个sub-layer是对encoder的输入进行attention计算,这里仍然是multi-head的attention结构,只不过输入的分别是decoder的输入和encoder的输出。

3 )第三个sub-layer是全连接网络,与Encoder相同。

其网络示意图如下:

img

其代码如下:

7、模型输出

decoder的输出会经过一层全联接网络和softmax得到最终的结果,示意图如下:

img

这样,一个完整的Transformer Architecture我们就介绍完了,对于文中写的不清楚或者不到位的地方,欢迎各位留言指正!

参考文献

1、原文:https://arxiv.org/abs/1706.03762

2、https://mp.weixin.qq.com/s/RLxWevVWHXgX-UcoxDS70w

3、https://github.com/princewen/tensorflow_practice/tree/master/basic/Basic-Transformer-Demo

63. 对Transformer,XLNet,ALBERT等技术仍然一知半解?再不学习就OUT了!

NLP领域的现状以及AI工程师面临的严峻挑战

在过去几年时间里,NLP领域取得了飞速的发展,这也推动了NLP在产业中的持续落地,以及行业对相关人才的需求。 虽然,NLP的崛起滞后CV多年,但目前的势头还是势不可挡。

但这里我们要面对的现实是,行业上90%以上的NLP工程师是“不合格的”。在过去几个月时间里,我们其实也面试过数百名已经在从事NLP的工程师,但明显发现绝大部分对技术深度和宽度的理解是比较薄弱的,大多还是只停留在调用现有工具比如BERT、XLNet等阶段。

我们一直坚信AI人才的最大壁垒是创造力,能够持续为变化的业务带来更多的价值。但创造的前提一定是对一个领域的深度理解和广度认知,以及不断对一个事物的追问比如不断问自己为什么。

为什么在这个问题上使用Adam,而不是GD或者Adagrad? 对于特定的业务场景,我应该如何把领域知识考虑进去, 用先验,还是用限制条件? 对于拼车场景,设计了一套优化目标,但好像是离散优化问题,应该如何解决? 对于二分类,我应该选择交叉熵还是Hinge Loss?BERT模型太大了,而且效果发现不那么好比如next sentence prediction, 能不能改一改? 为什么CRF要不HMM在不少NLP问题上效果更好? 文本生成效果不太好,如何改造Beam Search让效果更好呢?训练主题模型效率太慢了,如果改造吉布斯采样在分布式环境下运行呢? 数据样本里的标签中有一些依赖关系,能不能把这些信息也加入到目标函数里呢?

另外,有必要保持对前沿技术的敏感性,但事实上,很多人还是由于各种原因很难做到这一点。基于上述的目的,贪心学院一直坚持跑在技术的最前线,帮助大家不断地成长。

为什么选择贪心学院的高端NLP?

首先,全网不可能找得到另外一门系统性的训练营具备如此的深度和广度,这里包括国外的课程,所以从内容的角度来讲是非常稀缺的内容。

其次,即便网络上的资源非常多,学习是需要成本的,而且越有深度的内容越难找到好的学习资源。如果一门课程帮助你清晰地梳理知识体系,而且把有深度的知识点脉络讲清楚,这就是节省最大的成本。

另外,作为一家专注在AI领域的教育科技公司,教研团队的实力在同行业可以算是非常顶尖的,这里不乏顶会的最佳论文作者、ALBERT的作者等。

最后,我们这一期的NLP高阶训练营(第七期)在原有的基础上做了大量的升级,融合了更多前沿的内容,而且在部分内容上加深了难度。

img

img

img

img

img

img

img

为AI从业者/研究生/研究员专门定制

全网唯一《NLP自然语言处理高阶训练营》

对课程有意向的同学

添加课程顾问小姐姐微信

报名、课程咨询

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/317656
推荐阅读
相关标签