基于IR-transformer、IRGAN模型,解读搜狗语义匹配技术

栏目: 后端 · 发布时间: 6年前

内容简介:本文介绍了搜狗搜索的 IR-transformer 模型和 IRGAN 强化学习训练框架。搜索引擎作为上网冲浪的直接入口,其检索能力的强弱直接影响用户的上网体验。深度学习技术近期的爆发式发展也深刻影响着信息检索技术的革新进程,目前已有越来越多的深度学习模型成功应用于信息检索领域并发挥着重要的作用。紧跟学术界的研究进展,搜狗搜索引入了诸多前沿技术用于解决信息检索中的语义匹配问题,例如本文将要介绍的 IR-transformer 模型和 IRGAN 强化学习训练框架。我们的研究结果显示,由于 IR-Trans

本文介绍了搜狗搜索的 IR-transformer 模型和 IRGAN 强化学习训练框架。

摘要

搜索引擎作为上网冲浪的直接入口,其检索能力的强弱直接影响用户的上网体验。深度学习技术近期的爆发式发展也深刻影响着信息检索技术的革新进程,目前已有越来越多的深度学习模型成功应用于信息检索领域并发挥着重要的作用。紧跟学术界的研究进展,搜狗搜索引入了诸多前沿技术用于解决信息检索中的语义匹配问题,例如本文将要介绍的 IR-transformer 模型和 IRGAN 强化学习训练框架。我们的研究结果显示,由于 IR-Transformer 模型使用的 multi-head attention 技术可以很好的结合上下文语境分析语义,所以 IR-Transformer 的语义匹配准确度大幅超越了如 DSSM、K-NRM 等诸多深度学习模型;使用 IRGAN 框架进行模型训练,可以动态的「提纯」训练数据,部分消除预测精度随训练时间增长而产生的波动性,从而极大地提高训练效率。

1 序言

1.1 搜索引擎与信息检索技术

随着互联网技术的飞速发展,网络信息的数量也在爆炸式地增长。信息数量的增长一方面使得用户有机会获取更多内容丰富、满足个性化需求的信息;另一方面也可能给用户准确定位其目标需求增加了难度。面对日益丰富的搜索需求,作为获取信息好助手的搜索引擎,也在不断革新其核心技术——信息检索技术(Information Retrieval,IR)。

那么,信息检索技术是如何在搜索引擎中发挥作用的呢?用户在信息检索时,会向搜索引擎输入需要查询的语句(query)。基于用户的查询语句以及特定的 IR 算法,搜索引擎会计算得到与用户查询匹配度最高的一些网页,并将它们返回给用户。

传统的信息检索算法有 BM25 等。BM25 算法通过网页字段对查询字段的覆盖程度来计算两者间的匹配得分,得分越高的网页与查询的匹配度更好。虽然如 BM25 等经典检索方法具有逻辑简洁、计算效率高等优势,但是它们也存在忽略字词间的语序逻辑、难以处理近义词间的匹配关系、无法定量表述语义等问题。简言之,经典方法在查询-网页的语义匹配上存在硬伤,而该问题的存在直接导致了传统的检索算法越来越难以满足用户日趋复杂的查询需求。

1.2 经典的深度语义匹配模型

为了解决传统算法在语义感知和匹配上的瓶颈,人们开始将深度学习算法应用于信息检索应用中。深度学习的概念最早由 Hinton 等人于 2006 年提出,它利用多层堆垛的非线性感知器对输入数据进行抽象和分析。随着大数据技术的蓬勃发展以及云计算能力的不断增强,深度学习技术开始异军突起,在图像分析、自然语言处理(Natural Language Processing, NLP)、语音识别等应用中发挥威力。

已广泛应用于查询-网页语义匹配的深度学习模型有 DSSM(Deep Structured Semantic Model)、CDSSM(Convolutional DSSM)、K-NRM(Kernel based Neural Ranking Model)等。DSSM 利用全连接神经网络把查询-网页标题信息抽象表示为高维向量,并利用特定的匹配算法计算查询和网页信息之间的相关性。K-NRM 方法首先计算查询和网页标题之间的相似度矩阵,再利用特定的核函数对相似度矩阵进行分析变换,最终利用变换后的矩阵信息计算查询-网页的匹配得分。相对于 BM25 等经典检索算法,DSSM、K-NRM 等深度学习模型的语义感知能力大为提升,比如,可以自动实现近义词间的词义匹配,定量化表述词义和语义等。然而,上述模型并非完美无缺。由于模型架构的局限性,这些深度学习模型还存在难以处理语序逻辑关系、语义分析能力有限(受限于模型表达能力)、查询-网页匹配质量一般等问题。

