RNN 的 N-gram

数据挖掘 nlp lstm rnn ngram
2021-09-18 23:18:15

给出一个词wn使用 n-gram 的马尔可夫链等统计模型预测后续单词wn+1. 预测绝不是随机的。

这如何转化为神经模型?我已经尝试对我的句子进行标记和排序,下面是它们准备传递给模型的方式:

train_x = np.zeros([len(sequences), max_seq_len], dtype=np.int32)
for i, sequence in enumerate(sequences[:-1]): #using all words except last
    for t, word in enumerate(sequence.split()):
        train_x[i, t] = word2idx(word) #storing in word vectors

序列如下所示:

Given sentence "Hello my name is":
Hello 
Hello my
Hello my name
Hello my name is

将这些序列作为输入传递给具有 LSTM 层的 RNN,我得到的下一个单词(给定一个单词)的预测是随机的。

2个回答

神经语言模型试图预测条件概率 P(wi+1|w1,,wi). 它用以下近似概率P(wi+1|s(w1,,wi)), 在哪里 s是一个状态函数。之后,LSTM 查看所有单词w1,,wi,它有一个更新的状态,所以现在它包含一些关于所有先前单词的有用信息。你的代码中有一个错误:你应该接受一个句子的所有单词,但最后一个。但是,除了最后一句话,你已经全部接受了。

在语言建模一个正常的句子wi,wn通常增加 2 个特殊标记:--序列开始,--序列结束。所以你的例子“你好我的名字是”应该转换成“你好我的名字是”。现在你的源标记除了最后一个,即“你好,我的名字是”,而你想要预测的目标都期待第一个,即“你好,我的名字是”。您一次在 LSTM 中输入一个令牌,并尝试预测下一个令牌。

您不需要像您展示的那样为 RNN 创建 n-gram。使用 RNN/LSTM 进行神经语言建模的目的是避免做出您陈述的马尔可夫假设。要使用 RNN,您只需将整个句子按原样作为一个序列输入 RNN,作为目标,您输入一个序列,输入中的每个单词都向右移动一个。

您可以查看此 repo 以获取 RNN 语言模型的示例:https ://github.com/pytorch/examples/tree/master/word_language_model

使用能够更好地捕获远程依赖关系的 LSTM 可能会更好(比马尔可夫模型可能允许的更长!)。我怀疑你得到的是随机序列,因为你的短序列重复,这只会给神经网络增加很多噪音。