Layer

basic

class Dense(*args, **kwargs)

Dense Layer实现 \(y = active(wx + b)\).

之所以要重新实现一个Dense Layer,是因为增加的了些额外的操作,如 kernel_norm,论文可参考 https://arxiv.org/pdf/1602.07868.pdf。 kernel_norm 的计算方式为:

\[y = active( norm_{kernel} * l2_{normalize}(W) x + b)\]

先对 \(W\)\(l2_{normalize}\),将其取值限制在 \([-1, 1]\) 之间,然后乘以 \(norm_{kernel}\),这样 \(norm_{kernel} * l2_{normalize}(W)\) 的取值在 \([-norm_{kernel}, norm_{kernel}]\) 之间,可以有效地防止梯度爆炸。 \(norm_{kernel}\) 一般由 \(W\) 的初值决定,有 \(norm_{kernel} = norm(W_{init})\). 也可设置 \(norm_{kernel}\) 为 trainable,使其自动调节。

Parameters:
  • units (tf.Tensor) – 输入,也就是 \(x\)

  • activation (tf.activation, str) – 激活函数,可以用 str 表示,也可以用 TensorFlow 中的 activation

  • use_bias (bool) – 是否使用 bias

  • kernel_initializer (tf.initializer) – kernel 也就是 \(W\) 的初始化器

  • bias_initializer (tf.initializer) – bias 也就是 \(b\) 的初始化器

  • bias_regularizer (tf.regularizer) – bias 正侧化

  • allow_kernel_norm (bool) – 是否开启 kernel_norm

  • kernel_norm_trainable (bool) – 是否让 kernel_norm 可训练

  • partitioner (tf.partitioner, optional) – 分区器,可以将一个大变量分到不同的 PS 机器上

  • inactive_relu_monitor (bool) – 是否开启 relu_monitor

  • inactive_relu_monitor_decay (float) – 因为 relu 的非 0 率是用指数平均来计算的,decay就是衰减因子

  • optimizer (tf.optimizer) – 优化器,请参考 TensorFlow

>>> from monolith.native_training.layers import Dense
>>> dense = Dense(units=100,
...               activation=tf.keras.activations.sigmoid,
...               kernel_initializer=tf.keras.initializers.GlorotNormal())
>>> y = dense(x)
class MLP(*args, **kwargs)

多层感知器(Multilayer Perceptron),最经典的人工神经网络,由一系列层叠起来的 Dense 层组成

