layers

add_bias

class AddBias(*args, **kwargs)[source]

AddBias 执行 \(y = x + b\),与直接用`+`相比,AddBias处理了更多的shape问题

例如image有两种表示方式NWHC,NCWH,对于时间序列也有类似的问题。AddBias可以让用户透明增加Bias

>>> add_bias = AddBias(initializer=tf.initializers.Zeros())
>>> y = add_bias(x,data_format='channels_first')
Parameters:
  • initializer (tf.initializer) – bias的初始化器

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

dense

class Dense(*args, **kwargs)[source]

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)\) 的取值在 [-kernel_norm,kernel_norm]之间,可以有效地防止梯度爆炸。\(norm_{kernel}\) 一般由W的初值决定,有 \(norm_{kernel} = morm(W_{init})\)。 也可让 \(norm_{kernel}\) 成为trainable,让算法自已调节。

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

  • activation (tf.activationstr) – 激活函数,可以用str表示,也可以用TF中的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) – 优化器,请参考TF

>>> dense = Dense(units=100,
>>>               activation=tf.keras.activations.sigmoid,
>>>               kernel_initializer=tf.keras.initializers.GlorotNormal())
>>> y = dense(x)

mlp

class MLP(*args, **kwargs)[source]

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

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

  • activations (List[tf.activation]List[str]tf.activationstr) – 激活函数,可以用str表示,也可以用TF中的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,具体请参考TF中的 BatchNormalization

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

feature_cross

class GroupInt(*args, **kwargs)[source]

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的方式有两种,dot和multiply

  • use_attention (bool) – 是否使用attention,当interaction_type为’multiply’时才可用

  • 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)[source]

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)[source]

Compression and Dot Interaction,CDot。可以看成是Allint的升级版,也是一种自动做特征交叉的方法。论文可参考 https://arxiv.org/pdf/1803.05170.pdf

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)[source]

Co-action Network,CAN,协同作用网络 论文可参考 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)[source]

二阶特征交叉可用FM等方法显式提取,更高阶的交叉用MLP隐式提取。Deep & Cross Network (DCN)可替代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)[source]

Compressed Interaction Network,CIN,压缩相互作用网络。它是高阶(二阶以上)特征提取方法,形式上是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_seq

class DIN(*args, **kwargs)[source]

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)[source]

DIN的升级版,Deep Interest Evolution Network,阿里原创,基于兴趣演进的序列特征聚合,论文可参考 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)[source]

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

与DIN一样,还DMR还是用attention的方式来聚合序列特征。不同的是MR考虑了序列顺序,即增加了位置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正则化

feature_trans

class AutoInt(*args, **kwargs)[source]

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)[source]

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

logit_correction

class LogitCorrection(*args, **kwargs)[source]

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

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

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

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

norms

class LayerNorm(*args, **kwargs)[source]

与BatchNorm类似,但是是在样本内做归一化。

与BatchNorm不同的是LayerNorm在训练与推理时,使用同一套逻辑,不用分别处理

Parameters:
  • initializer (tf.initializer) – gamma的初始化器

  • regularizer (tf.regularizer) – beta/gamma的变量的正则化

class GradNorm(*args, **kwargs)[source]

GradNorm提出通过将不同任务的梯度控制在一定的范围来进行多任务学习,论文可参考 https://arxiv.org/abs/1711.02257

GradNorm是通过构造辅助loss实现,辅助的构造过程如下:
  • 选择shared bottom的最顶层变量W,然后计算每个head对它的梯度 (如果顶层有多个W,则分别计算梯度,再concat起来)

  • 对上一步得到的梯度取L2范数,得到gnorms,gnorms是一个n维向量,长度与task的个数相同

  • gnorms加权weight,得到wgnorms, wgnorms平均,得到avgnorm

  • gnorm_loss = scale * sum([(wgnorms - avgnorm) / (avgnorm + epsilon)]^loss_pow),relative_diff = True

  • gnorm_loss = scale * sum([wgnorms - avgnorm]^loss_pow),relative_diff = False

  • weighted_loss = sum(weight * losses)

Parameters:
  • loss_names (str) – loss名称,用于确定loss的个数,写相关日志

  • scale (float) – 缩放因子,用于缩放

  • loss_pow (float) – gnorm diff的指数因子

  • relative_diff (bool) – gnorm diff的计算方式,如果为True,会计算相对值

  • epsilon (float) – 一个非常小的常数,防止除以0

