要解决这个问题首先要看归一化的作用:
1.归一化可以加快梯度下降法求解最优解的速度。
当特征之间的数值变化范围相差太大时,会使得收敛路径呈Z字型,导致收敛太慢,或者根本收敛不到最优解的结果。
2.归一化可以提高计算精度。
一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。
因此,可以看出,当算法需要使用梯度下降的方法求解最优解(比如逻辑回归)或者该算法计算样本点距离时(比如KNN)必须使用归一化处理。
3.神经网络中的输入和输出层(softmax)需归一化,防止爆炸,这里也用到了梯度下降。
归一化的方法有线性归一化,标准差标准化,非线性归一化,最常用的是标准差标准化(standscaler)
ridge
Lasso
ElasticNet
Dropout
ElasticNet又叫弹性网络回归,要理解ElasticNet回归,首先要理解岭回归和Lasso回归。
主题模型是对文字隐含主题进行建模的方法。它克服了传统信息检索中文档相似度计算方法的缺点,并且能够在海量互联网数据中自动寻找出文字间的语义主题。
假设有两个句子,我们想知道它们之间是否相关联:
第一个是:“乔布斯离我们而去了。”
第二个是:“苹果价格会不会降?”
如果由人来判断,我们一看就知道,这两个句子之间虽然没有任何公共词语,但仍然是很相关的。这是因为,虽然第二句中的“苹果”可能是指吃的苹果,但是由于第一句里面有了“乔布斯”,我们会很自然的把“苹果”理解为苹果公司的产品。事实上,这种文字语句之间的相关性、相似性问题,在搜索引擎算法中经常遇到。例如,一个用户输入了一个query,我们要从海量的网页库中找出和它最相关的结果。这里就涉及到如何衡量query和网页之间相似度的问题。对于这类问题,人是可以通过上下文语境来判断的。但是,机器可以么?
在传统信息检索领域里,实际上已经有了很多衡量文档相似性的方法,比如经典的VSM模型。然而这些方法往往基于一个基本假设:文档之间重复的词语越多越可能相似。这一点在实际中并不尽然。很多时候相关程度取决于背后的语义联系,而非表面的词语重复。
那么,这种语义关系应该怎样度量呢?事实上在自然语言处理领域里已经有了很多从词、词组、句子、篇章角度进行衡量的方法。本文要介绍的是其中一个语义挖掘的利器:主题模型。
顾名思义,就是对文字中隐含主题的一种建模方法。还是上面的例子,“苹果”这个词的背后既包含是苹果公司这样一个主题,也包括了水果的主题。当我们和第一句进行比较时,苹果公司这个主题就和“乔布斯”所代表的主题匹配上了,因而我们认为它们是相关的。
在这里,我们先定义一下主题究竟是什么。主题就是一个概念、一个方面。它表现为一系列相关的词语。比如一个文章如果涉及到“百度”这个主题,那么“中文搜索”、“李彦宏”等词语就会以较高的频率出现,而如果涉及到“IBM”这个主题,那么“笔记本”等就会出现的很频繁。如果用数学来描述一下的话,主题就是词汇表上词语的条件概率分布 。与主题关系越密切的词语,它的条件概率越大,反之则越小。
例如: 通俗来说,一个主题就好像一个“桶”,它装了若干出现概率较高的词语。这些词语和这个主题有很强的相关性,或者说,正是这些词语共同定义了这个主题。对于一段话来说,有些词语可以出自这个“桶”,有些可能来自那个“桶”,一段文本往往是若干个主题的杂合体。我们举个简单的例子,我们划分了4个桶(主题),百度(红色),微软(紫色)、谷歌(蓝色)和市场(绿色)。段落中所包含的每个主题的词语用颜色标识出来了。从颜色分布上我们就可以看出,文字的大意是在讲百度和市场发展。在这里面,谷歌、微软这两个主题也出现了,但不是主要语义。值得注意的是,像“搜索引擎”这样的词语,在百度、微软、谷歌这三个主题上都是很可能出现的,可以认为一个词语放进了多个“桶”。当它在文字中出现的时候,这三个主题均有一定程度的体现。
有了主题的概念,我们不禁要问,究竟如何得到这些主题呢?对文章中的主题又是如何进行分析呢?这正是主题模型要解决的问题。下面我简要介绍一下主题模型是怎样工作的。
首先,我们用生成模型的视角来看文档和主题这两件事。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到的。那么,如果我们要生成一篇文档,它里面的每个词语出现的概率为:
上面这个式子,可以矩阵乘法来表示,如下图所示:
左边的矩阵表示每篇文章中每次词语出现的概率;中间的Φ矩阵表示的是每个主题中每个词语出现的概率 ,也就是每个“桶
表示的是每篇文档中各个主题出现的概率 ,可以理解为一段话中每个主题所占的比例。
假如我们有很多的文档,比如大量的网页,我们先对所有文档进行分词,得到一个词汇列表。这样每篇文档就可以表示为一个词语的集合。对于每个词语,我们可以用它在文档中出现的次数除以文档中词语的数目作为它在文档中出现的概率 。这样,对任意一篇文档,左边的矩阵是已知的,右边的两个矩阵未知。而主题模型就是用大量已知的“词语-文档”矩阵 ,通过一系列的训练,推理出右边的“词语-主题”矩阵Φ 和“主题文档”矩阵Θ 。
主题模型训练推理的方法主要有两种,一个是pLSA(Probabilistic Latent Semantic Analysis),另一个是LDA(Latent Dirichlet Allocation)。pLSA主要使用的是EM(期望最大化)算法;LDA采用的是Gibbs sampling方法。由于它们都较为复杂且篇幅有限,这里就只简要地介绍一下pLSA的思想,其他具体方法和公式,读者可以查阅相关资料。
pLSA采用的方法叫做EM(期望最大化)算法,它包含两个不断迭代的过程:E(期望)过程和M(最大化)过程。用一个形象的例子来说吧:比如说食堂的大师傅炒了一盘菜,要等分成两份给两个人吃,显然没有必要拿天平去一点点去精确称量,最简单的办法是先随意的把菜分到两个碗中,然后观察是否一样多,把比较多的那一份取出一点放到另一个碗中,这个过程一直重复下去,直到大家看不出两个碗里的菜有什么差别为止。
对于主题模型训练来说,“计算每个主题里的词语分布”和“计算训练文档中的主题分布”就好比是在往两个人碗里分饭。在E过程中,我们通过贝叶斯公式可以由“词语-主题”矩阵计算出“主题-文档”矩阵。在M过程中,我们再用“主题-文档”矩阵重新计算“词语-主题”矩阵。这个过程一直这样迭代下去。EM算法的神奇之处就在于它可以保证这个迭代过程是收敛的。也就是说,我们在反复迭代之后,就一定可以得到趋向于真实值的 Φ和 Θ。
1.词袋模型(Bags of Words)
词袋模型是最基础的文本表示模型,就是把每一篇文章看成一袋子单词,并忽略每个此出现的顺序。具体就是将整段文本以词为单位分开,每篇文章可以表示成一个长向量,向量中的每一维代表一个单词,而该维对应的权重代表这个词在文章中的重要程度。一般用TF-IDF计算权重,公式如下:
TF-IDF(t,d) = TF(t,d) x IDF(t)
其中TF(t,d)为单词t在文档d中出现的频率,IDF(t)为逆文档频率,用来衡量单词t对表达语义所起的重要性,公式表示如下:
其中,m为文章总数,n为包含单词t的文章总数
对于上述公式直观的解释:如果一个单词在很多文章中出现,那么它有可能是一个比较通用的单词,对于区分某篇文章的特殊语义的贡献较小,因此对权重作一定的惩罚。
2.N-gram模型
应用词袋模型将文章进行单词级别的划分有的时候未必是一种好的做法,例如:将general purpose intelligence(通用智能)一词,如果将general , purpose, intelligence这三个词拆开,所表达的意思与三个词连在一起时大相径庭。通常,可以将n个连续出现的单词()组成的词组(N-gram)也作为一个单独的特征放到向量表示中去,构成N-gram模型。另外,同一个词可能有多种词性变化,但是却有相似的含义。在实际应用中,,一般会对单词进行词干抽取(Word Stemming)处理,即将不同词性的单词统一称为同一词干的形式。
3.主题模型
主题模型用于从文本库中发现有代表性的主题(得到每个主题上面词的分布特性),并能够计算出每篇文章的主题分布。
(这一块在后面概率图模型中再总结)
4.词嵌入与深度学习模型
谷歌2013年提出的Word2vec就是词嵌入模型之一,词嵌入时将词向量化的模型的通称,其核心思想是将每个词映射成低维-K维空间(通常K=50~300)的一个稠密向量(Dense Vector)。K维空间的每一维都可以看作一个隐含的主题,只不过不像主题模型中的主题那样直观。
词嵌入将每个词映射成K维向量,每篇文档假设有N个词,则这篇文档就可以用N x K的矩阵表示,但是这样的表示太底层化。在实际的应用中,如果将这个矩阵作为原文本的表示特征输入到机器学习模型中,很难达到令人满意的结果。因此需要在在次基础上加工出更高层的特征。
在传统的浅层机器学习模型中,一个好的特征工程往往可以带来算法效果的显著提升,而深度学习模型则可以为我们提供一种自动化地进行特征工程地方式,模型中地每个隐层都可以认为对应着不同抽象层次地特征。从这个角度来讲,深度学习模型打败浅层模型也就顺理成章了。卷积神经网络和循环神经网络地结构在文本表示中取得了很好地效果,主要由于它们能够更好地对文本进行建模,抽取一些高层的语义特征。与全链接网络相比,卷积神经网络和循环神经网络一方面很好地抓住了文本的特性,另一方面又减少了网络中待学习的参数,提高了训练的速度,降低了过拟合的风险。
【总结】LDA(Latent dirichlet allocation)[1]是有Blei于2003年提出的三层贝叶斯主题模型,通过无监督的学习方法发现文本中隐含的主题信息,目的是要以无指导学习的方法从文本中发现隐含的语义维度-即“Topic”或者“Concept”。隐性语义分析的实质是要利用文本中词项(term)的共现特征来发现文本的Topic结构,这种方法不需要任何关于文本的背景知识。文本的隐性语义表示可以对“一词多义”和“一义多词”的语言现象进行建模,这使得搜索引擎系统得到的搜索结果与用户的query在语义层次上match,而不是仅仅只是在词汇层次上出现交集。
LDA生成过程:
所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。
首先我们所做的事情都在词典的限定下,就是文档中出现的词都不会超出词典给出的范围。比如说,话题“基因”中以很高的概率包含若干关于基因的词,而话题“进化生物学”则会以很高概率包含进化生物学的相关词。我们假设这些话题在数据产生前已经确定了。现在在文档集合中的每个文档,我们来生成其中的文字。步骤如下:
随机选择话题之上的分布
对文档中的每个词
2.1 从步骤1中产生的分布中随机选择一个话题
2.2 从词典上的对应分布中随机选择一个词
这个统计模型反应出文档拥有不同比例的话题(步骤1);每个文档中的每个词都是从众多话题之一中抽取出来的(步骤2.2),而被选择的话题是从针对每个文档的话题上的分布中产生的(步骤2.1)
一般有两种方法,第一种是基于Gibbs采样算法求解,第二种是基于变分推断EM算法求解。
参考:
介绍
工程实现
两种推导EM+gibbs sampiling
官方源码
有了主题模型,我们该怎么使用它呢?它有什么优点呢?我总结了以下几点:
1)它可以衡量文档之间的语义相似性。对于一篇文档,我们求出来的主题分布可以看作是对它的一个抽象表示。对于概率分布,我们可以通过一些距离公式(比如KL距离)来计算出两篇文档的语义距离,从而得到它们之间的相似度。
2)它可以解决多义词的问题。回想最开始的例子,“苹果”可能是水果,也可能指苹果公司。通过我们求出来的“词语-主题”概率分布,我们就可以知道“苹果”都属于哪些主题,就可以通过主题的匹配来计算它与其他文字之间的相似度。
3)它可以排除文档中噪音的影响。一般来说,文档中的噪音往往处于次要主题中,我们可以把它们忽略掉,只保持文档中最主要的主题。
4)它是无监督的,完全自动化的。我们只需要提供训练文档,它就可以自动训练出各种概率,无需任何人工标注过程。
5)它是跟语言无关的。任何语言只要能够对它进行分词,就可以进行训练,得到它的主题分布。
综上所述,主题模型是一个能够挖掘语言背后隐含信息的利器。近些年来各大搜索引擎公司都已经开始重视这方面的研发工作。语义分析的技术正在逐步深入到搜索领域的各个产品中去。在不久的将来,我们的搜索将会变得更加智能,让我们拭目以待吧。
P-R曲线:纵轴为准确率P、横轴为召回率R;
F1-score:(2×P×R)/(P+R) ;
ROC曲线:纵轴为TPR(True Positive Rate),横轴为FPR(False Positive Rate)
AUC是ROC曲线下的面积
P-R曲线下的面积不容易计算;并且当正负样本发生变化时,P-R曲线的形状容易发生剧烈变化;ROC曲线与之相反。
辑回归是softmax退化到二分类情况下的特殊形式。可以说softmax回归是多个逻辑回归的组合。
Dropout是指深度神经网络在训练过程中,以一定概率随机地临时丢弃一部分神经节点。这相当于每次迭代时训练不同结构的神经网络;
这与bagging的有放回采样的理念相似。
Seq2seq模型是通过RNN将一种输入序列映射到输出序列;
这一个过程通常由编码器和解码器两个RNN构成。
在机器翻译中,编码器处理原文输入,解码器处理翻译文本;
在文本自动生成中,编码器用于语言建模,在训练文本上生成一个语言模型;解码器基于该语言模型进行序列采样,生成新的文本。
1.GBDT的损失函数只利用了函数一阶导的信息,而xgboost利用了函数的二阶导信息,效率更高更准确。同时xgboost的损失函数还添加了模型复杂度的惩罚项,防止过拟合。
2.Xgboost可以自定义弱学习器类型,自定义损失函数,前提是损失函数具有二阶导特性。
3.Xgboost每一轮的训练中,不仅支持样本采样,还支持特征采样
4.Xgboost每一轮的训练,各层节点可以并行训练,gbdt不行
5.xgboost可以处理缺失值
6.xgboost在寻找分裂节点和分裂值时,是采用了分位数的方法
在Logistic Regression中,如果同时加入L1和L2范数,下列描述错误的是 D
可以做特征选择,并在一定程度上防止过拟合
能解决维度灾难问题
能加快计算速度
可以获得更准确的结果
若某算法的计算时间表示为递推关系式:
T(N)=2T(N/2)+NlogN
T(1)=1
则该算法的时间复杂度为( )。
某算法的时间复杂度递归公式为
T(n)=1,n=1
T(n)=4T(n/2)+n,n>1
则它的总时间复杂度?
根据主定理,log2 4 = 2 > 1,符合第一种情况,所以复杂度为O(n^log2 4)= O(n^2)
有一个卷积层,其参数如下,kernel size为338,kernel个数为16,stride为2,padding为1,输入特征图尺寸为1281288,那么在不考虑偏置的条件下这一层卷积的计算量(每做一次乘法或加法计算量累积一次)是多少?
(89 + 89 -1)6464*16=9371648
此处假设输入为正方形,输入为长方形 边长用两次这个公式
输出尺寸边长公式 : M = (X - K + 2 * Padding) / Stride + 1
M 为输出边长,X为输入尺寸边长,K为卷积核边长
画图求解概率
x+y>1-x-y
x+1-x-y>y
x-y<1-x-y
int f(int x) {
if(x <= 2)
return1;
returnf(x - 2) + f(x - 4) + 1;
}
循环队列
链表
哈希表
栈
所谓"存储结构无关"是指既可以用数组实现,又可以用链表实现。
1.集合中必存在唯一的一个"第一个元素";
2.集合中必存在唯一的一个"最后的元素";
3.除最后元素之外,其它数据元素均有唯一的"后继";
4.除第一元素之外,其它数据元素均有唯一的"前驱"。
一个盒子中放入1个红球,另一个盒子放入49个红球和50个白球
概率就是1/2+1/2 * 49/99=74/99