文本识别论文之基础构件解读
文本识别论文中经常会涉及到lstm、rnn、attention等名词,本篇文章是对这些基础构件的总结和介绍。
1. lstm
lstm构件主要从3部分进行介绍:
- 最小单元:lstm cell
- 实际使用样式一:多层多时序lstm
- 实际使用样式二:(双向)多层多时序lstm
1.1 lstm cell
pytorch官网关于lstm的注释,将lstm cell的过程描述为如下6个公式:
参考网上的资源,可以绘制出对应该公式的lstm cell简图。
这里稍做阐述:每一个lstm cell的输入有3个:
x
t
x_t
xt、
c
t
−
1
c_{t-1}
ct−1、
h
t
−
1
h_{t-1}
ht−1,输出有两个
c
t
c_{t}
ct和
h
t
h_{t}
ht。
x
t
x_t
xt表示的是时刻
t
t
t时的数据embedding输入,
c
t
−
1
c_{t-1}
ct−1表示上一个时刻
t
−
1
t-1
t−1lstm cell的state,
h
t
−
1
h_{t-1}
ht−1表示上一个时刻
t
−
1
t-1
t−1 lstm cell的hidden。显然,对于
t
=
0
t=0
t=0时刻, 需要"凭空"存在一个
h
−
1
h_{-1}
h−1和
c
−
1
c_{-1}
c−1,这两个值是通过赋予一个可学习的variable来做到。
1.2 multi-layer long short-term memory
>>> rnn = nn.LSTM(10, 20, 2)
>>> input = torch.randn(5, 3, 10)
>>> h0 = torch.randn(2, 3, 20)
>>> c0 = torch.randn(2, 3, 20)
>>> output, (hn, cn) = rnn(input, (h0, c0))
上述代码是pytorch官网提供的。这里阐明以下几点:
- 在构建lstm的时候,初始参数为输入维度10, 输出维度20和lstm层数2,而时序数并没有在lstm构建的时候传递进去。
- h 0 h0 h0和 c 0 c0 c0如上所述是随机构造的一个可学习的state和hidden初始值。
- 当前层的 h t 0 h_t^0 ht0作为下一层 h t 1 h_t^1 ht1的输入的时候,并非直接透传,而是通过乘以了一个Bernoulli random variable的 δ t 0 \delta_t^0 δt0。
1.3 (bidirection) multi-layer long short-term memory
在实际使用中大家会使用bidirection的lstm比较多一点。例如CRNN和Aster这两篇识别网络中,均使用的BLSTM。
在构造lstm模块的时候,有一个bidirectional参数,如果设置为True则变成了blstm,默认为False。如果是blstm,则output为正向和反向hidden states的concatenation。
1.4 总结
lstm作为文本识别算法中经常用到的一个基础构件,对于更好的理解和学习文本识别论文,具有重要的意义。本位参考了网上的资源和pytorch官网对lstm进行了一定的总结和学习,包括了lstm cell、MultiLayer Lstm和 Bidirectioanl MultiLayer Lstm。