译者 | Raku

出品 | AI科技大本营(ID:rgznai100)

摘要

用于文本生成的神经模型需要在解码阶段具有适当词嵌入的softmax层,大多数现有方法采用每个单词单点嵌入的方式,但是一个单词可能具有多种意义,在不同的背景下,其中一些可能会有所不同。在本文中,研究者提出一种新颖的、学习更好的嵌入文本生成方法——KerBS。KerBS主要有两个优点:a)采用嵌入的贝叶斯组合多义词;b)它适应单词的语义变化,并且通过施加学习过的内核来捕获相似度,对少见语境嵌入空间中的单词(感官)数具有鲁棒性。实证研究表明,KerBS大大提高了一些文本生成任务的性能。

1、简介

借助[Bengioet al.,2003;Mikolovet al.,2010]的语言建模,[Sutskeveret al.,2014;Bahdanauet al.,2015;Vaswaniet al.;2017]的机器翻译,[Sordoniet al.;2015]的对话生成,文本生成已得到显着改善。这些模型都包括softmax最后一层以产生单词。softmax层采用上下文状态(h)来自上游网络(例如RNN单元)作为输入,并将h转换为具有线性投影(W·h)和指数激活的单词概率,W的每一行都可以视为嵌入一个词。实际上,softmax通过计算上下文向量h和词汇表中的词嵌入W之间的内积评分进行嵌入匹配。

softmax常用的设置在嵌入空间上有一个很强的假设,即每个单词对应一个单独的向量,解码网络中的上下文向量h必须在一定距离度量下不加区别地接近所需的单词嵌入向量。我们发现这样的假设与实际情况不符。

图 1 可视化包含所检查单词话语上下文向量的示例, 来自BERT模型Devlinet al. [2019]。我们观察到3个有趣的现象:a)多义性:并非每个词的上下文向量构成一个单独的簇,而是由有多个簇的单词群构成(图1b)。b)变方差:上下文向量的方差在集群中存在显著差异,有些词对应较小的方差,有些词对应较大的方差(图1c)。c)鲁棒性:上下文空间存在异常值(图1b)。

这些现象解释了传统的softmax在训练中无效的原因,传统方法将单词嵌入到同一单词的所有上下文向量中,即使它们可能属于多个不同的簇。同时,以内积作为相似度评分的扁平 softmax完全忽略了不同单词的方差,它也容易受到离群值的影响,因为一个单一的异常将导致嵌入这个词远离主集群。简而言之,softmax层没有足够的表达能力。

Yanget al.[2018]提出了混合软max (MoS)来增强softmax的表达能力,它用M个softmax层的加权平均代替了单个softmax层。然而,所有的词都有相同数量的成分M和平均重量,这严重限制了MoS的容量。此外,上下文向量的方差也没有被考虑到。

图1:根据BERT计算的上下文向量h,并使用PCA进行投影。每个点对应一个包含单词的话语。(a)“computer”只有一个集群;(b) “monitor”有两组,分别表示动词(左)和名词(右)。右下角的离群值只出现在短语《基督教科学箴言报》中;(c)“car”的方差小于“vehicle”。

本文提出了一种新的文本嵌入生成方法——KerBS。KerBS通过引入多个嵌入的Bayesian组合和一个可学习的内核来度量嵌入之间的相似性,从而避免了上述softmax问题。KerBS不是一个单独的嵌入,而是用多个嵌入的加权组合显式地表示一个单词,每个嵌入的加权组合被视为一个意义,嵌入的数量也会自动从语料库中获得。我们设计了一组核心函数来代替softmax层中的嵌入匹配(即矩阵-向量点积),通过从文本中学习参数,每个单词(或意义)可以在其嵌入空间中享受个体差异。此外,与高斯核相比,核族对异常值具有更强的鲁棒性。

