# RNN/LSTM-递归神经网络

### 一、RNN vs LSTM

#### RNN 逻辑结构图 #### LSTM 逻辑结构图 LSTM 是 RNN 的变体，它们的原理几乎一样，唯一的不同是 output 即 hidden state 的计算逻辑不同

#### RNN 如何计算某个时刻 t 的 output ?

$h_t = tanh(W*[h_{t-1}, x_t]+b)$

#### LSTM 如何计算某个时刻 t 的 output ?

$f_t = sigmoid(W_f*[h_{t-1}, x_t] + b_f)$

${C}^{*} = tanh(W_c*[h_{t-1}, x_t]+b_c)$

$i_t = sigmoid(W_i*[h_{t-1}, x_t] + b_i)$

$C_t = f_t*C_{t-1} + i_t*{C}^{*}$

$o_t = sigmoid(W_o*[h_{t-1}, x_t] + b_o)$

$h_t = o_t*tanh(C_t)$

#### LSTM 为什么优于 RNN ?

RNN 通过叠乘的方式进行状态更新，当 sequence 比较长时容易出现梯度消失/爆炸的情况，主要原因是反向传播的连乘效应，而 LSTM 是通过门控制的叠加方式来更新状态（C_t的计算公式），所以可以有效防止梯度问题，当然对于超长的 sequence，LSTM 依然会有梯度消失或者爆炸的可能。

### 二、RNN/LSTM 中的 num_units 是啥意思 ？ num_units 相当于神经网络的隐层神经元的个数，例如上图表示一个 LSTM Cell，包含四个神经网络层，即黄色方框部分，num_units 就是每个神经网络结构的隐层神经元个数(全连接单元数)，它实际上也是 LSTM 输出向量的维度数，所以 h_t 为 num_units 维向量。

### 三、如何计算 Keras 的 LSTM layer 的参数个数？

$(num\_units + input\_dims + 1) * num\_units * 4 = 150600$

1. num_units + input_dims 是因为上层输出需要首先与输入进行一次concat，即 [h_t-1, x_t],
2. + 1 是因为 bias
3. * 4 是因为共有4个神经网络层（黄色方框）
4. 为什么不需要乘以 time_steps 即 number of cell ?

### 五、为什么 LSTM 的输入和输出值不用 sigmoid 而用 tanh 作为激活函数 ？

LSTM 内部维护了一个状态向量，其值应该可以增加或者减少，而 sigmoid 的输出为非负数，所以状态信息只能增加，显然不合适，相反，tanh 的输出范围包含了正负数，因此可以满足状态的增减。

[1,2,3,4] => 5
[2,3,4,5] => 6

### 八、Keras 中 LSTM 的 stateful 概念 ### 九、Keras 中 LSTM 的 state 何时 reset?

LSTM 的 state 是针对每一个 sequence 而言的，所以对于一个 batch_size = 10 的 batch，它会为10个 sequences 同时创建10个并行的 state。

### 十、常用 LSTM 模型结构

#### 多层 LSTM
{"ft_lang_label":"__label__zh","ft_lang_prob":0.91729164,"math_prob":0.99930596,"size":3136,"snap":"2020-45-2020-50","text_gpt3_token_len":1968,"char_repetition_ratio":0.16698596,"word_repetition_ratio":0.010443864,"special_character_ratio":0.25605866,"punctuation_ratio":0.0608365,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.9855287,"pos_list":[0,1,2,3,4,5,6,7,8,9,10],"im_url_duplicate_count":[null,null,null,null,null,null,null,null,null,null,null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2020-10-28T12:14:52Z\",\"WARC-Record-ID\":\"<urn:uuid:22bd0086-c68c-488e-9ebd-6b4e91aa154f>\",\"Content-Length\":\"48935\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:647815a9-011c-4f37-aea2-abb8365530fa>\",\"WARC-Concurrent-To\":\"<urn:uuid:81c2bd88-282b-48e9-8f22-4601f29daf80>\",\"WARC-IP-Address\":\"119.29.22.179\",\"WARC-Target-URI\":\"http://hejunhao.me/archives/1237\",\"WARC-Payload-Digest\":\"sha1:JWDL7OWNZENIRGG3MEIT473NHE3WVLLS\",\"WARC-Block-Digest\":\"sha1:6XOIT6JLMOFOAB3KU762OLTXWXY2W73F\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2020/CC-MAIN-2020-45/CC-MAIN-2020-45_segments_1603107898499.49_warc_CC-MAIN-20201028103215-20201028133215-00665.warc.gz\"}"}