Pytorch Chatbot模型中的一些问题

这是本人在学习Pytorch Tutorials的文本模型——Chatbot模型的过程中遇到的一些问题,供以后翻阅。

1.embedding层,词嵌入

词嵌入即是将单个词映射到一个向量中,例如:一个文本中包含“猫”,“狗”等词,我们可以将这些单词映射为(0.1,0.2,0.3),(0.2,0.2,0.4)。之所以映射为向量是为了便于计算,可通过计算不同词向量的夹角余弦值来判断两者类型是否相近。

embedding层可用来降维与升维,详细见https://blog.csdn.net/weixin_42078618/article/details/82999906

2.hidden

隐藏层的意义是为了将输入数据的特征抽象化到另一维度,使其特征能够更好地进行线性划分

3.该模型特殊之处

该模型的batch是放在前面的,所以在Decoder模型中进行了transpose操作

  • def forward(self, input_step, last_hidden, encoder_outputs):
            # 注意:decoder每一步只能处理一个时刻的数据,因为t时刻计算完了才能计算t+1时刻。
            # input_step的shape是(1, 64),64是batch,1是当前输入的词ID(来自上一个时刻的输出)
            # 通过embedding层变成(1, 64, 500),然后进行dropout,shape不变。
            embedded = self.embedding(input_step)
            embedded = self.embedding_dropout(embedded)
            # 把embedded传入GRU进行forward计算
            # 得到rnn_output的shape是(1, 64, 500)
            # hidden是(2, 64, 500),因为是双向的GRU,所以第一维是2。
            rnn_output, hidden = self.gru(embedded, last_hidden)
            # 计算注意力权重, 根据前面的分析,attn_weights的shape是(64, 1, 10)
            attn_weights = self.attn(rnn_output, encoder_outputs)
    
            # encoder_outputs是(10, 64, 500) 
            # encoder_outputs.transpose(0, 1)后的shape是(64, 10, 500)
            # attn_weights.bmm后是(64, 1, 500)
    
            # bmm是批量的矩阵乘法,第一维是batch,我们可以把attn_weights看成64个(1,10)的矩阵
            # 把encoder_outputs.transpose(0, 1)看成64个(10, 500)的矩阵
            # 那么bmm就是64个(1, 10)矩阵 x (10, 500)矩阵,最终得到(64, 1, 500)
            context = attn_weights.bmm(encoder_outputs.transpose(0, 1))
            # 把context向量和GRU的输出拼接起来
            # rnn_output从(1, 64, 500)变成(64, 500)
            rnn_output = rnn_output.squeeze(0)
            # context从(64, 1, 500)变成(64, 500)
            context = context.squeeze(1)
            # 拼接得到(64, 1000)
            concat_input = torch.cat((rnn_output, context), 1)
            # self.concat是一个矩阵(1000, 500),
            # self.concat(concat_input)的输出是(64, 500)
            # 然后用tanh把输出返回变成(-1,1),concat_output的shape是(64, 500)
            concat_output = torch.tanh(self.concat(concat_input))
    
            # out是(500, 词典大小=7826)    
            output = self.out(concat_output)
            # 用softmax变成概率,表示当前时刻输出每个词的概率。
            output = F.softmax(output, dim=1)
            # 返回 output和新的隐状态 
            return output, hidden

4.选择采用老师监督方法训练模型

Decoder可选择在不同step的输入。若选择老师监督,则输入该step的真实值;反之则采用上一次step的预测值——即输出值

 

你可能感兴趣的:(pytorch,tutorials,text)