xLearn 命令行接口使用指南

如果你已经编译并安装好 xLearn,你会在当前的 build 文件夹下看见 xlearn_trainxlearn_predict 这两个可执行文件,它们可以被用来进行模型的训练和预测。

快速开始

确保你现在正在 xLearn 的 build 文件夹下,在该文件夹下用户可以看见 small_test.txtsmall_train.txt 这两个样例数据集。我们使用以下命令进行模型训练:

./xlearn_train ./small_train.txt

下面是一部分程序的输出。注意,这里显示的 log_loss 值可能和你本地计算出的 log_loss 值不完全一样:

[ ACTION     ] Start to train ...
[------------] Epoch      Train log_loss     Time cost (sec)
[   10%      ]     1            0.569292                0.00
[   20%      ]     2            0.517142                0.00
[   30%      ]     3            0.490124                0.00
[   40%      ]     4            0.470445                0.00
[   50%      ]     5            0.451919                0.00
[   60%      ]     6            0.437888                0.00
[   70%      ]     7            0.425603                0.00
[   80%      ]     8            0.415573                0.00
[   90%      ]     9            0.405933                0.00
[  100%      ]    10            0.396388                0.00
[ ACTION     ] Start to save model ...
[------------] Model file: ./small_train.txt.model

在默认的情况下,xLearn 会使用 logistic regression (LR) 来训练我们的模型 (10 epoch).

我们发现,xLearn 训练过后在当前文件夹下产生了一个叫 small_train.txt.model 的新文件。这个文件用来存储训练后的模型,我们可以用这个模型在未来进行预测:

./xlearn_predict ./small_test.txt ./small_train.txt.model

运行上述命令之后,我们在当前文件夹下得到了一个新的文件 small_test.txt.out,这是我们进行预测任务的输出。我们可以通过如下命令显示这个输出文件的前几行数据:

head -n 5 ./small_test.txt.out

-1.9872
-0.0707959
-0.456214
-0.170811
-1.28986

这里每一行的分数都对应了测试数据中的一行预测样本。负数代表我们预测该样本为负样本,正数代表正样本 (在这个例子中没有)。在 xLearn 中,用户可以将分数通过 --sigmoid 选项转换到 (0-1) 之间,还可以使用 --sign 选项将其转换成 0 或 1:

./xlearn_predict ./small_test.txt ./small_train.txt.model --sigmoid
head -n 5 ./small_test.txt.out

0.120553
0.482308
0.387884
0.457401
0.215877

./xlearn_predict ./small_test.txt ./small_train.txt.model --sign
head -n 5 ./small_test.txt.out

0
0
0
0
0

模型的输出

用户可以通过设置不同的超参数来生成不同的模型,xLearn 通过 -m 选项来指定这些输出模型文件的路径。在默认的情况下,模型文件的路径是当前运行文件夹下的 training_data_name + .model 文件:

./xlearn_train ./small_train.txt -m new_model

用户还可以通过 -t 选项将模型输出成人类可读的 TXT 格式,例如:

./xlearn_train ./small_train.txt -t model.txt

运行上述命令后,我们发现在当前文件夹下生成了一个新的文件 model.txt,这个文件存储着 TXT 格式的输出模型:

head -n 5 ./model.txt

-0.688182
0.458082
0
0
0

对于线性模型来说,TXT 格式的模型将每一个模型参数存储在一行。对于 FM 和 FFM,模型将每一个 latent vector 存储在一行。

Linear:

bias: 0
i_0: 0
i_1: 0
i_2: 0
i_3: 0

FM:

bias: 0
i_0: 0
i_1: 0
i_2: 0
i_3: 0
v_0: 5.61937e-06 0.0212581 0.150338 0.222903
v_1: 0.241989 0.0474224 0.128744 0.0995021
v_2: 0.0657265 0.185878 0.0223869 0.140097
v_3: 0.145557 0.202392 0.14798 0.127928

FFM:

bias: 0
i_0: 0
i_1: 0
i_2: 0
i_3: 0
v_0_0: 5.61937e-06 0.0212581 0.150338 0.222903
v_0_1: 0.241989 0.0474224 0.128744 0.0995021
v_0_2: 0.0657265 0.185878 0.0223869 0.140097
v_0_3: 0.145557 0.202392 0.14798 0.127928
v_1_0: 0.219158 0.248771 0.181553 0.241653
v_1_1: 0.0742756 0.106513 0.224874 0.16325
v_1_2: 0.225384 0.240383 0.0411782 0.214497
v_1_3: 0.226711 0.0735065 0.234061 0.103661
v_2_0: 0.0771142 0.128723 0.0988574 0.197446
v_2_1: 0.172285 0.136068 0.148102 0.0234075
v_2_2: 0.152371 0.108065 0.149887 0.211232
v_2_3: 0.123096 0.193212 0.0179155 0.0479647
v_3_0: 0.055902 0.195092 0.0209918 0.0453358
v_3_1: 0.154174 0.144785 0.184828 0.0785329
v_3_2: 0.109711 0.102996 0.227222 0.248076
v_3_3: 0.144264 0.0409806 0.17463 0.083712

