赞
踩
SeqGAN将序列生成问题看成序列决策过程,将目前已经生成的token看为状态(state),将下一个将要生成token看为动作(action),使用判别器来对整个序列做出评估指导生成器学习。为了解决梯度很难传递给生成器的问题,我们将生成器看为随机策略。在策略梯度中,我们使用MCT搜索来近似状态-动作对的值.
文本序列生成模型可以表示为,给定真实世界的训练数据集,训练一个生成器 G θ G_\theta Gθ,通过 G θ G_\theta Gθ来产生序列 Y 1 : T = ( y 1 , . . . , y t , . . . , y T ) , y t ∈ Y Y_{1:T}=(y_1,...,y_t,...,y_T),y_t\in \mathbb{Y} Y1:T=(y1,...,yt,...,yT),yt∈Y,这里 Y \mathbb{Y} Y表示备选单词的词典. 在时间步 t t t,状态 s s s是当前已经生成的单词序列 ( y 1 , y 2 , . . , y t − 1 ) (y_1,y_2,..,y_{t-1}) (y1,y2,..,yt−1),动作 a a a是下一个将要选择的单词 y t y_t yt,也就是动作空间就是备选单词词典.
因此策略模型 G θ ( y t ∣ Y 1 : t − 1 ) G_\theta(y_t|Y_{1:t-1}) Gθ(yt∣Y1:t−1)是随机策略,但是状态转移是确定的,也就是在当前状态 s = Y 1 : t − 1 s=Y_{1:t-1} s=Y1:t−1,选择动作 a = y t a=y_t a=yt,那么状态一定转移到 s ′ = Y 1 : t {s}'=Y_{1:t} s′=Y1:t,也就是状态转移概率 δ s , s ′ a = 1 \delta_{s,s'}^a=1 δs,s′a=1,而对于其他后继状态,状态转移概率为0.
同时,我们训练了一个判别模型
D
ϕ
D_\phi
Dϕ. 判别器实际上是一个概率估计,也就是估计一个序列
Y
1
:
T
Y_{1:T}
Y1:T来自真实世界的概率. 如下图所示。判别器的训练是通过真实样本数据(正样本)和生成器合成数据(负样本)来训练的. 同时,基于从判别模型
D
ϕ
D_\phi
Dϕ接收的预期结束奖励,通过采用策略梯度和MC搜索来更新生成模型
G
θ
G_\theta
Gθ。奖赏是这个序列可能迷惑判别器的程度
D
ϕ
D_\phi
Dϕ
文中使用RNN模型作为生成模型。RNNs将输入嵌入表示 x 1 , . . . , x T x_1,...,x_T x1,...,xT映射为序列隐层 h 1 , . . , h T h_1,..,h_T h1,..,hT,通过递归地使用更新函数(也是网络) g g g: h t = g ( h t − 1 , x t ) ( 1 ) h_t=g(h_{t-1},x_t)\quad(1) ht=g(ht−1,xt)(1),然后一层softmax神经网络层 z z z,将隐层映射到输出单词分布(token distribution,也是就是词典中每个单词概率): p ( y t ∣ x 1 , . . . , x t ) = z ( h t ) = s o f t m a x ( c + V h t ) ( 2 ) p(y_t|x_1,...,x_t)=z(h_t)=softmax(c+Vh_t)\quad(2) p(yt∣x1,...,xt)=z(ht)=softmax(c+Vht)(2)其中 c c c是偏置, V V V是权重矩阵.为了避免梯度消失和梯度爆炸,这里式(1)实际上使用LSTM神经单元. 文中说GRU和软注意力机制都可以用在生成模型中。
文中判别器选用的是CNN,生成的序列长度是固定的
T
T
T,并且CNN通过使用max-over-time池化操作(论文,博客)这样可以适用于变长序列判别。max-over-time池化操作,也就是对每个feature map选取最大值,这样只需要filter个数固定那么池化后得到的向量长度就是固定的,就自然适应于变长的序列.
我们首先将输入序列
x
1
,
.
.
.
,
x
T
x_1,...,x_T
x1,...,xT表示为:
ε
1
:
T
=
x
1
⨁
x
2
⨁
.
.
.
⨁
x
T
\varepsilon_{1:T}=x_1\bigoplus x_2\bigoplus ...\bigoplus x_T
ε1:T=x1⨁x2⨁...⨁xT这里
⨁
\bigoplus
⨁表示并置(concatenation),也就并置为一个矩阵。其中
x
t
∈
R
k
x_t\in \mathbb{R}^k
xt∈Rk,是
k
k
k维的向量,得到的矩阵是
ε
1
:
T
∈
R
T
×
k
\varepsilon_{1:T}\in \mathbb{R}^{T\times k}
ε1:T∈RT×k,如上图所示. 然后使用一个核
w
∈
R
l
×
k
w\in \mathbb{R}^{l\times k}
w∈Rl×k做一个窗口大小为
l
l
l个单词的卷积操作,产生一个feature map:
c
i
=
ρ
(
w
⨂
ε
i
:
i
+
l
−
1
+
b
)
c_i=\rho (w\bigotimes \varepsilon_{i:i+l-1}+b)
ci=ρ(w⨂εi:i+l−1+b)这里
⨂
\bigotimes
⨂表示度对应元素相乘。
b
b
b是偏置,
ρ
\rho
ρ是一个非线性函数。我们可以使用具有不同窗口大小的各种数量的内核来提取不同的特征。最终我们对feature map使用max-over-time池化操作得到
c
~
=
m
a
x
{
c
1
,
.
.
.
,
c
T
−
l
+
1
}
\tilde{c}=max\{c_1,...,c_{T-l+1}\}
c~=max{c1,...,cT−l+1}为了提升性能,文中还使用 highway architecture (论文). 最后使用sigmoid激活函数的全连接层输出输入序列为真实的概率.
根据策略梯度理论(policy gradient methods),在没有中间奖赏时(因为策略只会对完整序列进行评估),生成模型(策略)
G
θ
(
y
y
∣
Y
1
:
t
−
1
)
G_\theta(y_y|Y_{1:t-1})
Gθ(yy∣Y1:t−1)的目标是从初始状态
s
0
s_0
s0生成序列来最大化其期望最终奖赏(也就是最大化序列生成后的奖赏):
J
(
θ
)
=
E
[
R
T
∣
s
0
,
θ
]
=
∑
y
1
∈
Y
G
θ
(
y
1
∣
s
0
)
⋅
Q
D
ϕ
G
θ
(
s
0
,
y
1
)
(
3
)
J(\theta)=\mathbb{E}[R_T|s_0,\theta]=\sum_{y_1\in \mathbb{Y}}G_\theta(y_1|s_0)\cdot Q^{G_\theta}_{D_\phi}(s_0,y_1) (3)
J(θ)=E[RT∣s0,θ]=y1∈Y∑Gθ(y1∣s0)⋅QDϕGθ(s0,y1)(3)这里
R
T
R_T
RT是完整序列的奖赏,来自判别器
D
ϕ
D_\phi
Dϕ.
Q
D
ϕ
G
θ
(
s
0
,
y
1
)
Q^{G_\theta}_{D_\phi}(s_0,y_1)
QDϕGθ(s0,y1)是序列的动作-值函数,即强化学习中从状态
s
s
s开始,采取动作
a
a
a后,遵循策略
G
θ
G_\theta
Gθ的期望累计奖赏,但事实上里不是累计奖赏,而是end reward,也就是完整序列的奖赏。
在本文中我们使用了REINFORCE 算法(如上图)来估计动作值函数,使用判别器的判别结果
D
ϕ
(
Y
1
:
n
n
)
D_\phi(Y^n_{1:n})
Dϕ(Y1:nn)作为奖赏. 这样我们就有:
Q
D
ϕ
G
θ
(
a
=
y
T
,
s
=
Y
1
:
T
−
1
)
=
D
ϕ
(
Y
1
:
T
)
Q^{G_\theta}_{D_\phi}(a=y_T,s=Y_{1:T-1})=D_{\phi}(Y_{1:T})
QDϕGθ(a=yT,s=Y1:T−1)=Dϕ(Y1:T)
注意判别器只对完整序列提出奖赏. 事实上因为我们只考虑长期奖赏,在每一个时间步,我们不仅会考虑已经拟合的单词token,也会考虑未来的结果。这类似于这类似于玩Go或Chess等游戏,玩家有时会为了长期胜利(最终)的放弃眼前利益(论文),因此为了评估中间状态-动作对的值,文中应用MCT搜索,使用一个Roll-OUT策略
G
β
G_\beta
Gβ来抽样未知的剩余
T
−
t
T-t
T−t个单词(已经生的序列是
Y
1
:
t
Y_{1:t}
Y1:t,起中
y
t
y_t
yt是要评估的动作).我们将
N
N
N次的MCT搜索表示为:
Y
1
:
T
1
,
.
.
.
,
Y
1
:
T
N
=
M
C
G
β
(
Y
1
:
t
;
N
)
{Y^1_{1:T},...,Y^N_{1:T}}=MC^{G_\beta}(Y_{1:t};N)
Y1:T1,...,Y1:TN=MCGβ(Y1:t;N)其中
Y
1
:
t
n
=
(
y
1
,
.
.
.
,
y
t
)
Y^n_{1:t}=(y_1,...,y_t)
Y1:tn=(y1,...,yt),
Y
t
+
1
:
T
n
Y^n_{t+1:T}
Yt+1:Tn是从当前状态开始使用roll-out策略
G
β
G_\beta
Gβ抽样得到的.注意在本文中这个roll-out策略是和生成器一样的,如果想提升速度可以使用其他简单的策略. 我们使用roll-out策略(属于随机策略)抽样
N
N
N次得到batch(批量)输出样本,因此对N个样本的end reward做一个平均:
Q
D
ϕ
G
θ
(
s
=
Y
1
:
t
−
1
,
a
=
y
t
)
=
{
1
N
∑
n
=
1
N
D
ϕ
(
Y
1
:
T
n
)
,
Y
1
:
T
n
∈
M
C
G
θ
(
Y
1
:
T
;
N
)
f
o
r
t
<
T
D
ϕ
(
Y
1
:
t
)
f
o
r
t
=
T
Q^{G_\theta}_{D_\phi}(s=Y_{1:t-1,a=y_t})=\left\{1N∑Nn=1Dϕ(Yn1:T),Yn1:T∈MCGθ(Y1:T;N)amp;foramp;tlt;TDϕ(Y1:t)amp;foramp;t=T\right.
QDϕGθ(s=Y1:t−1,a=yt)={N1∑n=1NDϕ(Y1:Tn),Y1:Tn∈MCGθ(Y1:T;N)Dϕ(Y1:t)forfort<Tt=T这里我们可以看见没有中间奖赏.
对于判别器的训练就和GAN中一样,将真实样本(正样本),和虚假样本(负样本)拿来使用公式:
m
i
n
ϕ
−
E
Y
∼
p
d
a
t
a
[
l
o
g
D
ϕ
(
Y
)
]
−
E
Y
∼
G
θ
[
l
o
g
(
1
−
D
ϕ
(
Y
)
)
]
min_{\phi}-\mathbb{E}_{Y\sim p_{data}}[log D_{\phi}(Y)]-\mathbb{E}_{Y\sim G_\theta}[log(1-D_\phi(Y))]
minϕ−EY∼pdata[logDϕ(Y)]−EY∼Gθ[log(1−Dϕ(Y))]每次更新时先更新判别器
D
D
D,再更新生成器
G
G
G。
对生成器的更新使用的梯度是(3)式中目标函数的梯度,使用策略梯度理论进行计算表示为如下:
▽
θ
J
(
θ
)
=
∑
t
=
1
T
E
Y
1
:
t
−
1
∼
G
θ
[
∑
y
t
∈
Y
▽
θ
G
θ
(
y
t
∣
Y
1
:
t
−
1
)
⋅
Q
D
ϕ
G
θ
(
Y
1
:
t
−
1
,
y
t
)
]
(
4
)
\bigtriangledown _\theta J(\theta)=\sum^T_{t=1}\mathbb{E}_{Y_{1:t-1}\sim G_\theta}[\sum_{y_t\in\mathbb{Y}}\bigtriangledown_\theta G_\theta(y_t|Y_{1:t-1})\cdot Q^{G_\theta}_{D_\phi}(Y_{1:t-1},y_t)] (4)
▽θJ(θ)=t=1∑TEY1:t−1∼Gθ[yt∈Y∑▽θGθ(yt∣Y1:t−1)⋅QDϕGθ(Y1:t−1,yt)](4)这个式子写成这样的原因是因为状态转移确定的。策略梯度原始公式是:
文中进一步对(4)式进行无偏估计:
▽
θ
J
(
θ
)
≃
∑
t
=
1
T
∑
y
t
∈
Y
▽
θ
G
θ
(
y
t
∣
Y
1
:
t
−
1
)
⋅
Q
D
ϕ
G
θ
(
Y
1
:
t
−
1
,
y
t
)
\bigtriangledown_\theta J(\theta)\simeq\sum^T_{t=1}\sum_{y_t\in\mathbb{Y}}\bigtriangledown_\theta G_\theta(y_t|Y_{1:t-1})\cdot Q^{G_\theta}_{D_\phi}(Y_{1:t-1},y_t)
▽θJ(θ)≃t=1∑Tyt∈Y∑▽θGθ(yt∣Y1:t−1)⋅QDϕGθ(Y1:t−1,yt)
=
∑
t
=
1
T
∑
y
t
∈
Y
G
θ
(
y
t
∣
Y
1
:
t
−
1
)
▽
θ
l
o
g
G
θ
(
y
t
∣
Y
1
:
t
−
1
)
⋅
Q
D
ϕ
G
θ
(
Y
1
:
t
−
1
,
y
t
)
=\sum^T_{t=1}\sum_{y_t\in\mathbb{Y}}G_\theta(y_t|Y_{1:t-1})\bigtriangledown_\theta logG_\theta(y_t|Y_{1:t-1})\cdot Q^{G_\theta}_{D_\phi}(Y_{1:t-1},y_t)
=t=1∑Tyt∈Y∑Gθ(yt∣Y1:t−1)▽θlogGθ(yt∣Y1:t−1)⋅QDϕGθ(Y1:t−1,yt)
=
∑
t
=
1
T
E
y
t
∼
G
θ
(
y
t
∣
Y
1
:
t
−
1
)
[
▽
θ
l
o
g
G
θ
(
y
t
∣
Y
1
:
t
−
1
)
⋅
Q
D
ϕ
G
θ
(
Y
1
:
t
−
1
,
y
t
)
]
=\sum^T_{t=1}\mathbb{E}_{y_t\sim G_\theta(y_t|Y_{1:t-1})}[\bigtriangledown_\theta logG_\theta(y_t|Y_{1:t-1})\cdot Q^{G_\theta}_{D_\phi}(Y_{1:t-1},y_t)]
=t=1∑TEyt∼Gθ(yt∣Y1:t−1)[▽θlogGθ(yt∣Y1:t−1)⋅QDϕGθ(Y1:t−1,yt)]这里由于期望是可以通过多次采样来逼近的,所以最终我们就可以使用上面这个梯度来更新生成器
G
G
G:
θ
←
θ
+
α
h
▽
θ
J
(
θ
)
\theta\leftarrow\theta+\alpha_h\bigtriangledown_\theta J(\theta)
θ←θ+αh▽θJ(θ)
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。