请介绍几种常用的参数更新方法。

梯度下降:在一个方向上更新和调整模型的参数,来最小化损失函数。

随机梯度下降(Stochastic gradient descent,SGD)对每个训练样本进行参数更新,每次执行都进行一次更新,且执行速度更快。

为了避免SGD和标准梯度下降中存在的问题,一个改进方法为小批量梯度下降(Mini Batch Gradient Descent),因为对每个批次中的n个训练样本,这种方法只执行一次更新。

使用小批量梯度下降的优点是:

  • 可以减少参数更新的波动,最终得到效果更好和更稳定的收敛。
  • 还可以使用最新的深层学习库中通用的矩阵优化方法,使计算小批量数据的梯度更加高效。
  • 通常来说,小批量样本的大小范围是从50到256,可以根据实际问题而有所不同。
  • 在训练神经网络时,通常都会选择小批量梯度下降算法。

SGD方法中的高方差振荡使得网络很难稳定收敛,所以有研究者提出了一种称为动量(Momentum)的技术,通过优化相关方向的训练和弱化无关方向的振荡,来加速SGD训练。

Nesterov梯度加速法,通过使网络更新与误差函数的斜率相适应,并依次加速SGD,也可根据每个参数的重要性来调整和更新对应参数,以执行更大或更小的更新幅度。

AdaDelta方法是AdaGrad的延伸方法,它倾向于解决其学习率衰减的问题。Adadelta不是累积所有之前的平方梯度,而是将累积之前梯度的窗口限制到某个固定大小w。

Adam算法即自适应时刻估计方法(Adaptive Moment Estimation),能计算每个参数的自适应学习率。这个方法不仅存储了AdaDelta先前平方梯度的指数衰减平均值,而且保持了先前梯度M(t)的指数衰减平均值,这一点与动量类似。

Adagrad方法是通过参数来调整合适的学习率η,对稀疏参数进行大幅更新和对频繁参数进行小幅更新。因此,Adagrad方法非常适合处理稀疏数据。

文末免费送电子书:七月在线干货组最新 升级的《名企AI面试100题》免费送!

对于长度较长的语料,如何使用Bert进行训练?

对于长文本,有两种处理方式,截断和切分。

  • 截断:一般来说文本中最重要的信息是开始和结尾,因此文中对于长文本做了截断处理。

head-only:保留前510个字符

tail-only:保留后510个字符

head+tail:保留前128个和后382个字符

  • 切分: 将文本分成k段,每段的输入和Bert常规输入相同,第一个字符是[CLS]表示这段的加权信息。文中使用了Max-pooling, Average pooling和self-attention结合这些片段的表示。

NLP相关任务在样本量较少的情况下如何扩充样本数量?

同义词替换(SR: Synonyms Replace):不考虑stopwords,在句子中随机抽取n个词,然后从同义词词典中(wordnet)随机抽取同义词,并进行替换。

2. 随机插入(RI: Randomly Insert):不考虑stopwords,随机抽取一个词,然后在该词的同义词集合中随机选择一个,插入原句子中的随机位置。该过程可以重复n次。

3. 随机交换(RS: Randomly Swap):句子中,随机选择两个词,位置交换。该过程可以重复n次。

4. 随机删除(RD: Randomly Delete):句子中的每个词,以概率p随机删除。

5. 基于词向量的替换

基于同义词的替换由于一词多义问题的存在,可能会使替换后的文档语义发生改变,基于词embeddings的替换可在一定程度上避免上述问题。假如已经获得词向量(Word2Vec, GloVe, FastText, Sent2Vec,BERT等),在词向量空间,选择与该词在空间上相近的词作为其同义词进行词向量的替换。

优点:使用词向量的方式从语义空间来进行选择候选词,考虑了实际的语义特征,替换比较准确

缺点:这种方法在选择上下文无关词向量预训练方式下获得的词向量时,仍然具有一定的偏差,比如Word2Vec, GloVe等(仍旧无法解决一词多义问题),考虑使用ELMO、BERT等预训练模型产生的上下文相关的词向量

6. 回译

所谓回译,就是将一种语言的语料翻译为另一种语言,然后再翻译回来的方法。对回译回来的文本,检查其是否与源文档相同,完全相同的话可以抛弃,否则留用。

这种方法在增强文本相似数据集时很有用,尤其是从无到有的构建文本相似数据集。目前,百度翻译、谷歌翻译、微软翻译、MarianMT都提供了可用API给开发者(但是不要大规模的无间断的不停歇请求),可以很方便的完成这一任务。

优点:回译之后的文本在语法结构、选词用词等方面进行了丰富的变换,目前的翻译技术比较成熟,可以提供较高质量的增强数据。

7. 随机噪音注入

与上述语义相似变换有所不同,这种增强方法主要通过向样本中注入噪音以达到增强模型的鲁棒性的效果,这通常是基于一个假设:对样本进行少量的干扰,模型对其预测的结果具有一致性。这样的模型鲁棒性更好,容错性更强。

layer normlization和batch normlization的区别

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

BatchNorm的缺点:

1.需要较大的batch以体现整体数据分布

2.训练阶段需要保存每个batch的均值和方差,以求出整体均值和方差在infrence阶段使用

3.不适用于可变长序列的训练,如RNN

Layer Normalization

Layer Normalization是一个独立于batch size的算法,所以无论一个batch样本数多少都不会影响参与LN计算的数据量,从而解决BN的两个问题。LN的做法是根据样本的特征数做归一化。Layer Normalization不依赖于batch的大小和输入sequence的深度,因此可以用于batch-size为1和RNN中对边长的输入sequence的normalize操作。但在大批量的样本训练时,效果没BN好。

实践证明,LN用于RNN进行Normalization时,取得了比BN更好的效果。但用于CNN时,效果并不如BN明显。

讲讲multi-head attention的具体结构

BERT由12层transformer layer(encoder端)构成,首先word emb , pos emb(可能会被问到有哪几种position embedding的方式,bert是使用的哪种), sent emb做加和作为网络输入,每层由一个multi-head attention, 一个feed forward 以及两层layerNorm构成,一般会被问到multi-head attention的结构,具体可以描述为, step1 一个768的hidden向量,被映射成query, key, value。 然后三个向量分别切分成12个小的64维的向量,每一组小向量之间做attention。不妨假设batch_size为32,seqlen为512,隐层维度为768,12个head

hidden(32 x 512 x 768) -> query(32 x 512 x 768) -> 32 x 12 x 512 x 64

hidden(32 x 512 x 768) -> key(32 x 512 x 768) -> 32 x 12 x 512 x 64

hidden(32 x 512 x 768) -> val(32 x 512 x 768) -> 32 x 12 x 512 x 64 step2 然后query和key之间做attention,得到一个32 x 12 x 512 x 512的权重矩阵,然后根据这个权重矩阵加权value中切分好的向量,得到一个32 x 12 x 512 x 64 的向量,拉平输出为768向量。

32 x 12 x 512 x 64(query_hidden) * 32 x 12 x 64 x 512(key_hidden) -> 32 x 12 x 512 x 512

32 x 12 x 64 x 512(value_hidden) * 32 x 12 x 512 x 512 (权重矩阵) -> 32 x 12 x 512 x 64

然后再还原成 -> 32 x 512 x 768

简言之是12个头,每个头都是一个64维度分别去与其他的所有位置的hidden embedding做attention然后再合并还原。

**帮助数千人成功上岸的《名企AI面试100