diff --git a/.clang_format.hook b/.clang_format.hook index 9db4fe4550c44fdb60e48818841d99ba5a081f46..4cbc972bbd200d0dcb6d8ba404bb1286ee81736c 100755 --- a/.clang_format.hook +++ b/.clang_format.hook @@ -1,5 +1,15 @@ -#!/bin/bash +#!/usr/bin/env bash +set -e -# clang-format hook without version check +readonly VERSION="3.9" + +version=$(clang-format -version) + +if ! [[ $version == *"$VERSION"* ]]; then + echo "clang-format version check failed." + echo "a version contains '$VERSION' is needed, but get '$version'" + echo "you can install the right version, and make an soft-link to '\$PATH' env" + exit -1 +fi clang-format $@ diff --git a/README.cn.md b/README.cn.md new file mode 100644 index 0000000000000000000000000000000000000000..aaf195d888c9d6231c8db2a3f04bbb2248a89edc --- /dev/null +++ b/README.cn.md @@ -0,0 +1,84 @@ +# models 简介 + +[![Documentation Status](https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat)](https://github.com/PaddlePaddle/models) +[![Documentation Status](https://img.shields.io/badge/中文文档-最新-brightgreen.svg)](https://github.com/PaddlePaddle/models) +[![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](LICENSE) + +PaddlePaddle提供了丰富的运算单元,帮助大家以模块化的方式构建起千变万化的深度学习模型来解决不同的应用问题。这里,我们针对常见的机器学习任务,提供了不同的神经网络模型供大家学习和使用。 + + +## 1. 词向量 + +词向量用一个实向量表示词语,向量的每个维都表示文本的某种潜在语法或语义特征,是深度学习应用于自然语言处理领域最成功的概念和成果之一。广义的,词向量也可以应用于普通离散特征。词向量的学习通常都是一个无监督的学习过程,因此,可以充分利用海量的无标记数据以捕获特征之间的关系,也可以有效地解决特征稀疏、标签数据缺失、数据噪声等问题。然而,在常见词向量学习方法中,模型最后一层往往会遇到一个超大规模的分类问题,是计算性能的瓶颈。 + +在词向量的例子中,我们向大家展示如何使用Hierarchical-Sigmoid 和噪声对比估计(Noise Contrastive Estimation,NCE)来加速词向量的学习。 + +- 1.1 [Hsigmoid加速词向量训练](https://github.com/PaddlePaddle/models/tree/develop/hsigmoid) +- 1.2 [噪声对比估计加速词向量训练](https://github.com/PaddlePaddle/models/tree/develop/nce_cost) + + +## 2. 使用循环神经网络语言模型生成文本 + +语言模型是自然语言处理领域里一个重要的基础模型,除了得到词向量(语言模型训练的副产物),还可以帮助我们生成文本。给定若干个词,语言模型可以帮助我们预测下一个最可能出现的词。在利用语言模型生成文本的例子中,我们重点介绍循环神经网络语言模型,大家可以通过文档中的使用说明快速适配到自己的训练语料,完成自动写诗、自动写散文等有趣的模型。 + +- 2.1 [使用循环神经网络语言模型生成文本](https://github.com/PaddlePaddle/models/tree/develop/generate_sequence_by_rnn_lm) + +## 3. 点击率预估 + +点击率预估模型预判用户对一条广告点击的概率,对每次广告的点击情况做出预测,是广告技术的核心算法之一。逻谛斯克回归对大规模稀疏特征有着很好的学习能力,在点击率预估任务发展的早期一统天下。近年来,DNN 模型由于其强大的学习能力逐渐接过点击率预估任务的大旗。 + +在点击率预估的例子中,我们给出谷歌提出的 Wide & Deep 模型。这一模型融合了适用于学习抽象特征的 DNN 和适用于大规模稀疏特征的逻谛斯克回归两者模型的优点,可以作为一种相对成熟的模型框架使用, 在工业界也有一定的应用。 + +- 3.1 [Wide & deep 点击率预估模型](https://github.com/PaddlePaddle/models/tree/develop/ctr) + +## 4. 文本分类 + +文本分类是自然语言处理领域最基础的任务之一,深度学习方法能够免除复杂的特征工程,直接使用原始文本作为输入,数据驱动地最优化分类准确率。 + +在文本分类的例子中,我们以情感分类任务为例,提供了基于DNN的非序列文本分类模型,以及基于CNN的序列模型供大家学习和使用(基于LSTM的模型见PaddleBook中[情感分类](https://github.com/PaddlePaddle/book/blob/develop/06.understand_sentiment/README.cn.md)一课)。 + +- 4.1 [基于 DNN / CNN 的情感分类](https://github.com/PaddlePaddle/models/tree/develop/text_classification) + +## 5. 排序学习 + +排序学习(Learning to Rank, LTR)是信息检索和搜索引擎研究的核心问题之一,通过机器学习方法学习一个分值函数对待排序的候选进行打分,再根据分值的高低确定序关系。深度神经网络可以用来建模分值函数,构成各类基于深度学习的LTR模型。 + +在排序学习的例子中,我们介绍基于 RankLoss 损失函数的 Pairwise 排序模型和基于LambdaRank损失函数的Listwise排序模型(Pointwise学习策略见PaddleBook中[推荐系统](https://github.com/PaddlePaddle/book/blob/develop/05.recommender_system/README.cn.md)一课)。 + +- 5.1 [基于 Pairwise 和 Listwise 的排序学习](https://github.com/PaddlePaddle/models/tree/develop/ltr) + +## 6. 深度结构化语义模型 + 深度结构化语义模型使用DNN模型在一个连续的语义空间中学习文本低纬的向量表示,最终建模两个句子间的语义相似度。 + +本例中我们演示如何使用 PaddlePaddle实现一个通用的深度结构化语义模型来建模两个字符串间的语义相似度。 +模型支持CNN(卷积网络)、FC(全连接网络)、RNN(递归神经网络)等不同的网络结构,以及分类、回归、排序等不同损失函数,采用了比较通用的数据格式,用户替换数据便可以在真实场景中使用。 + +- 6.1 [深度结构化语义模型](https://github.com/PaddlePaddle/models/tree/develop/dssm) + +## 7. 序列标注 + +给定输入序列,序列标注模型为序列中每一个元素贴上一个类别标签,是自然语言处理领域最基础的任务之一。随着深度学习的不断探索和发展,利用循环神经网络学习输入序列的特征表示,条件随机场(Conditional Random Field, CRF)在特征基础上完成序列标注任务,逐渐成为解决序列标注问题的标配解决方案。 + +在序列标注的例子中,我们以命名实体识别(Named Entity Recognition,NER)任务为例,介绍如何训练一个端到端的序列标注模型。 + +- 7.1 [命名实体识别](https://github.com/PaddlePaddle/models/tree/develop/sequence_tagging_for_ner) + +## 8. 序列到序列学习 + +序列到序列学习实现两个甚至是多个不定长模型之间的映射,有着广泛的应用,包括:机器翻译、智能对话与问答、广告创意语料生成、自动编码(如金融画像编码)、判断多个文本串之间的语义相关性等。 + +在序列到序列学习的例子中,我们以机器翻译任务为例,提供了多种改进模型,供大家学习和使用。包括:不带注意力机制的序列到序列映射模型,这一模型是所有序列到序列学习模型的基础;使用 scheduled sampling 改善 RNN 模型在生成任务中的错误累积问题;带外部记忆机制的神经机器翻译,通过增强神经网络的记忆能力,来完成复杂的序列到序列学习任务。 + +- 8.1 [无注意力机制的编码器解码器模型](https://github.com/PaddlePaddle/models/tree/develop/nmt_without_attention) + +## 9. 图像分类 +图像相比文字能够提供更加生动、容易理解及更具艺术感的信息,是人们转递与交换信息的重要来源。在图像分类的例子中,我们向大家介绍如何在PaddlePaddle中训练AlexNet、VGG、GoogLeNet和ResNet模型。同时还提供了一个模型转换工具,能够将Caffe训练好的模型文件,转换为PaddlePaddle的模型文件。 + +- 9.1 [将Caffe模型文件转换为PaddlePaddle模型文件](https://github.com/PaddlePaddle/models/tree/develop/image_classification/caffe2paddle) +- 9.2 [AlexNet](https://github.com/PaddlePaddle/models/tree/develop/image_classification) +- 9.3 [VGG](https://github.com/PaddlePaddle/models/tree/develop/image_classification) +- 9.4 [Residual Network](https://github.com/PaddlePaddle/models/tree/develop/image_classification) + + +## Copyright and License +PaddlePaddle is provided under the [Apache-2.0 license](LICENSE). diff --git a/README.md b/README.md index aaf195d888c9d6231c8db2a3f04bbb2248a89edc..e30f4a7064241dfa026c071903bbc3dbf5bc051c 100644 --- a/README.md +++ b/README.md @@ -1,84 +1,80 @@ -# models 简介 +# Introduction to models -[![Documentation Status](https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat)](https://github.com/PaddlePaddle/models) -[![Documentation Status](https://img.shields.io/badge/中文文档-最新-brightgreen.svg)](https://github.com/PaddlePaddle/models) -[![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](LICENSE) +PaddlePaddle provides a rich set of computational units to enable users to adopt a modular approach to solving various learning problems. In this repo, we demonstrate how to use PaddlePaddle to solve common machine learning tasks, providing several different neural network model that anyone can easily learn and use. -PaddlePaddle提供了丰富的运算单元,帮助大家以模块化的方式构建起千变万化的深度学习模型来解决不同的应用问题。这里,我们针对常见的机器学习任务,提供了不同的神经网络模型供大家学习和使用。 +## 1. Word Embedding +The word embedding expresses words with a real vector. Each dimension of the vector represents some of the latent grammatical or semantic features of the text and is one of the most successful concepts in the field of natural language processing. The generalized word vector can also be applied to discrete features. The study of word vector is usually an unsupervised learning. Therefore, it is possible to take full advantage of massive unmarked data to capture the relationship between features and to solve the problem of sparse features, missing tag data, and data noise. However, in the common word vector learning method, the last layer of the model often encounters a large-scale classification problem, which is the bottleneck of computing performance. -## 1. 词向量 +In the example of word vectors, we show how to use Hierarchical-Sigmoid and Noise Contrastive Estimation (NCE) to accelerate word-vector learning. -词向量用一个实向量表示词语,向量的每个维都表示文本的某种潜在语法或语义特征,是深度学习应用于自然语言处理领域最成功的概念和成果之一。广义的,词向量也可以应用于普通离散特征。词向量的学习通常都是一个无监督的学习过程,因此,可以充分利用海量的无标记数据以捕获特征之间的关系,也可以有效地解决特征稀疏、标签数据缺失、数据噪声等问题。然而,在常见词向量学习方法中,模型最后一层往往会遇到一个超大规模的分类问题,是计算性能的瓶颈。 +- 1.1 [Hsigmoid Accelerated Word Vector Training] (https://github.com/PaddlePaddle/models/tree/develop/hsigmoid) +- 1.2 [Noise Contrast Estimation Accelerated Word Vector Training] (https://github.com/PaddlePaddle/models/tree/develop/nce_cost) -在词向量的例子中,我们向大家展示如何使用Hierarchical-Sigmoid 和噪声对比估计(Noise Contrastive Estimation,NCE)来加速词向量的学习。 -- 1.1 [Hsigmoid加速词向量训练](https://github.com/PaddlePaddle/models/tree/develop/hsigmoid) -- 1.2 [噪声对比估计加速词向量训练](https://github.com/PaddlePaddle/models/tree/develop/nce_cost) +## 2. Generate text using the recurrent neural network language model +The language model is important in the field of natural language processing. In addition to getting the word vector (a by-product of language model training), it can also help us to generate text. Given a number of words, the language model can help us predict the next most likely word. In the example of using the language model to generate text, we focus on the recurrent neural network language model. We can use the instructions in the document quickly adapt to their training corpus, complete automatic writing poetry, automatic writing prose and other interesting models. -## 2. 使用循环神经网络语言模型生成文本 +- 2.1 [Generate text using the annotated neural network language model] (https://github.com/PaddlePaddle/models/tree/develop/generate_sequence_by_rnn_lm) -语言模型是自然语言处理领域里一个重要的基础模型,除了得到词向量(语言模型训练的副产物),还可以帮助我们生成文本。给定若干个词,语言模型可以帮助我们预测下一个最可能出现的词。在利用语言模型生成文本的例子中,我们重点介绍循环神经网络语言模型,大家可以通过文档中的使用说明快速适配到自己的训练语料,完成自动写诗、自动写散文等有趣的模型。 +## 3. Click-Through Rate prediction +The click-through rate model predicts the probability that a user will click on an ad. This is widely used for advertising technology. Logistic Regression has a good learning performance for large-scale sparse features in the early stages of the development of click-through rate prediction. In recent years, DNN model because of its strong learning ability to gradually take the banner rate of the task of the banner. -- 2.1 [使用循环神经网络语言模型生成文本](https://github.com/PaddlePaddle/models/tree/develop/generate_sequence_by_rnn_lm) +In the example of click-through rate estimates, we give the Google's Wide & Deep model. This model combines the advantages of DNN and the applicable logistic regression model for DNN and large-scale sparse features. -## 3. 点击率预估 +- 3.1 [Click-Through Rate Model] (https://github.com/PaddlePaddle/models/tree/develop/ctr) -点击率预估模型预判用户对一条广告点击的概率,对每次广告的点击情况做出预测,是广告技术的核心算法之一。逻谛斯克回归对大规模稀疏特征有着很好的学习能力,在点击率预估任务发展的早期一统天下。近年来,DNN 模型由于其强大的学习能力逐渐接过点击率预估任务的大旗。 +## 4. Text classification -在点击率预估的例子中,我们给出谷歌提出的 Wide & Deep 模型。这一模型融合了适用于学习抽象特征的 DNN 和适用于大规模稀疏特征的逻谛斯克回归两者模型的优点,可以作为一种相对成熟的模型框架使用, 在工业界也有一定的应用。 +Text classification is one of the most basic tasks in natural language processing. The deep learning method can eliminate the complex feature engineering, and use the original text as input to optimize the classification accuracy. -- 3.1 [Wide & deep 点击率预估模型](https://github.com/PaddlePaddle/models/tree/develop/ctr) +For text classification, we provide a non-sequential text classification model based on DNN and CNN. (For LSTM-based model, please refer to PaddleBook [Sentiment Analysis] https://github.com/PaddlePaddle/book/blob/develop/06.understand_sentiment/README.cn.md)). -## 4. 文本分类 +- 4.1 [Sentiment analysis based on DNN / CNN] (https://github.com/PaddlePaddle/models/tree/develop/text_classification) -文本分类是自然语言处理领域最基础的任务之一,深度学习方法能够免除复杂的特征工程,直接使用原始文本作为输入,数据驱动地最优化分类准确率。 +## 5. Learning to rank -在文本分类的例子中,我们以情感分类任务为例,提供了基于DNN的非序列文本分类模型,以及基于CNN的序列模型供大家学习和使用(基于LSTM的模型见PaddleBook中[情感分类](https://github.com/PaddlePaddle/book/blob/develop/06.understand_sentiment/README.cn.md)一课)。 +Learning to rank (LTR) is one of the core problems in information retrieval and search engine research. Training data is used by a learning algorithm to produce a ranking model which computes the relevance of documents for actual queries. +The depth neural network can be used to model the fractional function to form various LTR models based on depth learning. -- 4.1 [基于 DNN / CNN 的情感分类](https://github.com/PaddlePaddle/models/tree/develop/text_classification) +The algorithms for learning to rank are usually categorized into three groups by their input representation and the loss function. These are pointwise, pairwise and listwise approaches. Here we demonstrate RankLoss loss function method (pairwise approach), and LambdaRank loss function method (listwise approach). (For Pointwise approaches, please refer to [Recommended System] (https://github.com/PaddlePaddle/book/ blob / develop / 05.recommender_system / README.cn.md)). -## 5. 排序学习 +- 5.1 [Learning to rank based on Pairwise and Listwise approches] (https://github.com/PaddlePaddle/models/tree/develop/ltr) -排序学习(Learning to Rank, LTR)是信息检索和搜索引擎研究的核心问题之一,通过机器学习方法学习一个分值函数对待排序的候选进行打分,再根据分值的高低确定序关系。深度神经网络可以用来建模分值函数,构成各类基于深度学习的LTR模型。 +## 6. Semantic model +The deep structured semantic model uses the DNN model to learn the vector representation of the low latitude in a continuous semantic space, finally models the semantic similarity between the two sentences. -在排序学习的例子中,我们介绍基于 RankLoss 损失函数的 Pairwise 排序模型和基于LambdaRank损失函数的Listwise排序模型(Pointwise学习策略见PaddleBook中[推荐系统](https://github.com/PaddlePaddle/book/blob/develop/05.recommender_system/README.cn.md)一课)。 +In this example, we demonstrate how to use PaddlePaddle to implement a generic deep structured semantic model to model the semantic similarity between two strings. The model supports different network structures such as CNN (Convolutional Network), FC (Fully Connected Network), RNN (Recurrent Neural Network), and different loss functions such as classification, regression, and sequencing. -- 5.1 [基于 Pairwise 和 Listwise 的排序学习](https://github.com/PaddlePaddle/models/tree/develop/ltr) +- 6.1 [Deep structured semantic model] (https://github.com/PaddlePaddle/models/tree/develop/dssm) -## 6. 深度结构化语义模型 - 深度结构化语义模型使用DNN模型在一个连续的语义空间中学习文本低纬的向量表示,最终建模两个句子间的语义相似度。 +## 7. Sequence tagging -本例中我们演示如何使用 PaddlePaddle实现一个通用的深度结构化语义模型来建模两个字符串间的语义相似度。 -模型支持CNN(卷积网络)、FC(全连接网络)、RNN(递归神经网络)等不同的网络结构,以及分类、回归、排序等不同损失函数,采用了比较通用的数据格式,用户替换数据便可以在真实场景中使用。 +Given the input sequence, the sequence tagging model is one of the most basic tasks in the natural language processing by assigning a category tag to each element in the sequence. Recurrent neural network models with Conditional Random Field (CRF) are commonly used for sequence tagging tasks. -- 6.1 [深度结构化语义模型](https://github.com/PaddlePaddle/models/tree/develop/dssm) +In the example of the sequence tagging, we describe how to train an end-to-end sequence tagging model with the Named Entity Recognition (NER) task as an example. -## 7. 序列标注 +- 7.1 [Name Entity Recognition] (https://github.com/PaddlePaddle/models/tree/develop/sequence_tagging_for_ner) -给定输入序列,序列标注模型为序列中每一个元素贴上一个类别标签,是自然语言处理领域最基础的任务之一。随着深度学习的不断探索和发展,利用循环神经网络学习输入序列的特征表示,条件随机场(Conditional Random Field, CRF)在特征基础上完成序列标注任务,逐渐成为解决序列标注问题的标配解决方案。 +## 8. Sequence to sequence learning -在序列标注的例子中,我们以命名实体识别(Named Entity Recognition,NER)任务为例,介绍如何训练一个端到端的序列标注模型。 +Sequence-to-sequence model has a wide range of applications. This includes machine translation, dialogue system, and parse tree generation. -- 7.1 [命名实体识别](https://github.com/PaddlePaddle/models/tree/develop/sequence_tagging_for_ner) +As an example for sequence-to-sequence learning, we take the machine translation task. We demonstrate the sequence-to-sequence mapping model without attention mechanism, which is the basis for all sequence-to-sequence learning models. We will use scheduled sampling to improve the problem of error accumulation in the RNN model, and machine translation with external memory mechanism. -## 8. 序列到序列学习 +- 8.1 [Basic Sequence-to-sequence model] (https://github.com/PaddlePaddle/models/tree/develop/nmt_without_attention) -序列到序列学习实现两个甚至是多个不定长模型之间的映射,有着广泛的应用,包括:机器翻译、智能对话与问答、广告创意语料生成、自动编码(如金融画像编码)、判断多个文本串之间的语义相关性等。 +## 9. Image classification -在序列到序列学习的例子中,我们以机器翻译任务为例,提供了多种改进模型,供大家学习和使用。包括:不带注意力机制的序列到序列映射模型,这一模型是所有序列到序列学习模型的基础;使用 scheduled sampling 改善 RNN 模型在生成任务中的错误累积问题;带外部记忆机制的神经机器翻译,通过增强神经网络的记忆能力,来完成复杂的序列到序列学习任务。 +For the example of image classification, we show you how to train AlexNet, VGG, GoogLeNet and ResNet models in PaddlePaddle. It also provides a model conversion tool that converts Caffe trained model files into PaddlePaddle model files. -- 8.1 [无注意力机制的编码器解码器模型](https://github.com/PaddlePaddle/models/tree/develop/nmt_without_attention) - -## 9. 图像分类 -图像相比文字能够提供更加生动、容易理解及更具艺术感的信息,是人们转递与交换信息的重要来源。在图像分类的例子中,我们向大家介绍如何在PaddlePaddle中训练AlexNet、VGG、GoogLeNet和ResNet模型。同时还提供了一个模型转换工具,能够将Caffe训练好的模型文件,转换为PaddlePaddle的模型文件。 - -- 9.1 [将Caffe模型文件转换为PaddlePaddle模型文件](https://github.com/PaddlePaddle/models/tree/develop/image_classification/caffe2paddle) -- 9.2 [AlexNet](https://github.com/PaddlePaddle/models/tree/develop/image_classification) -- 9.3 [VGG](https://github.com/PaddlePaddle/models/tree/develop/image_classification) -- 9.4 [Residual Network](https://github.com/PaddlePaddle/models/tree/develop/image_classification) +- 9.1 [convert Caffe model file to PaddlePaddle model file] (https://github.com/PaddlePaddle/models/tree/develop/image_classification/caffe2paddle) +- 9.2 [AlexNet] (https://github.com/PaddlePaddle/models/tree/develop/image_classification) +- 9.3 [VGG] (https://github.com/PaddlePaddle/models/tree/develop/image_classification) +- 9.4 [Residual Network] (https://github.com/PaddlePaddle/models/tree/develop/image_classification) ## Copyright and License -PaddlePaddle is provided under the [Apache-2.0 license](LICENSE). + +PaddlePaddle is provided under the [Apache-2.0 license] (LICENSE). diff --git a/ctr/README.md b/ctr/README.md index 1b2a73757575404dfd7790440bf9f27617084c1d..419abc8670e4337149f67dae26b2df882a82c32c 100644 --- a/ctr/README.md +++ b/ctr/README.md @@ -1,82 +1,57 @@ -# 点击率预估 +# Click-Through Rate Prediction -以下是本例目录包含的文件以及对应说明: +## Introduction -``` -├── README.md # 本教程markdown 文档 -├── dataset.md # 数据集处理教程 -├── images # 本教程图片目录 -│   ├── lr_vs_dnn.jpg -│   └── wide_deep.png -├── infer.py # 预测脚本 -├── network_conf.py # 模型网络配置 -├── reader.py # data reader -├── train.py # 训练脚本 -└── utils.py # helper functions -└── avazu_data_processer.py # 示例数据预处理脚本 -``` - -## 背景介绍 - -CTR(Click-Through Rate,点击率预估)\[[1](https://en.wikipedia.org/wiki/Click-through_rate)\] -是对用户点击一个特定链接的概率做出预测,是广告投放过程中的一个重要环节。精准的点击率预估对在线广告系统收益最大化具有重要意义。 +CTR(Click-Through Rate)\[[1](https://en.wikipedia.org/wiki/Click-through_rate)\] +is a prediction of the probability that a user clicks on an advertisement. This model is widely used in the advertisement industry. Accurate click rate estimates are important for maximizing online advertising revenue. -当有多个广告位时,CTR 预估一般会作为排序的基准,比如在搜索引擎的广告系统里,当用户输入一个带商业价值的搜索词(query)时,系统大体上会执行下列步骤来展示广告: +When there are multiple ad slots, CTR estimates are generally used as a baseline for ranking. For example, in a search engine's ad system, when the user enters a query, the system typically performs the following steps to show relevant ads. -1. 获取与用户搜索词相关的广告集合 -2. 业务规则和相关性过滤 -3. 根据拍卖机制和 CTR 排序 -4. 展出广告 +1. Get the ad collection associated with the user's search term. +2. Business rules and relevance filtering. +3. Rank by auction mechanism and CTR. +4. Show ads. -可以看到,CTR 在最终排序中起到了很重要的作用。 +Here,CTR plays a crucial role. -### 发展阶段 -在业内,CTR 模型经历了如下的发展阶段: +### Brief history +Historically, the CTR prediction model has been evolving as follows. -- Logistic Regression(LR) / GBDT + 特征工程 -- LR + DNN 特征 -- DNN + 特征工程 +- Logistic Regression(LR) / Gradient Boosting Decision Trees (GBDT) + feature engineering +- LR + Deep Neural Network (DNN) +- DNN + feature engineering -在发展早期时 LR 一统天下,但最近 DNN 模型由于其强大的学习能力和逐渐成熟的性能优化, -逐渐地接过 CTR 预估任务的大旗。 +In the early stages of development LR dominated, but the recent years DNN based models are mainly used. ### LR vs DNN -下图展示了 LR 和一个 \(3x2\) 的 DNN 模型的结构: +The following figure shows the structure of LR and DNN model:


