Skip to content

Commit

Permalink
improve chinese translation of tutorial
Browse files Browse the repository at this point in the history
  • Loading branch information
Erich Elsen committed Jan 20, 2016
1 parent f1813d1 commit cbe1595
Showing 1 changed file with 23 additions and 18 deletions.
41 changes: 23 additions & 18 deletions torch_binding/TUTORIAL.zh_cn.md
Original file line number Diff line number Diff line change
@@ -1,31 +1,35 @@
## Torch教程

确保您有安装并运行’Warp-ctc’ ‘’Luarocks在最顶层目录创建了torch_binding/rocks/warp-ctc-scm-1.rockspec
为了确保您成功将‘Warp-CTC’和Torch绑定,请在warp-ctc根目录中运行“luarocks make torch_binding/rocks/warp-ctc-scm-1.rockspec”。

使用Torch绑定/平台 (?),以便交互试验CTC
现在,您可以非常容易的通过torch_binding来测试CTC。

假如你的编译没有GPU支持,请用`torch.Tensor(...):float()`替代`torch.Tensor(...):cuda()`,用`cpu_ctc`取代`gpu_ctc`

CTC算法给出了输入序列与目标输出序列之间的损失。由于CTC普遍运用于神经网络,我们称输入序列为激活序列。目标输出序列是从一个固定的字母表中得出的。
为了在此讨论, 我们选择了四个字母‘a,b,c,d’. 算法需要一个`<BLANK>`符号区别于字母。这就意味着激活序列会是一个五维向量序列(字母的数量加<BLANK>)。这个向量将会被转化成字母以及<BLANK>上的概率分布,包含一个SoftMax函数。所以比如一个长度为7的序列就会是(向量的组成部分是任意的)

CTC是一种计算输入序列与目标输出序列之间相似程度的目标函数。由于CTC普遍运用于神经网络,我们称输入序列为激活序列。目标输出序列是从一个固定的字母表中得出的。
为了在此讨论, 我们选择了四个字母‘a,b,c,d’. 算法需要一个`<空白>`符号区别于字母。这就意味着激活序列会是一个五维向量序列(字母的数量加<空白>)。这个向量(通过softmax函数)将会被转化成字母以及<空白>上的概率分布。

比如CTC可以用来衡量一个长度为7的激活序列和标签 ‘daceba’之间的误差。

一个长度为7的激活序列就会是(向量的组成部分是任意的)
```{<2,0,0,0,0>, <1,3,0,0,0>, <1,4,1,0,0>, <1,1,5,6,0>, <1,1,1,1,1>, <1,1,7,1,1>, <9,1,1,1,1>}```
得到的有效输出序列即`daceba`.

一开始我们会举一个非常简单的例子。在这个例子中我们会用一个长度为1的激活序列,以及一个长度为1的目标输出序列。
为了指定这个激活序列,我们必须写下每一个五维向量的组成部分。我们使用`<0,0,0,0,0>`作为激活序列的单一向量,得到的概率分布及`0.2,0.2,0.2,0.2,0.2`.
对于目标输出,我们会用一个单一标签`a`.

首先,我们如何将数据展现给算法? 像平时使用Torch一样,激活表示要在一个2维张量中放入行。目标标签需要放入lua目录/表格 (?), 每个目标标签序列都有一个对应的目录
我们每一个标签仅有一个序列,因此当标签`a`有指数1时,目录即`{{1}}` (指数0预留给空白符号)。因为我们允许输入不同长度的激活序列的可能性,我们需要指定
输入激活序列的长度,在这个例子即带有一个lua目录`{1}`的1.
首先,我们如何将数据展现给算法? 像平时使用Torch一样,激活表示要在一个2维张量中放入行。目标标签需要放入lua table, 每个目标标签序列都有一个对应的表
我们每一个标签仅有一个序列,因此当标签`a`有指数1时,表即`{{1}}` (指数0预留给空白符号)。因为我们允许输入不同长度的激活序列的可能性,我们需要指定
输入激活序列的长度,在这个例子即包涵一个lua table`{1}`的1.