在线学习

xLearn 提供在线学习的功能,即 xLearn 可以加载之前预训练过的模型继续学习。用户可以通过 -pre 选项来指定预先训练过的模型文件路径。例如:

./xlearn_train ./small_train.txt -s 0 -pre ./pre_model

注意,xLearn 只能加载二进制预训练模型,不能加载 TXT 格式的文本模型。

预测结果的输出

用户可以通过 -o 选项来指定预测结果输出文件的路径。例如:

./xlearn_predict ./small_test.txt ./small_train.txt.model -o output.txt
head -n 5 ./output.txt

-2.01192
-0.0657416
-0.456185
-0.170979
-1.28849

在默认的情况下,预测结果输出文件的路径格式是当前文件夹下的 test_data_name + .out 文件。

选择机器学习算法

目前,xLearn 可以支持三种不同的机器学习算法,包括了线性模型 (LR)、factorization machine (FM),以及 field-aware factorization machine (FFM).

用户可以通过 -s 选项来选择不同的算法:

./xlearn_train ./small_train.txt -s 0  # Classification: Linear model (GLM)
./xlearn_train ./small_train.txt -s 1  # Classification: Factorization machine (FM)
./xlearn_train ./small_train.txt -s 2  # Classification: Field-awre factorization machine (FFM)

./xlearn_train ./small_train.txt -s 3  # Regression: Linear model (GLM)
./xlearn_train ./small_train.txt -s 4  # Regression: Factorization machine (FM)
./xlearn_train ./small_train.txt -s 5  # Regression: Field-awre factorization machine (FFM)

对于 LR 和 FM 算法而言,我们的输入数据格式必须是 CSV 或者 libsvm. 对于 FFM 算法,我们的输入数据必须是 libffm 格式:

libsvm format:

   y index_1:value_1 index_2:value_2 ... index_n:value_n

   0   0:0.1   1:0.5   3:0.2   ...
   0   0:0.2   2:0.3   5:0.1   ...
   1   0:0.2   2:0.3   5:0.1   ...

CSV format:

   y value_1 value_2 .. value_n

   0      0.1     0.2     0.2   ...
   1      0.2     0.3     0.1   ...
   0      0.1     0.2     0.4   ...

libffm format:

   y field_1:index_1:value_1 field_2:index_2:value_2   ...

   0   0:0:0.1   1:1:0.5   2:3:0.2   ...
   0   0:0:0.2   1:2:0.3   2:5:0.1   ...
   1   0:0:0.2   1:2:0.3   2:5:0.1   ...

xLearn 还可以使用 , 作为数据的分隔符,例如:

libsvm format:

   label,index_1:value_1,index_2:value_2 ... index_n:value_n

CSV format:

   label,value_1,value_2 .. value_n

libffm format:

   label,field_1:index_1:value_1,field_2:index_2:value_2 ...

注意,如果输入的 csv 文件里不含 y 值,用户必须手动向其每一行数据添加一个占位符 (同样针对测试数据)。否则,xLearn 会将第一个元素视为 y.

LR 和 FM 算法的输入可以是 libffm 格式,xLearn 会忽略其中的 field 项并将其视为 libsvm 格式。

设置 Validation Dataset(验证集)

在机器学习中,我们可以通过 Validation Dataset (验证集) 来进行超参数调优。在 xLearn 中,用户可以使用 -v 选项来指定验证集文件,例如:

./xlearn_train ./small_train.txt -v ./small_test.txt

下面是程序的一部分输出:

[ ACTION     ] Start to train ...
[------------] Epoch      Train log_loss       Test log_loss     Time cost (sec)
[   10%      ]     1            0.571922            0.531160                0.00
[   20%      ]     2            0.520315            0.542134                0.00
[   30%      ]     3            0.492147            0.529684                0.00
[   40%      ]     4            0.470234            0.538684                0.00
[   50%      ]     5            0.452695            0.537496                0.00
[   60%      ]     6            0.439367            0.537790                0.00
[   70%      ]     7            0.425216            0.534396                0.00
[   80%      ]     8            0.416215            0.542883                0.00
[   90%      ]     9            0.404673            0.547597                0.00

我们可以看到,在这个任务中 Train log_loss 在不断的下降,而 Test log_loss (validation loss) 则是先下降,后上升。这代表当前我们训练的模型已经 overfit (过拟合)我们的训练数据。

