

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 因子分解机算法
<a name="fact-machines"></a>

因子分解机算法是通用的有监督学习算法，可用于分类和回归任务。它是线性模型的扩展，旨在经济地捕获高维稀疏数据集中的各特征之间的交互。例如，在一个点击预测系统中，当特定广告类别的广告放置在特定页面类别的页面上时，因子分解机模型可以捕获所观察到的点击率模式。对于处理高维稀疏数据集的任务 (如点击预测和项目建议)，因子分解机是不错的选择。

**注意**  
分解机算法的 SageMaker Amazon AI 实现仅考虑功能之间的成对（二阶）交互。

**Topics**
+ [因子分解机算法的输入/输出接口](#fm-inputoutput)
+ [因子分解机算法的 EC2 实例建议](#fm-instances)
+ [因子分解机示例笔记本](#fm-sample-notebooks)
+ [因子分解机的工作原理](fact-machines-howitworks.md)
+ [因子分解机超参数](fact-machines-hyperparameters.md)
+ [调整因子分解机模型](fm-tuning.md)
+ [因子分解机响应格式](fm-in-formats.md)

## 因子分解机算法的输入/输出接口
<a name="fm-inputoutput"></a>

因子分解机算法可在二元分类模式或回归模式下运行。在每种模式下，可以向**测试**通道提供数据集以及训练通道数据集。评分取决于使用的模式。在回归模式下，使用均方根误差 (RMSE) 对测试数据集计分。在二元分类模式下，使用二元交叉熵 (记录丢失)、准确度 (阈值=0.5) 和 F1 分数 (阈值=0.5) 对测试数据集计分。

对于**训练**，因子分解机算法目前仅支持具有 `Float32` 张量的 `recordIO-protobuf` 格式。由于使用案例主要针对稀疏数据，`CSV` 并不是合适选项。recordIO 包装的 protobuf 支持文件和管道模式训练。

对于**推理**，因子分解机算法支持 `application/json` 和 `x-recordio-protobuf` 格式。
+ 对于**二元分类**问题，该算法预测分数和标签。标签是一个数字，可以是 `0` 或 `1`。分数是一个数字，它表示该算法认为标签应该为 `1` 的强烈程度。该算法先计算分数，然后从分数值中得出标签。如果分数大于或等于 0.5，则标签为 `1`。
+ 对于**回归**问题，仅返回分数，并且它是预测的值。例如，如果使用因子分解机预测电影评级，则分数是预测的评级值。

有关训练和推理文件格式的更多详细信息，请参阅[因子分解机示例笔记本](#fm-sample-notebooks)。

## 因子分解机算法的 EC2 实例建议
<a name="fm-instances"></a>

Amazon SageMaker AI 分解机器算法具有高度可扩展性，可以跨分布式实例进行训练。建议对稀疏和密集数据集使用包含 CPU 实例的训练和推理。在某些情况下，使用一个或多个密集数据 GPUs 进行训练可能会带来一些好处。使用训练 GPUs 仅适用于密集数据。对稀疏数据使用 CPU 实例。因子分解机算法支持使用 P2、P3、G4dn 和 G5 实例进行训练和推理。

## 因子分解机示例笔记本
<a name="fm-sample-notebooks"></a>

有关使用 SageMaker AI 分解机算法分析 MNIST 数据集中从零到九的手写数字图像的示例笔记本，请参阅 MNIST [分解机简介。](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/factorization_machines_mnist/factorization_machines_mnist.html)有关如何创建和访问可用于在 SageMaker AI 中运行示例的 Jupyter 笔记本实例的说明，请参阅。[Amazon SageMaker 笔记本实例](nbi.md)创建并打开笔记本实例后，选择 “**SageMaker AI 示例**” 选项卡以查看所有 SageMaker AI 示例的列表。使用因子分解机算法的示例笔记本位于 **Amazon 算法简介**部分中。要打开笔记本，请单击**使用** 选项卡，然后选择**创建副本**。

# 因子分解机的工作原理
<a name="fact-machines-howitworks"></a>

因子分解机模型的预测任务是估算从特征集 xi 到目标域的函数 ŷ。该域对于回归是实际值，对于分类是二元值。因子分解机模型是有监督的，因此它具有可用的训练数据集 (xi,yj)。该模型呈现的优势是它使用因子分解的参数化方法来捕获两两特征交互。它可以用数学表示，如下所示：

![\[包含因子分解机模型的等式的图像。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/FM1.jpg)


 该等式中的三个项分别对应于模型的三个分量：
+ w0 项表示全局偏置。
+ wi 线性项对第 i 个变量的强度进行建模。
+ <vi,vj> 因子分解项对第 i 个和第 j 个变量之间的成对交互进行建模。

全局偏置项和线性项与线性模型中的相同。第三项将两两特征交互建模为每个特征所学习的相应因子的内积。所学因子也可视为每种特征的嵌入向量。例如，在分类任务中，如果一对特征往往更频繁地在积极标记样本中共同发生，则其因子的内积将较大。也就是说，其嵌入向量在余弦相似性方面彼此接近。有关因子分解机模型的更多信息，请参阅[因子分解机](https://www.ismll.uni-hildesheim.de/pub/pdfs/Rendle2010FM.pdf)。

对于回归任务，通过尽可能减小模型预测 ŷn 与目标值 yn 之间的平方误差来训练模型。这称为平方损失：

![\[包含平方损失的等式的图像。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/FM2.jpg)


对于分类任务，通过尽可能减少交叉熵损失（也称作日志丢失）来训练模型：

![\[包含日志丢失的等式的图像。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/FM3.jpg)


其中：

![\[包含预测值的逻辑函数的图像。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/FM4.jpg)


有关分类的损失函数的更多信息，请参阅[分类的损失函数](https://en.wikipedia.org/wiki/Loss_functions_for_classification)。

# 因子分解机超参数
<a name="fact-machines-hyperparameters"></a>

下表包含因子分解机算法的超参数。这些是由用户设置的参数，以便于从数据中评估模型参数。首先，按字母顺序列出必须设置的所需超参数。接下来，也按字母顺序列出可以设置的可选超参数。


| 参数名称 | 说明 | 
| --- | --- | 
| feature\$1dim | 输入特征空间的维度。对于稀疏输入，这可能非常高。 **必填** 有效值：正整数。建议的值范围：[10000,10000000]  | 
| num\$1factors | 因子分解的维度。 **必填** 有效值：正整数。建议的值范围：[2,1000]，值 64 通常会得到较好的结果，是一个很好的起点。  | 
| predictor\$1type | 预测器的类型。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/fact-machines-hyperparameters.html) **必填** 有效值：字符串：`binary_classifier` 或 `regressor`  | 
| bias\$1init\$1method | 偏置项的初始化方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/fact-machines-hyperparameters.html) **可选** 有效值：`uniform`、`normal` 或 `constant` 默认值：`normal`  | 
| bias\$1init\$1scale | 偏置项的初始化范围。在 `bias_init_method` 设置为 `uniform` 时生效。 **可选** 有效值：非负浮点值。建议的值范围：[1e-8, 512]。 默认值：无。  | 
| bias\$1init\$1sigma | 偏置项的初始化标准差。在 `bias_init_method` 设置为 `normal` 时生效。 **可选** 有效值：非负浮点值。建议的值范围：[1e-8, 512]。 默认值：0.01  | 
| bias\$1init\$1value | 偏置项的初始值。在 `bias_init_method` 设置为 `constant` 时生效。 **可选** 有效值：浮点值。建议的值范围：[1e-8, 512]。 默认值：无。  | 
| bias\$1lr | 偏置项的学习率。 **可选** 有效值：非负浮点值。建议的值范围：[1e-8, 512]。 默认值：0.1  | 
| bias\$1wd | 偏置项的权重衰减。 **可选** 有效值：非负浮点值。建议的值范围：[1e-8, 512]。 默认值：0.01  | 
| clip\$1gradient | 梯度裁剪优化程序参数。通过投射到间隔 [-`clip_gradient`, \$1`clip_gradient`] 来剪辑梯度。 **可选** 有效值：浮点值 默认值：无。  | 
| epochs | 要运行的训练纪元数。 **可选** 有效值：正整数 默认值：1  | 
| eps | Epsilon 参数，以避免被 0 除。 **可选** 有效值：浮点值。建议的值：小。 默认值：无。  | 
| factors\$1init\$1method | 因子分解项的初始化方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/fact-machines-hyperparameters.html) **可选** 有效值：`uniform`、`normal` 或 `constant`。 默认值：`normal`  | 
| factors\$1init\$1scale  | 因子分解项的初始化范围。在 `factors_init_method` 设置为 `uniform` 时生效。 **可选** 有效值：非负浮点值。建议的值范围：[1e-8, 512]。 默认值：无。  | 
| factors\$1init\$1sigma | 因子分解项的初始化标准差。在 `factors_init_method` 设置为 `normal` 时生效。 **可选** 有效值：非负浮点值。建议的值范围：[1e-8, 512]。 默认值：0.001  | 
| factors\$1init\$1value | 因子分解项的初始值。在 `factors_init_method` 设置为 `constant` 时生效。 **可选** 有效值：浮点值。建议的值范围：[1e-8, 512]。 默认值：无。  | 
| factors\$1lr | 因子分解项的学习率。 **可选** 有效值：非负浮点值。建议的值范围：[1e-8, 512]。 默认值：0.0001  | 
| factors\$1wd | 因子分解项的权重衰减。 **可选** 有效值：非负浮点值。建议的值范围：[1e-8, 512]。 默认值：0.00001  | 
| linear\$1lr | 线性项的学习率。 **可选** 有效值：非负浮点值。建议的值范围：[1e-8, 512]。 默认值：0.001  | 
| linear\$1init\$1method | 线性项的初始化方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/fact-machines-hyperparameters.html) **可选** 有效值：`uniform`、`normal` 或 `constant`。 默认值：`normal`  | 
| linear\$1init\$1scale | 线性项的初始化范围。在 `linear_init_method` 设置为 `uniform` 时生效。 **可选** 有效值：非负浮点值。建议的值范围：[1e-8, 512]。 默认值：无。  | 
| linear\$1init\$1sigma | 线性项的初始化标准差。在 `linear_init_method` 设置为 `normal` 时生效。 **可选** 有效值：非负浮点值。建议的值范围：[1e-8, 512]。 默认值：0.01  | 
| linear\$1init\$1value | 线性项的初始值。在 `linear_init_method` 设置为 *constant* 时生效。 **可选** 有效值：浮点值。建议的值范围：[1e-8, 512]。 默认值：无。  | 
| linear\$1wd | 线性项的权重衰减。 **可选** 有效值：非负浮点值。建议的值范围：[1e-8, 512]。 默认值：0.001  | 
| mini\$1batch\$1size | 用于训练的小批次大小。 **可选** 有效值：正整数 默认值：1000  | 
| rescale\$1grad |  梯度重新扩展优化程序参数。如果设置，则在更新之前将梯度与 `rescale_grad` 相乘。通常选择为 1.0/`batch_size`。 **可选** 有效值：浮点值 默认值：无。  | 

# 调整因子分解机模型
<a name="fm-tuning"></a>

*自动模型优化*（也称作超参数优化）通过运行很多在数据集上测试一系列超参数的作业来查找模型的最佳版本。您可以选择可优化超参数、每个超参数的值范围和一个目标指标。您可以从算法计算的指标中选择目标指标。自动模型优化将搜索所选超参数以找到导致优化目标指标的模型的值组合。

有关模型优化的更多信息，请参阅[使用 SageMaker AI 自动调整模型](automatic-model-tuning.md)。

## 由因子分解机算法计算的指标
<a name="fm-metrics"></a>

因子分解机算法具有二元分类和回归预测器类型。预测器类型确定可用于自动模型优化的指标。该算法报告在训练期间计算的 `test:rmse` 回归量指标。在为回归任务优化模型时，请选择此指标作为目标。


| 指标名称 | 说明 | 优化方向 | 
| --- | --- | --- | 
| test:rmse | 均方根误差 | 最小化 | 

因子分解机算法报告在训练期间计算的 3 个二元分类指标。在为二元分类任务优化模型时，请选择其中之一作为目标。


| 指标名称 | 说明 | 优化方向 | 
| --- | --- | --- | 
| test:binary\$1classification\$1accuracy | 准确性 | 最大化 | 
| test:binary\$1classification\$1cross\$1entropy | 交叉熵 | 最小化 | 
| test:binary\$1f\$1beta | Beta | 最大化 | 

## 可优化因子分解机超参数
<a name="fm-tunable-hyperparameters"></a>

您可为因子分解机算法调整以下超参数。包含偏置项、线性项和因子分解项的初始化参数取决于其初始化方法。有三种初始化方法：`uniform`、`normal` 和 `constant`。这些初始化方法本身是不可优化的。可优化参数依赖于初始化方法的选择。例如，如果初始化方法为 `uniform`，则仅 `scale` 参数是可优化的。具体而言，如果 `bias_init_method==uniform`，则 `bias_init_scale`、`linear_init_scale` 和 `factors_init_scale` 是可优化的。同样，如果初始化方法为 `normal`，则仅 `sigma` 参数是可优化的。如果初始化方法为 `constant`，则仅 `value` 参数是可优化的。下表列出了这些依赖项。


| 参数名称 | 参数类型 | 建议的范围 | 依赖关系 | 
| --- | --- | --- | --- | 
| bias\$1init\$1scale | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | bias\$1init\$1method==uniform | 
| bias\$1init\$1sigma | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | bias\$1init\$1method==normal | 
| bias\$1init\$1value | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | bias\$1init\$1method==constant | 
| bias\$1lr | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | 无 | 
| bias\$1wd | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | 无 | 
| epoch | IntegerParameterRange | MinValue: 1, MaxValue: 1000 | 无 | 
| factors\$1init\$1scale | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | bias\$1init\$1method==uniform | 
| factors\$1init\$1sigma | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | bias\$1init\$1method==normal | 
| factors\$1init\$1value | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | bias\$1init\$1method==constant | 
| factors\$1lr | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | 无 | 
| factors\$1wd | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512] | 无 | 
| linear\$1init\$1scale | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | bias\$1init\$1method==uniform | 
| linear\$1init\$1sigma | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | bias\$1init\$1method==normal | 
| linear\$1init\$1value | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | bias\$1init\$1method==constant | 
| linear\$1lr | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | 无 | 
| linear\$1wd | ContinuousParameterRange | MinValue: 1e-8， MaxValue: 512 | 无 | 
| mini\$1batch\$1size | IntegerParameterRange | MinValue: 100， MaxValue: 10000 | 无 | 

# 因子分解机响应格式
<a name="fm-in-formats"></a>

Amazon SageMaker AI 提供了多种响应格式，用于从分解机器模型中获取推理，例如 JSON、JSONLINES 和 RECORDIO，以及用于二进制分类和回归任务的特定结构。

## JSON 响应格式
<a name="fm-json"></a>

二元分类

```
let response =   {
    "predictions":    [
        {
            "score": 0.4,
            "predicted_label": 0
        } 
    ]
}
```

回归

```
let response =   {
    "predictions":    [
        {
            "score": 0.4
        } 
    ]
}
```

## JSONLINES 响应格式
<a name="fm-jsonlines"></a>

二元分类

```
{"score": 0.4, "predicted_label": 0}
```

回归

```
{"score": 0.4}
```

## RECORDIO 响应格式
<a name="fm-recordio"></a>

二元分类

```
[
    Record = {
        features = {},
        label = {
            'score’: {
                keys: [],
                values: [0.4]  # float32
            },
            'predicted_label': {
                keys: [],
                values: [0.0]  # float32
            }
        }
    }
]
```

回归

```
[
    Record = {
        features = {},
        label = {
            'score’: {
                keys: [],
                values: [0.4]  # float32
            }   
        }
    }
]
```