1.3 搜狗搜索的语义匹配技术前沿

为了不断提升信息检索结果的质量,必须要持续引入新的、表达能力更强的深度学习模型。与此同时,随着模型复杂度的提升,模型参数的寻优也越发困难,所以也必须引入更优的模型训练方法。基于此目的,下文将介绍最新应用于搜狗搜索的深度学习模型以及强化学习训练框架,分别是 IR-Transformer 和 IRGAN(Information Retrieval Generative Adversarial Network,信息检索生成对抗网络)。

我们的研究结果显示:由于 IR-Transformer 模型使用的 multi-head attention 技术可以很好的结合上下文语境分析语义,所以 IR-Transformer 模型的语义匹配能力大幅超越了如 DSSM、K-NRM 等诸多的深度学习模型,甚至超越了基于循环神经网络(Recurrent Neural Networks,RNN)、卷积神经网络(Convolutional Neural Network,CNN)的深度学习模型;任意深度学习模型均可嵌入 IRGAN 强化学习框架进行动态的对抗,在训练过程中,训练数据会被动态的优化,从而使该框架可以提高训练效率,收获更高的检索精度。

2 Transformer 模型

2.1 机器翻译 Transformer 模型简介

Transformer 模型最初发表在《Attention is all you need》一文 [1],用于处理机器翻译的问题。与其他机器翻译的研究不同,该模型并没有使用 RNN、CNN 等经典的神经网络结构,而主要采用 multi-head attention(多注意力)技术进行语义分析和处理。

那么,相对于传统的 CNN、RNN 模型,multi-head attention 有哪些好处呢?原文指出,使用 multi-head attention 技术可以直接处理语句内字词间逻辑关系,该特点可以提高长句的语义分析的精确度。此外,使用 multi-head attention 的模型还具有更容易进行并行计算等优势。目前,基于 Transformer 的变种模型已经应用于图像生成 [2,3]、逻辑推理 [4]、语句语义计算 [5] 等诸多领域,充分显示了 multi-head attention 技术的强大威力。

如图 1 所示,机器翻译 Transformer 由一个处理查询信息的编码器(encoder,图 1 左侧)和一个预测翻译结果的解码器(decoder,图 1 右侧)组成。当查询语句的「词嵌入」向量(embedding)输入编码器后,编码器会对查询进行编码,并将该编码信息传输给解码器;与此同时,解码器会基于编码信息进行解码,预测出语句翻译结果。这里需要解释一下「词嵌入」的概念和含义:词嵌入意味着用特定的高维向量(embedding)来表示语句中每个字词,向量的数值可以理解为对应字词的抽象含义。由于向量可以进行各种代数运算(但字词不能直接做计算),所以我们可以对字词向量设计特定的算法,利用运算的结果来定量化地表示语句的语义,最终实现如机器翻译、信息检索等应用。值得一提的是,词嵌入是处理绝大多数的 NLP 问题的第一步,对于本文提到的 RNN、CNN、IR-Transformer 等模型均是如此。

基于IR-transformer、IRGAN模型,解读搜狗语义匹配技术

图 1 机器翻译 Transformer 模型架构 [1]。

2.2 用于信息检索的 IR-Transformer

搜狗搜索对机器翻译 Transformer 模型进行了一定的改造,建立了用于信息检索的 IR-Transformer 模型。下文将简要介绍我们模型的架构。

类似于原始的 Transformer 模型,IR-Transformer 模型也分为两大模块:处理查询信息的 query 编码器(记为 q 编码器)和处理网页标题的 title 编码器(记为 t 编码器)。注意,由于处理信息检索问题时仅需分析已有网页,而不需要生成文字或者网页,所以 IR-Transformer 架构中不包含解码器。

q 编码器、t 编码器均为多层结构,较低层的输出作为较高层的输入被进一步处理,不同层的内部结构相同。每层 q 编码器由两个亚层组成,而每层 t 编码器由三个亚层组成。q 编码器和 t 编码器的第一个亚层主要执行 self multi-head attention 操作;q 编码器和 t 编码器的最后一个亚层主要执行非线性变换操作;t 编码器的第二层主要执行 q->t multi-head attention 操作。