我们对各种文本生成任务进行了实验,包括机器翻译、语言建模和对话生成。实证结果验证了该方法的有效性。消蚀研究(Ablation study,控制变量法)表明,KerBS的每个部分,包括贝叶斯组成和核函数,都是提高性能的必要条件。我们还发现,具有更多语义意义的词被赋予了更多的意义嵌入,这符合我们的直觉。

2、相关工作

词嵌入(Word Embeddings):Word2Vec [Mikolov et al.,2013]与GloVe [Pennington et al.,2014]以非监督的方式从语料库中学习分布式单词表示,但每个词只分配一个词的嵌入,不仅忽略了词的多义性,而且无法提供与上下文相关的词的嵌入。最近的研究[Alec Radford and Sutskever, 2018, Peters et al.,2018, Devlin et al. 2019]表明,预先训练的语境化单词表示对下游的自然语言处理任务是有益的。BERT [Devlin et al.,2019]使用深层双向转换器对掩蔽语言模型进行了预训练,并在各种NLP任务中实现了最好的性能。

多义词嵌入(Multi-Sense Word Embeddings):早期的工作通过先训练单点词嵌入,再对上下文嵌入进行聚类(例如,相邻词的平均嵌入)来获得多义词嵌入。但是这些方法是不可扩展的,并且在参数调优方面花费了大量的努力[Reisinger和Mooney, 2010, Huang et al.,2012]。Tian等[2014]提出了一种概率模型,该模型使用一个变量来控制每个单词的词义选择,Liu等[2015]为每个单词添加一个topic变量,并在topic变量上嵌入条件词,Tian等[2014]和Liu等[2015]都可以方便地集成到跳跃图模型中[Mikolov等,2013],效率很高,其他著作[Chen et al., 2014, Jauhar et al., 2015, Chen et al., 2015, Wu and Giles, 2015]利用大型语料库如WordNet Miller[1995]和Wikipedia进一步提高了多义嵌入的性能。然而,这些作品主要侧重于文本理解,而不是文本生成。

作为分布的词嵌入(Word Embedding as a Distribution):为了表示每个词的语义宽度,Vilnis和McCallum[2015]提出将每个词在嵌入空间映射成高斯分布,Vilnis和McCallum[2015]没有使用Mikolov等人[2013]的余弦相似度,而是使用嵌入分布的KL-divergence方法来衡量单词之间的相似度,为了提高高斯词嵌入的数值稳定性,特别是在比较非常近或非常远的分布时,Sun等[2018]提出用Wasserstein距离代替KL-divergence。虽然高斯词嵌入在相似度和嵌入检测等词级任务中表现良好,但不能直接应用于文本生成场景,因为高斯词嵌入与输出嵌入很难进行匹配,而输出嵌入通常是嵌入空间中的单点。

3、背景知识

大多数文本生成模型通过嵌入匹配过程生成单词。直观地说,在每个步骤中,上游网络(如RNN解码器)根据来自输入和先前生成的单词的编码信息计算上下文向量h,上下文向量h用作查询,从预先计算的词汇表嵌入W中搜索最相似的匹配,在实践中,这是通过W和h之间的内积实现的,在推理过程中,选择概率最高的单词。

具体来说,给定一个话语,GRU译码器计算如下:

在第t时刻,通过查找单词嵌入矩阵  (式.(1))。这里        是第i个单词在词汇表中的嵌入,V是词汇量,第t步的上下文嵌入              由GRU结合  和  的信息得到(式(2))。其他解码器和Transformer Vaswani等人[2017]工作类似。

式(3)在  和W之间进行嵌入匹配,将所获得单词的概率通过softmax激活。直觉上来说,要生成正确的单词  ,被嵌入  的上下文应该在所嵌入单词  的周围。

4、KerBS方法

在本节中,我们首先介绍用于文本生成的KerBS,它是根据在引言中提到的三个观察结果设计的:多义性、变差性和鲁棒性。然后,针对直接学习每个单词的义数比较困难的问题,提出了一种动态分配义的训练方案。

