

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Factorization Machines 演算法
<a name="fact-machines"></a>

Factorization Machines 演算法為一般用途的監督式學習演算法，可以用來分類與迴歸任務。該演算法旨在延伸線性模型的用途，藉此在高維度稀疏資料集內，以經濟實惠方式擷取各特徵之間的互動。舉例來說，因式分解機模型可以在點閱預測系統中，觀察特定頁面類別上所放置的特定廣告類別，並擷取該頁面上的廣告點擊率模式。對於處理點閱預測、項目推薦等高維度稀疏資料集的任務，Factorization Machines 將會是您的最佳選擇。

**注意**  
採用 Amazon SageMaker AI 實作的 Factorization Machines 僅會考量各特徵之間的逐對 (二階) 互動。

**Topics**
+ [Factorization Machines 演算法的輸入/輸出介面](#fm-inputoutput)
+ [Factorization Machines 演算法的 EC2 執行個體建議](#fm-instances)
+ [Factorization Machines 範例筆記本](#fm-sample-notebooks)
+ [Factorization Machines 的運作方式](fact-machines-howitworks.md)
+ [Factorization Machines 超參數](fact-machines-hyperparameters.md)
+ [調校 Factorization Machines 模型](fm-tuning.md)
+ [因式分解機回應格式](fm-in-formats.md)

## Factorization Machines 演算法的輸入/輸出介面
<a name="fm-inputoutput"></a>

您可以在二元分類模式或迴歸模式中，執行 Factorization Machines 演算法。在每一種模式下，系統皆會連同訓練通路的資料集，將資料集一併提供給**測試**通道。評分取決於所使用的模式。在迴歸模式中，系統會透過均方根誤差 (RMSE) 為測試資料集評分。而二元分類模式則會透過二元交叉熵 (損失函式)、準確度 (閾值 = 0.5) 與 F1 分數 (閾值 = 0.5)，對測試資料集進行評分。

對於**訓練**，Factorization Machines 演算法目前僅支援採用 `Float32` 張量 (tensor) 的 `recordIO-protobuf` 格式。該演算法的使用案例主要是針對稀疏資料，所以 `CSV` 並不適合。檔案模式與管道模式皆支援已包裝 recordIO 的 protobuf。

對於**推論**，因式分解機演算法支援 `application/json` 和 `x-recordio-protobuf` 格式。
+ 對於**二進位分類**問題，演算法預測評分和標籤。標籤是一個數字，可以是 `0` 或 `1`。分數是一個數字，表示演算法相信標籤為 `1` 的強度。演算法首先會計算分數，然後從分數值衍生標籤。如果分數大於或等於 0.5，則標籤為 `1`。
+ 對於**迴歸**問題，只會傳回分數，且它是預測值。例如，如果 Factorization Machines 用來預測影片分級，則分數是預測的分級值。

如需訓練與推論檔案格式的詳細資訊，請參閱[Factorization Machines 範例筆記本](#fm-sample-notebooks)。

## Factorization Machines 演算法的 EC2 執行個體建議
<a name="fm-instances"></a>

Amazon SageMaker AI Factorization Machines 演算法具備高可擴展性，且能夠在各個分布的執行個體中進行訓練。建議您透過 CPU 執行個體，加以訓練、推論稀疏資料集與密集資料集。在某些情況下，透過一個或多個 GPU 來訓練密集資料也許能讓使用者從中獲益。請注意，GPU 訓練僅適用於密集資料。若是稀疏資料，請使用 CPU 執行個體進行訓練。因式分解機演算法可支援 P2、P3、G4dn 和 G5 執行個體，進行訓練和推論。

## Factorization Machines 範例筆記本
<a name="fm-sample-notebooks"></a>

如需使用 SageMaker AI Factorization Machines 演算法，在 MNIST 資料集中分析 0 到 9 手寫數字的範例筆記本，請參閱[使用 MNIST 的 Factorization Machines 簡介](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/factorization_machines_mnist/factorization_machines_mnist.html)。如需如何建立並存取 Jupyter 筆記本執行個體以用來執行 SageMaker AI 中範例的指示，請參閱[Amazon SageMaker 筆記本執行個體](nbi.md)。在建立並開啟筆記本執行個體後，請選取 **SageMaker AI 範例**索引標籤以查看所有 SageMaker AI 範例的清單。使用 Factorization Machines 演算法的範例筆記本位於 **Amazon 演算法簡介**一節。若要開啟筆記本，請按一下其**使用**標籤，然後選取**建立複本**。

# Factorization Machines 的運作方式
<a name="fact-machines-howitworks"></a>

因式分解機模型的預測任務是預估從功能集 xi 到目標域的函式。此領域是迴歸的真值，以及分類的二進位。Factorization Machines 模型為監督式，因此具有訓練資料集 (xi,yj)。此模型的優勢，在於其使用分解參數化來擷取逐對特徵互動。可以用數學方式呈現如下：

![\[包含因式分解機模型方程式的影像。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/FM1.jpg)


 此方程式中的三項分別對應至模式的三個元件：
+ w0 項代表全域偏差。
+ wi 線性項模仿 ith 變數的強度。
+ <vi,vj> 分解項模仿 ith 和 jth 變數之間的逐對互動。

全域偏差和線性項會與線性模型一致。系統會以第三項建立逐對特徵互動模型，並將其用於對應因素的內積值，以供各種特徵學習。或者，您也可以將學習因素視為各特徵的內嵌向量。以分類任務為例，如果在標籤為正數的樣本中，一組特徵同時出現的頻率逐漸提升，則這組特徵的內積值也會隨之提高。換句話說，這組特徵的內嵌向量在餘絃相似度上，結果會非常相近。如需因式分解機模型的詳細資訊，請參閱[因式分解機](https://www.ismll.uni-hildesheim.de/pub/pdfs/Rendle2010FM.pdf)。

針對迴歸任務，系統為了有效訓練模型，會將模型預測值 ŷn 與目標值 yn 之間的平方誤差減到最低。這也稱為平方損失：

![\[包含平方損失之方程式的影像。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/FM2.jpg)


針對分類任務，系統會訓練模型來將跨熵遺失減到最低 (也稱為損失函式)：

![\[包含損失函式之方程式的影像。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/FM3.jpg)


其中：

![\[包含預估值之邏輯函式的影像。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/FM4.jpg)


如需分類之損失函式的詳細資訊，請參閱[分類的損失函式](https://en.wikipedia.org/wiki/Loss_functions_for_classification)。

# Factorization Machines 超參數
<a name="fact-machines-hyperparameters"></a>

下表包含因式分解機演算法的超參數。這些是由使用者設定的參數，用來協助從資料預估模型參數。首先列出的是必須設定的超參數，依字母順序排列。接著列出的是選用的超參數，也是依字母順序排列。


| 參數名稱 | Description | 
| --- | --- | 
| 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_tw/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_tw/sagemaker/latest/dg/fact-machines-hyperparameters.html) **選用** 有效值：`uniform`、`normal` 或 `constant` 預設值：`normal`  | 
| bias\$1init\$1scale | 偏差項的初始化範圍。`bias_init_method` 設定為 `uniform` 時，才會生效。 **選用** 有效值：非負浮點數。建議值範圍：[1e-8, 512]。 預設值：NONE  | 
| bias\$1init\$1sigma | 偏差項的初始化標準偏差。`bias_init_method` 設定為 `normal` 時，才會生效。 **選用** 有效值：非負浮點數。建議值範圍：[1e-8, 512]。 預設值：0.01  | 
| bias\$1init\$1value | 偏差項的初始值。`bias_init_method` 設定為 `constant` 時，才會生效。 **選用** 有效值：浮點數。建議值範圍：[1e-8, 512]。 預設值：NONE  | 
| bias\$1lr | 偏差項的學習率。 **選用** 有效值：非負浮點數。建議值範圍：[1e-8, 512]。 預設值：0.1  | 
| bias\$1wd | 偏差項的權重衰減。 **選用** 有效值：非負浮點數。建議值範圍：[1e-8, 512]。 預設值：0.01  | 
| clip\$1gradient | 漸層梯度最佳化程式參數。在間隔 [-`clip_gradient`, \$1`clip_gradient`] 上輸入參數，即可剪裁梯度。 **選用** 有效值：浮點數 預設值：NONE  | 
| epochs | 要執行的訓練 epoch 數量。 **選用** 有效值：正整數 預設值：1  | 
| eps | Epsilon 參數，以避免除以 0。 **選用** 有效值：浮點數。建議值：小。 預設值：NONE  | 
| factors\$1init\$1method | 因式分解項的初始化方式： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/fact-machines-hyperparameters.html) **選用** 有效值：`uniform`、`normal` 或 `constant`。 預設值：`normal`  | 
| factors\$1init\$1scale  | 因式分解項的初始化範圍。`factors_init_method` 設定為 `uniform` 時，才會生效。 **選用** 有效值：非負浮點數。建議值範圍：[1e-8, 512]。 預設值：NONE  | 
| factors\$1init\$1sigma | 因式分解項的初始化標準偏差。`factors_init_method` 設定為 `normal` 時，才會生效。 **選用** 有效值：非負浮點數。建議值範圍：[1e-8, 512]。 預設值：0.001  | 
| factors\$1init\$1value | 因式分解項的初始值。`factors_init_method` 設定為 `constant` 時，才會生效。 **選用** 有效值：浮點數。建議值範圍：[1e-8, 512]。 預設值：NONE  | 
| 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_tw/sagemaker/latest/dg/fact-machines-hyperparameters.html) **選用** 有效值：`uniform`、`normal` 或 `constant`。 預設值：`normal`  | 
| linear\$1init\$1scale | 線性項的初始化範圍。`linear_init_method` 設定為 `uniform` 時，才會生效。 **選用** 有效值：非負浮點數。建議值範圍：[1e-8, 512]。 預設值：NONE  | 
| linear\$1init\$1sigma | 線性項的初始化標準偏差。`linear_init_method` 設定為 `normal` 時，才會生效。 **選用** 有效值：非負浮點數。建議值範圍：[1e-8, 512]。 預設值：0.01  | 
| linear\$1init\$1value | 線性項的初始值。`linear_init_method` 設定為 *constant* (固定) 時，才會生效。 **選用** 有效值：浮點數。建議值範圍：[1e-8, 512]。 預設值：NONE  | 
| linear\$1wd | 線性項的權重衰減。 **選用** 有效值：非負浮點數。建議值範圍：[1e-8, 512]。 預設值：0.001  | 
| mini\$1batch\$1size | 供訓練的小批量資料大小。 **選用** 有效值：正整數 預設值：1000  | 
| rescale\$1grad |  漸層重新擴展最佳化程式參數。若設定完成，請先將梯度與 `rescale_grad` 相乘，再進行更新。通常會選擇 1.0/`batch_size`。 **選用** 有效值：浮點數 預設值：NONE  | 

# 調校 Factorization Machines 模型
<a name="fm-tuning"></a>

*自動模型調校*，又稱為超參數調校，會透過在您的資料集上，執行許多測試超參數範圍的任務，來尋找最佳版本的模型。您可以選擇可調校的超參數、每一個超參數的值範圍，及目標指標。您可以從演算法運算的指標中選擇目標指標。自動模型調校會搜尋所選擇的超參數，以找出產生之模型可最佳化目標指標的值組合。

如需模型調校的詳細資訊，請參閱[使用 SageMaker AI 執行自動模型調校](automatic-model-tuning.md)。

## 依 Factorization Machines 演算法運算的指標
<a name="fm-metrics"></a>

Factorization Machines 演算法具有二元分類和迴歸預測器兩種類型。預測器類型會判斷可用於自動模型調校的指標。演算法會回報 `test:rmse` 迴歸指標 (在訓練期間運算)。調校迴歸任務的模型時，請選擇此指標做為目標。


| 指標名稱 | Description | 最佳化方向 | 
| --- | --- | --- | 
| test:rmse | 均方根誤差 | 最小化 | 

Factorization Machines 算法會回報三個二元分類指標 (在訓練期間運算)。調校二元分類任務的模型時，請選擇其中之一做為目標。


| 指標名稱 | Description | 最佳化方向 | 
| --- | --- | --- | 
| test:binary\$1classification\$1accuracy | 準確性 | 最大化 | 
| test:binary\$1classification\$1cross\$1entropy | 跨熵 | 最小化 | 
| test:binary\$1f\$1beta | 試用版 | 最大化 | 

## 可調校的 Factorization Machines 超參數
<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 等 Factorization Machines 模型取得推論，並具有用於二進制分類和迴歸任務的特定結構。

## 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
            }   
        }
    }
]
```