如何让 LSTM 预测下一个单词

机器算法验证 神经网络 lstm
2022-03-26 04:14:31

我制作了一个 LSTM 网络(隐藏大小为 16),在其中我给出了 10 个数字的序列作为输入,并将其输出提供给全连接层。
序列中的数字对应我创建的字典中的单词(例如:序列中的数字12对应字典中的第12个单词)

我想要的是使用该完全连接的层来预测下一个数字(即下一个单词),而我被困在那个地方。

我尝试的一种方法是在输出中创建一个具有relu激活功能的神经元的 FC 层,并将其输出 a 转换为integer并获取与该数字对应的单词。它的准确性太低了。

我想到的另一种方法是创建具有多个输出的 FC 并将其连接到一个softmax层。然后得到它的输出,将输出转换为概率<0.5的二进制数为二进制0,其他为二进制1。然后得到对应的单词。我还没有尝试过这种方法。

我想问的是是否有更好的方法来做到这一点..?这类问题的一般解决方案是什么..?(可能是不同的架构)

1个回答

预测分类输出概率的最广泛使用的方法是在最后一层使用softmax激活和交叉熵损失进行训练这是因为您正在对字典中每个单词接下来出现的概率进行建模。但是,完整的 softmax 可能会很昂贵,因此采样的 softmax 及其变体可以加快速度。

另一种选择是观察使用words的成本通常很高,因为它们太多了:你将拥有一个大的嵌入层和一个大的投影层——要存储大量数据。相反,使用字符可以很好地工作——英文字符相对较少,所以完整的 softmax 工作正常,LSTM 基本上可以从无到有“学习”英语。

生成下一个单词,可能是因为您希望您的网络编写一个新的十四行诗,请将网络的输出作为概率向量。然后从多项分布中采样。采样的元素用作网络的下一个输入,依此类推。这是有效的,因为 softmax 层的输出是一个概率向量,您可以逐字或逐字符地编写十四行诗。

使用 ReLU 作为输出层没有多大意义。您的结果是 分类的,因此您需要分类输出的概率分布。ReLU 输出无界值,因此它不是概率分布。

这篇文章是一个很好的起点:Andrej Karpathy,“循环神经网络的不合理有效性