-Figure 1. LR 和 DNN 模型结构对比 +Figure 1. LR and DNN model structure comparison

-LR 的蓝色箭头部分可以直接类比到 DNN 中对应的结构,可以看到 LR 和 DNN 有一些共通之处(比如权重累加), -但前者的模型复杂度在相同输入维度下比后者可能低很多(从某方面讲,模型越复杂,越有潜力学习到更复杂的信息); -如果 LR 要达到匹敌 DNN 的学习能力,必须增加输入的维度,也就是增加特征的数量, -这也就是为何 LR 和大规模的特征工程必须绑定在一起的原因。 +We can see, LR and CNN have some common structures. However, DNN can have non-linear relation between input and output values by adding activation unit and further layers. This enables DNN to achieve better learning results in CTR estimates. -LR 对于 DNN 模型的优势是对大规模稀疏特征的容纳能力,包括内存和计算量等方面,工业界都有非常成熟的优化方法; -而 DNN 模型具有自己学习新特征的能力,一定程度上能够提升特征使用的效率, -这使得 DNN 模型在同样规模特征的情况下,更有可能达到更好的学习效果。 +In the following, we demonstrate how to use PaddlePaddle to learn to predict CTR. -本文后面的章节会演示如何使用 PaddlePaddle 编写一个结合两者优点的模型。 +## Data and Model formation +Here `click` is the learning objective. There are several ways to learn the objectives. -## 数据和任务抽象 +1. Direct learning click, 0,1 for binary classification +2. Learning to rank, pairwise rank or listwise rank +3. Measure the ad click rate of each ad, then rank by the click rate. -我们可以将 `click` 作为学习目标,任务可以有以下几种方案: +In this example, we use the first method. -1. 直接学习 click,0,1 作二元分类 -2. Learning to rank, 具体用 pairwise rank(标签 1>0)或者 listwise rank -3. 统计每个广告的点击率,将同一个 query 下的广告两两组合,点击率高的>点击率低的,做 rank 或者分类 +We use the Kaggle `Click-through rate prediction` task \[[2](https://www.kaggle.com/c/avazu-ctr-prediction/data)\]. -我们直接使用第一种方法做分类任务。 +Please see the [data process](./dataset.md) for pre-processing data. -我们使用 Kaggle 上 `Click-through rate prediction` 任务的数据集\[[2](https://www.kaggle.com/c/avazu-ctr-prediction/data)\] 来演示本例中的模型。 - -具体的特征处理方法参看 [data process](./dataset.md)。 - -本教程中演示模型的输入格式如下: +The input data format for the demo model in this tutorial is as follows: ``` # \t \t click @@ -84,10 +59,10 @@ LR 对于 DNN 模型的优势是对大规模稀疏特征的容纳能力,包括 23 231 \t 1230:0.12 13421:0.9 \t 1 ``` -详细的格式描述如下: +Description: -- `dnn input ids` 采用 one-hot 表示,只需要填写值为1的ID(注意这里不是变长输入) -- `lr input sparse values` 使用了 `ID:VALUE` 的表示,值部分最好规约到值域 `[-1, 1]`。 +- `dnn input ids` one-hot coding. +- `lr input sparse values` Use `ID:VALUE` , values are preferaly scaled to the range `[-1, 1]`。 此外,模型训练时需要传入一个文件描述 dnn 和 lr两个子模型的输入维度,文件的格式如下: @@ -96,9 +71,9 @@ dnn_input_dim: lr_input_dim: ``` -其中, `` 表示一个整型数值。 + represents an integer value. -本目录下的 `avazu_data_processor.py` 可以对下载的演示数据集\[[2](#参考文档)\] 进行处理,具体使用方法参考如下说明: +`avazu_data_processor.py` can be used to download the data set \[[2](#参考文档)\]and pre-process the data. ``` usage: avazu_data_processer.py [-h] --data_path DATA_PATH --output_dir @@ -123,40 +98,38 @@ optional arguments: size of the trainset (default: 100000) ``` -- `data_path` 是待处理的数据路径 -- `output_dir` 生成数据的输出路径 -- `num_lines_to_detect` 预先扫描数据生成ID的个数,这里是扫描的文件行数 -- `test_set_size` 生成测试集的行数 -- `train_size` 生成训练姐的行数 +- `data_path` The data path to be processed +- `output_dir` The output path of the data +- `num_lines_to_detect` The number of generated IDs +- `test_set_size` The number of rows for the test set +- `train_size` The number of rows of training set ## Wide & Deep Learning Model -谷歌在 16 年提出了 Wide & Deep Learning 的模型框架,用于融合适合学习抽象特征的 DNN 和 适用于大规模稀疏特征的 LR 两种模型的优点。 +Google proposed a model framework for Wide & Deep Learning to integrate the advantages of both DNNs suitable for learning abstract features and LR models for large sparse features. -### 模型简介 +### Introduction to the model -Wide & Deep Learning Model\[[3](#参考文献)\] 可以作为一种相对成熟的模型框架使用, -在 CTR 预估的任务中工业界也有一定的应用,因此本文将演示使用此模型来完成 CTR 预估的任务。 +Wide & Deep Learning Model\[[3](#References)\] is a relatively mature model, but this model is still being used in the CTR predicting task. Here we demonstrate the use of this model to complete the CTR predicting task. -模型结构如下: +The model structure is as follows:


Figure 2. Wide & Deep Model

-模型左边的 Wide 部分,可以容纳大规模系数特征,并且对一些特定的信息(比如 ID)有一定的记忆能力; -而模型右边的 Deep 部分,能够学习特征间的隐含关系,在相同数量的特征下有更好的学习和推导能力。 +The wide part of the left side of the model can accommodate large-scale coefficient features and has some memory for some specific information (such as ID); and the Deep part of the right side of the model can learn the implicit relationship between features. -### 编写模型输入 +### Model Input -模型只接受 3 个输入,分别是 +The model has three inputs as follows. -- `dnn_input` ,也就是 Deep 部分的输入 -- `lr_input` ,也就是 Wide 部分的输入 -- `click` , 点击与否,作为二分类模型学习的标签 +- `dnn_input` ,the Deep part of the input +- `lr_input` ,the wide part of the input +- `click` , click on or not ```python dnn_merged_input = layer.data( @@ -170,9 +143,9 @@ lr_merged_input = layer.data( click = paddle.layer.data(name='click', type=dtype.dense_vector(1)) ``` -### 编写 Wide 部分 +### Wide part -Wide 部分直接使用了 LR 模型,但激活函数改成了 `RELU` 来加速 +Wide part uses of the LR model, but the activation function changed to `RELU` for speed. ```python def build_lr_submodel(): @@ -181,9 +154,9 @@ def build_lr_submodel(): return fc ``` -### 编写 Deep 部分 +### Deep part -Deep 部分使用了标准的多层前向传导的 DNN 模型 +The Deep part uses a standard multi-layer DNN. ```python def build_dnn_submodel(dnn_layer_dims): @@ -199,10 +172,9 @@ def build_dnn_submodel(dnn_layer_dims): return _input_layer ``` -### 两者融合 +### Combine -两个 submodel 的最上层输出加权求和得到整个模型的输出,输出部分使用 `sigmoid` 作为激活函数,得到区间 (0,1) 的预测值, -来逼近训练数据中二元类别的分布,并最终作为 CTR 预估的值使用。 +The output section uses `sigmoid` function to output (0,1) as the prediction value. ```python # conbine DNN and LR submodels @@ -217,7 +189,7 @@ def combine_submodels(dnn, lr): return fc ``` -### 训练任务的定义 +### Training ```python dnn = build_dnn_submodel(dnn_layer_dims) lr = build_lr_submodel() @@ -263,16 +235,17 @@ trainer.train( event_handler=event_handler, num_passes=100) ``` -## 运行训练和测试 -训练模型需要如下步骤: -1. 准备训练数据 - 1. 从 [Kaggle CTR](https://www.kaggle.com/c/avazu-ctr-prediction/data) 下载 train.gz - 2. 解压 train.gz 得到 train.txt +## Run training and testing +The model go through the following steps: + +1. Prepare training data + 1. Download train.gz from [Kaggle CTR](https://www.kaggle.com/c/avazu-ctr-prediction/data) . + 2. Unzip train.gz to get train.txt 3. `mkdir -p output; python avazu_data_processer.py --data_path train.txt --output_dir output --num_lines_to_detect 1000 --test_set_size 100` 生成演示数据 -2. 执行 `python train.py --train_data_path ./output/train.txt --test_data_path ./output/test.txt --data_meta_file ./output/data.meta.txt --model_type=0` 开始训练 +2. Execute `python train.py --train_data_path ./output/train.txt --test_data_path ./output/test.txt --data_meta_file ./output/data.meta.txt --model_type=0`. Start training. -上面第2个步骤可以为 `train.py` 填充命令行参数来定制模型的训练过程,具体的命令行参数及用法如下 +The argument options for `train.py` are as follows. ``` usage: train.py [-h] --train_data_path TRAIN_DATA_PATH @@ -303,15 +276,16 @@ optional arguments: classification) ``` -- `train_data_path` : 训练集的路径 -- `test_data_path` : 测试集的路径 -- `num_passes`: 模型训练多少轮 -- `data_meta_file`: 参考[数据和任务抽象](### 数据和任务抽象)的描述。 -- `model_type`: 模型分类或回归 +- `train_data_path` : The path of the training set +- `test_data_path` : The path of the testing set +- `num_passes`: number of rounds of model training +- `data_meta_file`: Please refer to [数据和任务抽象](### 数据和任务抽象)的描述。 +- `model_type`: Model classification or regressio + +## Use the training model for prediction +The training model can be used to predict new data, and the format of the forecast data is as follows. -## 用训好的模型做预测 -训好的模型可以用来预测新的数据, 预测数据的格式为 ``` # \t @@ -319,9 +293,9 @@ optional arguments: 23 231 \t 1230:0.12 13421:0.9 ``` -这里与训练数据的格式唯一不同的地方,就是没有标签,也就是训练数据中第3列 `click` 对应的数值。 +Here the only difference to the training data is that there is no label (i.e. `click` values). -`infer.py` 的使用方法如下 +We now can use `infer.py` to perform inference. ``` usage: infer.py [-h] --model_gz_path MODEL_GZ_PATH --data_path DATA_PATH @@ -345,21 +319,21 @@ optional arguments: classification) ``` -- `model_gz_path_model`:用 `gz` 压缩过的模型路径 -- `data_path` : 需要预测的数据路径 -- `prediction_output_paht`:预测输出的路径 -- `data_meta_file` :参考[数据和任务抽象](### 数据和任务抽象)的描述。 -- `model_type` :分类或回归 +- `model_gz_path_model`:path for `gz` compressed data. +- `data_path` : +- `prediction_output_patj`:path for the predicted values s +- `data_meta_file` :Please refer to [数据和任务抽象](### 数据和任务抽象)。 +- `model_type` :Classification or regression -示例数据可以用如下命令预测 +The sample data can be predicted with the following command ``` python infer.py --model_gz_path --data_path output/infer.txt --prediction_output_path predictions.txt --data_meta_path data.meta.txt ``` -最终的预测结果位于 `predictions.txt`。 +The final prediction is written in `predictions.txt`。 -## 参考文献 +## References 1. 2. 3. Cheng H T, Koc L, Harmsen J, et al. [Wide & deep learning for recommender systems](https://arxiv.org/pdf/1606.07792.pdf)[C]//Proceedings of the 1st Workshop on Deep Learning for Recommender Systems. ACM, 2016: 7-10. diff --git a/ctr/index.html b/ctr/index.html index f1df7456a7aef174254fb20f2710c78079f4f26f..17022e45b2cdc43f5cdbbdcf8f6cd2ab61a7c66e 100644 --- a/ctr/index.html +++ b/ctr/index.html @@ -40,85 +40,60 @@