在探索深度学习领域时,一定会遇到诸如神经网络、循环神经网络、LSTM、GRU等术语。本文将解释LSTM在Python中的使用以及其在文本分类中的作用。
LSTM代表长短期记忆网络。LSTM是一种循环神经网络,与传统的循环神经网络相比,在记忆方面表现更好。LSTM能够很好地记忆某些模式,因此在性能上表现更优。与其他神经网络一样,LSTM可以有多个隐藏层,并且在通过每一层时,相关信息被保留,所有不相关的信息在每个单元中被丢弃。它是如何做到保留和丢弃的呢?
传统的神经网络存在短期记忆的问题。此外,一个很大的缺点是梯度消失问题(在反向传播过程中,梯度变得非常小,趋向于0,这样的神经元在进一步处理中没有用处)。LSTM通过记忆重要信息并找到模式,有效提高了性能。
LSTM有三个主要的门:
让快速看一下它们每一个。
这个门负责决定哪些信息被保留用于计算单元状态,哪些是不相关的可以被丢弃。来自前一个隐藏状态(前一个单元)的信息是ht-1,来自当前单元的信息是xt。这两个是遗忘门的两个输入。它们通过sigmoid函数,趋向于0的被丢弃,其他的被传递以计算单元状态。
输入门更新单元状态,并决定哪些信息是重要的,哪些不是。正如遗忘门帮助丢弃信息一样,输入门帮助找出重要信息并存储某些数据在记忆中。ht-1和xt是输入,它们都通过sigmoid和tanh函数。tanh函数调节网络并减少偏差。
所有获得的信息然后被用来计算新的单元状态。单元状态首先与遗忘门的输出相乘。如果乘以接近0的值,单元状态中的值有可能被丢弃。然后与输入门的输出进行逐点相加,更新单元状态为神经网络认为相关的新值。
最后一个门是输出门,它决定下一个隐藏状态应该是什么。ht-1和xt被传递到sigmoid函数。然后新修改的单元状态通过tanh函数,并与sigmoid输出相乘,以决定隐藏状态应该携带的信息。
有许多经典的分类算法,如决策树、随机森林、支持向量机,它们可以很好地完成工作,那么为什么要使用LSTM进行分类呢?使用LSTM的一个好理由是它在记忆重要信息方面是有效的。
如果看其他非神经网络分类技术,它们是在多个单词作为单独输入进行训练的,这些单词只是没有实际意义的句子中的单词,而在预测类别时,它会根据统计数据而不是根据意义给出输出。这意味着,每个单词都被分类到一个类别中。
LSTM则不同。在LSTM中,可以使用多个单词字符串来找出它所属的类别。这在自然语言处理中非常有用。如果在LSTM中使用适当的嵌入和编码层,模型将能够找出输入字符串的实际含义,并给出最准确的输出类别。以下代码将详细说明如何使用LSTM进行文本分类。
定义LSTM Python模型以训练数据。
# 模型定义
embedding_vector_features=45
model=Sequential()
model.add(Embedding(voc_size,embedding_vector_features,input_length=sent_length))
model.add(LSTM(128,input_shape=(embedded_docs.shape),activation='relu',return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128,activation='relu'))
model.add(Dropout(0.2))
# for units in [128,128,64,32]:
# model.add(Dense(units,activation='relu'))
# model.add(Dropout(0.2))
model.add(Dense(32,activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(4,activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
print(model.summary())
定义了一个顺序模型,并添加了各种层。
现在模型准备好了,数据被分割成训练数据和测试数据。这里的比例是90-10。X_final和y_final是独立和依赖数据集。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_final, y_final, test_size=0.1, random_state=42,stratify=y_final)
下一步是使用训练数据训练LSTM模型,测试数据用于验证。Model.fit()用于此目的。
model.fit(X_train,y_train,validation_data=(X_test,y_test),epochs=120,batch_size=64)
epochs是这个过程将被重复的次数。它可以是20、120、2000、20000,任何数字。批量大小是64,即每个epoch,将使用64个输入批量来训练模型。这主要取决于数据集的大小。
训练完成后,是时候找出结果并使用模型进行预测了。
results = model.evaluate(X_test,y_test)
模型被评估,计算模型对数据分类的准确性。“results”将有准确性分数和损失。在某些情况下,增加epochs的数量可以提高准确性,因为模型得到了更好的训练。
要使用训练好的模型进行预测,使用predict()函数。
y_pred = model.predict(embedded_docs_pred)