在默认的情况下,xLearn 会在每一轮 epoch 结束后计算 validation loss 的数值,而用户可以使用 -x 选项来制定不同的评价指标。对于分类任务而言,评价指标有: acc (accuracy), prec (precision), f1, 以及 auc,例如:

./xlearn_train ./small_train.txt -v ./small_test.txt -x acc
./xlearn_train ./small_train.txt -v ./small_test.txt -x prec
./xlearn_train ./small_train.txt -v ./small_test.txt -x f1
./xlearn_train ./small_train.txt -v ./small_test.txt -x auc

对于回归任务而言,评价指标包括:mae, mape, 以及 rmsd (或者叫作 rmse),例如:

cd demo/house_price/
../../xlearn_train ./house_price_train.txt -s 3 -x rmse --cv
../../xlearn_train ./house_price_train.txt -s 3 -x rmsd --cv

注意,这里我们通过设置 --cv 选项使用了 Cross-Validation (交叉验证) 功能, 我们将在下一节详细介绍该功能。

Cross-Validation (交叉验证)

在机器学习中,Cross-Validation (交叉验证) 是一种被广泛使用的模型超参数调优技术。在 xLearn 中,用户可以使用 --cv 选项来使用交叉验证功能,例如:

./xlearn_train ./small_train.txt --cv

在默认的情况下,xLearn 使用 3-folds 交叉验证 (即将数据集平均分成 3 份),用户也可以通过 -f 选项来指定数据划分的份数,例如:

./xlearn_train ./small_train.txt -f 5 --cv

上述命令将数据集划分成为 5 份,并且 xLearn 会在最后计算出平均的 validation loss:

 ...
[------------] Average log_loss: 0.549417
[ ACTION     ] Finish Cross-Validation
[ ACTION     ] Clear the xLearn environment ...
[------------] Total time cost: 0.03 (sec)

选择优化算法

在 xLearn 中,用户可以通过 -p 选项来选择使用不同的优化算法。目前,xLearn 支持 SGD, AdaGrad, 以及 FTRL 这三种优化算法。 在默认的情况下,xLearn 使用 AdaGrad 优化算法:

./xlearn_train ./small_train.txt -p sgd
./xlearn_train ./small_train.txt -p adagrad
./xlearn_train ./small_train.txt -p ftrl

相比于传统的 SGD (随机梯度下降) 算法,AdaGrad 可以自适应的调整学习速率 learning rate,对于不常用的参数进行较大的更新,对于常用的参数进行较小的更新。 正因如此,AdaGrad 算法常用于稀疏数据的优化问题上。除此之外,相比于 AdaGradSGD 对学习速率的大小更敏感,这增加了用户调参的难度。

FTRL (Follow-the-Regularized-Leader) 同样被广泛应用于大规模稀疏数据的优化问题上。相比于 SGDAdaGrad, FTRL 需要用户调试更多的超参数,我们将在下一节详细介绍 xLearn 的超参数调优。

超参数调优

在机器学习中,hyper-parameter (超参数) 是指在训练之前设置的参数,而模型参数是指在训练过程中更新的参数。超参数调优通常是机器学习训练过程中不可避免的一个环节。

首先,learning rate (学习速率) 是机器学习中的一个非常重要的超参数,用来控制每次模型迭代时更新的步长。在默认的情况下,这个值在 xLearn 中被设置为 0.2,用户可以通过 -r 选项来改变这个值:

./xlearn_train ./small_train.txt -v ./small_test.txt -r 0.1
./xlearn_train ./small_train.txt -v ./small_test.txt -r 0.5
./xlearn_train ./small_train.txt -v ./small_test.txt -r 0.01

用户还可以通过 -b 选项来控制 regularization (正则项)。xLearn 使用 L2 正则项,这个值被默认设置为 0.00002:

./xlearn_train ./small_train.txt -v ./small_test.txt -r 0.1 -b 0.001
./xlearn_train ./small_train.txt -v ./small_test.txt -r 0.1 -b 0.002
./xlearn_train ./small_train.txt -v ./small_test.txt -r 0.1 -b 0.01

对于 FTRL 算法来说,除了学习速率和正则项,我们还需要调节其他的超参数,包括:-alpha, -beta, -lambda_1-lambda_2,例如:

./xlearn_train ./small_train.txt -p ftrl -alpha 0.002 -beta 0.8 -lambda_1 0.001 -lambda_2 1.0

对于 FM 和 FFM 模型,用户需要通过 -k 选项来设置 latent vector (隐向量) 的长度。在默认的情况下,xLearn 将其设置为 4:

./xlearn_train ./small_train.txt -s 1 -v ./small_test.txt -k 2
./xlearn_train ./small_train.txt -s 1 -v ./small_test.txt -k 4
./xlearn_train ./small_train.txt -s 1 -v ./small_test.txt -k 5
./xlearn_train ./small_train.txt -s 1 -v ./small_test.txt -k 8