pooling

class Pooling(*args, **kwargs)[source]

Pooling基类

Parameters:

kwargs (dict) – 其它位置参数,详情请参考 TF Layer

class SumPooling(*args, **kwargs)[source]

Sum pooling,加法池化

Parameters:

kwargs (dict) – 其它位置参数,详情请参考 TF Layer

class AvgPooling(*args, **kwargs)[source]

Average pooling,平匀池化

Parameters:

kwargs (dict) – 其它位置参数,详情请参考 TF Layer

class MaxPooling(*args, **kwargs)[source]

Max pooling,最大池化

Parameters:

kwargs (dict) – 其它位置参数,详情请参考 TF Layer

agru

class AGRUCell(*args, **kwargs)[source]

带attention的GRU单元,用于DIEN中。

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

  • att_type (str) – attention方式,支持两种AGRU/AUGRU

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

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

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

dynamic_rnn_with_attention(cell, inputs, att_scores, parallel_iterations=1, swap_memory=True, init_state=None)[source]

带Attention的动态RNN,得用tf.while实现,模型大小不会增大

Parameters:
  • cell (RNNCell) – RNN单元

  • inputs (tf.Tensor) – 输入数据,shape为(batch_size,seq_len,emb_size)

  • att_scores (tf.Tensor) – attention权重,shape为(batch_size,seq_len)

  • parallel_iterations (int) – 并行迭代次数,具体请参考`control_flow_ops.while_loop`

  • swap_memory (bool) – 是否swap内存,具体请参考`control_flow_ops.while_loop`

  • init_state (tf.Tensor) – 初始化状态

create_ta(name, size, dtype)[source]

创建Tensor Array,一般用于while循环中存放中间结果。

Parameters:
  • name (str) – Array名称

  • size (int) – Array大小

  • dtype (tf.DType) – 数据类型

static_rnn_with_attention(cell, inputs, att_scores, init_state=None)[source]

带Attention的静态RNN,利用python for循环直接将时间维度静态展开,模型大小会增大

Parameters:
  • cell (RNNCell) – RNN单元

  • inputs (tf.Tensor) – 输入数据,shape为(batch_size,seq_len,emb_size)

  • att_scores (tf.Tensor) – attention权重,shape为(batch_size,seq_len)

  • init_state (tf.Tensor) – 初始化状态

advanced_activations

deserialize(identifier)[source]

反序列化激活函数

Parameters:

identifier (Any) – 标识,可以是name,获序列化的Json,None等

Returns:

激活函数

get(identifier)[source]

获取函数,可以用名字获取,也可以用序列化的Json获取

Parameters:

identifier (Any) – 标识,可以是name,获序列化的Json,None等

Returns:

激活函数

serialize(activation)[source]

序列化激活函数

Parameters:

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

Returns:

Dict/Json 获序列化的激活函数

utils

merge_tensor_list(tensor_list, merge_type='concat', num_feature=None, axis=1, keep_list=False)[source]

将Tensor列表合并

Parameters:
  • tensor_list (List[tf.Tensor]) – 输入的Tensor列表

  • merge_type (str) – 合并类型,支持stack/concat两种,如果设为None,则不做任何处理

  • num_feature (int) – 特征个数

  • axis (int) – merge延哪个轴进行

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

multi_task

class MMoE(*args, **kwargs)[source]

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-

