赞
踩
参数都初始化为0的问题
w初始化全为0,使得在反向传播的过程中所有参数结点可能变得相同,进而很可能直接导致模型失效,无法收敛。因此应该把参数初始化为随机值。
逻辑回归和线性回归的本质区别
2.1 损失函数有哪些
2.2 多分类下的softmax损失函数
L = ∑ i N ∑ k = 1 C y ( i k ) l o g ( y ^ ( i k ) ) L = \sum{_{i}^{N}}\sum{_{k=1}^{C}}y^{(ik)}log(\hat{y}^{(ik)}) L=∑iN∑k=1Cy(ik)log(y^(ik))
2.3 softmax交叉熵反向推导公式
self-attention的作用
自注意力(self-attention)层,这层帮助编码器在对每个单词编码时关注输入句子的其他单词。
4.1 梯度消失和梯度爆炸的原因
反向传播算法中要对激活函数进行求导,如果此部分大于1,那么神经网络层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着神经网络层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。梯度消失也和激活函数的选择有很大关系,如果激活函数选择不合适,在进行链式求导的时候其结果小于1,就非常容易发生梯度消失。
4.2 梯度消失和梯度爆炸的解决方案
预训练加微调
加入正则化
梯度修剪
选择合适的激活函数,relu、leakrelu、elu等激活函数
batchnorm
Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。
LSTM
LSTM全称是长短期记忆网络(long-short term memory networks),是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”(gates),如下图,LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“,因此,经常用于生成文本中。
5.1 解读Transformer, 一篇文章解决
5.2 解读BERT
上图中的Trm就对应Transformer结构中左侧的Transformer Block。其中的
T
1
,
T
2
,
.
.
.
,
T
N
T_{1}, T_{2},..., T_{N}
T1,T2,...,TN对应的就是由BERT得到的词向量。
5.3 BERT的微调策略
预训练的长本文,因为Bert的最长文本序列是512
层数选择,每一层都会捕获不同的信息,因此我们需要选择最适合的层数
过拟合问题,因此需要考虑合适的学习率。Bert的底层会学习到更多的通用的信息,文中对Bert的不同层使用了不同的学习率。 每一层的参数迭代可以如下所示:
θ t l = θ t l − 1 − \theta_{t}^{l}=\theta_{t}^{l-1}- θtl=θtl−1−
5.4 BERT如何使用transformer的encoding模块
5.5 BERT的输入和transformer有什么不同
与Transformer本身的Encoder端相比,BERT的Transformer Encoder端输入的向量表示,多了Segment Embeddings。
5.5.1 BERT的输入是包括三部分
5.5.2 Transformer的输入
Transformer的输入涉及到两个部分既word embedding 和position embedding。没有段向量以CLS和SEP标识符。
5.6 BERT的缺点
6.1 为什么使用交叉熵而不用平方差
在激活函数是sigmoid之类的函数的时候,用平方损失的话会导致误差比较小的时候梯度很小,这样就没法继续训练了,这时使用交叉熵损失就可以避免这种衰退
6.2 交叉熵公式(二分类)
单个样本的损失函数
y ^ = P ( y = 1 ∣ x ) \hat{y} = P(y=1|x) y^=P(y=1∣x)
1 − y ^ = P ( y = 0 ∣ x ) 1-\hat{y} = P(y=0|x) 1−y^=P(y=0∣x)
从极大似然情况组合以上两个公式
P ( y ∣ x ) = y ^ y ⋅ ( 1 − y ^ ) 1 − y P(y|x)=\hat{y}^y \cdot (1-\hat{y})^{1-y} P(y∣x)=y^y⋅(1−y^)1−y
l o g ( P ( y ∣ x ) ) = l o g ( y ^ y ⋅ ( 1 − y ^ ) 1 − y ) = y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) log(P(y|x)) = log(\hat{y}^y \cdot (1-\hat{y})^{1-y}) = y log\hat{y} + (1-y) log(1-\hat{y}) log(P(y∣x))=log(y^y⋅(1−y^)1−y)=ylogy^+(1−y)log(1−y^)
所有样本的损失函数
我们期望 l o g ( P ( y ∣ x ) ) log(P(y|x)) log(P(y∣x)) 越大越好,所以既有下列损失函数,使得 L L L 越小越好。
L = ∑ − [ y ( i ) l o g y ^ ( i ) + ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ] L=\sum{-[y^{(i)} log\hat{y}^{(i)} + (1-y^{(i)}) log(1-\hat{y}^{(i)})]} L=∑−[y(i)logy^(i)+(1−y(i))log(1−y^(i))](二分类的交叉熵损失函数)
L = − ∑ i N ∑ c = 1 M y ( i ) l o g ( y ^ ( i ) ) L = -\sum{_{i}^{N}\sum_{c=1}^{M}}y^{(i)}log(\hat{y}^{(i)}) L=−∑iNc=1∑My(i)log(y^(i)) (多分类的交叉熵损失函数)
其他文章对交叉熵函数的一些解释
6.3 手推Softmax交叉熵损失函数
8.1 Bagging 和 Boosting的区别
8.1.1 Bagging
Bagging 的核心思路是——民主。
Bagging 的思路是所有基础模型都一致对待,每个基础模型手里都只有一票。然后使用民主投票的方式得到最终的结果。
具体的过程:
8.1.2 Boosting
Boosting 的核心思路是——挑选精英。
Boosting 和 bagging 最本质的差别在于他对基础模型不是一致对待的,而是经过不停的考验和筛选来挑选出「精英」,然后给精英更多的投票权,表现不好的基础模型则给较少的投票权,然后综合所有人的投票得到最终结果。
具体过程:
8.1.3 Bagging 和 Boosting 的 4 点差别
样本选择上:
样例权重:
预测函数:
并行计算:
8.2 XGBoot,LGB 和 GBDT的区别
随机梯度下降 (SGD):相对于梯度下降,可以看到多了随机两个字,随机也就是说我每次用样本中的一个例子来近似我所有的样本,用这一个例子来计算梯度并用这个梯度来更新 θ \theta θ。因为每次只用了一个样本因而容易陷入到局部最优解中。
批量随机梯度下降 (mini-SGD):他用了一些小样本来近似全部的,其本质就是1个样本的近似不一定准,那就用更大的30个或50个样本来近似。将样本分成m个mini-batch,每个mini-batch包含n个样本;在每个mini-batch里计算每个样本的梯度,然后在这个mini-batch里求和取平均作为最终的梯度来更新参数;然后再用下一个mini-batch来计算梯度,如此循环下去直到m个mini-batch操作完就称为一个epoch结束。
CRF和HMM并不是多么明白。
利用中文分词实例讲解HMM
http://yanyiwu.com/work/2014/04/07/hmm-segment-xiangjie.html
两者的区别
L1正则化指的是权值向量 w w w 中各个元素的绝对值之和,通常表示为 ∣ ∣ w ∣ ∣ 1 ||w||_{1} ∣∣w∣∣1
L2正则化指的是权值向量 w w w 中各个元素的平方和然后再求平方根,通常表示为 ∣ ∣ w ∣ ∣ 2 ||w||_{2} ∣∣w∣∣2
L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合
SVM的优点
SVM缺点
定义: 过拟合就是模型在训练集上表现很好,能对训练数据充分拟合,误差也很小,但是在训练集上表现很差,泛化性不好。
产生原因:数据不够,模型太复杂
从数据集中随机选择K个聚类样本作为初始的聚类中心,然后计算数据集中每个样本到这K个聚类中心的距离,并将此样本分到距离最小的聚类中心所对应的类中。将所有样本归类后,对于每个类别重新计算每个类别的聚类中心既每个类中所有样本的质心,重复以上操作直到聚类中心不变为止。
RNN
s
t
=
t
a
n
h
(
U
x
t
+
W
s
t
−
1
)
o
t
=
s
o
f
t
m
a
x
(
V
s
t
)
s_{t} = tanh(Ux_{t}+Ws_{t-1})\\ o_{t} = softmax(Vs_{t})
st=tanh(Uxt+Wst−1)ot=softmax(Vst)
LSTM
什么是支持向量机?
支持向量机是一个二分类模型,他的基本模型定义为特征空间上的间隔最大的线性分类器。而他的学习策略为最大化分类间隔,最终可以转化为凸二次规划问题求解。SVM的目标是寻找一个最优化超平面在空间中分割两类数据,这个最优的超平面需要满足的条件是:离其最近的点到其的距离最大化,这些点也称为支持向量
SVM什么时候用线性核什么时候用高斯核
SVM的优化目标函数
SVM的损失函数
SVM引入对偶函数的目的
SVM和LR的区别
LR是参数模型,而SVM是非参数模型.
在统计学中,参数模型通常假设总体服从某个分布,这个分布可以由一些参数确定,如正态分布由均值和标准差确定,在此基础上构建的模型称为参数模型;非参数模型对于总体的分布不做任何假设或者说是数据分布假设自由,只知道其分布是存在的,所以就无法得到其分布的相关参数,只能通过非参数统计的方法进行推断。所以说,参数模型和非参数模型中的“参数”并不是模型中的参数,而是数据分布的参数。
LR采用的损失函数是logistical loss,而SVM采用的是合页损失
在学习分类器时,SVM只是考虑少量支持向量点,而LR是考虑所有的点
完整推导SVM
各种trick
算法流程:
缺点
K值的确定
1. 样本的选取
bagging采取有放回的采样方式得到训练弱分类器的训练集;boosting则会考虑所有的样本,但是每次训练样本的权重不一样,权重值会根据上一轮的分类结果做调整。
2. 样例权重
bagging是均匀取样,样本的权重一样;boosting会根据错误率调整权重,错误率越大权重值越大。
3. 预测函数
bagging的预测函数间是平等的权重相同,最后的预测结果通过类似于投票的方式得到;boosting的每个弱分类器都有对应的权重,对于分类误差小的分类器会有更大的权重。
4. 并行计算
bagging的各个分类器可以并行生成;boosting只能顺序生成,因为后一个模型参数需要前一轮模型的训练结果。
xgboost的并行是在特征粒度上的。决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,这个block结构使得并行成为了可能。在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
Adaboot是不断调整样本的权重和学得的弱分类器的权重来得到最后的分类模型;而GBDT是通过拟合负梯度来得到最后的模型,尤其是当GBDT中选择的损失函数是方差时,计算损失函数函数的负梯度值在当前模型的值就是残差。
执行原理的不同:
两者的相同点:
两者的区别
Tnesorflow是用数据流图来进行数值的计算的,而数据流图是描述有向图的数值计算过程。在有向图中,结点表述为数学运算,边表示为传输多维数据,节点也可以被分配到计算设备上并行的执行操作。
其主要思想是:如果在一篇文章中一个词的出现频率高,并且语料库中其他文章包含这个词的概率小,那么这个词可以被选作关键词使用。
TF
T
F
=
n
i
∑
n
i
TF = \frac{n_i}{\sum{n_i}}
TF=∑nini
n
i
n_i
ni:一篇文章中一个词出现的次数
∑
n
i
\sum{n_i}
∑ni:这篇文章的总词数
可以看出一个词的TF值随着它在这篇文章中出现频率的增加而增加。
IDF
在其他文章出现的频率(Inverse Document Frequency)很少的词应该比出现频率高的词更有代表性
I
D
F
=
l
g
∣
D
∣
∣
j
:
t
i
∈
d
j
∣
+
1
IDF = lg\frac{|D|}{|j:t_i\in d_j|+1}
IDF=lg∣j:ti∈dj∣+1∣D∣
|D|: 语料库中的文件总数
∣
j
:
t
i
∈
d
j
∣
+
1
|j:t_i\in d_j|+1
∣j:ti∈dj∣+1: 包含这个词语的文章总数
注:+1的目的是防止这个词语在语料中没有出现导致分母为0的问题
TF-IDF
一个词的IDF值随着语料库中包含这个词的文章数目的减小而增大
T F − I D F = T F ∗ I D F TF-IDF = TF*IDF TF−IDF=TF∗IDF
#定义TF-IDF的计算过程
def D_con(word, count_list):
D_con = 0
for count in count_list:
if word in count:
D_con += 1
return D_con
def tf(word, count):
return count[word] / sum(count.values())
def idf(word, count_list):
return math.log(len(count_list)) / (1 + D_con(word, count_list))
def tfidf(word, count, count_list):
return tf(word, count) * idf(word, count_list)
这里主要对牛客网的面经中不熟悉的点再手敲一遍,加深记忆。
由于神经网络层数的加深,在反向传播时底层的神经网络可能发生梯度消失的问题,BatchNormalization的作用就是规范化输入,把不规范的分布拉到正态分布,使得数据能够分布在激活函数的敏感区域。进而可以使得梯度变大,加快学习的收敛速度,避免梯度消失的问题。
由于激活函数选取不合适,在反向传播的过程中,梯度值趋于0,无法有效的反向传播,进而导致梯度消失。
RNN 利用内部的记忆机制来处理任意序列的输入序列,并且在处理单元之间既有内部的反馈链接又有前馈链接,这使得RNN可以更容易处理不分段的文本内容。
若卷积神经网络的上一层有N个卷积核,则对应的通道数也为N。设群体数目为M,在进行卷积操作的时候,那么该群卷积层的操作就是,先将channel分成M份。每一个group对应N/M个channel,与之独立连接。然后各个group卷积完成后将输出叠在一起(concatenate),作为这一层的输出channel。
一个序列中的当前输出不仅和当前的输入和前一个时间序列的输出有关,还可能和之前序列的隐藏层状态有关。RNN的机构中,当前隐藏层状态不仅包含当前的输入信息,还包括之前序列的隐藏层状态。网络会对之前的信息进行记忆并应用于当前的输入计算中。
不能说明模型无效;导致不收敛的原因可能是数据分类的标注不准确,样本信息量太大导致模型不足以fit整个样本空间。学习率设置太大容易产生震荡,太小容易不收敛。数据没有进行归一化操作等
因为两者有相同的感受野,但是前者的参数更少。
Sigmoid只在0的附近时有比较好的激活性,而在正负饱和区的梯度趋近于0,从而产生梯度消失问题;而relu在大于0的部分梯度为常数,所以不会有梯度消失。ReLU的导数计算更快。ReLU在负半导数区为0,所以神经元激活值为负时,梯度为0,此神经元不参与训练,具有稀疏性。
计算同一个深度切片的神经元时采用的滤波器是共享的
relu,sigmoid,tanh
实践中的数据集质量参差不齐,可以使用训练好的网络来进行特征提取。把训练好的网络当作特征提取器。
在神经网络的计算过程中,对于神经单元按照一定的概率将其随机从网络中丢弃,从而达到对于每个mini-batch都是在训练不同的网络的效果,防止过拟合。
batch size过小,花费时间多,同时梯度震荡严重,不利于收敛;batch size过大,不同batch的梯度方向没有任何变化,容易陷入局部极小值。
16.优化器Adam
Adam算法和传统的SGD不同。SGD保持单一的学习率更新所有权重,学习率在训练过程中不会改变。而Adam通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应学习率。
17.RNN梯度消失问题,为什么LSTM和GRU可以解决此问题
RNN由于网络比较深,后面层的输出误差很难影响到前面层的计算,RNN的某一单元主要受他附近单元的影响。而LSTM可以通过阀门记忆一些长期的信息,相应的保留了更多的梯度。而GRU也可以通过重置和更新两个阀门保留长期的记忆,进而相对解决梯度消失的问题。
18.1*1卷积的作用
19.如何提升模型泛化能力
20. RNN和LSTM的区别
21.如何防止过拟合
22. 为什么需要神经元稀疏
更好的挖掘相关特征,拟合数据。而由于ReLU激活函数可以实现一半激活一半抑制,因而可以能够更好的实现神经元的稀疏。
1. 神经网络为什么使用交叉熵
如果一个样本属于K,那么这个类别所对应的输出值应该是1,其他的为0,这是神经网络期望输出的结果。交叉熵就是用来判断实际输出和期望输出接近程度的。
2. Bi-LSTM的正向推导和反向推导过程
二面
1.手写svm,
2.手写LR,
3.手推前向传播。
4.xgb详细讲解。
5.knn,k-mean。
6.旋转数组:用额外内存和不用。
7.判断是不是后续遍历中序二叉树。
8.python内存管理,内存池最大?
9.python可变不可变数据结构。
10 python lamba与def 定义函数的区别
三面:
1.redis和mongodb与mysql。。真不会。
2.加快搜索速度方法。
3.计算相似度方法。
4.bert微调。
5.研究生最大收获。
6.研究生与本科生区别。
问面试官的问题:
7有啥问题:1.你们干啥的,2.你看起来为啥像95后,不应该是总监么。3.多久能收到反馈。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。