注意,xLearn 使用了 SSE 硬件指令来加速向量运算,该指令会同时进行向量长度为 4 的运算,因此将 k=2k=4 所需的运算时间是相同的。

除此之外,对于 FM 和 FFM,用户可以通过设置超参数 -u 来调节模型的初始化参数。在默认的情况下,这个值被设置为 0.66:

./xlearn_train ./small_train.txt -s 1 -v ./small_test.txt -u 0.80
./xlearn_train ./small_train.txt -s 1 -v ./small_test.txt -u 0.40
./xlearn_train ./small_train.txt -s 1 -v ./small_test.txt -u 0.10

迭代次数 & Early-Stop (提前终止)

在模型的训练过程中,每一个 epoch 都会遍历整个训练数据。在 xLearn 中,用户可以通过 -e 选项来设置需要的 epoch 数量:

./xlearn_train ./small_train.txt -e 3
./xlearn_train ./small_train.txt -e 5
./xlearn_train ./small_train.txt -e 10

如果用户设置了 validation dataset (验证集),xLearn 在默认情况下会在得到最好的 validation 结果时进行 early-stop (提前终止训练),例如:

./xlearn_train ./small_train.txt -s 2 -v ./small_test.txt -e 10

在上述命令中,我们设置 epoch 的大小为 10,但是 xLearn 会在第 7 轮提前停止训练 (你可能在你的本地计算机上会得到不同的轮次):

 ...
[ ACTION     ] Early-stopping at epoch 7
[ ACTION     ] Start to save model ...

用户可以通过 -sw 来设置提前停止机制的窗口大小。即,-sw=2 意味着如果在后两轮的时间窗口之内都没有比当前更好的验证结果,则停止训练,并保存之前最好的模型:

./xlearn_train ./small_train.txt -e 10 -v ./small_test.txt -sw 3

用户可以通过 --dis-es 选项来禁止 early-stop:

./xlearn_train ./small_train.txt -s 2 -v ./small_test.txt -e 10 --dis-es

在上述命令中,xLearn 将进行完整的 10 轮 epoch 训练。

注意,在默认情况下,如果没有设置 metric,则 xLearn 会通过 test_loss 来选择最佳停止时机。如果设置了 metric,则 xLearn 通过 metric 的值来决定停止时机。

无锁 (Lock-free) 学习

在默认情况下,xLearn 会进行 Hogwild! 无锁学习,该方法通过 CPU 多核进行并行训练,提高 CPU 利用率,加快算法收敛速度。但是,该无锁算法是非确定性的算法 (non-deterministic). 即,如果我们多次运行如下的命令,我们会在每一次运行得到略微不同的 loss 结果:

./xlearn_train ./small_train.txt

The 1st time: 0.396352

./xlearn_train ./small_train.txt

The 2nd time: 0.396119

./xlearn_train ./small_train.txt

The 3nd time: 0.396187

用户可以通过 -nthread 选项来设置使用 CPU 核心的数量,例如:

./xlearn_train ./small_train.txt -nthread 2

上述命令指定使用 2 个 CPU Core 来进行模型训练。如果用户不设置该选项,xLearn 在默认情况下会使用全部的 CPU 核心进行计算。xLearn 会显示当前使用线程数量的情况:

[------------] xLearn uses 2 threads for training task.
[ ACTION     ] Read Problem ...

用户可以通过设置 --dis-lock-free 选项禁止多核无锁学习:

./xlearn_train ./small_train.txt --dis-lock-free

这时,xLearn 计算的结果是确定性的 (determinnistic):

./xlearn_train ./small_train.txt

The 1st time: 0.396372

./xlearn_train ./small_train.txt

The 2nd time: 0.396372

./xlearn_train ./small_train.txt

The 3nd time: 0.396372

使用 --dis-lock-free 的缺点是训练速度会比无锁训练慢很多,我们的建议是在大规模数据训练下开启此功能。

Instance-Wise 归一化

对于 FM 和 FFM 来说,xLearn 会默认对特征进行 Instance-Wise Normalizarion (归一化). 在一些大规模稀疏数据的场景 (例如 CTR 预估), 这一技术非常的有效,但是有些时候它也会影响模型的准确率。用户可以通过设置 --no-norm 来关掉该功能:

./xlearn_train ./small_train.txt -s 1 -v ./small_test.txt --no-norm

注意,如果在训练过程中使用了 Instance-Wise 归一化,用户需要在预测过程中同样使用该功能。

Quiet Model 安静模式

xLearn 的训练支持安静模式,在安静模式下,用户通过调用 --quiet() 选项来使得 xLearn 的训练过程不会计算任何评价指标,这样可以很大程度上提高训练速度:

./xlearn_train ./small_train.txt -e 10 --quiet

xLearn 还可以支持 Python API,我们将在下一节详细介绍。