使用内置广度和深度算法进行训练

使用 AI Platform Training 中的内置算法进行训练时,您无需编写任何训练代码即可提交数据集并训练模型。本页面介绍内置广度和深度算法的工作原理和使用方法。

概览

此内置算法会执行预处理和训练:

  1. 预处理:AI Platform Training 将混合的分类数据和数值数据处理为纯数值数据集,以便为训练做好准备。
  2. 训练:AI Platform Training 使用您提供的数据集和模型参数,通过 TensorFlow 的广度和深度 Estimator 运行训练。

限制

使用内置广度和深度算法进行训练时不支持以下功能

支持的机器类型

以下是系统支持的 AI Platform Training 容量层级和机器类型

设置输入数据的格式

数据集的每一行表示一个实例,数据集的每一列表示一个特征值。目标列表示您要预测的值

准备 CSV 文件

您的输入数据必须是采用 UTF-8 编码的 CSV 文件。如果您的训练数据仅包含分类值和数值,则可以使用我们的预处理模块填充缺失的数值、拆分数据集以及移除缺失值超过 10% 的行。否则,您可以在未启用自动预处理的情况下运行训练。

您在准备输入 CSV 文件时须满足以下要求:

  • 移除标题行。标题行包含每列的标签。移除标题行,避免将其作为训练数据的一部分与其余数据实例一起提交。
  • 确保目标列为第一列。目标列包含您尝试预测的值。对于分类算法,目标列中的所有值均为类或类别。对于回归算法,目标列中的所有值均为数值。

处理整数值

整数值的含义可能不明确,这会导致整数值的列在自动预处理过程中成为问题。AI Platform Training 会自动确定如何处理整数值。默认情况下:

  • 如果每个整数值都是唯一的,则该列会被视为实例键。
  • 如果只有几个唯一的整数值,则该列会被视为分类列。
  • 否则,该列中的值将转换为浮点数并被视为数值。

要覆盖这些默认判定,请执行以下操作:

  • 如果数据应被视为数值,请将列中的所有整数值转换为浮点数,例如,{101.0, 102.0, 103.0}
  • 如果数据应被视为分类,请在列中所有整数值的前面加上非数值前缀,例如,{code_101, code_102, code_103}

检查 Cloud Storage 存储分区权限

要存储数据,请使用用于运行 AI Platform Training 作业的同一 Google Cloud 项目中的 Cloud Storage 存储分区。否则,需要向 AI Platform Training 授予对存储数据的 Cloud Storage 存储分区的访问权限

提交广度和深度训练作业

本部分介绍如何提交使用内置广度和深度算法的训练作业。

您可以在 Google Cloud 控制台中查找每个超参数的简要说明,并在内置广度和深度算法参考文档中查看更详细的说明。

控制台

  1. 转到 Google Cloud 控制台中的 AI Platform Training“作业”页面:

    AI Platform Training“作业”页面

  2. 点击新建训练作业按钮。从下方显示的选项中,点击内置算法训练

  3. 创建新的训练作业页面上,选择内置广度和深度 (Built-in wide and deep),然后点击下一步

  4. 如需详细了解所有可用的参数,请点击 Google Cloud 控制台中的链接,并参阅内置广度和深度参考文档了解详情。

gcloud

  1. 为您的作业设置环境变量,用您的项目的相应值替代 [VALUES-IN-BRACKETS] 内的值:

       # Specify the name of the Cloud Storage bucket where you want your
       # training outputs to be stored, and the Docker container for
       # your built-in algorithm selection.
       BUCKET_NAME='[YOUR-BUCKET-NAME]'
       IMAGE_URI='gcr.io/cloud-ml-algos/wide_deep_learner_cpu:latest'
    
       # Specify the Cloud Storage path to your training input data.
       TRAINING_DATA='gs://[YOUR_BUCKET_NAME]/[YOUR_FILE_NAME].csv'
    
       DATASET_NAME='census'
       ALGORITHM='wide_deep'
       MODEL_TYPE='classification'
    
       DATE='date '+%Y%m%d_%H%M%S''
       MODEL_NAME="${DATASET_NAME}_${ALGORITHM}_${MODEL_TYPE}"
       JOB_ID="${MODEL_NAME}_${DATE}"
    
       JOB_DIR="gs://${BUCKET_NAME}/algorithm_training/${MODEL_NAME}/${DATE}"
    
  2. 使用 gcloud ai-platform jobs training submit 提交训练作业:

       gcloud ai-platform jobs submit training $JOB_ID \
          --master-image-uri=$IMAGE_URI --scale-tier=BASIC --job-dir=$JOB_DIR \
          -- \
          --preprocess --model_type=$MODEL_TYPE --batch_size=250 --learning_rate=0.1 \
          --dnn_learning_rate=0.005 --dnn_dropout=0.1 --hidden_units=10,10,10 \
          --use_wide --embed_categories \
          --max_steps=1000 --training_data_path=$TRAINING_DATA
    
  3. 使用 gcloud 查看日志,从而监控训练作业的状态。请参阅 gcloud ai-platform jobs describegcloud ai-platform jobs stream-logs

       gcloud ai-platform jobs describe ${JOB_ID}
       gcloud ai-platform jobs stream-logs ${JOB_ID}
    

预处理的工作原理

自动预处理适用于分类数据和数值数据。预处理例程先分析您的数据,然后再对其进行转换

分析

首先,AI Platform Training 会自动检测每个列的数据类型、确定应如何处理每一列,并计算该列中数据的部分统计信息。此类信息将捕获到 metadata.json 文件中。

AI Platform Training 会分析目标列的类型,以此确定特定数据集是用于回归还是分类。如果此分析与您对 model_type 的选择冲突,则会导致错误。通过在不确定的情况下清楚地设置数据格式,明确应如何处理目标列。

  • 类型:列可以是数值列,也可以是分类列

  • 处理方式:AI Platform Training 会根据如下原则确定如何处理每个列:

    • 如果列在所有行中包含单个值,则将其视为常量
    • 如果列是分类列,并且所有行中都包含唯一值,则将其视为 row_identifier
    • 如果列是带有浮点值的数值列,或者该列是带整数值的数值列且包含许多唯一值,则将该列视为数值
    • 如果列是带有整数值的数值列,并且包含的唯一值非常少,则将该列视为分类列,其中整数值是身份词汇
      • 如果列中唯一值的数量小于输入数据集中行数的 20%,则认为该列具有很少的唯一值
    • 如果列是具有高基数的分类列,则对该列进行哈希处理,其中哈希分区数等于列中唯一值数量的平方根。
      • 如果唯一值的数量大于数据集中行数的平方根,则认为该分类列具有高基数
    • 如果列是分类列,并且唯一值的数量小于或等于数据集行数的平方根,则将该列视为包含词汇的普通分类列。
  • 统计信息:AI Platform Training 会根据已确定的列类型和处理方式计算以下统计信息,以便在后续阶段中用于转换列。

    • 如果列是数值列,则计算均值和方差值。
    • 如果列是分类列,并且处理方式是身份或词汇,则从列中提取不同的值。
    • 如果列是分类列,并且处理方式是哈希技术,则按照列的基数计算哈希分区的数量。

转换

完成数据集的初始分析后,AI Platform Training 会根据应用于数据集的类型、处理方式和统计信息来转换您的数据。AI Platform Training 会按以下顺序执行转换:

  1. 将训练数据集拆分为验证和测试数据集(如果您指定拆分百分比)。
  2. 移除特征缺少 10% 以上的行。
  3. 使用列的平均值填写缺失的数值。

转换示例

超过 10% 的值缺失的行会被删除。在以下示例中,假设该行具有 10 个值。为简单起见,每个示例行都经过精简。

行问题 原始值 转换后的值 说明
没有缺失值的示例行 [3, 0.45, ...,
'fruits', 0, 1]
[3, 0.45, ...,
1, 0, 0, 0, 1]
字符串 'fruits' 在独热编码中转换为值“1, 0, 0”。此转换稍后在 TensorFlow 图中发生。
缺失值过多 [3, 0.45, ...,
'fruits', __, __]
行已移除 行中超过 10% 的值缺失。
缺少数值 [3, 0.45, ...,
'fruits', 0, __]
[3, 0.45, ...,
1, 0, 0, 0, 0.54]
  • 该列的平均值替换了缺失的数值。在本示例中,平均值是 0.54。
  • 字符串 'fruits' 在独热编码中转换为值“1, 0, 0”。此转换稍后在 TensorFlow 图中发生。
缺少分类值 [3, 0.45, ...,
__, 0, 1]
[3, 0.45, ...,
0, 0, 0, 0, 1]
  • 缺失的分类值在独热编码中转换为值“0, 0, 0”。此转换稍后在 TensorFlow 图中发生。

特征列

转换期间不会处理这些列。分析期间生成的元数据会传递到 AI Platform Training,以相应地创建特征列:

列类型 列的处理方式 生成的特征列
数值 (所有列处理类型) tf.feature_column.numeric_column

平均值和方差值用于执行值的标准化操作:
new_value = (input_value - mean) / sqrt(variance)
该特征适用于模型的深层神经网络部分。

分类 身份 tf.feature_column.categorical_column_with_identity
分类 词汇 tf.feature_column.categorical_column_with_vocabulary_list
分类 哈希技术 tf.feature_column.categorical_column_with_hash_bucket
分类 常量或行标识符 忽略。未创建任何特征列。

其他特征列

您可以选择在 DNN 模型的广度部分 (use_wide) 使用分类列,或者选择将分类列嵌入该模型的深度部分 (embed_categories)。根据您的选择,将添加以下其他特征列:

use_wide 已启用 embed_categories 已启用 结果
True True 或 False 该特征适用于模型的广度部分。
True 或 False True 将为分类列创建一个嵌入特征列,其中嵌入维度设置为该列中类别数平方根的上取整函数值。此嵌入特征列适用于模型的深度部分。
False False 将为分类列创建一个指标列。此指标特征列适用于模型的深度部分。

自动预处理完成后,AI Platform Training 会将处理后的数据集上传回 Cloud Storage 存储分区,存放在您在作业请求内指定的目录中。

后续步骤