Parameters:
  • output_dims (List[int]) – 每一层的输出神经元个数

  • activations (List[tf.activation], List[str], tf.activation, str) – 激活函数,可以用 str 表示,也可以用 TensorFlow 中的 activation

  • initializers (List[tf.initializer]) – kernel 也就是 \(W\) 的初始化器,是一个列表

  • kernel_regularizer (tf.regularizer) – kernel 正侧化器

  • use_weight_norm (bool) – 是否开启 kernel_norm

  • use_learnable_weight_norm (bool) – 是否让 kernel_norm 可训练

  • use_bias (bool) – 是否使用 bias,默认为 True

  • bias_regularizer (tf.regularizer) – bias 正侧化

  • enable_batch_normalization (bool) – 是否开启batch normalization,如果开启,会对输入数据及每个 Dense Layer 的输出均做 BatchNorm (最后一个 Dense Layer 除外)。

  • batch_normalization_momentum (float) – BatchNorm 中的动量因子

  • batch_normalization_renorm (bool) – 是否使用 renorm,(论文可参考 https://arxiv.org/abs/1702.03275)

  • batch_normalization_renorm_clipping (bool) – renorm 中的 clipping,具体请参考 TensorFlow 中的 BatchNormalization

  • batch_normalization_renorm_momentum (float) – renorm 中的 momentum,具体请参考 TensorFlow 中的 BatchNormalization

feature cross

class GroupInt(*args, **kwargs)

GroupInt(Group Interaction) 是一种简单的特征交叉方式,同时支持 attention。论文可参考 https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf

特征交叉可以在多个层面做,一种方法是在特征工程中做,即在特征工程阶段直接生成一个新特征,这个特征是由多个原始征特拼接起来的,然后再做 Embedding。 这样做的好处是记忆性较好,但由于稀疏性,有时训练不够充分,也存在过拟合的风险。另一种是在模型层面做,代表算法为 FM, DeepFM 等。

在模型中做二阶特征交叉存在如下问题:
  • 输出维度高: FM用点积表示特征交叉,如果输入有 n 个特征,输出有 n(n-1)/2 维,当特征较多时,给训练/推理带来很大的负担

  • 重复交叉:特征交叉可以在两个地方做,现实中往往同时做。FM 等算法并不区分参与交叉的是原始特征还是交叉特征。所以存在重复交叉。不过,也有人认为 重复交叉会生成更高阶的特征,不是重复。

为了克服 FM 等算法的不足,可以使用 GroupInt。它先将特征分组(Group),哪些特征属于一个组由算法开发人员确定。然后用 SumPooling 来将特征聚合 得到 group embedding。最后用 group embedding 做两两交叉输出。

GroupInt输出有如下几种形式:
  • 交叉用 dot,直接输出。此时输出的大小远小于原始 FM,而且人工确定 group,减少了重复交叉

  • 交叉用 multiply,输出有两种选择:
Parameters:
  • interaction_type (str) – Interaction的方式有两种,dotmultiply

  • use_attention (bool) – 是否使用 attention,当 interaction_typemultiply 时才可用

  • attention_units (List[int]) – 使用一个 MLP 生成 attention,attention_units 表示 MLP 每一层的 dim,最后一维必须是 1

  • activation (tf.activation) – MLP 的激活函数

  • initializer (tf.initializer) – MLP 的初始化器

  • regularizer (tf.regularizer) – MLP 的正则化器

  • out_type (str) – 输出类型,可以为 stack, concat, None

  • keep_list (bool) – 输出是否保持 list

FFM

alias of GroupInt

class AllInt(*args, **kwargs)

AllInt (All Interaction) 是一种简单的特征交叉方式,通过引入压缩矩阵,减少输出大小。论文可参考 https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf

GroupInt虽然能克服FM带来的输出膨胀的问题,但也有其它问题,如 Group 要人工决定,给算法开发人员带来较大的负担。AllInt 将所有特征都做交叉,不用人工选择,同时引入压缩矩阵来减少输出大小。

All Interaction 中引入压缩矩阵。如下:

\[O_{n, c} = X_{n, k} * X_{n, k}^T * C_{n, c}\]

为了避免生成 (n, n) 的大中间矩阵,在计算上进行了一些优化,即先算 \(X_{n, k}^T * C_{n, c}\),这样得到的 (k, c) 矩阵小很多,计算效率高

Parameters:
  • cmp_dim (int) – 压缩维的维度

  • initializer (tf.initializer) – 初始化器

  • regularizer (tf.regularizer) – kernel 正则化器

  • use_bias (bool) –

  • out_type (str) – 输出类型,可以为 stack, concat, None

  • keep_list (bool) – 输出是否保持 list

class CDot(*args, **kwargs)

CDot(Compression and Dot Interaction) 可以看成是 Allint 的升级版,也是一种自动做特征交叉的方法。

Allint 通过引入压缩矩阵,减少相对 FM 的输出大小,同时移除了 GroupInt 中人工定义 Group 的不足,CDot 与 Allint 十分相似。

CDot 相对 Allint 的改进在于:
  • AllInt 引入的压缩矩阵与输入无关,在CDot中,压缩矩阵是与输入数据相关,可以根据输入,自适应地调节压缩矩阵。

  • CDot输出时,会将压缩后的中间特征也输出,作为上层MLP的输入,Allint 不会做这一步

一般提取高阶特征交叉时使用 MLP,MLP 的输入是直接接拼起来的 Embedding。一些实验表明,可以先用 CDot 提取二阶特征,再在二阶特征基础上提取高阶 特征效果更好。所以 CDot 也可以与 MLP 联用,用于高阶特征提取。

Parameters:
  • project_dim (int) – 投影 dim

  • compress_units (List[int]) – 用一个 MLP 来压缩,压缩 MLP 的各层 dims

  • activation (tf.activation) – MLP 的激活函数

  • initializer (tf.initializer) – 初始化器

  • regularizer (tf.regularizer) – kernel 正则化器

class CAN(*args, **kwargs)

CAN(Co-action Network) 协同作用网络 论文可参考 https://arxiv.org/pdf/2011.05625.pdf

在模型中做特征交叉,同一份 Embedding,同时要拟合原始特征/交叉特征,容易两个都拟合不好。CAN 是为了改善这种情况提出的,通过拓展参数,使得交叉特征与原始特征的学习相对独立

CAN Unit 将要建模的“特征对”分为 weight side(item) 和 input side(user):
  • weight side 可以 reshape 成 MLP 的参数

  • input side 作为 MLP 的输入,通过多层 MLP 来建模 co-action

Parameters:
  • layer_num (int) – Layer 的层数

  • activation (tf.activation) – 激活函数

  • is_seq (bool) – 是否为序列特征

  • is_stacked (bool) – User 侧是否是多个特征 stack 起来的

class DCN(*args, **kwargs)

二阶特征交叉可用 FM 等方法显式提取,更高阶的交叉用 MLP 隐式提取。DCN(Deep & Cross Network) 可替代 MLP 做高阶特征交叉, 通过加入残差联接,达到比 MLP 更好的效果。

DCN 现在有三个版本(论文可参考 https://arxiv.org/pdf/1708.05123.pdf):
  • vector: \(x_{l+1} = x_0 * x_l w + b + x_l\),其中w的shape为(dim, 1)

  • matrix: \(x_{l+1} = x_0 * (x_l w + b) + x_l\),其中w的shape为(dim, dim)

  • mixed: \(x_{l+1} = \sum_i x_0 * (x_l V C U^T + b) * softmax(x_l g) + x_l\)

Parameters:
  • layer_num (int) – DCN 的层数

  • dcn_type (str) – DCN 类型,目前支持三种 vector, matrix, mixed

  • initializer (tf.initializer) – 初始化器

  • regularizer (tf.regularizer) – 正则化器

  • num_experts (int) – 只在 mixed 模式下有用,用于指定 expert 个数

  • low_rank (int) – 只在 mixed 模式下有用,用于指定低秩

  • use_dropout (bool) – 只否使用 dropout

  • keep_prob (float) – dropout 的保留概率

  • mode (str) – 运行模式,可以是 train, eval, predict

class CIN(*args, **kwargs)

CIN(Compressed Interaction Network) 压缩相互作用网络。它是高阶(二阶以上)特征提取方法,形式上是 DCN 与 FM 的结合体,也是 xDeepFM 的核心。论文可参考 https://arxiv.org/pdf/1703.04247.pdf

DCN 的计算:
  • \(x_{l+1} = f_{\theta}(x_0, x_l) + x_l\),即它是一个残差网络,并且每一层的计算都与 \(x_0\) 有关

FM 的计算:
  • 相对于 LR,增加了二阶交叉项,并且用 embedding 的形式压缩表达,计算特征交叉的方式是点积

CIN的计算:
  • 与 DCN 一样,并且每一层的计算都与 \(x_0\) 有关,但是并不使用残差,\(f_{\theta}(x,y)\) 不是线性的,而是与 FM 类似,用 embedding 计算得到, 但使用的不是点积(bit-wise),而是对应元素相乘,然后线性组合(vector-wise)。\(f_{\theta}(x,y)\) 是类似于 FM 的方法显式交叉,所以它是一种显式高阶特征交叉方法

  • 计算上,CIN 还有一个特点是它可以转化成 CNN 高效计算

\[X_{h,*}^k = \sum_{i=1}^{H_{k-1}} \sum_{j=1}^m W_{ij}^{k,k} (x_{i,*}^{k-1} \circ x_{j,*}^0)\]
CIN的主要特点是:
  • 相互作用在 vector-wise level,而不是在 bit-wise level

  • 高阶特征交叉是显性的,而非隐性的

  • 模型大小并不会随因交叉度增加而指数增加

Parameters:
  • hidden_uints (List[int]) – CIN 隐含层 uints 个数

  • activation (tf.activation) – 激活函数

  • initializer (tf.initializer) – 初始化器

  • regularizer (tf.regularizer) – 正则化器

feature transform

class AutoInt(*args, **kwargs)

AutoInt(Auto-Interaction),基于 Self-attention 的特征变换。论文可参考 https://arxiv.org/pdf/1810.11921.pdf

一个样本有 n 个特征,每个特征用一个 k 维的 embedding 表示,则样本可以表示为 (n, k) 的矩阵。所谓 attention,本质上是一种线性组合,关键是确定组合系数

AutoInt 中确定组合系数的方式为:

\[coeff_{n, n} = softmax( X_{n, k} * X_{n, k}^T )\]

即先计算自相关,确定特征与其它特征的`相似性`,然后用 softmax 的方式归一化,得到组合系数。最后是组性组合,计算 attention:

\[O_{n, k} = coeff_{n, n} * X_{n, k}\]

在 AutoInt 中,上述过程可以迭代进行多次,一次为一个 layer

Parameters:
  • layer_num (int) – auto int layer 的层数,一层为一个完整的 auto int

  • out_type (str) – 输出类型,可以为 stack, concat, None

  • keep_list (bool) – 输出是否保持 list

class SeNet(*args, **kwargs)

SeNet 最早用于图像中,这里是借用其概念,不同特征具有不同重要性。论文可参考 https://arxiv.org/pdf/1709.01507.pdf

一个样本有 n 个特征,每个特征用一个 k 维的 embedding 表示。但是并不是每个特征都一样重要,所以想给每个特征一个权重,以调整其重要性。 权重计算是用一个 MLP 完成的,一般有三层 input - cmp_layer - output。其中 input/output 是同 shape 的,input 是通过 reduce_mean 输入矩阵 (n, k) 的最后一维得到。 最后用 weight(n) * (n, k) 为特征加权

Parameters:
  • num_feature (int) – 输入特征数

  • cmp_dim (int) – 压缩维的维度

  • initializer (tf.initializer) – kernel/bias 初始化器

  • kernel_regularizer (tf.regularizer) – kernel 正则化

  • bias_regularizer (tf.regularizer) – bias 正则化

  • on_gpu – 计算是否发生在GPU上, 如果是,则用 GPU 优化版本

  • out_type (str) – 输出类型,可以为 stack, concat, None

  • keep_list (bool) – 输出是否保持 list

feature sequential

class DIN(*args, **kwargs)

DIN(Deep Interest Network) 是阿里的原创,基于兴趣序列特征聚合,论文可参考 https://arxiv.org/pdf/1706.06978.pdf

为了更好地描述用户,仅用静态特征是不够的,需要加入行为特征。行为特征往往是一个序列,如点击过的 app,购买过的商品等等。 一方面,用户的行为是由内在兴趣(Interest)与外部条件(Target)一起促成的。用户行为是用户兴趣的体现,简单起见,用户行为表示兴趣

DIN的三个假设:
  • Behavior/Interest:将用户行为序列表示为 embedding 序列,这个序列同时也表示用户兴趣

  • Target Representation:将用户物品(Target)表示为 embedding,它与行为/兴趣处于同一空间,因为它能满足用户的兴趣,促进行为的发生

  • Interest Match:用户对物品发生行为, 是因为物品满足了用户的`某些`兴趣,用 Attention 来表达

为了简单,以单个特征为例:
  • queries: 表示召回的物品(Target),emb_size 为 k,shape 为(k, )

  • keys : 表示用户序列特征(Interest),emb_size 为 k,序列长长度为 t,shape 为 (t, k)

先将 queries tile 成 shape 为(t, k),即将数据 copy t 次,使 queries 和 key 同 shape。然后作如下操作

din_all = concat([queries, keys, queries - keys, queries * keys])

也就是将 queries, keys及其差值、乘值等 concat 起来,然后输入 MLP,得到 attention weight(即物品对兴趣的满足程度)

attention_weight = mlp(din_all)

最后,线性组合,实现attention (兴趣汇总),如下:

output = matmul(attention_weight * keys)

结果的 shape 为(k, ),与原始 queries 同 shape。

Parameters:
  • hidden_units (list) – DIN 中 MLP layers 的 hidden_units,最后一维为 1

  • activation (tf.activation) – 激活函数

  • initializer (tf.initializer) – kernel/bias 初始化器

  • regularizer (tf.regularizer) – kernel 正则化

  • mode (str) – 输出模式,如果为 sum,则会进行线性组合,返回的 shape 与 queries 一样,否则只相乘不组合,返回的 shape 与 keys 一样

  • decay (bool) – 是否在 attention weight 上做 decay,默认为 False

class DIEN(*args, **kwargs)

DIEN(Deep Interest Evolution Network) 是 DIN 的升级版,阿里原创,基于兴趣演进的序列特征聚合,论文可参考 https://arxiv.org/pdf/1809.03672.pdf

在推荐场景,用户无需输入搜索关键词来表达意图,这种情况下捕捉用户兴趣并考虑兴趣的动态变化将是提升模型效果的关键。 大多该类模型将用户的行为直接看做兴趣,而用户的潜在兴趣往往很难通过行为来完全表示,需要挖掘行为背后的用户真实兴趣,并考虑用户兴趣的动态变化。

DIEN 的假设:
  • Behavior Layer: 也就是将用户行为序列表示为 embedding 序列,embedding 表达的意义是行为本身,不再直接代表兴趣,这与 DIN 不同

  • Interest Extractor Layer: 用 GRU 从用户行为中提取兴趣(Interest),兴趣是随时间演变的,DIN没有考虑这一点

  • Interest Evolving Layer: 随着外部环境(Target attention)和内部认知(Interest)的变化,用户兴趣也不断变化,最终兴趣促使行为发生
    • 物品表示与 DIN 一样,它与兴趣处于同一空间,因为它能满足用户的兴趣,促进行为的发生

    • 物品与兴趣的关系建模与 DIN 不一样,DIN是静态地看物品能否满足用户兴趣,而 DIEN 中,用户兴趣是演进的(Evolving),物品会诱导/挖掘用户兴趣 在网络结构上表示为 AGRU,即 attention + GRU

Parameters:
  • num_units (int) – GRU 隐含层的大小

  • att_type (str) – attention 的类型,目前支持 AGRU/AUGRU 两种

  • activation (tf.activation) – 激活函数

  • initializer (tf.initializer) – kernel/bias 初始化器

  • regularizer (tf.regularizer) – kernel 正则化

class DMR_U2I(*args, **kwargs)

DMR(Deep Match to Rank) 深度配匹排序,与 RNN 不同,主要考虑序列顺序。

与 DIN 一样,DMR 还是用 attention 的方式来聚合序列特征。不同的是 DMR 考虑了序列顺序,即增加了位置 embedding 来处理用户序列的先后顺序。 由于原始论文中最后的输出是点积,梯度回传时只有一个值,会导致训练不充分,所以引入辅助 loss,但是辅助 loss 要用到负采样,系统实现上比较 麻烦,这里用 element wise 乘积代替点积,去除辅助 loss。论文可参考 https://ojs.aaai.org/index.php/AAAI/article/view/5346/5202

Parameters:
  • cmp_dim (int) – 压缩维度

  • activation (tf.activation) – 激活函数

  • initializer (tf.initializer) – kernel/bias 初始化器

  • regularizer (tf.regularizer) – kernel 正则化

multi-task

class MMoE(*args, **kwargs)

MMoE(Multi-gate Mixture of Experts) 是 MTL(Multi-task Training) 多任务学习的一种结构。通过引入 Multi-gate 来描述任务之间相关性以及每个任务对底层共享参数的依赖程度。 论文可参考: https://www.kdd.org/kdd2018/accepted-papers/view/modeling-task-relationships-in-multi-task-learning-with-multi-gate-mixture-

Parameters:
  • num_tasks (int) – 任务训练的数量

  • expert_output_dims (List[int], List[List[int]]) –

    每个Expert MLP的output_dims,可以通过两种方法来定义

    1. List[int] 指定,此时,每个 Expert 的结构是相同的

    2) 用 List[List[int]] 指定,此时,每个 Expert MLP 结构都可以不同,内部不会处理最上层 Dense 层,所以用户必须确保每个 Expert 最上层的 shape 是相同的

  • expert_activations (List[Any], str) – 每个 Expert 激活函数,可以用 str 表示,也可以用 TF 中的 activation

  • expert_initializers (List[Any], str) – W 的初始化器,可以是 str 也可以用户定义使用列表,默认使用 Glorot_uniform 初始化

  • gate_type (str) – 每个gate所使用的计算方式,可以是 softmaxtopknoise_topk 。默认使用的是 softmax

  • topk (int) – 定义 gate 使用 (topk, noise_topk) 计算后保留最大的 k 个 Expert,默认是 1

  • num_experts (int) – 定义 Expert 的个数,默认会根据 Expert 的其他参数生成个数

  • kernel_regularizer (tf.regularizer) – kernel 正侧化器

  • use_weight_norm (bool) – 是否开启 kernel_norm,默认为 True

  • use_learnable_weight_norm (bool) – 是否让 kernel_norm 可训练,默认为 True

  • use_bias (bool) – 是否使用 bias,默认为 True

  • bias_regularizer (tf.regularizer) – bias 正侧化

  • enable_batch_normalization (bool) – 是否开启 batch normalization,如果开启,会对输入数据,及每个 Dense Layer 的输出均做 BatchNorm (最后一个Dense Layer除外)。

  • batch_normalization_momentum (float) – BatchNorm 中的动量因子

  • batch_normalization_renorm (bool) – 是否使用 renorm,(论文可参考 https://arxiv.org/abs/1702.03275)

  • batch_normalization_renorm_clipping (bool) – renorm 中的 clipping,具体请参考 TF 中的 BatchNormalization

  • batch_normalization_renorm_momentum (float) – renorm 中的 momentum,具体请参考 TF 中的 BatchNormalization

  • _BatchNormalization (..) – https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization

class SNR(*args, **kwargs)
SNR(Sub-Network Routing) 是为了解决多任务学习(MTL)中任务之间相关性不大导致出现训练效果不好(Negative Transfer)而提出的

一种灵活共享参数的方法。论文可参考: https://ojs.aaai.org/index.php/AAAI/article/view/3788

Parameters:
  • num_out_subnet (int) – 表示 Sub_Network (Expert) 输出的个数

  • out_subnet_dim (int) – 表示 Sub_Network (Expert) 输出的维度

  • snr_type (str) – 表示 Sub_Networks 之前的连接的结构,可以是 transaver,默认使用 trans

  • zeta (float) – 表示改变 Conrete 分布范围的上界

  • gamma (float) – 表示改变 Conrete 分布范围的下界

  • beta (float) – 表示 Concrete 分布的温度因子,用于决定分布的平滑程度

  • use_ste – (bool): 表示是否使用 STE(Straight-Through Estimator),默认为 False

  • mode (str) – 表示 tf.esitimator.Estimator 的模式,默认是训练模式

  • initializer (str) – 表示参数W的初始化器, 配合 trans 结构默认使用 glorot_uniform

  • regularizer (tf.regularizer) – 表示参数W的正则化

sparse nas

class NASGatingLayer(*args, **kwargs)

NAS Gate层

Parameters:
  • segment_names (list of str) – 特征名列表.

  • segment_sizes (List[int]) –

    表示不同选择对应的embedding大小 接收一维的列表:

    [emd_size_c1, emb_size_c2, …, emb_size_C1] # C1 个选择对应的embedding大小

  • ste_type (str) – STE (Straigh_through estimatlor) 的模式, 可以从 [‘softplus’, ‘clip’, ‘none’] 选择 默认为 ‘none’.

class MixedNASLayer(*args, **kwargs)

NAS Mixed 层

Parameters:
  • segment_sizes (List[List[int]]) –

    列表表示针对每一个特征的 embedding 选择 接收一个二维的列表:

    [[emd_size_f1c1, emb_size_f1c2, …, emb_size_f1C1], # 特征 1 的 C1 个选择

    [emb_size_f2c1, emb_size_f2c2, …, emb_size_f2C2], # 特征 2 的 C2 个选择 …, ]

  • segment_names (list of str) – 特征名列表

  • temperature (float, optional) – Softmax 操作的温度因子。默认为 1.0

  • embedding_share_mode (str, optional) –

    不同选择之间共享 embedding 的模式,可以选择 leftdiffrandomnone,默认为 none。在二进制 mask 的生成上和 NAS Selection layer 有细微的差别。 样例:

    • 当模式为 embedding_share_mode=left 并且 embedding_size_choice=[2, 4, 6],对应二进制 mask (定义如何选择) 是:

      [[0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 0, 0],
       [1, 1, 1, 1, 1, 1]]
      
    • 当模式为 embedding_share_mode=random 并且 embedding_size_choice=[2, 4, 6],对应二进制 mask (定义如何选择) 是:

      [[0, 0, 0, 0, 0, 0],
       [1, 1, 0, 1, 0, 0],
       [1, 1, 1, 1, 1, 1]]
      
    • 当模式为 embedding_share_mode=diff 并且 embedding_size_choice=[2, 4, 6],对应二进制 mask (定义如何选择) 是:

      [[0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 1, 1]]
      
    • 当模式为 embedding_share_mode=none 并且 embedding_size_choice=[2, 4, 6],对应二进制 mask (定义如何选择) 是:

      [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]]
      

  • weight_grad_mode (str, optional) – 表示 gate 参数求梯度的方法,可以是 discretegumbelnone,默认为 discrete

class SimpleNasLayer(*args, **kwargs)

简易版 NAS 层

Args: segment_names (list of str): 特征名列表. segment_sizes (List[int]): 表示不同选择对应的 embedding 大小

接收一维的列表:

[emd_size_f1, emb_size_f2, …, emb_size_fn] # 不同特征的 embedding 大小

threshold (float, optional): 寻找拐点的阈值,默认为 0.9 temperature (float, optional): Softmax 操作的温度因子。默认为 1.5. use_gumbel (bool):是否使用 gumbel_distribution。默认为 True。

class SimpleNasV2Layer(*args, **kwargs)

简易版 NAS 层

Args: segment_names (list of str): 特征名列表 segment_sizes (List[int]): 表示不同选择对应的 embedding 大小

接收一维的列表:

[emd_size_f1, emb_size_f2, …, emb_size_fn] # 不同特征的 embedding 大小

threshold (float, optional): 寻找拐点的阈值,默认为 0.9 temperature (float, optional): Softmax 操作的温度因子。默认为 1.5 use_gumbel (bool): 是否使用gumbel_distribution. 默认为 True

logit correction

class LogitCorrection(*args, **kwargs)

Logit 校正,由于采样等原因,会使得 CTR/CVR 的预测与后验均值有偏差,需要对这种偏差进行校正。

Logit 校正可以在训练时进行,也可以在推理时进行,为了减轻推理时负担,一般选择训练时进行,LogitCorrection 就是用于训练时校正的

Parameters:
  • activation (tf.activation) – 激活函数,默认为 None

  • sample_bias (bool) – 是否校正样本采样偏差