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 的对角线以提高训练稳定性(尤其是在低秩情况下)。
参数
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 * I
,其中 I 是单位矩阵。默认为 None
。True
。keras.activations
。应用于层输出矩阵,在与输入相乘之前。可用于控制层输出的比例并提高稳定性。默认为 None
。keras.initializers
初始化器。用于核矩阵的初始化器。默认为 "glorot_uniform"
。keras.initializers
初始化器。用于偏置向量的初始化器。默认为 "ones"
。keras.regularizer
正则化器。用于核矩阵的正则化器。keras.regularizer
正则化器。用于偏置向量的正则化器。示例
# 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)
交叉层的前向传播。
参数
(batch_size, ..., input_dim)
。x0
具有相同的形状。返回
交叉张量,与 x0
具有相同的形状。