4.1、模型架构

KerBS假设同一个单词的上下文向量空间由几个几何上独立的分量组成,每个部分都代表一种意义,有自己的差异。为了更好地模拟它们的分布,我们将式(3)代入以下方程:

在这里, 是步骤t的意义索引,其值取,对应于词汇表中第i个单词的第j个意义。 是单词i的意义数量,不同单词的意义数量可能不同。KerBS不是直接计算单词的概率,而是先计算属于某个单词的所有意义的概率,然后将它们相加得到单词概率。

式(5)中输出感知  的概率不是严格的高斯后验,因为高斯模型在高维空间的训练是数值不稳定的,相反,我们建议使用一个精心设计的核函数,来模拟每个意义的分布方差。具体来说,我们替换式(3)的内积核函数K,这取决于方差相关参数θ, 是一个简化符号包含所有成对的内核值 。对于 的每个意义,我们可以分别对它们的分布的方差建模。

4.1.1、嵌入的贝叶斯组合

在这一部分中,我们将详细介绍KerBS如何对单词的多义性进行建模。直观地说,我们在文本生成中使用了嵌入的贝叶斯组合,因为同一个单词可以有完全不同的含义,对于具有多个意义的单词,通常可以将其对应的上下文向量划分为单独的集群(参见图1)。如果我们使用单一嵌入模型(如传统的softmax)来拟合这些集群,则单词嵌入将收敛于这些集群的平均值,并且可能与所有集群都很远,这可能会导致文本生成性能变差。

如式(4)所示,我们可以为每个意义分配不同的嵌入。我们首先通过上下文向量h与意义嵌入矩阵w之间的权值匹配得到意义概率,然后将每个单词的意义概率相加得到单词概率。

我们采用了权值捆绑方案[Inan et al.,2017],其中解码嵌入和输入嵌入是共享的。由于W是一个意义嵌入矩阵,因此不能像式(1)那样直接用于下一步的解码网络。相反,我们根据意义嵌入的条件概率计算其加权和得到嵌入集。假设是第t步的输入字:

4.1.2、内核的嵌入匹配

为了计算每个意义的概率,在嵌入空间中引入高斯分布是非常简单的,然而,由于以下原因,在高维空间中很难学习嵌入的高斯分布。上下文向量通常分布在高维空间中嵌入的低维流形中,在低维流形中使用高斯分布来建模嵌入向量可能会导致严重的不稳定性,假设在一个采用空间, 的分布遵循d1维子空间,我们建立一个模型 去拟合嵌入点。但通常存在一些噪声异常值,假设这些异常值均匀分布在边长为1且以原点为中心的立方体中,离群点到原点的平均平方距离为d12,与d成线性关系:

其中X为包含离群值的数据点集,并将X中的离群值比例表示为α。由于          是随机生成的点集并且等于d1,  是离群值,所以当d较大时,L为离群值所主导。最优σ约等于   ,当d较大时,最优σ约等于          ,并且独立于真实方差 与预期的一样,在我们的初步实验中,我们发现直接模拟高斯分布并不是很有效。

因此,我们设计了一个核函数来对嵌入方差进行建模,它比高斯混合模型更容易学习。具体来说,我们用一个核函数来代替可以看作是围绕整个空间的一个固定核的内积 

图2:不同θ下核的形状

在这里,θ是控制每个方向的嵌入方差的参数, 是一个归一化因子。当  ,它退化为一个公共内积。如图2所示,一个小小的θ,嵌入的是集中在一个小区域,而一个大型的θ导致平内核。最后,第i个单词的参数可以是 ,其中是意义 的嵌入与核参数。直观地说,在具有内积相似性的原始空间中,概率质量的密度是均匀分布的。但是扭曲了概率空间,使得上下文向量在不同意义上的方差不同。

