Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
book
提交
5596f274
B
book
项目概览
PaddlePaddle
/
book
通知
16
Star
4
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
40
列表
看板
标记
里程碑
合并请求
37
Wiki
5
Wiki
分析
仓库
DevOps
项目成员
Pages
B
book
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
40
Issue
40
列表
看板
标记
里程碑
合并请求
37
合并请求
37
Pages
分析
分析
仓库分析
DevOps
Wiki
5
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
5596f274
编写于
10月 08, 2018
作者:
S
Shan Yi
提交者:
GitHub
10月 08, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #624 from PaddlePaddle/updateMathJaxSyntax
Update the MathJax syntax on machine translation
上级
fb351603
3827110e
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
30 addition
and
30 deletion
+30
-30
08.machine_translation/README.cn.md
08.machine_translation/README.cn.md
+15
-15
08.machine_translation/index.cn.html
08.machine_translation/index.cn.html
+15
-15
未找到文件。
08.machine_translation/README.cn.md
浏览文件 @
5596f274
...
...
@@ -43,7 +43,7 @@
我们已经在
[
语义角色标注
](
https://github.com/PaddlePaddle/book/blob/develop/07.label_semantic_roles/README.cn.md
)
一章中介绍了一种双向循环神经网络,这里介绍Bengio团队在论文
\[
[
2
](
#参考文献
)
,
[
4
](
#参考文献
)
\]
中提出的另一种结构。该结构的目的是输入一个序列,得到其在每个时刻的特征表示,即输出的每个时刻都用定长向量表示到该时刻的上下文语义信息。
具体来说,该双向循环神经网络分别在时间维以顺序和逆序——即前向(forward)和后向(backward)——依次处理输入序列,并将每个时间步RNN的输出拼接成为最终的输出层。这样每个时间步的输出节点,都包含了输入序列中当前时刻完整的过去和未来的上下文信息。下图展示的是一个按时间步展开的双向循环神经网络。该网络包含一个前向和一个后向RNN,其中有六个权重矩阵:输入到前向隐层和后向隐层的权重矩阵(
`$W_1, W_3$`
),隐层到隐层自己的权重矩阵(
`$W_2,W_5$`
),前向隐层和后向隐层到输出层的权重矩阵(
`$W_4, W_6$`
)。注意,该网络的前向隐层和后向隐层之间没有连接。
具体来说,该双向循环神经网络分别在时间维以顺序和逆序——即前向(forward)和后向(backward)——依次处理输入序列,并将每个时间步RNN的输出拼接成为最终的输出层。这样每个时间步的输出节点,都包含了输入序列中当前时刻完整的过去和未来的上下文信息。下图展示的是一个按时间步展开的双向循环神经网络。该网络包含一个前向和一个后向RNN,其中有六个权重矩阵:输入到前向隐层和后向隐层的权重矩阵(
$W_1, W_3$),隐层到隐层自己的权重矩阵($W_2,W_5$),前向隐层和后向隐层到输出层的权重矩阵($W_4, W_6$
)。注意,该网络的前向隐层和后向隐层之间没有连接。
<div
align=
"center"
>
...
...
@@ -65,13 +65,13 @@
编码阶段分为三步:
1.
one-hot vector表示:将源语言句子
`$x=\left \{ x_1,x_2,...,x_T \right \}$`
的每个词
`$x_i$`
表示成一个列向量
`$w_i\epsilon \left \{ 0,1 \right \}^{\left | V \right |},i=1,2,...,T$`
。这个向量
`$w_i$`
的维度与词汇表大小
`$\left | V \right |$`
相同,并且只有一个维度上有值1(该位置对应该词在词汇表中的位置),其余全是0。
1.
one-hot vector表示:将源语言句子
$x=
\l
eft
\{
x_1,x_2,...,x_T
\r
ight
\}
$的每个词$x_i$表示成一个列向量$w_i
\e
psilon
\l
eft
\{
0,1
\r
ight
\}
^{
\l
eft | V
\r
ight |},i=1,2,...,T$。这个向量$w_i$的维度与词汇表大小$
\l
eft | V
\r
ight |$
相同,并且只有一个维度上有值1(该位置对应该词在词汇表中的位置),其余全是0。
2.
映射到低维语义空间的词向量:one-hot vector表示存在两个问题,1)生成的向量维度往往很大,容易造成维数灾难;2)难以刻画词与词之间的关系(如语义相似性,也就是无法很好地表达语义)。因此,需再one-hot vector映射到低维的语义空间,由一个固定维度的稠密向量(称为词向量)表示。记映射矩阵为
`$C\epsilon R^{K\times \left | V \right |}$`
,用
`$s_i=Cw_i$`
表示第
`$i$`
个词的词向量,
`$K$`
为向量维度。
2.
映射到低维语义空间的词向量:one-hot vector表示存在两个问题,1)生成的向量维度往往很大,容易造成维数灾难;2)难以刻画词与词之间的关系(如语义相似性,也就是无法很好地表达语义)。因此,需再one-hot vector映射到低维的语义空间,由一个固定维度的稠密向量(称为词向量)表示。记映射矩阵为
$C
\e
psilon R^{K
\t
imes
\l
eft | V
\r
ight |}$,用$s_i=Cw_i$表示第$i$个词的词向量,$K$
为向量维度。
3.
用RNN编码源语言词序列:这一过程的计算公式为
`$h_i=\varnothing _\theta \left ( h_{i-1}, s_i \right )$`
,其中
`$h_0$`
是一个全零的向量,
`$\varnothing _\theta$`
是一个非线性激活函数,最后得到的
`$\mathbf{h}=\left \{ h_1,..., h_T \right \}$`
就是RNN依次读入源语言
`$T$`
个词的状态编码序列。整句话的向量表示可以采用
`$\mathbf{h}$`
在最后一个时间步
`$T$`
的状态编码,或使用时间维上的池化(pooling)结果。
3.
用RNN编码源语言词序列:这一过程的计算公式为
$h_i=
\v
arnothing _
\t
heta
\l
eft ( h_{i-1}, s_i
\r
ight )$,其中$h_0$是一个全零的向量,$
\v
arnothing _
\t
heta$是一个非线性激活函数,最后得到的$
\m
athbf{h}=
\l
eft
\{
h_1,..., h_T
\r
ight
\}
$就是RNN依次读入源语言$T$个词的状态编码序列。整句话的向量表示可以采用$
\m
athbf{h}$在最后一个时间步$T$
的状态编码,或使用时间维上的池化(pooling)结果。
第3步也可以使用双向循环神经网络实现更复杂的句编码表示,具体可以用双向GRU实现。前向GRU按照词序列
`$(x_1,x_2,...,x_T)$`
的顺序依次编码源语言端词,并得到一系列隐层状态
`$(\overrightarrow{h_1},\overrightarrow{h_2},...,\overrightarrow{h_T})$`
。类似的,后向GRU按照
`$(x_T,x_{T-1},...,x_1)$`
的顺序依次编码源语言端词,得到
`$(\overleftarrow{h_1},\overleftarrow{h_2},...,\overleftarrow{h_T})$`
。最后对于词
`$x_i$`
,通过拼接两个GRU的结果得到它的隐层状态,即
`$h_i=\left [ \overrightarrow{h_i^T},\overleftarrow{h_i^T} \right ]^{T}$`
。
第3步也可以使用双向循环神经网络实现更复杂的句编码表示,具体可以用双向GRU实现。前向GRU按照词序列
$(x_1,x_2,...,x_T)$的顺序依次编码源语言端词,并得到一系列隐层状态$(
\o
verrightarrow{h_1},
\o
verrightarrow{h_2},...,
\o
verrightarrow{h_T})$。类似的,后向GRU按照$(x_T,x_{T-1},...,x_1)$的顺序依次编码源语言端词,得到$(
\o
verleftarrow{h_1},
\o
verleftarrow{h_2},...,
\o
verleftarrow{h_T})$。最后对于词$x_i$,通过拼接两个GRU的结果得到它的隐层状态,即$h_i=
\l
eft [
\o
verrightarrow{h_i^T},
\o
verleftarrow{h_i^T}
\r
ight ]^{T}$
。
<div
align=
"center"
>
<img
src=
"https://github.com/PaddlePaddle/book/blob/develop/08.machine_translation/image/encoder_attention.png?raw=true"
width=
"400"
><br/>
图4. 使用双向GRU的编码器
...
...
@@ -80,15 +80,15 @@
#### 解码器
机器翻译任务的训练过程中,解码阶段的目标是最大化下一个正确的目标语言词的概率。思路是:
1.
每一个时刻,根据源语言句子的编码信息(又叫上下文向量,context vector)
`$c$`
、真实目标语言序列的第
`$i$`
个词
`$u_i$`
和
`$i$`
时刻RNN的隐层状态
`$z_i$`
,计算出下一个隐层状态
`$z_{i+1}$`
。计算公式如下:
1.
每一个时刻,根据源语言句子的编码信息(又叫上下文向量,context vector)
$c$、真实目标语言序列的第$i$个词$u_i$和$i$时刻RNN的隐层状态$z_i$,计算出下一个隐层状态$z_{i+1}$
。计算公式如下:
$$z_{i+1}=
\p
hi_{
\t
heta '}
\l
eft ( c,u_i,z_i
\r
ight )$$
其中
`$\phi _{\theta '}$`
是一个非线性激活函数;
`$c=q\mathbf{h}$`
是源语言句子的上下文向量,在不使用注意力机制时,如果
[
编码器
](
#编码器
)
的输出是源语言句子编码后的最后一个元素,则可以定义
`$c=h_T$`
;
`$u_i$`
是目标语言序列的第
`$i$`
个单词,
`$u_0$`
是目标语言序列的开始标记
`<s>`
,表示解码开始;
`$z_i$`
是
`$i$`
时刻解码RNN的隐层状态,
`$z_0$`
是一个全零的向量。
其中
$
\p
hi _{
\t
heta '}$是一个非线性激活函数;$c=q
\m
athbf{h}$是源语言句子的上下文向量,在不使用注意力机制时,如果
[
编码器
](
#编码器
)
的输出是源语言句子编码后的最后一个元素,则可以定义$c=h_T$;$u_i$是目标语言序列的第$i$个单词,$u_0$是目标语言序列的开始标记
`<s>`
,表示解码开始;$z_i$是$i$时刻解码RNN的隐层状态,$z_0$
是一个全零的向量。
2.
将
`$z_{i+1}$`
通过
`softmax`
归一化,得到目标语言序列的第
`$i+1$`
个单词的概率分布
`$p_{i+1}$`
。概率分布公式如下:
2.
将
$z_{i+1}$通过
`softmax`
归一化,得到目标语言序列的第$i+1$个单词的概率分布$p_{i+1}$
。概率分布公式如下:
$$p
\l
eft ( u_{i+1}|u_{
<
i+1},
\m
athbf{x}
\r
ight )=softmax(W_sz_{i+1}+b_z)$$
其中
`$W_sz_{i+1}+b_z$`
是对每个可能的输出单词进行打分,再用softmax归一化就可以得到第
`$i+1$`
个词的概率
`$p_{i+1}$`
。
其中
$W_sz_{i+1}+b_z$是对每个可能的输出单词进行打分,再用softmax归一化就可以得到第$i+1$个词的概率$p_{i+1}$
。
3.
根据
`$p_{i+1}$`
和
`$u_{i+1}$`
计算代价。
3.
根据
$p_{i+1}$和$u_{i+1}$
计算代价。
4.
重复步骤1~3,直到目标语言序列中的所有词处理完毕。
...
...
@@ -102,15 +102,15 @@ $$p\left ( u_{i+1}|u_{<i+1},\mathbf{x} \right )=softmax(W_sz_{i+1}+b_z)$$
柱搜索算法使用广度优先策略建立搜索树,在树的每一层,按照启发代价(heuristic cost)(本教程中,为生成词的log概率之和)对节点进行排序,然后仅留下预先确定的个数(文献中通常称为beam width、beam size、柱宽度等)的节点。只有这些节点会在下一层继续扩展,其他节点就被剪掉了,也就是说保留了质量较高的节点,剪枝了质量较差的节点。因此,搜索所占用的空间和时间大幅减少,但缺点是无法保证一定获得最优解。
使用柱搜索算法的解码阶段,目标是最大化生成序列的概率。思路是:
1.
每一个时刻,根据源语言句子的编码信息
`$c$`
、生成的第
`$i$`
个目标语言序列单词
`$u_i$`
和
`$i$`
时刻RNN的隐层状态
`$z_i$`
,计算出下一个隐层状态
`$z_{i+1}$`
。
1.
每一个时刻,根据源语言句子的编码信息
$c$、生成的第$i$个目标语言序列单词$u_i$和$i$时刻RNN的隐层状态$z_i$,计算出下一个隐层状态$z_{i+1}$
。
2.
将
`$z_{i+1}$`
通过
`softmax`
归一化,得到目标语言序列的第
`$i+1$`
个单词的概率分布
`$p_{i+1}$`
。
2.
将
$z_{i+1}$通过
`softmax`
归一化,得到目标语言序列的第$i+1$个单词的概率分布$p_{i+1}$
。
3.
根据
`$p_{i+1}$`
采样出单词
`$u_{i+1}$`
。
3.
根据
$p_{i+1}$采样出单词$u_{i+1}$
。
4.
重复步骤1~3,直到获得句子结束标记
`<e>`
或超过句子的最大生成长度为止。
注意:
`$z_{i+1}$`
和
`$p_{i+1}$`
的计算公式同
[
解码器
](
#解码器
)
中的一样。且由于生成时的每一步都是通过贪心法实现的,因此并不能保证得到全局最优解。
注意:
$z_{i+1}$和$p_{i+1}$
的计算公式同
[
解码器
](
#解码器
)
中的一样。且由于生成时的每一步都是通过贪心法实现的,因此并不能保证得到全局最优解。
## 数据介绍
...
...
@@ -124,7 +124,7 @@ $$p\left ( u_{i+1}|u_{<i+1},\mathbf{x} \right )=softmax(W_sz_{i+1}+b_z)$$
-
合并每个
`XXX.src`
和
`XXX.trg`
文件为
`XXX`
。
-
`XXX`
中的第
`$i$`
行内容为
`XXX.src`
中的第
`$i$`
行和
`XXX.trg`
中的第
`$i$`
行连接,用'
\t
'分隔。
-
`XXX`
中的第
$i$行内容为
`XXX.src`
中的第$i$行和
`XXX.trg`
中的第$i$
行连接,用'
\t
'分隔。
-
创建训练数据的“源字典”和“目标字典”。每个字典都有
**DICTSIZE**
个单词,包括:语料中词频最高的(DICTSIZE - 3)个单词,和3个特殊符号
`<s>`
(序列的开始)、
`<e>`
(序列的结束)和
`<unk>`
(未登录词)。
...
...
08.machine_translation/index.cn.html
浏览文件 @
5596f274
...
...
@@ -85,7 +85,7 @@
我们已经在[语义角色标注](https://github.com/PaddlePaddle/book/blob/develop/07.label_semantic_roles/README.cn.md)一章中介绍了一种双向循环神经网络,这里介绍Bengio团队在论文\[[2](#参考文献),[4](#参考文献)\]中提出的另一种结构。该结构的目的是输入一个序列,得到其在每个时刻的特征表示,即输出的每个时刻都用定长向量表示到该时刻的上下文语义信息。
具体来说,该双向循环神经网络分别在时间维以顺序和逆序——即前向(forward)和后向(backward)——依次处理输入序列,并将每个时间步RNN的输出拼接成为最终的输出层。这样每个时间步的输出节点,都包含了输入序列中当前时刻完整的过去和未来的上下文信息。下图展示的是一个按时间步展开的双向循环神经网络。该网络包含一个前向和一个后向RNN,其中有六个权重矩阵:输入到前向隐层和后向隐层的权重矩阵(
`$W_1, W_3$`),隐层到隐层自己的权重矩阵(`$W_2,W_5$`),前向隐层和后向隐层到输出层的权重矩阵(`$W_4, W_6$`
)。注意,该网络的前向隐层和后向隐层之间没有连接。
具体来说,该双向循环神经网络分别在时间维以顺序和逆序——即前向(forward)和后向(backward)——依次处理输入序列,并将每个时间步RNN的输出拼接成为最终的输出层。这样每个时间步的输出节点,都包含了输入序列中当前时刻完整的过去和未来的上下文信息。下图展示的是一个按时间步展开的双向循环神经网络。该网络包含一个前向和一个后向RNN,其中有六个权重矩阵:输入到前向隐层和后向隐层的权重矩阵(
$W_1, W_3$),隐层到隐层自己的权重矩阵($W_2,W_5$),前向隐层和后向隐层到输出层的权重矩阵($W_4, W_6$
)。注意,该网络的前向隐层和后向隐层之间没有连接。
<div
align=
"center"
>
...
...
@@ -107,13 +107,13 @@
编码阶段分为三步:
1. one-hot vector表示:将源语言句子
`$x=\left \{ x_1,x_2,...,x_T \right \}$`的每个词`$x_i$`表示成一个列向量`$w_i\epsilon \left \{ 0,1 \right \}^{\left | V \right |},i=1,2,...,T$`。这个向量`$w_i$`的维度与词汇表大小`$\left | V \right |$`
相同,并且只有一个维度上有值1(该位置对应该词在词汇表中的位置),其余全是0。
1. one-hot vector表示:将源语言句子
$x=\left \{ x_1,x_2,...,x_T \right \}$的每个词$x_i$表示成一个列向量$w_i\epsilon \left \{ 0,1 \right \}^{\left | V \right |},i=1,2,...,T$。这个向量$w_i$的维度与词汇表大小$\left | V \right |$
相同,并且只有一个维度上有值1(该位置对应该词在词汇表中的位置),其余全是0。
2. 映射到低维语义空间的词向量:one-hot vector表示存在两个问题,1)生成的向量维度往往很大,容易造成维数灾难;2)难以刻画词与词之间的关系(如语义相似性,也就是无法很好地表达语义)。因此,需再one-hot vector映射到低维的语义空间,由一个固定维度的稠密向量(称为词向量)表示。记映射矩阵为
`$C\epsilon R^{K\times \left | V \right |}$`,用`$s_i=Cw_i$`表示第`$i$`个词的词向量,`$K$`
为向量维度。
2. 映射到低维语义空间的词向量:one-hot vector表示存在两个问题,1)生成的向量维度往往很大,容易造成维数灾难;2)难以刻画词与词之间的关系(如语义相似性,也就是无法很好地表达语义)。因此,需再one-hot vector映射到低维的语义空间,由一个固定维度的稠密向量(称为词向量)表示。记映射矩阵为
$C\epsilon R^{K\times \left | V \right |}$,用$s_i=Cw_i$表示第$i$个词的词向量,$K$
为向量维度。
3. 用RNN编码源语言词序列:这一过程的计算公式为
`$h_i=\varnothing _\theta \left ( h_{i-1}, s_i \right )$`,其中`$h_0$`是一个全零的向量,`$\varnothing _\theta$`是一个非线性激活函数,最后得到的`$\mathbf{h}=\left \{ h_1,..., h_T \right \}$`就是RNN依次读入源语言`$T$`个词的状态编码序列。整句话的向量表示可以采用`$\mathbf{h}$`在最后一个时间步`$T$`
的状态编码,或使用时间维上的池化(pooling)结果。
3. 用RNN编码源语言词序列:这一过程的计算公式为
$h_i=\varnothing _\theta \left ( h_{i-1}, s_i \right )$,其中$h_0$是一个全零的向量,$\varnothing _\theta$是一个非线性激活函数,最后得到的$\mathbf{h}=\left \{ h_1,..., h_T \right \}$就是RNN依次读入源语言$T$个词的状态编码序列。整句话的向量表示可以采用$\mathbf{h}$在最后一个时间步$T$
的状态编码,或使用时间维上的池化(pooling)结果。
第3步也可以使用双向循环神经网络实现更复杂的句编码表示,具体可以用双向GRU实现。前向GRU按照词序列
`$(x_1,x_2,...,x_T)$`的顺序依次编码源语言端词,并得到一系列隐层状态`$(\overrightarrow{h_1},\overrightarrow{h_2},...,\overrightarrow{h_T})$`。类似的,后向GRU按照`$(x_T,x_{T-1},...,x_1)$`的顺序依次编码源语言端词,得到`$(\overleftarrow{h_1},\overleftarrow{h_2},...,\overleftarrow{h_T})$`。最后对于词`$x_i$`,通过拼接两个GRU的结果得到它的隐层状态,即`$h_i=\left [ \overrightarrow{h_i^T},\overleftarrow{h_i^T} \right ]^{T}$`
。
第3步也可以使用双向循环神经网络实现更复杂的句编码表示,具体可以用双向GRU实现。前向GRU按照词序列
$(x_1,x_2,...,x_T)$的顺序依次编码源语言端词,并得到一系列隐层状态$(\overrightarrow{h_1},\overrightarrow{h_2},...,\overrightarrow{h_T})$。类似的,后向GRU按照$(x_T,x_{T-1},...,x_1)$的顺序依次编码源语言端词,得到$(\overleftarrow{h_1},\overleftarrow{h_2},...,\overleftarrow{h_T})$。最后对于词$x_i$,通过拼接两个GRU的结果得到它的隐层状态,即$h_i=\left [ \overrightarrow{h_i^T},\overleftarrow{h_i^T} \right ]^{T}$
。
<div
align=
"center"
>
<img
src=
"https://github.com/PaddlePaddle/book/blob/develop/08.machine_translation/image/encoder_attention.png?raw=true"
width=
"400"
><br/>
图4. 使用双向GRU的编码器
...
...
@@ -122,15 +122,15 @@
#### 解码器
机器翻译任务的训练过程中,解码阶段的目标是最大化下一个正确的目标语言词的概率。思路是:
1. 每一个时刻,根据源语言句子的编码信息(又叫上下文向量,context vector)
`$c$`、真实目标语言序列的第`$i$`个词`$u_i$`和`$i$`时刻RNN的隐层状态`$z_i$`,计算出下一个隐层状态`$z_{i+1}$`
。计算公式如下:
1. 每一个时刻,根据源语言句子的编码信息(又叫上下文向量,context vector)
$c$、真实目标语言序列的第$i$个词$u_i$和$i$时刻RNN的隐层状态$z_i$,计算出下一个隐层状态$z_{i+1}$
。计算公式如下:
$$z_{i+1}=\phi_{\theta '} \left ( c,u_i,z_i \right )$$
其中
`$\phi _{\theta '}$`是一个非线性激活函数;`$c=q\mathbf{h}$`是源语言句子的上下文向量,在不使用注意力机制时,如果[编码器](#编码器)的输出是源语言句子编码后的最后一个元素,则可以定义`$c=h_T$`;`$u_i$`是目标语言序列的第`$i$`个单词,`$u_0$`是目标语言序列的开始标记`
<s>
`,表示解码开始;`$z_i$`是`$i$`时刻解码RNN的隐层状态,`$z_0$`
是一个全零的向量。
其中
$\phi _{\theta '}$是一个非线性激活函数;$c=q\mathbf{h}$是源语言句子的上下文向量,在不使用注意力机制时,如果[编码器](#编码器)的输出是源语言句子编码后的最后一个元素,则可以定义$c=h_T$;$u_i$是目标语言序列的第$i$个单词,$u_0$是目标语言序列的开始标记`
<s>
`,表示解码开始;$z_i$是$i$时刻解码RNN的隐层状态,$z_0$
是一个全零的向量。
2. 将
`$z_{i+1}$`通过`softmax`归一化,得到目标语言序列的第`$i+1$`个单词的概率分布`$p_{i+1}$`
。概率分布公式如下:
2. 将
$z_{i+1}$通过`softmax`归一化,得到目标语言序列的第$i+1$个单词的概率分布$p_{i+1}$
。概率分布公式如下:
$$p\left ( u_{i+1}|u_{
<
i+1},\mathbf{x} \right )=softmax(W_sz_{i+1}+b_z)$$
其中
`$W_sz_{i+1}+b_z$`是对每个可能的输出单词进行打分,再用softmax归一化就可以得到第`$i+1$`个词的概率`$p_{i+1}$`
。
其中
$W_sz_{i+1}+b_z$是对每个可能的输出单词进行打分,再用softmax归一化就可以得到第$i+1$个词的概率$p_{i+1}$
。
3. 根据
`$p_{i+1}$`和`$u_{i+1}$`
计算代价。
3. 根据
$p_{i+1}$和$u_{i+1}$
计算代价。
4. 重复步骤1~3,直到目标语言序列中的所有词处理完毕。
...
...
@@ -144,15 +144,15 @@ $$p\left ( u_{i+1}|u_{<i+1},\mathbf{x} \right )=softmax(W_sz_{i+1}+b_z)$$
柱搜索算法使用广度优先策略建立搜索树,在树的每一层,按照启发代价(heuristic cost)(本教程中,为生成词的log概率之和)对节点进行排序,然后仅留下预先确定的个数(文献中通常称为beam width、beam size、柱宽度等)的节点。只有这些节点会在下一层继续扩展,其他节点就被剪掉了,也就是说保留了质量较高的节点,剪枝了质量较差的节点。因此,搜索所占用的空间和时间大幅减少,但缺点是无法保证一定获得最优解。
使用柱搜索算法的解码阶段,目标是最大化生成序列的概率。思路是:
1. 每一个时刻,根据源语言句子的编码信息
`$c$`、生成的第`$i$`个目标语言序列单词`$u_i$`和`$i$`时刻RNN的隐层状态`$z_i$`,计算出下一个隐层状态`$z_{i+1}$`
。
1. 每一个时刻,根据源语言句子的编码信息
$c$、生成的第$i$个目标语言序列单词$u_i$和$i$时刻RNN的隐层状态$z_i$,计算出下一个隐层状态$z_{i+1}$
。
2. 将
`$z_{i+1}$`通过`softmax`归一化,得到目标语言序列的第`$i+1$`个单词的概率分布`$p_{i+1}$`
。
2. 将
$z_{i+1}$通过`softmax`归一化,得到目标语言序列的第$i+1$个单词的概率分布$p_{i+1}$
。
3. 根据
`$p_{i+1}$`采样出单词`$u_{i+1}$`
。
3. 根据
$p_{i+1}$采样出单词$u_{i+1}$
。
4. 重复步骤1~3,直到获得句子结束标记`
<e>
`或超过句子的最大生成长度为止。
注意:
`$z_{i+1}$`和`$p_{i+1}$`
的计算公式同[解码器](#解码器)中的一样。且由于生成时的每一步都是通过贪心法实现的,因此并不能保证得到全局最优解。
注意:
$z_{i+1}$和$p_{i+1}$
的计算公式同[解码器](#解码器)中的一样。且由于生成时的每一步都是通过贪心法实现的,因此并不能保证得到全局最优解。
## 数据介绍
...
...
@@ -166,7 +166,7 @@ $$p\left ( u_{i+1}|u_{<i+1},\mathbf{x} \right )=softmax(W_sz_{i+1}+b_z)$$
- 合并每个`XXX.src`和`XXX.trg`文件为`XXX`。
- `XXX`中的第
`$i$`行内容为`XXX.src`中的第`$i$`行和`XXX.trg`中的第`$i$`
行连接,用'\t'分隔。
- `XXX`中的第
$i$行内容为`XXX.src`中的第$i$行和`XXX.trg`中的第$i$
行连接,用'\t'分隔。
- 创建训练数据的“源字典”和“目标字典”。每个字典都有**DICTSIZE**个单词,包括:语料中词频最高的(DICTSIZE - 3)个单词,和3个特殊符号`
<s>
`(序列的开始)、`
<e>
`(序列的结束)和`
<unk>
`(未登录词)。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录