细心的读者会发现,该模型共用到两种 multi-head attention 操作,即 self multi-head attention(两种编码器均采用)以及 q->t multi-head attention(仅用于 t 编码器)。实际上,这两种 multi-head attention 的差别仅在于输入的来源有所不同:前者的输入只包含自身相关的信息;而后者的输入不仅包含 t 编码器自身的信息,还包含来自 q 编码器的信息。

为了更形象的说明 multi-head attention 的运算过程,我们在图 2 中展示了一个具体的例子:假设 q 编码器的输入(即用户的查询)是「今天/天气/如何」(斜杠代表分词),一个待分析网页的标题是「近期/天气/汇总」。那么,对于 q 编码器而言,如图 2(a) 所示,执行 self multi-head attention 运算意味着要计算 N 个相关性矩阵(每个矩阵由如 (今天, 今天),(今天, 天气),(今天, 如何) 等词对的相关性数值组成)。换言之,词与词之间的相关性即为 attention 机制,而计算 N 个相关性矩阵意味着 multi-head。由于词对均由 q 编码器的输入组成,所以对于 q 编码器而言,这个操作也叫 self multi-head attention。利用 N 个相关性矩阵以及查询语句的初始语义向量(embedding),「今天」、「天气」、「如何」的语义可被进一步深化为三个新向量,如图 2(a) 的大括号右侧所示。

相对于未经过 self multi-head attention 的语义向量,新的语义向量含有了上下文的信息(信息来自 N 个相关性矩阵),内涵更加丰富、全面。所以,IR-Transformer 模型拥有结合上下文语境来分析语义的能力,而该能力对于信息检索精度至关重要,我们将在下一小节重点介绍这一特点。

同理,如图 2(b) 所示,q->t multi-head attention 操作需要计算 N 个相关性矩阵(每个矩阵由如 (近期,今天),(近期,天气),(近期,如何) 等词对的相关性数值组成)。需要注意的是,词对的组成不光来自 t 编码器,还来自 q 编码器(如「今天」等词)。

基于IR-transformer、IRGAN模型,解读搜狗语义匹配技术

图 2 (a) self multi-head attention 与 (b) q->t multi-head attention 示意。

经过 q 编码器、t 编码器的多层处理,用户查询和网页标题的语义已被充分抽象。利用加权平均、神经网络处理等方法,我们可以用两个高维向量来分别表示查询和网页标题。比如对于图 2 中的例子,查询和网页标题的信息可以分别表示为 q=(q_1, q_2, …, q_k) 以及 t=(t_1, t_2,…, t_k)。基于这两个高维向量的相似度(例如 cos 内积的大小),搜索引擎可以给网页打分,将高分的网页返回给发出查询请求的用户。

为了提高模型的精度以及收敛效率,我们也参考了原始文献,在 IR-Transformer 中加入了残差连接(residual connection)、层正则化(layer normalization)等技术;为了增加语序分析能力,我们在模型中加入了位置编码(positional encoding)等操作。

2.3 IR-Transformer 的效果

信息检索领域的一个重要的难题是:如何结合上下文语境分析语义,并对查询与网页的语义进行匹配。举个例子,假设用户的查询是「哪家/医院/看/XX 病/水平/好」,一个相关性较好的网页标题信息是「各大/医院/治/XX 病/效果」。对于该查询,其语义的核心在于「看/XX 病」,而网页信息的核心则是「治/XX 病」。在一般的语义环境中,「看」字的语义和「治」字的语义差别很大,所以如果直接计算「看」和「治」的相关性,则用户的查询和该网页的匹配度会比较差。但是,如果结合「XX 病」这个上下文语境,「看」字和「治」字的语义相关性就非常强了。换言之,一个好的搜索算法必须能够在感知上下文的前提下进行语义匹配。然而,K-NRM 以及 DSSM 等深度学习模型从原理上无法做到这一点,所以这些算法的搜索精度有限。

那么 IR-Transformer 感知上下文语境的能力怎样呢?我们做了如下实验:选择 6 个不同类型的网站,分别是(0)新浪博客,(1)道客巴巴,(2)宝宝树,(3)56 网,(4)大众点评和(5)土巴兔。每个网站确定 100 个互不重复的专属关键词,例如新浪博客的专属关键词是「博客」、「口述」等,道客巴巴是「汇报」、「文献」等,宝宝树是「试纸」、「分泌物」等。接下来,对每个网站分别选择含有专属关键词的网页标题,并利用 self multi-head attention 对这些网页标题进行处理。为了可视化显示 self multi-head attention 的语义分析能力,我们采用了 T-SNE 算法对这些专属关键词的语义向量进行了降维。

基于IR-transformer、IRGAN模型,解读搜狗语义匹配技术

图 3 self multi-head attention 的语境分析能力。本图采用了 T-SNE 降维算法对语义向量进行可视化。散点之间的距离越近意味着它们的语义相关性越强。

如图 3(a) 所示,在没有经过 self multi-head attention 之前,这些专属关键词的语义向量的区别并不大(各个颜色的散点并没有被明确区分成簇)。但是经过了两层 self multi-head attention 操作后,这些关键词的语义被明显区分开了。

那么图 3 背后的道理是什么呢?经过 self multi-head attention 之前,网页标题中不同词之间没有任何的相关性操作,即该语义向量中并没有任何的上下文的信息;经过 self multi-head attention 之后,由于 attention 操作(具体见上一节),这些关键词的语义中包含了上下文的信息。因为不同类型的(如新浪博客和道客巴巴)网页标题的上下文语境会有巨大差别,所以经过 self multi-head attention 之后,语义向量会被分在不同的簇内。

总结上文,图 3 的结果显示了 IR-Transformer 具有很强的感知上下文语境的能力,因此该模型的检索能力远超 DSSM、KNRM 等传统深度信息检索模型,甚至超越了如 RNN、CNN 等经典的模型。可以想见,对于在本节开头提出的「看病」的查询和「治病」的网页之间的匹配问题,IR-Transformer 会表现的非常出色。

3 IRGAN 模型

3.1 信息检索问题的模型训练

机器学习的基础理论指出,任何机器学习方法都是由模型、策略以及寻优算法构成的。其中,模型指的是机器学习方法的框架结构;策略以及寻优算法主要针对模型的训练:如何设定损失函数、梯度优化算法等环节来高效获得最优的模型参数。换言之,从方法论的角度,为了得到一个高精度的机器学习(深度学习)模型,设计完了模型框架并非大功告成,训练方法的设计也异常关键:我们必须确定模型的有效训练方法,才能获得最优模型数据,从而进行结果预测。

对于传统的训练方法,输入给模型的训练数据会被提前制作好并封装成为训练集合。在训练过程中,模型会从集合中随机抽样获得某条训练数据。可以想见,采用这样的训练方法,训练数据整体的学习难度就等于被构造的训练集的学习难度。换言之,训练难度是静态的。

然而,模型会随着训练而「成长」,静态的训练难度不容易获得最优的训练模型。这是为什么呢?举个例子来解释:当一个高中生刚开始学习高中知识时,他开始可能会觉得有点难,但后来会越来越适应,并很快掌握了这些知识;当这个高中生毕业后进入了大学,如果他还只学习高中难度的知识,他就学不到什么新的内容了。对于深度学习的模型训练,道理亦是如此:一成不变的学习难度难以完全激发模型的潜力。

为了解决训练集难度不变的问题,搜狗搜索引入了 IRGAN 强化学习训练框架:采用该框架可以动态的提升训练数据的难度,从而提高训练效率以及预测精度。

3.2 IRGAN 原理

IRGAN 模型最初发表在《Irgan: A minimax game for unifying generative and discriminative information retrieval models》[6]。该模型脱胎于在图片生成领域得到广泛应用的生成对抗网络(Generative Adversarial Network,GAN)。

为了更好地理解 IRGAN 的工作机制,我们首先介绍 GAN。GAN 是一种强化学习方法,其基本思想是让模型在对抗中学习训练样本的特征。GAN 由生成器(generator,记为 G)和判别器(discriminator,记为 D)组成。以图片生成领域的上色问题为例,为了训练 GAN,我们需要一系列彩色图片以及与彩色图片对应的黑白图片。生成器以黑白图片输入,利用 CNN 等神经网络结构,生成黑白上色的彩色图片。此后,生成器将生成的彩色图片(或者说伪彩色照片)与真实的彩色图片一起提交给判别器,让其从中选择哪个是真实的彩色图片。如果判别器选错了,判别器将会受到惩罚;反之如果判别器选对了,生成器将会受到惩罚。在 GAN 的训练过程中,生成器和判别器会动态的寻找彼此的弱点,并不断增强自身。在训练结束后,生成器为模型有效的部分:生成器会将待上色的黑白照片处理成为逼真的彩色照片。

对于 IRGAN 而言,其设计思想与传统的 GAN 大同小异:同样是利用生成器和判别器之间的博弈来让两者相辅相成,共同成长。然而,由于 IR 的任务并不是生成以假乱真的虚假网页,而是返回更准确的检索结果,所以 IRGAN 的模型架构、训练方法、训练数据构造均与传统的 GAN 有一定差别。

3.3 IRGAN 训练框架

IRGAN 的训练数据必须满足一定的格式要求。比如,每条训练数据要包括一个查询语句 query 以及多个(个数大于 2)与查询相关的网页数据。此外,每条训练数据还要在多个网页数据中标明哪个与本条 query 最为相关。记与当前查询最为相关的网页为 doc_+,其他网页信息为 doc_-,那么训练集的格式即为 (query, doc_+, doc_-, doc_-, … ,doc_-)。

基于IR-transformer、IRGAN模型,解读搜狗语义匹配技术

图 4 IRGAN 模型架构

如图 4 所示,IRGAN 的训练过程可分为判别器的训练和生成器的训练两部分。在训练判别器时,生成器首先会拿到形如 (query, doc_+, doc_-, doc_-, … ,doc_-) 的初始数据。为了最大程度的欺骗判别器,生成器会从诸多 doc_-中挑选一个它认为与查询最相关的网页数据,并将这个 doc_-与 doc_+(实际上最相关的网页数据)拼在一起形成新的数据对 (query, doc_+, doc_-)。判别器会对生成器产生的数据对做出选择:究竟哪个网页与查询最相关。如果判别器选择错误(换言之,被生成器骗到了),那么它将会被惩罚,从而得到训练。

必须要指出的是,由于生成器在不断进化,所以它产生的数据对 (query, doc_+, doc_-) 也在不断发生改变。该变化即上文所述的「动态对抗使得训练数据的难度发生变化」。

生成器的前半部分训练流程基本与判别器的训练流程一致:生成器获得原始数据,生成为了欺骗判别器的数据对。此后,当判别器对数据对做出判断之后,会输出一个混淆评分给生成器。混淆评分越大意味着判别器越容易被生成器产生的数据所迷惑;反之,评分越小意味着生成器产生的数据并没有让判别器特别困扰。该混淆评分会作为生成器的奖励,指导生成器的优化方向。随着生成器训练的推进,它会分析出除了 doc+外哪个 doc-的语义最接近 query,从而更准确的攻击判别器的选择盲区并得到更高的奖励。

IRGAN 是一种对抗训练的模式,有对抗就有强弱(即检索能力的高低),所以在训练完成后,我们可以选生成器和判别器中能力更强的那个来进行信息检索。

值得一提的是,IRGAN 模型规定的是训练的框架,而没有对判别器和生成器的内部结构做出任何限定。换言之,任何可用作信息检索的深度学习模型都可以当作 IRGAN 的生成器或者判别器。例如上文介绍的 IR-transformer 模型就可嵌入 IRGAN 框架中。

3.4 IRGAN 的效果

为了证实 IRGAN 的确在动态对抗中优化了输入的训练集,我们做了如下实验:对于某一深度信息检索模型,我们让其在普通的训练模式下训练一定时间,并将该状态作为初始状态进一步进行两种方式的训练:(a) 继续进行普通训练;(b) 分别当作 IRGAN 的生成器和判别器的初始状态,并让生成器和判别器进行对抗训练。

如图 5 所示,(a) 图表示采用普通模式得到的预测精度(DCG5)随训练的变化,(b) 图表示采用 IRGAN 模式得到的预测精度随训练的变化。图 5(b) 中蓝色点为生成器的预测精度,绿色点为判别器的预测精度,黑色点为在训练开始前的预测精度,红色区域代表生成器训练的阶段。

训练集由大量的训练数据组成,从微观角度,部分训练数据较难学习,而部分训练数据较容易被学习。在普通的训练模式中,模型通过从集合中抽样获得训练数据,所以训练数据的难度随机变化,起伏较大。可想而知,以这样的训练方式得到的结果的精度也必然是随机起伏的,恰如图 5(a) 所示。不幸的是,当预测精度出现随训练时长的随机性波动,一般也就意味着训练的效率大幅下降了。