,并当时,每个h的梯度都以一个固定的θ为界,这来自于 的连续性。因此,少量的异常值或噪声点不会对训练稳定性产生重大影响。

4.2、训练方案

很难从经验上确定每个词的意义数,这是一个非常大的超参数集,同样,同一个单词的属性在不同的语料库和任务中可能有所不同,为此,我们设计了一种包含动态感分配的路沿识别训练方案,我们不需要提供每个单词的意义数,只需要输入总意义数即可,算法会自动分配意义数量。

训练方案详见算法1。具体来说,获取参数对KerBS和上游网络  上下文向量输出,整个过程包括分配和适应阶段。在训练之前,W和θ分别由随机矩阵和一个随机向量初始化,我们将  随机分配给单词。初始化之后,我们首先进入适应阶段。在步骤t,给定一个训练集中的序列  ,我们从  中得到上下文向量  。然后分别由式(4)和式(5)计算意义概率和单词概率。然后,我们计算生成   的对数概率  ,再通过微调W, θ 与φ最大化  :

在适应阶段,KerBS学习意义嵌入向量 ,分布方差指标 

在分配阶段,我们删除多余的意义并将它们重新分配到预测不佳的词上。为了确定需要去除的意义项和需要更多义项的单词,我们记录每个单词的log预测准确率log P与意义使用率U的变化的平均值:

其中β是更新率。对于一个单词i,如果经过几个世纪后log P始终低于阈值,我们认为目前分配给i的意义数是不够的,然后我们删除最不常用的义并重新分配给i。我们交替地执行适应和重新分配直到收敛。

4.3、理论分析

在这一部分中,我们将解释为什么KerBS能够学习上下文向量的复杂分布。我们只对下面的引理做了简单的介绍,在附录中留下了更详细的证明。

引理4.1:KerBS具有学习多义性的能力。如果上下文向量的实际分布由几个不相连的集群组成,那么KerBS将学习尽可能多地表示集群。

证明:每一组词的上下文向量都吸引着它KerBS意义的嵌入,以使这些嵌入更靠近  。然而,如果一个集群已经用KerBS意义来表示,它对嵌入其他意义的吸引力就会减弱,所以它们会聚合到其他的簇,意义将尝试表示尽可能多的上下文向量分布集群,而不是集中在几个集群中。

引理4.2:KerBS具有学习嵌入分布方差的能力,对于方差较大的分布,KerBS学习更大的θ。

证明:优化的θ是方程  的解。我们只需要解释,当h的方差增大时,方程的解变大。

5、实验

在本节中,我们通过实证验证了KerBS的有效性。我们先建立实验,然后在5.2部分给出实验结果。

我们在几个文本生成任务上测试kerb,包括:

机器翻译(MT)是在IWSLT 16 De En上进行的,它包含了196k对用于训练的句子。

语言建模(LM)用于测试无条件文本生成性能。在之前的工作之后,我们使用10亿个单词的语料库中的300k、10k和30k子集分别进行训练、验证和测试。

对话生成(Dialog)也包括在内。我们使用Li等[2017]的DailyDialog数据集进行实验,提前删除训练集和测试集的重叠部分。

注意,这些文本生成任务强调不同的方面。利用MT测试双语语料库中的语义转换能力,LM是用来测试路边语是否有助于生成更流畅的句子,Dialog甚至需要一些先验知识来生成良好的响应,这是最具挑战性的任务。

对于LM,我们使用Perplexity (PPL)来测试性能。对于MT和Dialog,我们使用BLEU-4和BLEU-1评分来衡量生成质量[Papineni et al.,2002]。对话中还包括人工评估。在人工评价过程中,要求3名志愿者标注包含50组句子的对话数据,每个集合包含输入语句以及由KerBS和基线模型生成的输出响应,志愿者被要求根据回答的流利程度和与相应问题的相关性对回答进行评分(具体评分见附录)。在标记完回答后,我们计算每种方法的平均分数,然后进行t检验以拒绝KerBS不优于基线方法的假设。