Attributes:

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所使用的计算方式,可以在 (softmax,topk,noise_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

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

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

num_out_subnet

表示Sub_Network (Expert) 输出的个数

Type:

int

out_subnet_dim

表示Sub_Network (Expert) 输出的维度

Type:

int

snr_type

表示Sub_Networks之前的连接的结构,可以在 (‘trans’,’aver’),默认使用 ‘trans’

Type:

str

zeta

表示改变Conrete分布范围的上界

Type:

float

gamma

表示改变Conrete分布范围的下界

Type:

float

beta

表示Concrete分布的温度因子,用于决定分布的平滑程度

Type:

float

use_ste

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

mode

表示tf.esitimator.Estimator的模式,默认是训练模式

Type:

str

initializer

表示参数W的初始化器,配合 ‘trans’ 结构默认使用glorot_uniform

Type:

str

regularizer

表示参数W的正则化

Type:

tf.regularizer

sparse_nas

class NASSelectionLayer(*args, **kwargs)[source]

NAS 层结合多个embedding

segment_sizes

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

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

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

Type:

List[List[int]]

segment_names

特征名列表

Type:

list of str

temperature

Softmax 操作的温度因子。默认为 1.0.

Type:

float, optional

embedding_share_mode

不同选择之间共享embedding的模式, 可以选择以下模式[‘left’, ‘diff’, ‘random’, ‘none’]. 默认为 ‘none’. 注意:选择模式为 none 的时候,输入和其他三种选择是有区别的。 样例:

  • 当模式为 embedding_share_mode=’left’ 并且 embedding_size_choice=[2, 4, 6], 对应二进制 mask (定义如何选择) 是: |[[1, 1, 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, 1, 0, 1], | [1, 1, 0, 1, 0, 0], | [1, 1, 1, 1, 1, 1]]

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

  • 当模式为r embedding_share_mode=’none’ 并且 embedding_size_choice=[2, 4, 6], 对应二进制 mask (定义如何选择) 是: |[[1, 1, 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]]

Type:

str, optional

weight_grad_mode

表示gate参数求梯度的方法, 可以选择以下方法 [‘discrete’, ‘gumbel’, ‘none’]. 默认为 ‘discrete’.

Type:

str, optional

class NASSelectionLayer(*args, **kwargs)[source]

NAS 层结合多个embedding

segment_sizes

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

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

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

Type:

List[List[int]]

segment_names

特征名列表

Type:

list of str

temperature

Softmax 操作的温度因子。默认为 1.0。

Type:

floatoptional

embedding_share_mode

不同选择之间共享embedding的模式, 可以选择以下模式[‘left’,’diff’,’random’,’none’]。默认为 ‘none’。 注意:选择模式为 none 的时候,输入和其他三种选择是有区别的。 样例:

  • 当模式为 embedding_share_mode=’left’ 并且 embedding_size_choice=[2,4,6], 对应二进制 mask (定义如何选择) 是: |[[1,1,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,1,0,1], | [1,1,0,1,0,0], | [1,1,1,1,1,1]]

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

  • 当模式为r embedding_share_mode=’none’ 并且 embedding_size_choice=[2,4,6], 对应二进制 mask (定义如何选择) 是: |[[1,1,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]]

Type:

stroptional

weight_grad_mode

表示gate参数求梯度的方法,可以选择以下方法 [‘discrete’,’gumbel’,’none’]。默认为 ‘discrete’。

Type:

stroptional

class NASGatingLayer(*args, **kwargs)[source]

NAS Gate层

segment_names

特征名列表。

Type:

list of str

segment_sizes

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

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

Type:

List[int]

ste_type

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

Type:

str

class MixedNASLayer(*args, **kwargs)[source]

NAS Mixed 层。

segment_sizes

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

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

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

Type:

List[List[int]]

segment_names

特征名列表

Type:

list of str

temperature

Softmax 操作的温度因子。默认为 1.0。

Type:

floatoptional

embedding_share_mode

不同选择之间共享embedding的模式,可以选择以下模式 [‘left’,’diff’,’random’,’none’]。默认为 ‘none’。 在二进制 mask 的生成上和NAS Selection layer有细微的差别。 如果传入的每个特征的 Embedding_size 列表第一个选择不是0,会自动插入零的选择。起到特征重要性的选择。 样例:

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

    [1,1,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],

    [0,1,0,0,1,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],

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

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

    [1,1,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]]

Type:

stroptional

weight_grad_mode

表示gate参数求梯度的方法,可以选择以下方法 [‘discrete’,’gumbel’,’none’]。默认为 ‘discrete’。

Type:

stroptional

class SimpleNasLayer(*args, **kwargs)[source]

简易版 NAS 层

segment_names

特征名列表。

Type:

list of str

segment_sizes

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

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

Type:

List[int]

threshold

寻找拐点的阈值,默认为 0.9

Type:

float,optional

temperature

Softmax 操作的温度因子。默认为 1.5。

Type:

float,optional

use_gumbel

是否使用gumbel_distribution。默认为 True。

Type:

bool