KerasRS / API 文档 / 特征交互层 / FeatureCross 层

特征交叉层

[来源]

FeatureCross

keras_rs.layers.FeatureCross(
    projection_dim: Optional[int] = None,
    diag_scale: Optional[float] = 0.0,
    use_bias: bool = True,
    pre_activation: Union[
        str, keras.src.layers.activations.activation.Activation, NoneType
    ] = None,
    kernel_initializer: Union[
        str, keras.src.initializers.initializer.Initializer
    ] = "glorot_uniform",
    bias_initializer: Union[
        str, keras.src.initializers.initializer.Initializer
    ] = "zeros",
    kernel_regularizer: Union[
        str, NoneType, keras.src.regularizers.regularizers.Regularizer
    ] = None,
    bias_regularizer: Union[
        str, NoneType, keras.src.regularizers.regularizers.Regularizer
    ] = None,
    **kwargs: Any
)

深度交叉网络 (DCN) 中的 FeatureCross 层。

该层可高效地创建显式且有界度的特征交互。`call` 方法接受两个输入:`x0` 包含原始特征;第二个输入 `xi` 是堆栈中前一个 `FeatureCross` 层的输出,即第 i 个 `FeatureCross` 层。对于堆栈中的第一个 `FeatureCross` 层,`x0 = xi`。

输出为 `x_{i+1} = x0 .* (W * x_i + bias + diag_scale * x_i) + x_i`,其中 .* 表示逐元素相乘。W 可以是满秩矩阵,也可以是为了降低计算成本的低秩矩阵 `U*V`,而 `diag_scale` 会增加 W 的对角线元素以提高训练稳定性(特别是对于低秩情况)。

参数

  • projection_dim: int。用于将输入向下投影以降低计算成本的维度。如果为 None(默认值),则使用完整的矩阵 W(形状为 (input_dim, input_dim))。否则,将使用低秩矩阵 W = U*V,其中 U 的形状为 (input_dim, projection_dim)V 的形状为 (projection_dim, input_dim)projection_dim 需要小于 input_dim//2 才能提高模型效率。在实践中,我们观察到 projection_dim = input_dim//4 始终能够保持与满秩版本相当的准确率。
  • diag_scale: 非负浮点数。用于将核矩阵 W 的对角线增加 diag_scale,即 W + diag_scale * I,其中 I 是单位矩阵。默认为 None
  • use_bias: 布尔值。是否为该层添加偏置项。默认为 True
  • pre_activation: 字符串或 keras.activations。在与输入相乘之前,应用于层输出矩阵的激活函数。可用于控制层输出的尺度并提高稳定性。默认为 None
  • kernel_initializer: 字符串或 keras.initializers 初始化器。用于核矩阵的初始化器。默认为 "glorot_uniform"
  • bias_initializer: 字符串或 keras.initializers 初始化器。用于偏置向量的初始化器。默认为 "ones"
  • kernel_regularizer: 字符串或 keras.regularizer 正则化器。用于核矩阵的正则化器。
  • bias_regularizer: 字符串或 keras.regularizer 正则化器。用于偏置向量的正则化器。
  • **kwargs: 传递给基类的参数。

示例

# 1. Simple forward pass
batch_size = 2
embedding_dim = 32
feature1 = np.random.randn(batch_size, embedding_dim)
feature2 = np.random.randn(batch_size, embedding_dim)
crossed_features = keras_rs.layers.FeatureCross()(feature1, feature2)

# 2. After embedding layer in a model
vocabulary_size = 32
embedding_dim = 6

# Create a simple model containing the layer.
inputs = keras.Input(shape=(), name='indices', dtype="int32")
x0 = keras.layers.Embedding(
    input_dim=vocabulary_size,
    output_dim=embedding_dim
)(inputs)
x1 = keras_rs.layers.FeatureCross()(x0, x0)
x2 = keras_rs.layers.FeatureCross()(x0, x1)
logits = keras.layers.Dense(units=10)(x2)
model = keras.Model(inputs, logits)

# Call the model on the inputs.
batch_size = 2
input_data = np.random.randint(0, vocabulary_size, size=(batch_size,))
outputs = model(input_data)

参考


[来源]

call 方法

FeatureCross.call(x0: Any, x: Optional[Any] = None)

交叉层的前向传播。

参数

  • x0: 张量。交叉层的输入。N 阶张量,形状为 (batch_size, ..., input_dim)
  • x: 张量。可选。如果提供,该层将计算 x0 和 x 之间的交叉。否则,该层将计算 x0 和自身之间的交叉。形状应与 x0 相同。

返回值

交叉张量,形状与 x0 相同。