- 序列数据建模
- 输入序列–>输出序列
- 预测序列的下一项(监督)
- 模糊了监督和非监督
- 有的cnn对序列不适用:
- cnn假设:离得远的关系远,有关系的都在附近
- 序列:可能长距离也有相关的(一段文字的代词)
RNN结构
- RNN
- 结构:
- 层间全连接
- 层内全连接?
- 自连接
- 功能强大
- 计算力够且单元数够的情况下
- 每个时间点的输入输出不同–
- 参数共享:一个序列的从前到后逐个输入到网络中(矩阵)(每个时间点不同的字进的都是同一个神经元–参数一样的)
- 矩阵:行(时间,一行一个字的表达),列(神经元数目)
- 特点(展开后的(可认为是:
- 权值约束(共享
- 多层
- 前向网络
- 损失函数:
- 平方损失
- 交叉熵
- 训练:采用权值一致的BP算法(更新也一致
- BP容易实现权值的线性约束
- 约 束 w 1 = w 2 , 令 Δ w 1 = Δ w 2 = ∂ E ∂ w 1 + ∂ E ∂ w 2 约束w^1=w^2,令\Delta w^1=\Delta w^2=\frac{\partial E}{\partial w^1}+\frac{\partial E}{\partial w^2} 约束w1=w2,令Δw1=Δw2=∂w1∂E+∂w2∂E
- BPTT(时间域上的BP
- 前向
- 输入层:(常用tanh a t = g 1 ( W a a a t − 1 + W a x x t + b a ) = g 1 ( W a [ a t − 1 , x t ] + b a ) , z a t = W a a a t − 1 + W a x x t + b a a^t=g_1(W_{aa}a^{t-1}+W_{ax}x^t+b_a)=g_1(W_a[a^{t-1},x^t]+b_a),z_a^t=W_{aa}a^{t-1}+W_{ax}x^t+b_a at=g1(Waaat−1+Waxxt+ba)=g1(Wa[at−1,xt]+ba),zat=Waaat−1+Waxxt+ba
- 输出层:(softmax y ^ t = g 2 ( W y a a t + b y ) , z y t = W y a a t + b y \hat{y}^t=g_2(W_{ya}a^{t}+b_y),z_y^t=W_{ya}a^{t}+b_y y^t=g2(Wyaat+by),zyt=Wyaat+by
- 计算每一个时间的链式导数
∂
E
∂
w
i
\frac{\partial E}{\partial w^i}
∂wi∂E
- Δ W = − η ∂ L ∂ W , η 学 习 率 \Delta W=-\eta \frac{\partial L}{\partial W}, \eta学习率 ΔW=−η∂W∂L,η学习率
- δ t = ∂ L ∂ z t \delta^t=\frac{\partial L}{\partial z^t} δt=∂zt∂L
- ∂ L t ∂ W y a = ∂ L t ∂ y ^ t ∂ y ^ t ∂ z y t ∂ z y t ∂ W y a = ∂ L t ∂ y ^ t g 2 ′ ( z y t ) a t = δ y t a t \frac{\partial L^t}{\partial W_ya}=\frac{\partial L^t}{\partial \hat{y}^t}\frac{\partial \hat{y}^t}{\partial z_y^t}\frac{\partial z_y^t}{\partial W_ya}=\frac{\partial L^t}{\partial \hat{y}^t}g_2'(z_y^t)a^t=\delta_y^ta^t ∂Wya∂Lt=∂y^t∂Lt∂zyt∂y^t∂Wya∂zyt=∂y^t∂Ltg2′(zyt)at=δytat
-
δ
a
t
=
g
1
′
(
z
a
t
)
(
W
y
a
T
δ
y
t
+
W
a
a
′
T
δ
a
′
t
+
1
)
\delta_a^t=g_1'(z_a^t)(W_{ya}^T\delta_y^t+W_{aa'}^T\delta_{a'}^{t+1})
δat=g1′(zat)(WyaTδyt+Waa′Tδa′t+1)
- 前一项: W y a T δ y t : 当 前 层 的 y 传 来 的 W_{ya}^T\delta_y^t:当前层的y传来的 WyaTδyt:当前层的y传来的
- 后一项: W a a ′ T δ a ′ t + 1 : 其 他 隐 层 ( 上 一 时 刻 的 ) 传 递 而 来 的 W_{aa'}^T\delta_{a'}^{t+1}:其他隐层(上一时刻的)传递而来的 Waa′Tδa′t+1:其他隐层(上一时刻的)传递而来的
- 将所有时间的导数加在一起
约
束
w
1
=
w
2
,
令
Δ
w
1
=
Δ
w
2
=
∂
E
∂
w
1
+
∂
E
∂
w
2
约束w^1=w^2,令\Delta w^1=\Delta w^2=\frac{\partial E}{\partial w^1}+\frac{\partial E}{\partial w^2}
约束w1=w2,令Δw1=Δw2=∂w1∂E+∂w2∂E
- ∂ L t ∂ W y a = Σ t = 1 T y δ y t a t \frac{\partial L^t}{\partial W_ya}=\Sigma_{t=1}^{T_y}\delta_y^ta^t ∂Wya∂Lt=Σt=1Tyδytat
- ∂ L t ∂ W a a = Σ t = 1 T x δ a t a t \frac{\partial L^t}{\partial W_aa}=\Sigma_{t=1}^{T_x}\delta_a^ta^t ∂Waa∂Lt=Σt=1Txδatat
- ∂ L t ∂ W y a = Σ t = 1 T x δ a t x t \frac{\partial L^t}{\partial W_ya}=\Sigma_{t=1}^{T_x}\delta_a^tx^t ∂Wya∂Lt=Σt=1Txδatxt
- 这里的x、y、W都是向量、矩阵,可以视作一个向量中一个元素一个神经元
- 前向
- 交叉熵loss:
- L t ( y ^ t , y t ) = − y t l o g ( y ^ t ) − ( 1 − y t ) l o g ( 1 − y ^ t ) L^t(\hat{y}^t,y^t)=-y^tlog(\hat{y}^t)-(1-y^t)log(1-\hat{y}^t) Lt(y^t,yt)=−ytlog(y^t)−(1−yt)log(1−y^t)
- 用 这 个 损 失 函 数 : L ( y ^ , y ) = Σ t = 1 T y L t ( y ^ t , y t ) 用这个损失函数:L(\hat{y},y)=\Sigma_{t=1}^{T_y}L^t(\hat{y}^t,y^t) 用这个损失函数:L(y^,y)=Σt=1TyLt(y^t,yt)
- BP容易实现权值的线性约束
- 结构
- 多对多1
- 多对多2(encoder+decoder)
- 机器翻译
- 多对1
- 情感分析
- 1对多
- 一对一
- 结构:
- 语言模型(多对多1)
- 计算P(sentence),大的好=
P
(
y
1
,
y
2
,
.
.
.
,
y
n
)
=
P
(
c
a
t
s
在
开
头
)
P
(
a
v
e
r
a
g
e
∣
c
a
t
s
)
P
(
15
∣
a
v
e
r
a
g
e
,
c
a
t
s
)
P(y^1,y^2,...,y^n)=P(cats在开头)P(average|cats) P(15|average,cats)
P(y1,y2,...,yn)=P(cats在开头)P(average∣cats)P(15∣average,cats)
- RNN的每个时刻的输出y^1==第一个单词在开头的概率 P ( c a t s 在 开 头 ) P(cats在开头) P(cats在开头)
- 第二个词的输出:给定第一个词,第二个词出现的概率 P ( a v e r a g e ∣ c a t s ) P(average|cats) P(average∣cats)
- 第三个的输出:给定前两个词,第三个词出现的概率 P ( 15 ∣ a v e r a g e , c a t s ) P(15|average,cats) P(15∣average,cats)
- 标记
- 句子结尾:/< E O S/>
- 不名词:/< U N K />
- 采样可以知道学到了什么)
- 也可以在字符级别建立语言模型–
- 不会有UNK,但序列很长很长(会梯度下降,计算要求大)
- 会用在专业词陌生词多的i情况下
- 不同语料可以训练出不同的文风
- 计算P(sentence),大的好=
P
(
y
1
,
y
2
,
.
.
.
,
y
n
)
=
P
(
c
a
t
s
在
开
头
)
P
(
a
v
e
r
a
g
e
∣
c
a
t
s
)
P
(
15
∣
a
v
e
r
a
g
e
,
c
a
t
s
)
P(y^1,y^2,...,y^n)=P(cats在开头)P(average|cats) P(15|average,cats)
P(y1,y2,...,yn)=P(cats在开头)P(average∣cats)P(15∣average,cats)
BPTT
BPTT前向传播
- 1对多模型–序列生成任务
长序列循环神经网络
- BP的困难–回传是线性的
- error双倍,则回传的错误也是双倍的–>梯度爆炸或消失
- δ a t = g 1 ′ ( z a t ) ( W y a T δ y t + W a a ′ T δ a ′ t + 1 ) , 忽 略 第 一 项 , 看 第 二 项 可 以 知 道 是 线 性 的 \delta_a^t=g_1'(z_a^t)(W_{ya}^T\delta_y^t+W_{aa'}^T\delta_{a'}^{t+1}),忽略第一项,看第二项可以知道是线性的 δat=g1′(zat)(WyaTδyt+Waa′Tδa′t+1),忽略第一项,看第二项可以知道是线性的
- 梯度膨胀(容易发现:
- (梯度修剪)限制梯度(好解决点
- 梯度消失(难以发现难以处理–GRU可以解决
- error双倍,则回传的错误也是双倍的–>梯度爆炸或消失
- GRU单元
- 为了保留远时刻的信息
- 门限循环单元
- RNN的:
- 输入层:(常用tanh a t = g 1 ( W a a a t − 1 + W a x x t + b a ) = g 1 ( W a [ a t − 1 , x t ] + b a ) , z a t = W a a a t − 1 + W a x x t + b a a^t=g_1(W_{aa}a^{t-1}+W_{ax}x^t+b_a)=g_1(W_a[a^{t-1},x^t]+b_a),z_a^t=W_{aa}a^{t-1}+W_{ax}x^t+b_a at=g1(Waaat−1+Waxxt+ba)=g1(Wa[at−1,xt]+ba),zat=Waaat−1+Waxxt+ba
- 输出层:(softmax y ^ t = g 2 ( W y a a t + b y ) , z y t = W y a a t + b y \hat{y}^t=g_2(W_{ya}a^{t}+b_y),z_y^t=W_{ya}a^{t}+b_y y^t=g2(Wyaat+by),zyt=Wyaat+by
- GRU(简单版本):
- c t = a t c^t=a^t ct=at
- 输 入 : c ~ t = t a n h ( W c [ c t − 1 , x t ] + b c ) 输入:\tilde{c}^t=tanh(W_c[c^{t-1},x^t]+b_c) 输入:c~t=tanh(Wc[ct−1,xt]+bc)–和RNN的输入一样
- 激 活 门 / 更 新 门 : Γ u = σ ( W u [ c t − 1 , x t ] + b u ) 激活门/更新门:\Gamma_u=\sigma(W_u[c^{t-1},x^t]+b_u) 激活门/更新门:Γu=σ(Wu[ct−1,xt]+bu)–sigmoid–0/1
- c t = Γ u ∗ c ~ t + ( 1 − Γ u ) ∗ c t − 1 , Γ u = 1 , 更 新 并 遗 忘 过 去 c^t=\Gamma_u*\tilde{c}^t+(1-\Gamma_u)*c^{t-1},\Gamma_u=1,更新并遗忘过去 ct=Γu∗c~t+(1−Γu)∗ct−1,Γu=1,更新并遗忘过去–决定遗忘还是记住过去
- GRU(完全):
- c t = a t c^t=a^t ct=at
- 输 入 : c ~ t = t a n h ( W c [ Γ r ∗ c t − 1 , x t ] + b c ) , 输入:\tilde{c}^t=tanh(W_c[\Gamma_r*c^{t-1},x^t]+b_c), 输入:c~t=tanh(Wc[Γr∗ct−1,xt]+bc),–和RNN的输入一样
- 输 入 门 : Γ r = σ ( W r [ c t − 1 , x t ] + b r ) 输入门:\Gamma_r=\sigma(W_r[c^{t-1},x^t]+b_r) 输入门:Γr=σ(Wr[ct−1,xt]+br)–sigmoid–0/1,备选状态和前一时刻状态是否相关
- 激 活 门 / 更 新 门 : Γ u = σ ( W u [ c t − 1 , x t ] + b u ) 激活门/更新门:\Gamma_u=\sigma(W_u[c^{t-1},x^t]+b_u) 激活门/更新门:Γu=σ(Wu[ct−1,xt]+bu)–sigmoid–0/1
- c t = Γ u ∗ c ~ t + ( 1 − Γ u ) ∗ c t − 1 , Γ u = 1 , 更 新 并 遗 忘 过 去 c^t=\Gamma_u*\tilde{c}^t+(1-\Gamma_u)*c^{t-1},\Gamma_u=1,更新并遗忘过去 ct=Γu∗c~t+(1−Γu)∗ct−1,Γu=1,更新并遗忘过去–决定遗忘还是记住过去
- 有两个门,比LSTM更快、可以扩大模型的规模
- LSTM长短时记忆
- 利用逻辑和线性运算来求乘法?
- BPTT训练
- 前向
- 写门(输入门)
- a L t = W L T x t + W L T b t − 1 + W L T s t − 1 , b 是 输 出 , x 是 输 入 , s 是 状 态 ( 隐 层 ) a^t_L=W_{L}^Tx^t+W_{L}^Tb^{t-1}+W_{L}^Ts^{t-1},b是输出,x是输入,s是状态(隐层) aLt=WLTxt+WLTbt−1+WLTst−1,b是输出,x是输入,s是状态(隐层)
- b L t = f ( a L t ) b^t_L=f(a^t_L) bLt=f(aLt)
- 遗忘门
- a ϕ t = W ϕ T x t + W ϕ T b t − 1 + W ϕ T s t − 1 , b 是 输 出 , x 是 输 入 , s 是 状 态 ( 隐 层 ) a^t_\phi=W_{\phi}^Tx^t+W_{\phi}^Tb^{t-1}+W_{\phi}^Ts^{t-1},b是输出,x是输入,s是状态(隐层) aϕt=WϕTxt+WϕTbt−1+WϕTst−1,b是输出,x是输入,s是状态(隐层)
- b ϕ t = f ( a ϕ t ) b^t_\phi=f(a^t_\phi) bϕt=f(aϕt)
- cell
- a C t = W C T x t + W C T b t − 1 , b 是 输 出 , x 是 输 入 , s 是 状 态 ( 隐 层 ) a^t_C=W_{C}^Tx^t+W_{C}^Tb^{t-1},b是输出,x是输入,s是状态(隐层) aCt=WCTxt+WCTbt−1,b是输出,x是输入,s是状态(隐层)
- s C t = b ϕ t s C t − 1 + b L t g ( a C t ) s_C^t=b^t_\phi s_C^{t-1}+b_L^tg(a_C^t) sCt=bϕtsCt−1+bLtg(aCt)
- 读门(输出门)
- a ω t = W ω T x t + W ω T b t − 1 + W ω T s t − 1 , b 是 输 出 , x 是 输 入 , s 是 状 态 ( 隐 层 ) a^t_\omega=W_{\omega}^Tx^t+W_{\omega}^Tb^{t-1}+W_{\omega}^Ts^{t-1},b是输出,x是输入,s是状态(隐层) aωt=WωTxt+WωTbt−1+WωTst−1,b是输出,x是输入,s是状态(隐层)
- b ω t = f ( a ω t ) b^t_\omega=f(a^t_\omega) bωt=f(aωt)
- 写门(输入门)
- 前向
- 和GRU比:更强大和灵活,有三个门
- 双向RNN
- 上下文都用上
- 深层RNN
LSTM
序列到序列的模型
(many to many
GRU或者LSTM/RNN都可以
采样可能得到多个句子,选择可能性最大的那个
单词表很大,词很多,每一个句子的获得都要搜索很多单词,都产生也不划算
以BFS/DFS搜索效果都不大好—》集束搜索
贪婪搜索会受到常用词影响而不一定是最好的
集束搜索——近似搜索
- 利用 P ( y 1 ∣ x ) P(y^1|x) P(y1∣x)找到最可能的三个单词(集束宽度B=3)
- 对这三个单词再看第二个单词有没有合适的
- 对每个单词分别计算 P ( y 1 , y 2 ∣ x ) = P ( y 1 ∣ x ) P ( y 2 ∣ y 1 , x ) , P ( y 2 ∣ y 1 , x ) 是 神 经 网 络 计 算 出 来 的 P(y^1,y^2|x)=P(y^1|x)P(y^2|y^1,x),P(y^2|y^1,x)是神经网络计算出来的 P(y1,y2∣x)=P(y1∣x)P(y2∣y1,x),P(y2∣y1,x)是神经网络计算出来的,单词表,10000,这里有30000个组合,再从这里挑出三个最大的组合
- 重复2
* 集束搜索宽度B=1:退化到贪婪搜索
- B = ∞ B=\infty B=∞:穷举、宽度优先搜索BFS
- 实际应用中:B=10或者50
改进的集束搜索
- 长度归一化
- 以前的:
P
(
y
1
,
y
2
,
.
.
.
,
y
T
y
∣
x
)
=
P
(
y
1
∣
x
)
P
(
y
2
∣
y
1
,
x
)
.
.
.
P
(
y
T
y
∣
y
1
,
y
2
,
.
.
.
,
y
T
x
−
1
,
x
)
=
Π
t
=
1
T
y
P
(
y
t
∣
y
1
,
y
2
,
.
.
.
,
y
t
−
1
,
x
)
P(y^1,y^2,...,y^{T_y}|x)=P(y^1|x)P(y^2|y^1,x)...P(y^{T_y}|y^1,y^2,...,y^{T_x-1},x)=\Pi_{t=1}^{T_y} P(y^{t}|y^1,y^2,...,y^{t-1},x)
P(y1,y2,...,yTy∣x)=P(y1∣x)P(y2∣y1,x)...P(yTy∣y1,y2,...,yTx−1,x)=Πt=1TyP(yt∣y1,y2,...,yt−1,x)
- a r g m a x y Π t = 1 T y P ( y t ∣ y 1 , y 2 , . . . , y t − 1 , x ) = a r g m a x y P ( y 1 , y 2 , . . . , y T y ∣ x ) argmax_y \Pi_{t=1}^{T_y} P(y^{t}|y^1,y^2,...,y^{t-1},x) =argmax_y P(y^1,y^2,...,y^{T_y}|x) argmaxyΠt=1TyP(yt∣y1,y2,...,yt−1,x)=argmaxyP(y1,y2,...,yTy∣x)
- 乘积导致越来越小
- 解决:log
-
a
r
g
m
a
x
y
Σ
t
=
1
T
y
l
o
g
P
(
y
t
∣
y
1
,
y
2
,
.
.
.
,
y
t
−
1
,
x
)
argmax_y \Sigma_{t=1}^{T_y} log P(y^{t}|y^1,y^2,...,y^{t-1},x)
argmaxyΣt=1TylogP(yt∣y1,y2,...,yt−1,x)
- 是负数,所以以乘积或者求和得到的结果,序列越长则数值越小—趋向于选择短序列
- 所以要归一化: a r g m a x y 1 T y α Σ t = 1 T y P ( y t ∣ y 1 , y 2 , . . . , y t − 1 , x ) argmax_y \frac{1}{T_y^\alpha}\Sigma_{t=1}^{T_y} P(y^{t}|y^1,y^2,...,y^{t-1},x) argmaxyTyα1Σt=1TyP(yt∣y1,y2,...,yt−1,x)
-
a
r
g
m
a
x
y
Σ
t
=
1
T
y
l
o
g
P
(
y
t
∣
y
1
,
y
2
,
.
.
.
,
y
t
−
1
,
x
)
argmax_y \Sigma_{t=1}^{T_y} log P(y^{t}|y^1,y^2,...,y^{t-1},x)
argmaxyΣt=1TylogP(yt∣y1,y2,...,yt−1,x)
- 以前的:
P
(
y
1
,
y
2
,
.
.
.
,
y
T
y
∣
x
)
=
P
(
y
1
∣
x
)
P
(
y
2
∣
y
1
,
x
)
.
.
.
P
(
y
T
y
∣
y
1
,
y
2
,
.
.
.
,
y
T
x
−
1
,
x
)
=
Π
t
=
1
T
y
P
(
y
t
∣
y
1
,
y
2
,
.
.
.
,
y
t
−
1
,
x
)
P(y^1,y^2,...,y^{T_y}|x)=P(y^1|x)P(y^2|y^1,x)...P(y^{T_y}|y^1,y^2,...,y^{T_x-1},x)=\Pi_{t=1}^{T_y} P(y^{t}|y^1,y^2,...,y^{t-1},x)
P(y1,y2,...,yTy∣x)=P(y1∣x)P(y2∣y1,x)...P(yTy∣y1,y2,...,yTx−1,x)=Πt=1TyP(yt∣y1,y2,...,yt−1,x)
- 目标函数:归一化的对数似然函数
- a r g m a x y 1 T y α Σ t = 1 T y P ( y t ∣ y 1 , y 2 , . . . , y t − 1 , x ) argmax_y \frac{1}{T_y^\alpha}\Sigma_{t=1}^{T_y} P(y^{t}|y^1,y^2,...,y^{t-1},x) argmaxyTyα1Σt=1TyP(yt∣y1,y2,...,yt−1,x)
集束搜索的误差分析
- y ∗ − − 人 的 选 择 ( 最 优 , y ^ − − 算 法 的 选 择 y^*--人的选择(最优,\hat{y}--算法的选择 y∗−−人的选择(最优,y^−−算法的选择
-
P
(
y
∗
∣
x
)
>
P
(
(
^
y
)
∣
x
)
P(y^*|x)>P(\hat(y)|x)
P(y∗∣x)>P((^y)∣x):集束搜索错误了(因为他选的应该是概率最大的
- 解决:增加B
- P ( y ∗ ∣ x ) < = P ( ( ^ y ) ∣ x ) , y ∗ 最 优 , 但 却 预 测 的 小 , R N N 有 问 题 , P ( y ∗ ∣ x ) < P ( ( ^ y ) ∣ x ) P(y^*|x)<=P(\hat(y)|x) ,y^*最优,但却预测的小,RNN有问题,P(y^*|x)<P(\hat(y)|x) P(y∗∣x)<=P((^y)∣x),y∗最优,但却预测的小,RNN有问题,P(y∗∣x)<P((^y)∣x)
–>以上结果是多个句子结果比较之后才能判别到底是RNN还是集束搜索的问题
图到文本
一到多
x是图的特征表示
注意力模型
- 对长序列的问题(句子长或短性能都会变差)
- 长序列不好记忆
- 每次只考虑一部分,看一部分翻译一部分
- 结构
- 输入:低层仍是原来的双向RNN,但是输出层不要了(不直接产生输出),只保留隐层输出的向量(表示)
- 输出,换成了另一个RNN
- 产生系数的小神经网络也加进去
- –》一起训练(BP)
每个c是所有低层输出的线性组合(并非只有图中的三个)
- c 1 = Σ t ′ α < 1 , t ′ > a < t ′ > , Σ t ′ α < 1 , t ′ > = 1 , a 是 低 层 的 隐 藏 层 的 输 出 c^1=\Sigma_{t'}\alpha^{<1,t'>}a^{<t'>},\Sigma_{t'}\alpha^{<1,t'>}=1,a是低层的隐藏层的输出 c1=Σt′α<1,t′>a<t′>,Σt′α<1,t′>=1,a是低层的隐藏层的输出
- α < t , t ′ > = s o f t m a x ( e t , t ′ ) = e x p ( e < t , t ′ > ) Σ t ′ = 1 T x e x p ( e < t , t ′ > \alpha^{<t,t'>}=softmax(e^{t,t'})=\frac{exp(e^{<t,t'>}) }{\Sigma_{t'=1}^{T_x}exp(e^{<t,t'>}} α<t,t′>=softmax(et,t′)=Σt′=1Txexp(e<t,t′>exp(e<t,t′>)—保证和为1
- e < t , t ′ > = g ( s t − 1 , a t ) e^{<t,t'>}=g(s^{t-1},a^t) e<t,t′>=g(st−1,at)–用一个小的神经网络产生