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

FeatureCross 层

[源代码]

FeatureCross

keras_rs.layers.FeatureCross(
    projection_dim: int | None = None,
    diag_scale: float | None = 0.0,
    use_bias: bool = True,
    pre_activation: (
        str | keras.src.layers.activations.activation.Activation | None
    ) = None,
    kernel_initializer: (
        str | keras.src.initializers.initializer.Initializer
    ) = "glorot_uniform",
    bias_initializer: str | keras.src.initializers.initializer.Initializer = "zeros",
    kernel_regularizer: (
        str | None | keras.src.regularizers.regularizers.Regularizer
    ) = None,
    bias_regularizer: str | None | 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:一个 Tensor。交叉层的输入。N 阶张量,形状为 (batch_size, ..., input_dim)
  • x:一个 Tensor。可选。如果提供,层将在 x0 和 x 之间计算交叉。否则,层将在 x0 和其自身之间计算交叉。应与 x0 具有相同的形状。

返回

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