1、proj_size是指在计算出隐状态hi之后,另外使用一个投影矩阵(projection matrix)来把隐状态从hidden_size投影到proj_size维度。这个投影矩阵也是可学习的。
2、LSTM产出3种结果,第一个是output,是最后一层LSTM产出的每个时间节点t的隐状态合集,如果LSTM是双向的,则会拼接每个时间点t的正向和反向的结果,作为这个时间t的结果。
第二个是h,是每一层的LSTM的每个方向的最后一个时间节点t的隐状态结果,这个维度大小和刚开始初始化时丢进去的h大小是一样的,即:
(LSTM层数*LSTM方向数)*batch数*隐节点数
第三个是c,细胞状态,维度和h一样,不过这个结果不常用。
3、RNNCell和LSTMCell两个类模型,是RNN和LSTM模型拆开的独立单元,一般来说RNN或LSTM会根据输入序列的字数自动安排模型长度,而RNNCell和LSTMCell固定只接受单个字的特征(带batch),这就给建模提供了diy的可能性。
>>> rnn = nn.RNNCell(10, 20)
>>> input = torch.randn(6, 3, 10)
>>> hx = torch.randn(3, 20)
>>> output = []
>>> for i in range(6):
hx = rnn(input[i], hx)
output.append(hx)
>>> rnn = nn.LSTMCell(10, 20)
>>> input = torch.randn(6, 3, 10)
>>> hx = torch.randn(3, 20)
>>> cx = torch.randn(3, 20)
>>> output = []
>>> for i in range(6):
hx, cx = rnn(input[i], (hx, cx))
output.append(hx)
4、dropout为什么能防止过拟合,因为dropout在丢弃某些节点后,剩下的节点相当于独立的一个模型网络,当每次dropout不同节点时,相当于训练多个模型网络来捕获不同维度的特征,最后在pred时没有经过dropout,这就启动了所有网络进行综合判断,这样可以一定程度上使各个方向上的过拟合相互抵消,增强鲁棒性。
5、BILSTM流程图: