diff --git a/ltr/README.md b/ltr/README.md index b39ddac7cb80d2a8afc2665bd014c1f2d7bf7041..0ee2dadbd9a67360dadea20d244a182cd7c0547b 100644 --- a/ltr/README.md +++ b/ltr/README.md @@ -2,20 +2,6 @@ 排序学习技术\[[1](#参考文献1)\]是构建排序模型的机器学习方法,在信息检索、自然语言处理,数据挖掘等机器学场景中具有重要作用。排序学习的主要目的是对给定一组文档,对任意查询请求给出反映相关性的文档排序。在本例子中,利用标注过的语料库训练两种经典排序模型RankNet[[4](#参考文献4)\]和LamdaRank[[6](#参考文献6)\],分别可以生成对应的排序模型,能够对任意查询请求,给出相关性文档排序。 -RankNet模型在命令行输入: - -```bash -bash ./run_ranknet.sh -``` - -LambdaRank模型在命令行输入: - -```bash -bash ./run_lambdarank.sh -``` - -用户只需要使用以上命令就完成排序模型的训练和预测,程序会自动下载内置数据集,无需手动下载。 - ## 背景介绍 排序学习技术随着互联网的快速增长而受到越来越多关注,是机器学习中的常见任务之一。一方面人工排序规则不能处理海量规模的候选数据,另一方面无法为不同渠道的候选数据给于合适的权重,因此排序学习在日常生活中应用非常广泛。排序学习起源于信息检索领域,目前仍然是许多信息检索场景中的核心模块,例如搜索引擎搜索结果排序,推荐系统候选集排序,在线广告排序等等。本例以文档检索任务阐述排序学习模型。 @@ -102,60 +88,27 @@ $$\lambda _{i,j}=\frac{\partial C}{\partial s_{i}} = \frac{1}{2}(1-S_{i,j})-\fra - 全连接层(fully connected layer) : 指上一层中的每个节点都连接到下层网络。本例子中同样使用`paddle.layer.fc`实现,注意输入到RankCost层的全连接层维度为1。 - RankCost层: RankCost层是排序网络RankNet的核心,度量docA相关性是否比docB好,给出预测值并和label比较。使用了交叉熵(cross enctropy)作为度量损失函数,使用梯度下降方法进行优化。细节可见[RankNet](http://icml.cc/2015/wp-content/uploads/2015/06/icml_ranking.pdf)[4]。 -由于Pairwise中的网络结构是左右对称,可定义一半网络结构,另一半共享网络参数。在PaddlePaddle中允许网络结构中共享连接,具有相同名字的参数将会共享参数。使用PaddlePaddle实现RankNet排序模型,定义网络结构的示例代码如下: +由于Pairwise中的网络结构是左右对称,可定义一半网络结构,另一半共享网络参数。在PaddlePaddle中允许网络结构中共享连接,具有相同名字的参数将会共享参数。使用PaddlePaddle实现RankNet排序模型,定义网络结构的示例代码见 [ranknet.py](ranknet.py) 中的 `half_ranknet` 函数。 -```python -import paddle.v2 as paddle - -def half_ranknet(name_prefix, input_dim): - """ - parameter with a same name will be shared in PaddlePaddle framework, - these parameters in ranknet can be used in shared state, e.g. left network and right network in detail - https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/api.md - """ - # data layer - data = paddle.layer.data(name_prefix+"/data", paddle.data_type.dense_vector(input_dim)) - - # fully connect layer - hd1 = paddle.layer.fc( - input=data, - size=10, - act=paddle.activation.Tanh(), - param_attr=paddle.attr.Param(initial_std=0.01, name="hidden_w1")) - # fully connected layer/ output layer - output = paddle.layer.fc( - input=hd1, - size=1, - act=paddle.activation.Linear(), - param_attr=paddle.attr.Param(initial_std=0.01, name="output")) - return output - -def ranknet(input_dim): - # label layer - label = paddle.layer.data("label", paddle.data_type.integer_value(1)) - - # reuse the parameter in half_ranknet - output_left = half_ranknet("left", input_dim) - output_right = half_ranknet("right", input_dim) - - # rankcost layer - cost = paddle.layer.rank_cost(name="cost", left=output_left, right=output_right, label=label) - return cost -``` - -上述结构中使用了和图3相同的模型结构:两层隐藏层,分别是`hidden_size=10`的全连接层和`hidden_size=1`的全连接层。本例中的input_dim指输入**单个文档**的特征的维度,label取值为1,0。每条输入样本为`