那么,有没有什么办法可以降低这种随机性呢?答案就是采用 IRGAN 训练框架。在动态对抗下,生成器会学到判别器的弱点,并对原始训练集进行「提纯」,即从 4 个 doc_-中选择一个最难分辨的 doc_-交给判别器去抉择。值得注意的是,经过了生成器的提纯,判别器得到的训练数据难度再也不是随机变化的了。如图 5(b) 所示,在 IRGAN 训练框架下,生成器和判别器的预测精度具有明确的周期性变化趋势,且生成器和判别器的能力交替上升和下降。判别器预测精度上升意味着在此阶段判别器很好地「击败了」生成器;反之,如果预测精度下降,意味着在此阶段判别器完全被搞迷糊了,学错了很多「知识」。

精度的周期性波动取代随机性波动说明了 IRGAN 训练模式对训练数据提纯的有效性。换言之,将深度学习模型嵌入到 IRGAN 框架下再进行训练具有大幅提高训练效率、充分发掘模型能力等优势。我们的研究结果显示,达到同样的信息检索精度,使用 IRGAN 框架可以节省一半甚至更多的训练时间。

基于IR-transformer、IRGAN模型,解读搜狗语义匹配技术

图 5 使用 IRGAN 训练框架,可以「精炼」训练数据,并在一定程度上消除预测精度的随机性波动。

4 总结与展望

随着学术界对深度学习研究的不断深入,优秀的算法和技术手段在不断涌现。本文介绍的 IR-transformer 模型和 IRGAN 训练框架就是近期学界的新鲜成果。

然而必须要指出的是,虽然信息检索中的很多问题可以利用深度学习模型较好的解决,但是还有大量的问题亟待研究。比如,深度学习的模型训练需要大量的高质量数据,如何通过用户点击或者其他行为得到足够纯净的训练集是决定深度学习模型能力强弱的重要难题;此外,未来的深度学习模型还需考虑更多样的搜索需求,比如考虑用户的个性化特点,搜索产生的时间、地点,用户的搜索历史等信息。

道路虽然曲折,但前途依然光明。随着大数据技术的不断发展以及对深度学习、机器学习算法研究的不断深入,我们有理由相信,未来的搜索引擎一定会越发智能化、个性化,伴随在人们上网冲浪的点滴时刻。

参考文献

  1. Vaswani A, Shazeer N, Parmar N, Uszkoreit J, Jones L, Gomez AN, et al., editors. Attention is all you need. Advances in Neural Information Processing Systems; 2017.

  2. Parmar N, Vaswani A, Uszkoreit J, Kaiser Ł, Shazeer N, Ku A. Image Transformer. arXiv preprint arXiv:180205751. 2018.

  3. Vaswani A, Bengio S, Brevdo E, Chollet F, Gomez AN, Gouws S, et al. Tensor2tensor for neural machine translation. arXiv preprint arXiv:180307416. 2018.

  4. Dehghani M, Gouws S, Vinyals O, Uszkoreit J, Kaiser Ł. Universal Transformers. arXiv preprint arXiv:180703819. 2018.

  5. Cer D, Yang Y, Kong S-y, Hua N, Limtiaco N, John RS, et al. Universal sentence encoder. arXiv preprint arXiv:180311175. 2018.

  6. Wang J, Yu L, Zhang W, Gong Y, Xu Y, Wang B, et al., editors. Irgan: A minimax game for unifying generative and discriminative information retrieval models. Proceedings of the 40th International ACM SIGIR conference on Research and Development in Information Retrieval; 2017: ACM.


以上所述就是小编给大家介绍的《基于IR-transformer、IRGAN模型,解读搜狗语义匹配技术》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ruby元编程

Ruby元编程

[意] Paolo Perrotta / 廖志刚、陈睿杰 / 华中科技大学出版社 / 2012-1-10 / 56.00元

《Ruby元编程》以案例形式循序渐进讲解Ruby对象模型原理和高级应用技巧,堪称动态语言的设计模式。书中讲述的各种Ruby编程模式,完全可以应用于其他动态语言(甚至静态语言)。本书不仅适合Ruby程序员阅读,也适合对动态编程 语言和面向对象编程感兴趣的读者阅读。所有对程序设计理论感兴趣的人都能从中获益。Ruby之父松本行弘作序推荐。一起来看看 《Ruby元编程》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具