如何训练深度网络的 LSTM 层

机器算法验证 分类 神经网络 深度学习 lstm
2022-03-10 21:33:49

我正在使用 lstm 和前馈网络对文本进行分类。

我将文本转换为 one-hot 向量并将每个向量输入 lstm,以便我可以将其总结为单个表示。然后我将它提供给另一个网络。

但是我如何训练 lstm?我只想对文本进行序列分类——我应该在没有训练的情况下喂它吗?我只想将段落表示为可以输入分类器输入层的单个项目。

我将不胜感激任何建议!

更新:

所以我有一个 lstm 和一个分类器。我获取 lstm 的所有输出并对它们进行平均池化,然后将该平均值输入分类器。

我的问题是我不知道如何训练 lstm 或分类器。我知道 lstm 的输入应该是什么,以及该输入的分类器的输出应该是什么。由于它们是两个单独的网络,只是按顺序激活,因此我需要知道并且不知道 lstm 的理想输出应该是什么,这也将是分类器的输入。有没有办法做到这一点?

1个回答

LSTM 的最佳起点是 A. Karpathy 的博客文章http://karpathy.github.io/2015/05/21/rnn-effectiveness/如果您使用的是 Torch7(我强烈建议),源代码可在 github https://github.com/karpathy/char-rnn获得。

我也会尝试稍微改变你的模型。我会使用多对一的方法,让您通过查找表输入单词并在每个序列的末尾添加一个特殊单词,这样只有当您输入“序列结束”标志时,您才会阅读分类根据您的训练标准输出并计算误差。通过这种方式,您可以直接在受监督的环境下进行训练。

另一方面,更简单的方法是使用paragraph2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ) 为您的输入文本提取特征,然后在您的特征之上运行分类器。段落向量特征提取非常简单,在 python 中是:

class LabeledLineSentence(object):
    def __init__(self, filename):
        self.filename = filename

    def __iter__(self):
        for uid, line in enumerate(open(self.filename)):
            yield LabeledSentence(words=line.split(), labels=['TXT_%s' % uid])

sentences = LabeledLineSentence('your_text.txt')

model = Doc2Vec(alpha=0.025, min_alpha=0.025, size=50, window=5, min_count=5, dm=1, workers=8, sample=1e-5)
model.build_vocab(sentences)

for epoch in range(epochs):
    try:
        model.train(sentences)
    except (KeyboardInterrupt, SystemExit):
        break