5.1、实现细节

对于LM,我们使用GRU语言模型[Chung et al., 2014]作为我们的测试平台。我们尝试了不同的参数集,包括RNN层,隐藏层大小和嵌入维度。传统softmax性能最好的模型被当作baseline。对于MT和Dialog,我们实现了基于注意力的序列到序列模型(Seq2Seq,[Bahdanau et al.,2015])和Transformer (Vaswani et al.,2017)作为我们的baseline。对于Seq2Seq,((hidden size, embedding dimension)分别设置为(512,256)和(1024,512)。对于Transformer的MT和Dialog,设置与Lee等[2018]相同:(hidden size, embedding dim, dropout, layer num, head num)设置为(288,507,0.1,5,2)。

所有的模型都接受了长达80个单词的句子训练,我们设置批大小为128,波束大小为5进行解码。对于德语和英语,我们首先将句子标记为摩西标记器(Moses tokenizer, Koehn et al.,2007)的标记。然后使用BPE [Sennrich et al.,2016]将每个单词分割成子单词。我们的优化算法采用Adam [Kingma and Ba, 2014]。当验证集的损失停止减少时,我们开始降低学习速率。对于LM,我们将初始学习率设置为1.0,衰减率设置为0.8。对于MT和Dialog,初始学习率为5e-4,衰减率为0.5。

5.2、文本生成结果

我们在表1和表2中列出了使用KerBS的结果,然后进行了分析。

机器翻译:对于机器翻译,KerBS在Seq2Seq(+1.37)和Transformer(+1.29)上获得了更高的BLEU-4分数。然而,MoS的性能增益并不显著,甚至不如vanilla Transformer模型,Transformer上MT的情况如表3所示。

语言建模:正如所料,与MoS(102.72)和传统的softmax(103.12)相比,KerBS在LM上的PPL(102.17)更低。虽然它引入了更多的参数,但不会导致过拟合。相反,KerBS中复杂度的增加有助于模型更好地捕获嵌入空间的信息。

对话生成:这里还包括对话生成的结果。与源句和目标句高度一致的任务不同,对话生成可能需要一些先验知识来获得良好的响应。此外,所生成句子的多情态性是会话中的一个严重问题,我们期待更多的表达结构可以帮助。由于Transformer在对话框生成方面的性能比不上Seq2Seq,所以在这一部分我们将重点讨论Seq2Seq。KerBS在测试集上获得了BLEU-1的17.85分,这与baseline相比是非常显著的,人工评估也证实了在对话生成中使用kerb的有效性。在进行单尾假设检验后,我们发现p值小于0.05,这意味着对对话系统的改进并非微不足道的,我们在表4中列出了不同模型生成的一些响应。

5.3、消蚀研究(Ablation Study)

我们在MT任务中对三种不同的路缘进行了消蚀研究。KerBS w/o内核从KerBS中删除内核函数,这样分布方差就不再被显式控制。我们发现,与原始的kerb相比,它失去了0.49的BLEU分数,这表明显式表达隐藏状态的分布方差是重要的,KerBS 在这方面做得很好(表5)。单意义下的KerBS替代了多意义模式,也导致了性能的下降,这进一步证实了我们的假设,即上下文向量的分布是多模态的。在这种情况下,输出层也应该是多模态的,在KerBS w/o动态分配中,每个词都有固定数量的义项。虽然它的性能仍然优于单一的感知模型,但略低于完整的KerBS模型,说明了动态分配的必要性。

5.4、细节分析

在本部分中,我们验证KerBS学习合理数M和方差参数θ的例子,对此我们有以下结论:

首先,KerBS可以学习多义性。从表6中我们可以发现,具有单一含义的单词,包括一些专有名词,只具有一种意义,但是对于意义更复杂的词,比如代词,需要更多的意义项来表示(在我们的实验中,为了保持训练的稳定性,我们将每个单词的义数限制在1到4之间)。此外,我们发现有四种意义的词有几种不同的含义。例如,“change”意味着转变和小额货币。

其次,在KerBS中,θ是一个单词的语义范围指标,在图3中,我们比较了3组名词的 θ 。对于它们的每一组,我们发现更大概念的词组(如汽车、动物和地球)拥有更大的 θ 。

5.5、时间复杂度

与baseline相比,将KerBS合并到文本生成中的计算成本主要取决于更大的嵌入匹配词汇量,而这只是整个文本生成计算的一部分。根据经验,当我们设置总意义数为词汇量的3倍左右时,KerBS花费的时间是vanilla softmax的两倍。

6、结论

文本生成需要适当的单词嵌入空间。在这篇论文中,我们提出了KerBS来学习更好的文本生成嵌入。与传统的Softmax不同,KerBS包含一个多义词嵌入的贝叶斯组合和一个可学习的内核来捕获词之间的相似性,将KerBS合并到文本生成中可以提高几个文本生成任务的性能,特别是对话生成任务。未来的工作包括提出更好的内核去生成和设计一个元学习机器来动态地重新分配意义数。

附录A  证明

引理A.1:KerBS具有学习多义性的能力。如果上下文向量的实际分布是由几个不相连的部分组成的,那么KerBS组件将学习表示这些部分的数量。

证明:我们只证明了传统内积核下最简单的情形。我们假设第i个单词的实际上下文向量由两个不相连的部分组成,并且它也有两个KerBS意义,我们还假设第1部分已经由第1部分中h1的意义表示,然后是第二个新分配的意义,我们发现:

其中h1和h2分别是第1部分和第2部分中的上下文向量,代表除了      和 之外的所有意义,第1部分已经用意义很好地表达了 应该比 大得多。然后有:

因此,第一部分对  的吸引力(第15行)比第二部分(第16行)要小得多,      将向第二部分移动。

引理A.2:KerBS具有学习模型方差的能力,对于方差更大的分布,KerBS学习更大的θ。

证明:我们只会给一个启发式证明θ是一个小的正数。证明也是在单意义条件下进行的,如果在其他区间θ,证明将会更加复杂,但思想是一样的。

根据  的定义:

其中, 的期望输出,并暂时隐藏其他参数。

我们可以推出  对 的偏导数:

当θ很小时,我们可以大致由以下方程:

大约得到:

其中被缩写成 

因为对于 , 通常很小,我们可以忽略式(19)的第二部分,所以最优值θ近似式(23)的一个解:

然后有:

由于当 时 ,并且当 恒正,故当  越来越小,有增长的趋势。因此,当分布方差增加时, 趋于下降,因为上下文向量离均值向量较远,所以, 将会增长。

附录B  实验细节

人工评分标准 - 志愿者被要求根据以下标准对所有模型产生的回答进行评分:

0分:回答既不流畅也与输入问题不相关。

• 1分:回答流畅或与输入问题相关,但不同时满足。

• 2分:回答流畅并且与输入问题相关。

(*本文为AI科技大本营编译文章,转载请微信系 1092722531)

精彩推荐

2019 中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。6.6 折票限时特惠(立减1400元),学生票仅 599 元!

推荐阅读

今日头条李磊等最新论文:用于文本生成的核化贝叶斯Softmax相关推荐

  1. keras bi-lstm_LSTM用于文本生成的应用介绍-使用Keras和启用GPU的Kaggle Kernels

    keras bi-lstm by Megan Risdal 梅根·里斯达尔(Megan Risdal) LSTM用于文本生成的应用介绍-使用Keras和启用GPU的Kaggle Kernels (An ...

  2. 李飞飞CVPR最新论文 | 「文本转图」效果优化可多一步:物体关系描述

    Root 假装发自 凹非寺 量子位 出品 | 公众号 QbitAI 一个设计师拿到简(mo)单(hu)需求的日常. 帮我做个海报吧. 我要个浪漫的场景,两个人在海边走,有日落,海浪,远山那种.  ...

  3. transformer xl 用于文本生成

    本文尝试用transformer xl做中文文本续写,基于论文为:<Transformer-XL: Attentive Language Models Beyond a Fixed-Length ...

  4. 利用循环神经网络生成唐诗_PyTorch实现用于文本生成的循环神经网络

    自然语言处理(NLP)有很多有趣的应用,文本生成就是其中一个有趣的应用. 当一个机器学习模型工作在诸如循环神经网络.LSTM-RNN.GRU等序列模型上时,它们可以生成输入文本的下一个序列. PyTo ...

  5. PyTorch实现用于文本生成的循环神经网络

    作者|DR. VAIBHAV KUMAR 编译|VK 来源|Analytics In Diamag 自然语言处理(NLP)有很多有趣的应用,文本生成就是其中一个有趣的应用. 当一个机器学习模型工作在诸 ...

  6. Python微调文本顺序对抗朴素贝叶斯算法垃圾邮件分类机制

    封面图片:<Python可以这样学>,ISBN:9787302456469,董付国,清华大学出版社 图书详情(京东): ================= 关于朴素贝叶斯算法中文垃圾邮件分 ...

  7. 文本分类(朴素贝叶斯算法)

    一.贝叶斯定理引入 1.朴素贝叶斯:   朴素贝叶斯中的朴素一词的来源就是假设各特征之间相互独立.这一假设使得朴素贝叶斯算法变得简单,但有时会牺牲一定的分类准确率. 2.贝叶斯公式: 3.换成分类任务 ...

  8. Google最新论文:Youtube视频推荐如何做多目标排序

    作者 | 深度传送门 来源 | 深度传送门(ID:deep_deliver) 导读:本文是"深度推荐系统"专栏的第十五篇文章,这个系列将介绍在深度学习的强力驱动下,给推荐系统工业界 ...

  9. 今日头条技术架构分析,看这篇就对了!

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Anywhere, it is a good in the past, re ...

最新文章

  1. USACO1.1 Broken Necklace (beads)
  2. 你在第几楼?80后、90后扎心图鉴
  3. MySQL流程控制函数-case结构
  4. [New Portal]Windows Azure Virtual Machine (18) Azure Virtual Machine内部IP和外部IP
  5. php spry文本域_Spry框架及验证构件
  6. git查看两次提交之间的差异_如何在同一分支的两个不同提交之间区分同一文件?...
  7. RTF文件格式【转】
  8. 开课吧Java课堂:如何通过接口引用实现接口?
  9. 必做作业3:原型化系统
  10. matlab2018a帮助文档设置为中文
  11. eviews时间序列分析课堂笔记
  12. 把js封装到html,什么是javascript封装?
  13. 苹果系统打不开html,苹果6s的蜂窝移动数据打开没反应怎么办
  14. 如何用PHP编写简单的api数据接口
  15. Linux详细到爆炸的一篇文章
  16. linux双机连通找不到con1,Linux服务器崩溃 - 错误在反序列化(节点$ CON):错误的连接...
  17. 如何才能够系统地学习Java并发技术?
  18. Python 测试框架pytest
  19. eclipse如何导入jdk包
  20. 彩色图像RGB分量直方图分析matlab

热门文章

  1. OpenStack快速入门
  2. 如何利用zendstudio新建 或导入php项目
  3. 制作一个简单的linux
  4. 理解LoadRunner中的局部变量和全局变量
  5. 使用Facade模式分析
  6. Java2021中级面试题
  7. 暑期集训2:ACM基础算法 练习题B:CF-1008B
  8. BZOJ1460: Pku2114 Boatherds
  9. vue实用组件——页面公共头部
  10. 【转】Mac 程序员的十种武器