本人985硕士毕业,互联网相关工作两年经验,参加了NLP就业班4,转行自然语言处理,先后面试十几家公司,拿到四五家公司offer,最终去了某互联网公司,package 40万。现将面试题目分享给大家,祝大家都能有好的offer。
总共分为四层:
网络接口层,网络层,传输层,应用层。
网络接口层,负责接收IP数据包并通过网络发送,或者从网络上接收物理帧,抽出IP数据包,交给IP层。
网络层,定义了IP数据地址格式,从而能够使得不同类型的数据在Internet上传输。
传输层,主要是提供应用程序间的通信,TCP/IP协议族在这一层的协议有TCP和UDP。
为何HTTP采用tcp,而DNS采用udp协议?
HTTP用TCP为了可靠性,假如你在某网站上使用UDP连接买东西,结果服务器收到了发送的表单,但是由于网络丢包,并没有收到服务器返回的数据,结果重复发送了好多次,结果就是买了好几次东西,TCP由于有三次握手四次挥手,即使丢包也会发生重传。
2.机器学习泛化能力评测指标(性能度量)?
模型对未知数据的预测能力称为模型的泛化能力,它是模型最重要的性质。
只有选择与问题相匹配的评估方法,才能快速地发现模型选择或训练过程中出现的问题,迭代地对模型进行优化。模分类问题、回归问题、序列预测和翻译问题往往需要使用不同的指标进行评估。
分类问题
准确率
准确率是指分类正确的样本占总样本个数的比例,即
准确率缺陷
当不同类别的样本比例非常不均衡时,占比大的类别往往成为影响准确率的最主
要因素。比如,当负样本占99%时,分类器把所有样本都预测为负样本也可以获得99%的准确率。可以使用,每个类别下的样本准确率的算术平均作为模型评估的指标。
精确率和召回率
精确率是指分类正确的正样本个数占分类器预测为正样本的样本个数的比例
召回率是指分类正确的正样本个数占实际的正样本个数的比例。
在排序问题中,通常没有一个确定的阈值把得到的结果直接判定为正样本或负样本,而是采用TopN返回结果的Precision值和Recall值来衡量排序模型的性能,即认为模型返回的Top N的结果就是模型判定的正样本,然后计算前N个位置上的准确率Precision@N和前N个位置上的召回率Recall@N。
Precision值和Recall值是既矛盾又统一的两个指标,为了提高Precision值,分类器需要尽量在“更有把握”时才把样本预测为正样本,但此时往往会因为过于保 守而漏掉很多“没有把握”的正样本,导致Recall值降低。
F1 score
是精确率和召回率的调和平均数,综合反应模型分类的性能。
ROC曲线
二值分类器(Binary Classifier)是机器学习领域中最常见也是应用最广泛的分类器。ROC曲线则有很多优点,经常作为评估二 值分类器最重要的指标之一。ROC曲线的横坐标为假阳性率(False Positive Rate,FPR);纵坐标为真阳性 率(True Positive Rate,TPR)。FPR和TPR的计算方法分别为
上式中,P是真实的正样本的数量,N是真实的负样本的数量,TP是P个正样本中被分类器预测为正样本的个数,FP是N个负样本中被分类器预测为正样本的个数。
回归问题
RMSE
RMSE经常被用来衡量回归模型的好坏,RMSE的计算公式为:
RMSE能够很好地反映回归模型预测值与真实值的偏离程度。但在实际问题中,如果存在个别偏离程度非常大的离群点(Outlier)时,即使离群点 数量非常少,也会让RMSE指标变得很差。
MAPE
引入别的评价指标,MAPE,平均绝对百分比误差
相比RMSE,MAPE相当于把每个点的误差进行了归一化,降低了个别离群点带来的绝对误差的影响。
翻译问题
BLEU
这种方法认为如果翻译系统越接近人工翻译结果,那么它的翻译质量就越高,评测关键就在于如何定义系统译文与参考译文之间的相似度。BLEU采用的方式是比较并统计共现的n元词的个数,即统计同时出现在系统译文和参考译文中的n元词的个数,最后把匹配到的n元词的数目除以系统译文的单词数目,得到评测结果。
ROUGH
ROUGH算法基本思路和BLEU差不多,不过它统计的是召回率,也就是对于标准译文中的短语,统计一下它们有多少个出现在机器翻译的译文当中,其实就是看机器翻译有多少个翻译对了,这个评价指标主要在于标准译文中的短语都出现过,那么自然机器翻译的译文越长结果越好。
METOR
翻译模型翻译的结果是对的,只是碰巧跟参考译文没对上(比如用了一个同义词),于是用WordNet等知识源扩充了一下同义词集,同时考虑了单词的词形,最后还有召回率和准确率两者都要考虑,用F值作为最后的评价指标。
CIDEr
CIDEr是BLEU和向量空间模型的结合。它把每个句子看成文档,然后计算TF-IDF向量(只不过term是n-gram而不是单词)的余弦夹角,据此得到候选句子和参考句子的相似度,同样是不同长度的n-gram相似度取平均得到最终结果。
词汇替换
(1)基于词典的替换
在这种技术中,我们从句子中随机取出一个单词,并使用同义词词典将其替换为同义词。我们可以使用WordNet的英语词汇数据库来查找同义词,然后执行替换。
(2)基于词向量的替换
我们采用预先训练好的单词嵌入,如Word2Vec、GloVe、FastText、Sent2Vec,并使用嵌入空间中最近的相邻单词替换句子中的某些单词。
例如,你可以用三个最相似的单词来替换句子中的单词,并得到文本的三个变体。
使用像Gensim这样的包来访问预先训练好的字向量和获取最近的邻居是很容易的。
# pip install gensim
(3) Masked Language Model
像BERT、ROBERTA和ALBERT这样的Transformer模型已经接受了大量的文本训练,使用一种称为“Masked LanguageModeling”的预训练,即模型必须根据上下文来预测遮盖的词汇。这可以用来扩充一些文本。
from transformers import pipeline nlp = pipeline('fill-mask') nlp('This is cool') [{'score': 0.515411913394928, 'sequence': ' This is pretty cool', 'token': 1256}, {'score': 0.1166248694062233, 'sequence': ' This is really cool', 'token': 269}, {'score': 0.07387523353099823, 'sequence': ' This is super cool', 'token': 2422}, {'score': 0.04272908344864845, 'sequence': ' This is kinda cool', 'token': 24282}, {'score': 0.034715913236141205, 'sequence': ' This is very cool',
'token': 182}]
(4)基于TF-IDF的词替换
其基本思想是,TF-IDF分数较低的单词不能提供信息,因此可以在不影响句子的ground-truth的情况下替换它们。
反向翻译
(1)把一些句子(如英语)翻译成另一种语言,如法语
(2)将法语句子翻译回英语句子。
(3)检查新句子是否与原来的句子不同。如果是,那么我们使用这个新句子作为原始文本的数据增强。
你还可以同时使用不同的语言运行反向翻译以生成更多的变体。如下图所示,我们将一个英语句子翻译成三种目标语言:法语、汉语、意大利语,然后再将其翻译回英语。
文本表面转换
这些是使用正则表达式的简单的模式匹配的转换,他给出了一个将动词形式由简写转化为完整形式或者反过来的例子。我们可以通过这个来生成增强型文本。
随机噪声注入
这些方法的思想是在文本中加入噪声,使所训练的模型对扰动具有鲁棒性。
拼写错误注入
在这种方法中,我们在句子中的一些随机单词上添加拼写错误。这些拼写错误可以通过编程方式添加,也可以使用常见拼写错误的映射。
句子打乱这是一种朴素的技术,我们将训练文本中的句子打乱,以创建一个增强版本。
迁移学习
是借用一个在大规模数据集上预训练好的通用模型(bert),并在针对目标任务的小数据集上进行微调(fine-tune),这种微调操作就可以看成是一种简单的迁移学习。
图创建
创建和运行计算图可能是两个框架最不同的地方。
在pyTorch中,图结构是动态的,这意味着图在运行时构建。
而在TensorFlow中,图结构是静态的,这意味着图先被“编译”然后再运行。
pyTorch中简单的图结构更容易理解,更重要的是,还更容易调试。调试pyTorch代码就像调试Python代码一样。你可以使用pdb并在任何地方设置断点。调试tensorFlow代码可不容易。要么得从会话请求要检查的变量,要么学会使用tensorFlow的调试器(tfdbg)。
灵活性
pytorch:动态计算图,数据参数在CPU与GPU之间迁移十分灵活,调试简便;
tensorflow:静态计算图,数据参数在CPU与GPU之间迁移麻烦,调试麻烦。
设备管理
pytorch:需要明确启用的设备
tensorflow:不需要手动调整,简单
Mysql是一个关系型数据库,neo4j是一个图数据库,更好地也更高效地描述实体之间的关系。
数据定义
neo4j允许对数据的简单且多样的管理
mysql高度结构化的数据
数据查询
mysql关系查询操作耗时。
查询语句
neo4j提出全新的查询语言cypher,查询语句更加简单;
mysql查询语句更为复杂,尤其涉及到join或者union操作
(1)CNN代表卷积神经网络;RNN代表递归神经网络。
(2)CNN适合做图像和视频处理;RNN是文本和语音分析的理想选择。
(3)CNN网格采用固定大小的输入并且生成固定大小的输出;RNN可以处理处理任意长度的输入或者输出长度。
(1)LSTM和GRU的性能在很多任务上不分伯仲;
(2)GRU参数更少,因此更容易收敛,但是在大数据集的情况下,LSTM性能表现更好;
(3)从结构上说,GRU只有两个门,LSTM有三个门,GRU直接将hiddenstate传给下一个单元,而LSTM则用momery cell把hidden state包装起来。
训练集准确度一直保持在1.0左右,loss也基本上接近于0了,但是测试集上的效果在变差,这说明模型已经开始出现过拟合现象,模型的泛化能力逐渐变弱。
9.解决过拟合问题
1.正则化(参数范数惩罚L1,L2)
2.数据增强(通过对样本进行各种操作:图片的形变、位移等,音频的声调、音量等、文本的反序)
3.提前终止(earlystopping)
String hash list set zset(有序集合)
11.进程和线程的区别
进程:
1. 操作系统进行资源分配和调度的基本单位,多个进程之间相互独立;
2. 稳定性好,如果一个进程崩溃,不会影响其他进程,但是进程消耗资源大,开启的进程数量有限制。
线程:
1. CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源。
2. 如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程,都会造成进程崩溃。
12.程序的运行结构
1.普通索引
2.唯一索引
3.主键索引
4.组合索引
15.堆和栈的区别
16.线性回归
(1)最小二乘法的本质
误差的极大似然估计,需要最小二乘法。
(2)线性回归优缺点
优点:
善于获取数据集中的线性关系;
训练速度和预测速度较快;
在小数据集上表现很好;
结果可解释,并且易于说明;
缺点:不适用于非线性数据;预测精确度较低;可能会出现过拟合(下面的正则化模型可以抵消这个影响, Lasso回归, Ridge回归, Elastic-Net回归);分离信号和噪声的效果不理想,在使用前需要去掉不相关的特征。
17.逻辑回归为啥不用mse?
如果要具体地说的话,那是因为用MSE作为二元分类的损失函数会有梯度消失的问题。
因为σ(wTxi)σ(wTxi)的优化目标是接近yi。
所以σ(wTxi)σ(wTxi)和(1−σ(wTxi))(1−σ(wTxi))中的一个也会越来越接近0,也就是梯度消失。
而CrossEntropy的梯度是∑Ni(σ(wTxi)−yi)xi∑iN(σ(wTxi)−yi)xi就没有这个问题。
18.简述SVM
SVM是一种二分类模型。它的基本思想是在特征空间中寻找间隔最大化的分离超平面使得数据得到高效的二分类,具体来讲,有三种情况。
当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;
当训练样本近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;
当训练样本线性不可分时,通过使用核函数和软间隔最大化,学习一个非线性支持向量机。
· 当样本在原始空间线性不可分时,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。
如何选择核函数
· 当特征维数d超过样本数m时(文本分类问题通常是这种情况),使用线性核;
· 当特征维数d比较小.样本数m中等时,使用RBF核;
· 当特征维数d比较小.样本数m特别大时,支持向量机性能通常不如深度神经网络间隔
训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
假如我有四类要划分(也就是4个Label),他们是A、B、C、D。
于是我在抽取训练集的时候,分别抽取
(1)A所对应的向量作为正集,B,C,D所对应的向量作为负集;
(2)B所对应的向量作为正集,A,C,D所对应的向量作为负集;
(3)C所对应的向量作为正集,A,B,D所对应的向量作为负集;
(4)D所对应的向量作为正集,A,B,C所对应的向量作为负集;
使用这四个训练集分别进行训练,然后的得到四个训练结果文件。
在测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试。
最后每个测试都有一个结果f1(x),f2(x),f3(x),f4(x)。
于是最终的结果便是这四个值中最大的一个作为分类结果。
一对一法(one-versus-one,简称OVO SVMs或者pairwise)
其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。
当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。
层次支持向量机
首先将所有类别划分成两个子类,再将子类进一步划分成两个次级子类,如此循环下去,直到得到一个单独的子类为止,这样就得到一个倒立的二叉分类树。
20.深度学习参数初始化的方法
1.全零初始化
我们在线性回归,logistics回归的时候,基本上都是把参数初始化为0,我们的模型也能够很好的工作。然后在神经网络中,把 初始化为0是不可以的。这是因为如果把 初始化0,那么每一层的神经元学到的东西都是一样的(输出是一样的),而且在BP的时候,每一层内的神经元也是相同的,因为他们的gradient相同,weight update也相同。这显然是一个不可接受的结果。
2.随机初始化
随机初始化是很多人经常使用的方法,一般初始化的权重为高斯或均匀分布中随机抽取的值。然而这是有弊端的,一旦随机分布选择不当,就会导致网络优化陷入困境。
3. Xavier初始化
Xavier初始化可以帮助减少梯度消失的问题,使得信号在神经网络中可以传递得更深,在经过多层神经元后保持在合理的范围(不至于太小或太大)。
Xavier初始化的基本思想:保持输入和输出的方差一致(服从相同的分布),这样就避免了所有输出值都趋向于0。
注意,为了问题的简便,Xavier初始化的推导过程是基于线性函数的(假设激活函数是线性的)。
4. Heinitialization(MSRA)
为了解决上面的问题,何恺明大神提出了一种针对ReLU的初始化方法,一般称作He
He initialization的思想是:在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0(x负半轴中是不激活的),所以要保持variance不变,只需要在Xavier的基础上再除以2
效果是比Xavier initialization好很多。现在神经网络中,隐藏层常使用ReLU,权重初始化常用He initialization这种方法。
5. BatchNormalization Layer
在网络中间层中使用Batch Normalization层一定程度上能够减缓对较好的网络参数初始化的依赖,使用方差较小的参数分布即可。
6. pre-training
在迁移学习的情况下,优先采用预训练的模型进行参数初始化。
21.简述一下决策树
22.方差和偏差的区别
偏差:描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,预测值越偏离真实数据,如下图第二行所示。
方差:描述的是预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散,如下图右列所示
23.常见优化器
(1)随机梯度下降(SDG)
在每次更新时用1个样本,可以看到多了随机两个字,随机也就是说我们用样本中的一个例子来近似所有的样本,来调整θ,因而随机梯度下降是会带来一定的问题。频繁的更新使得参数间具有高方差,损失函数会以不同的强度波动。
但SGD的问题是,由于频繁的更新和波动,最终将收敛到最小限度,很难收敛,可能无法获得给出损失函数的最小值。
(2)动量
最后通过θ=θ−V(t)来更新参数。动量项γ通常设定为0.9,或相近的某个值。1)使网络能更优和更稳定的收敛;
2)使得网络减少振荡过程。
(3)AdaGrad
针对简单的SGD及Momentum存在的问题,2011年John Duchi等发布了AdaGrad优化算法(Adaptive Gradient,自适应梯度),它能够对每个不同的参数调整不同的学习率,对频繁变化的参数以更小的步长进行更新,而稀疏的参数以更大的步长进行更新。
与SGD的核心区别在于计算更新步长时,增加了分母:梯度平方累积和的平方根。此项能够累积各个参数gt,i的历史梯度平方,频繁更新的梯度,则累积的分母项逐渐偏大,那么更新的步长(stepsize)相对就会变小,而稀疏的梯度,则导致累积的分母项中对应值比较小,那么更新的步长则相对比较大。
优势:在数据分布稀疏的场景,能更好利用稀疏梯度的信息,比标准的SGD算法更有效地收敛。
(4)RMSProp
RMSProp是Geoffrey Hinton教授在教案中提到的算法,结合梯度平方的指数移动平均数来调节学习率的变化。能够在不稳定(Non-Stationary)的目标函数情况下进行很好地收敛。
计算梯度平方的指数移动平均数(Exponential Moving Average),γ是遗忘因子(或称为指数衰减率),依据经验,默认设置为0.9。
梯度更新时候,与AdaGrad类似,只是更新的梯度平方的期望(指数移动均值),其中ε=10^-8,避免除数为0。默认学习率α=0.001。
优势:能够克服AdaGrad梯度急剧减小的问题,在很多应用中都展示出优秀的学习率自适应能力。尤其在不稳定(Non-Stationary)的目标函数下,比基本的SGD、Momentum、AdaGrad表现更良好.
(5)Adam
Adam算法即自适应时刻估计方法(Adaptive Moment Estimation),能计算每个参数的自适应学习率。
在实际应用中,Adam方法效果良好。与其他自适应学习率算法相比,其收敛速度更快,学习效果更为有效,而且可以纠正其他优化技术中存在的问题,如学习率消失、收敛过慢或是高方差的参数更新导致损失函数波动较大等问题。
对更新的步长计算,能够从梯度均值及梯度平方两个角度进行自适应地调节,而不是直接由当前梯度决定,ε=10^-8,避免除数变为0。
主要有Skip-Gram和CBOW两种,从直观上讲,Skip-Gram是给定input word预测上下文,而CBOW是给定上下文,来预测input word。总体上说,skip-gram的训练时间更长,对于一些出现频率不高的词,在CBOW中的学习效果就不如Skip-Gram,skip-gram准确率更高。
CBOW模型中input是context(周围词)而output是中心词,训练过程中其实是在从output的loss学习周围词的信息也就是embedding,但是在中间层是average的,一共预测V(vocab size)次就够了。skipgram是用中心词预测周围词,预测的时候是一对word pair,等于对每一个中心词都有K个词作为output,对于一个词的预测有K次,所以能够更有效的从context中学习信息,但是总共预测K*V词。
会发生死亡relu现象,导致神经元永久不更新,只是ReLU函数的输入的分布函数发生了很小的改变(-0.2的改变),导致了ReLU函数行为质的改变。我们越过了0这个边界,ReLU函数几乎永久的关闭了。更重要的是ReLU函数一旦关闭,参数w就得不到更新,这就是所谓的‘dying ReLU’
26.学习率怎么调整
此外,考虑到误差梯度的噪声估计,较小的批量大小更适合于较小的学习率。学习率的传统默认值为0.1或0.01,这可能是训练的起点。默认值0.01通常适用于标准多层神经网络,但完全依赖此默认值是愚蠢的。
另一种方法是对所选模型的学习速率进行灵敏度分析,也称为网格搜索。
27.梯度消失和梯度爆炸
梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。
层数比较多的神经网络模型在训练时也是会出现一些问题的,其中就包括梯度消失问题(gradientvanishing problem)和梯度爆炸问题(gradient exploding problem)。梯度消失问题和梯度爆炸问题一般随着网络层数的增加会变得越来越明显。
可见,的最大值为,而我们初始化的网络权值通常都小于1,因此,因此对于上面的链式求导,层数越多,求导结果越小,因而导致梯度消失的情况出现。
这样,梯度爆炸问题的出现原因就显而易见了,即,也就是比较大的情况。但对于使用sigmoid激活函数来说,这种情况比较少。因为的大小也与有关(),除非该层的输入值在一直一个比较小的范围内。
28.梯度消失和梯度爆炸解决方案
(1)pre-training+fine-tunning (2) 梯度剪切:对梯度设定阈值 (3) 权重正则化
另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization),正则化主要是通过对网络权重做正则来限制过拟合。如果发生梯度爆炸,那么权值就会变的非常大,反过来,通过正则化项来限制权重的大小,也可以在一定程度上防止梯度爆炸的发生。比较常见的是L1正则和L2正则,在各个深度框架中都有相应的API可以使用正则化。
(4) 选择relu等梯度大部分落在常数上的激活函数
relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。
(5)batch normalization
BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。
(6) 残差网络的捷径(shortcut)
相比较于以前直来直去的网络结构,残差中有很多这样(如上图所示)的跨层连接结构,这样的结构在反向传播中具有很大的好处,可以避免梯度消失。
(7)LSTM的“门(gate)”结构
LSTM全称是长短期记忆网络(long-short term memory networks),LSTM的结构设计可以改善RNN中的梯度消失的问题。主要原因在于LSTM内部复杂的“门”(gates),如下图所示。
2. CRF利用的是马尔科夫随机场(无向图),而HMM的基础是贝叶斯网络(有向图);
3.概率计算问题、学习问题和预测问题;
32.深度学习模型加速训练
(1)内部方法
网络结构的选择:比如CNN和RNN,CNN更适合并行结构;
优化算法的改进:动量,自适应学习率;
减少参数规模:比如使用GRU代替LSTM
参数初始化:Batch Normalization
Mini-batch的调整,调大一些
(2)外部方法
GPU加速训练
数据并行:数据并行是指对数据数据做切分,同时采用多个模型实例,对多个分片的数据进行并行训练。
模型并行:是指将模型拆分成几个分片,由几个训练单元分别持有,共同协助训练。
同步模式:所有训练程序同一个批次的训练数据,完成后经过同步,再同时交换参数。参数交换完后所有的训练程序具有新的模型作为起点,再训练下一批次。
需要用一个参数服务器加速训练。
混合数据并行与模型并行
结合GPU计算和集群计算技术,构建GPU集群正在成为加速大规模深度神经网络训练的有效解决方案。
33.模型陷入局部最优解解决方案
(1)使用随机梯度下降代替真正的梯度下降。
(2)不用的初始值权重进行训练。
34.英伟达GPU类型
GeForce GTX 1080 ti显存是11GB。
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历对象位置的对象。
迭代器从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退。
有两个基本方法:iter()和next()
GIL是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大
在python多线程下,每个线程的运行方式:
1. 获取GIL;
2. 执行代码直到sleep或者是python虚拟机将其挂起;
3. 释放GIL。
多核下,想做并行提升效率,比较通用的方法是使用多进程,能够有效提高执行效率。
在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将self参数作为方法的第一个参数。
另外,对于构造函数中的self参数,其代表的是当前正在初始化的类对象。
38.过拟合和欠拟合
欠拟合是指模型不能在训练集上获取足够低的误差,模型的复杂度比较低,模型在训练集上表现就差。
解决欠拟合方法:增加网络复杂度或者在模型中增加特征。
过拟合是指模型在训练集上表现很好,在测试集上表现很差,模型的泛化能力比较差。
39.==和is的区别
is用于判断两个变量引用对象是否为同一个,==用于判断引用变量的值是否相等。
40.深拷贝和浅拷贝
浅拷贝:拷贝父对象,不会拷贝对象的内部的子对象,这两个对象不是完全独立的。
深拷贝:copy模块的deepcopy方法,完全拷贝了父对象及其子对象,两个对象完全是对立的。
可以用于从文件流中读取block_size大小的字节块。那么,我们只要每次从文件中读取一点,保证内存装得下就行了
def get_lines(file_path):
"""
给定一个文件路径,读取文件并返回一个迭代器,这个迭代器将顺序返回文件的每一行
"""
with open(file_path, 'rb') as f:
for line in f:
yield line
print(e)
44.迭代器实现
迭代器对象要求支持迭代器协议的对象,再python中,支持迭代器协议就是实现对象的__iter__()方法和next()方法。其中__iter__()方法返回迭代器本身;next()方法返回容器的下一个元素,在python中,实现了__iter__()方法的对象是可迭代的。
例子:
class House(object):
def __init__(self,room):
def add_person(self,person):
def __iter__(self):
return self
def __next__(self):
return current_data
else:
raise StopIteration
if __name__=="__main__":
bedroom = House('bedroom')
for person in bedroom:
print(person)
引用计数为主,标记清除和分代收集为辅。
在python中,如果一个对象的引用数为0,python虚拟机就会回收这个对象的内存。
typedef struct_object { int ob_refcnt; struct_typeobject *ob_type; } PyObject;
在Python中每一个对象的核心就是一个结构体PyObject,它的内部有一个引用计数器(ob_refcnt)。程序在运行的过程中会实时的更新ob_refcnt的值,来反映引用当前对象的名称数量。当某对象的引用计数值为0,那么它的内存就会被立即释放掉。
以下情况是导致引用计数加一的情况:
对象被创建,例如a=2
对象被引用,b=a
对象被作为参数,传入到一个函数中
对象作为一个元素,存储在容器中
下面的情况则会导致引用计数减一:
对象别名被显示销毁del
对象别名被赋予新的对象
一个对象离开他的作用域
对象所在的容器被销毁或者是从容器中删除对象
循环引用导致内存泄漏
c1=ClassA() #内存1引用计数+1 = 1 c2=ClassA() #内存2引用计数+1 = 1 c1.t=c2#内存2引用计数+1 = 2 c2.t=c1#内存1引用计数+1 = 2 del c1#内存1引用计数-1 = 1 del c2#内存2引用计数-1 = 1
标记清除法:
跟其名称一样,该算法在进行垃圾回收时分成了两步,分别是:
A)标记阶段,遍历所有的对象,如果是可达的(reachable),也就是还有对象引用它,那么就标记该对象为可达;
B)清除阶段,再次遍历对象,如果发现某个对象没有标记为可达,则就将其回收。
上面描述的垃圾回收的阶段,会暂停整个应用程序,等待标记清除结束后才会恢复应用程序的运行。
分代回收
在循环引用对象的回收中,整个应用程序会被暂停,为了减少应用程序暂停的时间,Python通过“分代回收”(Generational Collection)以空间换时间的方法提高垃圾回收效率。 对于程序,存在一定比例的内存块的生存周期比较短;而剩下的内存块,生存周期会比较长,甚至会从程序开始一直持续到程序结束。生存期较短对象的比例通常在80%~90%之间,这种思想简单点说就是:对象存在时间越长,越可能不是垃圾,应该越少去收集。这样在执行标记-清除算法时可以有效减小遍历的对象数,从而提高垃圾回收的速度。
model = TheModelClass(*args,**kargs)
1. Mixed Word/Character Model
即把所有的OOV词,拆成字符。比如Jessica,变成J,e, s, s, i, c, a。其中 是Begin,Middle,End的标记。这样处理的好处就是消灭了全部的OOV。坏处就是文本序列变得非常长,对于性能敏感的系统,这是难以接受的维度增长。
2. Wordpiece Model(WPM)
和上面一样,同样要进行拆词。不同的是,非OOV的词也要拆,并且非字符粒度,而是sub-word。
3. UNK处理
在训练数据充足的情况下,RNN模型可以轻松支持30k-80k的词表。在大多数情况下,扩大词表都是首选的方案。经过WPM处理后,配合词表加大,剩下的OOV都是冷门的长尾词。如果你不关注这部分性能,可以直接扔掉OOV词,删掉包含OOV的数据。对于分类型任务,就全部替换成 标签。对于生成型任务,有不同的细节处理方案,可以看下经典的《Addressing theRare Word Problem in Neural Machine Translation》,里面介绍了Copyable、PosALL和PosUNK三种替换策略。这类策略对于实体类NER的词,有比较好的效果。
4.中文的处理5.扩大词表
共现词的数量除以参考译文的总数;
惩罚因子
针对翻译译文长度比参考译文要短的情况,就需要一个惩罚的机制去控制。
49.使用BLEU?
说实话,数学用人话来解释是非常困难的,我们还是来通过例子来学习,还是之前的:
机器翻译:The cat sat on the mat.人工翻译:The cat is on the mat.
第一步:计算各阶n-gram的精度
P1 = 5 / 6 = 0.833333333333333 P2 = 3 /5 = 0.6 P3 = 1 / 4 = 0.25 P4 = 0 / 3 = 0
第二步:加权求和
取权重:Wn = 1 / 4 =0.25
加权求和:
$ \sum_{i=1}^{N}w_n\log P_n=0.25\logP_1+0.25\log P_2+0.25\log P_3+0.25\log P_4= -0.5198603854199589 $
第三步:求BP
机器翻译长度=参考译文长度,所以:
BP= 1
最后求BLEU
$BLEU = 1 * exp(-0.5198603854199589) =0.5946035575013605 $
优点:方便、快速,结果比较接近人类评分。
缺点:
1. 不考虑语言表达(语法)上的准确性;
2. 测评精度会受常用词的干扰;
3. 短译句的测评精度有时会较高;
4. 没有考虑同义词或相似表达的情况,可能会导致合理翻译被否定;
BLEU本身就不追求百分之百的准确性,也不可能做到百分之百,它的目标只是给出一个快且不差的自动评估解决方案。
1.模型结构
近年来的不少研究指出,学习广泛适用的词嵌入是现代NLP系统的一个不可分割的部分,经过预训练的词嵌入要比传统的one-hot编码导入有利于后续任务性能的改进。ELMo模型从不同维度对传统的词嵌入进行了概括,通过构建词嵌入动态调整的双向神经网络,能够提取上下文敏感特征,输出体现上下文语义的预训练词向量,较好地解决了一词多义现象。
BERT[6]相比于ELMo模型进一步拓宽了词向量的泛化能力,能够充分学习字符级、词级、句子级甚至句间关系特征,增强字向量的语义表示 ,因此表现出优于过往方法的卓越性能。
传统的RNN和CNN在处理NLP任务时存在着 一定缺陷:RNN的循环式网络结构没有并行化,训 练慢;CNN先天的卷积操作不是很适合序列化的文 本。Transformer模型[18]是文本序列网络的一种新架 构,基于self-attention机制,任意单元都会交互,没有长度限制问题,能够更好捕获长距离上下文语 义特征。BERT模型采用了多层的双向Transformer编码器结构,同时受到左右语境的制约,相比ELMo模型中独立训练从左 到 右 和 从 右 到 左 的LSTM连接,能够更好地包含丰富的上下文语义信息。
4. BiLSTM及CRF
与LSTM相 比 , 双 向 长 短 时 记 忆 网 络 (BiL‐STM) 对每个句子分别采用顺序 (从第一个词开 始,从左往右递归) 和逆序 (从最后一个词开始, 从右向左递归) 计算得到两套不同的隐层表示,然后通过向量拼接得到最终的隐层表示。。因此,BiL‐ STM能够更好地捕捉双向的语义依赖关系,有效地 学习并掌握上下文语义共现信息,从而提升命名实体识别的性能。BiLSTM不考虑标签之间的相关性, 而CRF的一个独特优势是能够通过考虑相邻标签的关系获得一个全局最优的标记序列。将CRF与BiLSTM神经网络相结合,对BiLSTM的输出进行处理,可以获得最佳的术语标记结果。
52.生成模型和判别模型
1.生成模型
学习得到联合概率分布P(x,y),即特征x和标记y共同出现的概率。
2.判别模型
学习得到条件概率分布P(y|x),即在特征x出现的情况下标记y出现的概率。
3.常见生成模型
HMM
由隐藏的马尔可夫链随机生成观测序列,是生成模型。HMM是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程。包含三要素:初始状态概率向量pie,状态转移概率矩阵A,观测概率矩阵B。
4.常见判别模型
1、感知机(线性分类模型)
2. 决策树
3、逻辑斯蒂回归模型
4. 最大熵模型
原理:概率模型中,熵最大的模型是最好的模型,可以使用拉格朗日函数求解对偶
问题解决。
6、支持向量机(SVM)
SVM分为线性可分支持向量机(硬间隔最大化)、线性支持向量机(软间隔最大化)、非线性支持向量机(核函数)三种。
目的是最大化间隔,这是和感知机最大的区别。
7、boosting方法(AdaBoost等)
通过改变训练样本的权重,训练多个分类器,将分类器进行线性组合,提升分类性能。AdaBoost采用加权多数表决的方法。
8、条件随机场(conditional random field, CRF)
给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫随机场。可应用于标注问题。
9、CNN
训练过程中,每一个中间层都有其功能,但其具体的功能无法知道。
本质上看,分词可以看做是一个为文本中每个字符分类的过程,例如我们现在定义两个类别:
E代表词尾词,B代表非词尾词,于是分词“你/现在/应该/去/幼儿园/了”可以表达为:你E现B在E应B该E去E幼B儿B园E了B,分类完成后只需要对结果进行“解读”就可以得到分词结果了。
序列构建
我们可以求得所有可能出现的分类序列的出现概率然后选择其中概率最大的一个,用数学表达为:
argmax C P(C1,C2,C3….Ci)(1)
其中C代表一个分类标识,这里,C属于{E,B}进一步的:
P(C1,C2,C3….Ci) = P(C1)P(C2,C3…..Ci|C1)=P(C1)P(C2|C1)P(C3…..Ci|C1,C2)=P(C1)P(C2|C1)P(C3|C2,C1)P(C4|C3,C2,C1)…P(Ci|Ci-1….C1)这里,我们假设第i个分类标记只依赖于第i-1个标记,那么我们可以得到分类标记的马尔科夫链了:
P(C1,C2,C3….Ci) =P(C1)P(C2|C1)P(C3|C2)…P(Ci|Ci-1)
我们称 P(Cj|Ci) 为i到j的状态转移概率,可以通过在大量预料中使用统计的方法求得。
1.概率计算问题
3. 学习问题
Baum-Welch算法(状态未知)。
限时福利领取
《推荐系统》纸质书限时限额免费送!
活动参与方式
PS:邀3位好友扫码助力,即可免费学习【音乐推荐系统项目】特训课;
邀19位好友扫码助力,可免费得以下《推荐系统》纸质书,3选1包邮送。
活动仅剩10小时,抓紧参与吧!
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.