为了计算以上问题(单一元素输入序列,单一输出标签)的CTC损失函数的价值, 只有一种可能的映射/对齐方式(?),所以符号必须在第一个时间步(time step)发出。
为了计算以上问题(单一元素输入序列,单一输出标签)的CTC损失函数的价值, 只有一种可能的对齐方式,所以符号必须在第一个时间步(time step)发出。
发出符号的概率为`0.2`。 算法返回的负对数似然值为`-ln(0.2)=1.6094`.


现在让我们通过代码来做计算。先从Torch部分开始,需要代码库。


假如你有GPU的支持

```
Expand All @@ -44,7 +48,7 @@ th>require 'warp_ctc'
th>acts = torch.Tensor({{0,0,0,0,0}}):cuda()
```

假如一个空梯度张量通过,梯度计算则不能完成。
假如输入为空,梯度计算则不能完成。

```
th>grads = torch.Tensor():cuda()
Expand All @@ -66,13 +70,14 @@ th> gpu_ctc(acts, grads, labels, sizes)
}
```

对每一组序列,函数会返回CTC损失的一个lua目录
对每一组序列,函数会返回CTC损失的一个lua table.


现在,我们来看一个更有意思的例子。假如我们有一个长度为3的输入序列,激活后:

`1,2,3,4,5`,`6,7,8,9,10` and `11,12,13,14,15`.

对应这些帧(?)的概率则为
对应这些帧的概率则为

`0.0117, 0.0317, 0.0861, 0.2341, 0.6364`

Expand All @@ -84,8 +89,7 @@ th>acts = torch.Tensor({{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}}):cuda()
th>labels = {{3,3}}
th>sizes = {3}
```
CTC计算了所有可能映射的概率。请注意目标包涵了重复的符号`c`.CTC不能在连续的时间步上发出一个重复的符号(更多细节,请见 [link](http://www.cs.toronto.edu/~graves/icml_2006.pdf)).
对于重复的符号必须用一个空白分开,所以唯一可能的映射序列为`c <BLANK> c`.
CTC计算了所有可能对齐的概率。请注意目标包涵了重复的符号`c`.CTC不能在连续的时间步上发出重复的符号(更多细节,请见ttp://www.cs.toronto.edu/~graves/icml_2006.pdf)。对于重复的符号必须用一个空白分开,所以唯一可能的对齐序列为`c <BLANK> c`.

CTC假设,在给定数据的情况下,标签概率是有条件独立的,所以我们期待的答案即`Pr(c at frame 1)*Pr(<BLANK> at frame 2)*Pr(c at frame 3) = 0.2341*0.0117*0.2341`
and `-ln(0.2341*0.0117*0.2341) = 7.3522`.
Expand All @@ -107,7 +111,8 @@ th> gpu_ctc(acts, grads, labels, sizes)

`0.0117, 0.0317, 0.0861, 0.2341, 0.6364`.

由于重复的符号被折叠(?),空白被取消,现在有五种可能的映射

由于重复的符号被清空,空白被取消,现在有五种可能的对齐
`<BLANK> b c`, `b <BLANK> c`, `b c <BLANK>`, `b b c` and `b c c`.

结果应当是
Expand Down Expand Up @@ -167,5 +172,5 @@ th>gpu_ctc(acts, grads, labels, sizes)
}
```

为了获得梯度wrt, 接下来的激活序列仅通过一个相同大小的张量作为激活张量即可(?)
如果想看更多例子,请见`torch_binding/tests/test.lua`
为了获取接下来激活的梯度,传递和激活张量同样大小的张量即可。
如果想看更多例子,请见`torch_binding/tests/test.lua`

0 comments on commit cbe1595

Please sign in to comment.