多场景:双列Tab(Double-Columned Discovery Tab)、精选Tab(the Featured-Video Tab)、沉浸单列Tab(the Single-Columned Slide Tab)
多目标:点赞(Like)、关注(Follow)、转发(Forward)、收藏(Collect)、不喜欢(Hate)、 点击(Click)、有效观看(EffView)
user及item在不同场景有交叉重叠,场景之间存在共性;任务之间也存在相互关系,单独为每个场景训练单独的模型既耗费人力也无法利用全量的数据,忽略了场景之间的共性,因此需要多场景多任务建模。
双跷跷板效应
引入 domain-specific EPNet(Embedding Personalized Network),增加场景相关的先验信息去个性化选择底层的embedding,底层embedding按场景个性化
引入 task-specific PPNet(Parameter Personalized Network),将user和item的个性化先验信息加入进来,通过gate去动态个性化改变DNN隐层单元,平衡不同任务之间的稀疏性
点评:通过输入的个性化先验信息通过gate机制动态缩放底层的Embedding参数以及上层的DNN隐层参数
EPNet和PPNet的基本单元都是Gate NU(Gate Neural Unit),详解下Gate NU,这个结构受语音识别领域的LHUC结构启发而来的,目的是将个性化的先验信息注入到网站中。LHUC是通过speaker的先验信息来缩放模型的隐层单元达到语音识别的个性化。但是LHUC仅仅是用userID来作为个性化的先验信息,并没有用到用户的年龄、性别等其他画像信息,而这些信息在推荐系统非常重要,包括itemID,item的类别、作者等等先验信息,当然也包括场景ID等先验。Gate NU就是将这些信息都当做先验信息输入来个性化调节DNN网络隐层,达到场景、任务的个性化。
Gate NU是由两层网络结构实现,第一层目的是交叉输入的先验信息 x \mathbf x x,通过非线性函数relu进行激活,第二层通过sigmoid函数产生gate缩放分数,用 γ \gamma γ来调节缩放的程度
x ′ = R e l u ( x W + b ) \mathbf x^{'} = Relu(\mathbf x \mathbf W + \mathbf b) x′=Relu(xW+b)
δ = γ ∗ S i g m o i d ( x ′ W + b ′ ) \mathbf \delta = \gamma * Sigmoid(\mathbf x^{'} \mathbf W + \mathbf b^{'}) δ=γ∗Sigmoid(x′W+b′)
面临问题:所有特征的Embedding拼接到一起作为共享底层(share-bottom)输入,但是这种方式面对多场景时没有考虑场景之间的差异性,怎样从输入层面考虑场景的差异?
解法:将场景先验信息注入到底层Embedding中,实现场景个性化
sparse特征和dense特征合拼接起来,经过Embedding层,作为主体网络的输入
E = E ( F S ) ⊕ E ( F D ) \mathbf E = E(F_S) \oplus E(F_D) E=E(FS)⊕E(FD)
场景特征像场景ID、场景的统计特征(用户曝光量和点击量)等表示为 F d F_d Fd
经过GateNU后,GateNU的输出为
δ d o m a i n = G a t e N U ( E ( F d ) ⊕ ( ⊘ ( E ) ) ) \mathbf \delta_{domain} = GateNU( E(F_d) \oplus (\oslash (\mathbf E)) ) δdomain=GateNU(E(Fd)⊕(⊘(E)))
这里 ⊘ \oslash ⊘表示GateNU不对原来的Embedding层做梯度回传,也就是说虽然GateNU会缩放改变Embedding,但是不对Embedding进行梯度回传,避免和主体网络的梯度回传冲突混乱。GateNU这种参数缩放的方式,其实是一种注入的方式,还是尽量减少对原始Embedding的影响。
EPNet的输出如下,这样就实现了对Embedding输入的场景个性化
δ d o m a i n ⊗ E \mathbf \delta_{domain} \otimes \mathbf E δdomain⊗E
面临问题:各个任务都是用DNN塔来学习的,这样所有用户都是共享这个任务塔,这样缺少个性化,很难去平衡各个任务之间的学习。
核心目的:将user、item、author等先验信息注入上层的DNN塔中,实现任务的个性化
user、item、author的相关特征表示为 F u F_u Fu/ F i F_i Fi/ F a F_a Fa,这部分先验输入拼接起来再和底层经过场景先验注入的Embedding拼接在一起作为PPNet的网络输入
经过GateNU后,GateNU的输出为
δ t a s k = G a t e N U ( ( E ( F u ) ⊕ E ( F i ) ⊕ E ( F a ) ) ⊕ ( ⊘ ( δ d o m a i n ) ) ) \mathbf \delta_{task} = GateNU( (E(F_u) \oplus E(F_i) \oplus E(F_a) ) \oplus ( \oslash (\mathbf \delta_{domain}) ) ) δtask=GateNU((E(Fu)⊕E(Fi)⊕E(Fa))⊕(⊘(δdomain)))
这里GateNu也是不对DNN网络进行回传梯度,减少对主网络的影响
这里 H \mathbf H H表示DNN的隐层 H = [ H 1 , H 2 , . . . , H T ] \mathbf H=[H_1,H_2,...,H_T] H=[H1,H2,...,HT],其中 H t ∈ R h H_t \in R^h Ht∈Rh表示任务 t t t任务塔的隐层单元数量, δ t a s k ∈ R h ∗ T \mathbf \delta_{task} \in R^{h*T} δtask∈Rh∗T需要split拆分成 T T T个 h h h维度的向量,这样好乘到任务的隐层单元上面,达到改变任务塔隐层的目的。
PPNet的输出如下,这样就实现了对DNN塔参数的任务个性化
δ t a s k ⊗ H \mathbf \delta_{task} \otimes \mathbf H δtask⊗H
对DNN每一层进行这样的处理,假设有 L L L层
O l = δ t a s k l ⊗ H l \mathbf O^l = \mathbf \delta_{task}^l \otimes \mathbf H^l Ol=δtaskl⊗Hl
H l + 1 = f ( O l W + b l ) l ∈ { 1 , 2 , . . . , L } \mathbf H^{l+1} = f( \mathbf O^l \mathbf W + \mathbf b^l ) \ \ \ l \in \{1,2,...,L\} Hl+1=f(OlW+bl) l∈{1,2,...,L}
10天的数据训练,第11天验证,第12天测试
训练策略:由于Embedding层的参数更新频率比DNN层参数更新频率要大很多,特别是ID类特征的Embedding参数,因此使用不同的更新策略,Embedding层AdaGrad,学习率 0.05,DNN层Adam,学习率设置相对小:5.0e-06。
without EPNet、without PPNet、without both EPNet and PPNet
Embedding维度,维度在16维的时候已经能取得较好的效果
GateNU的缩放系数,2最好,因为输出是(0,2),中心是1,这样缩放比较平衡
把GateNU对input的后向梯度传播加/不加进来,说明不对主网络进行更新效果更好