输出特征 (↓)
Ludwig 配置中的 output_features
部分结构与 input_features
相同,它是一个特征定义列表,每个定义包含用户希望模型预测的 name
和 type
,以及可选的 preprocessing
配置。
output_features:
-
name: french
type: text
{
"output_features": [
{
"name": "french",
"type": "text",
}
]
}
解码器¶
回顾 Ludwig 的蝴蝶框架
输出特征不像 encoders
那样有编码器,而是有 decoders
(解码器)。除了 name
和 type
之外的所有其他参数都将作为参数传递给解码器子部分,该子部分决定如何构建输出特征的解码器。与编码器一样,每个解码器也可以有不同的参数,因此我们为可用于特定数据类型的每个解码器提供了详细的文档。这可以在每种数据类型的文档中找到。
output_features:
-
name: french
type: text
decoder:
type: generator
cell_type: lstm
num_layers: 2
max_sequence_length: 256
{
"output_features": [
{
"name": "french",
"type": "text",
"decoder": {
"type": "generator",
"cell_type": "lstm",
"num_layers": 2,
"max_sequence_length": 256
}
}
]
}
解码器将组合器的输出作为输入,对其进行进一步处理,例如通过全连接层,并预测值,这些值随后用于计算损失和评估指标。
解码器还有其他参数,特别是 loss
,它允许您为此特定解码器指定不同的损失函数进行优化。例如,数值特征支持 mean_squared_error
(均方误差) 和 mean_absolute_error
(平均绝对误差) 作为损失函数。
关于可用解码器和损失函数以及所有参数的详细描述在特定数据类型的文档中提供。
还可以为所有特定类型的特征指定解码器类型和解码器相关参数。参见类型全局解码器。
多任务学习¶
在大多数机器学习任务中,您通常只预测一个目标变量,但在 Ludwig 中,用户可以指定多个输出特征。在训练期间,输出特征以多任务方式进行优化,使用其损失的加权和作为组合损失。Ludwig 原生支持多任务学习。
当指定多个输出特征时,优化的损失是每个独立输出特征损失的加权和。
默认情况下,每个损失权重为 1
,但这可以通过在每个输出特征定义的 loss
部分为 weight
参数指定一个值来更改。
例如,给定一个 category
特征 A
和一个 number
特征 B
,为了优化损失 loss_total = 1.5 * loss_A + 0.8 + loss_B
,配置的 output_feature
部分应如下所示:
output_features:
-
name: A
type: category
loss:
weight: 1.5
-
name: A
type: number
loss:
weight: 0.8
{
"output_features": [
{
"name": "A",
"type": "category",
"loss": {
"weight": 1.5
}
},
{
"name": "A",
"type": "number",
"loss": {
"weight": 0.8
}
}
]
}
输出特征依赖¶
Ludwig 提供的另一个额外功能是 output_features
之间的依赖概念。
有时输出特征之间存在强烈的因果关系,了解其中一个特征的预测结果可以改善对另一个特征的预测。例如,如果有两个输出特征:1) 粗粒度类别 和 2) 细粒度类别,了解对粗粒度类别的预测可以有效地明确细粒度类别的可能选择。
输出特征依赖在特征定义中声明。例如:
output_features:
-
name: coarse_class
type: category
decoder:
num_fc_layers: 2
output_size: 64
-
name: fine_class
type: category
dependencies:
- coarse_class
decoder:
num_fc_layers: 1
output_size: 64
{
"output_features": [
{
"name": "coarse_class",
"type": "category",
"decoder": {
"num_fc_layers": 2,
"output_size": 64
}
},
{
"name": "fine_class",
"type": "category",
"dependencies": [
"coarse_class"
],
"decoder": {
"num_fc_layers": 1,
"output_size": 64
}
}
]
}
在模型构建时,Ludwig 会检查是否存在循环依赖。
对于下游特征,Ludwig 将把所有依赖的输出特征预测之前的最终表示进行拼接,作为下游特征解码器的输入1
-
假设来自组合器的输入具有隐藏维度
h
128,在 `coarse_class` 解码器末尾有两个全连接层,返回一个隐藏大小为 64 的向量(该向量将用于在投影到输出 `coarse_class` 空间之前的最终层)。在 `fine_class` 的解码器中,`coarse_class` 的 64 维向量将与组合器输出向量拼接,形成一个隐藏大小为 192 的向量,该向量将通过一个全连接层,其 64 维输出将用于在投影到 `fine_class` 的输出类别空间之前的最终层。 ↩