多场景:双列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。
A场景
B场景
C场景
without EPNet、without PPNet、without both EPNet and PPNet
PPNet在单场景多任务上的表现
EPNet在多场景单任务上的表现
PPNet在单任务单场景上的表现
Embedding维度,维度在16维的时候已经能取得较好的效果
DNN层数,4层最好,太深了可能过拟合
GateNU的缩放系数,2最好,因为输出是(0,2),中心是1,这样缩放比较平衡
把GateNU对input的后向梯度传播加/不加进来,说明不对主网络进行更新效果更好