Perfee's Blog

成功只有一个——按照自己喜欢的方式,去度过人生。

0%

循环神经网络文本分类

TextRNN出处

论文出处: Recurrent Neural Network for Text Classification with Multi-Task Learning

TextRNN原理

在自然语言处理中,我们的语言序列往往不是孤立的,比如说词性预测,动词后面往往大概率是跟随的是名词,跟随动词的几率会很小,RNN可以很好的处理带有序列的问题,并具有短时记忆能力。
RNN的主要改变是将上一次的激活值a,输入到下次时间步骤中参与计算,下一时刻的计算不仅要考虑输入数据x也要使用上一时刻的激活值a。

计算公式:
$a^t = g_1(W_{aa}a^{t-1} + W_{ax}x + b_a) $

$y^t = g_2(W_{ya}a^t + b_y)$

RRN之LSTM算法

LSTM可以解决长序列的梯度消失和爆炸问题,LSTM通过门控制单元,可以学习很深的连接,LSTM有着长短时记忆的能力,通过遗忘门、更新门、输出门控制。
LSTM的引入了记忆细胞它的数据包含了记忆细胞c与上一适合的激活值a还有数据数据输入x,主要包括三个阶段:

  • 遗忘阶段。对上次层传来的输入进行选择性遗忘,忘记不重要的,记住重要的,主要通过遗忘门控制$c^{t-1}$
  • 记忆阶段。通过更新门选择记忆重要的信息
  • 输出阶段。通过输出门控制


    当输入上一层的记忆信息$c^{t-1}$时我希望有一个门$Γ^t_f=\sigma(W_{fa}a^{t-1} + W_{fx}x^t + b_f)$能控制是否遗忘和保留引入,本级网络也会根据输入$x^t$与$a^{t-1}$计算出产生的信息$\hat{c}^t = tanh(W_{ca}a_t-1 + W_{cx}x^t + b_c)$,我们使用更新门$Γ^t_u=\sigma(W_{ua}a^{t-1} + W_{ux}x^t + b_u)$更新经过本层后的需要记忆的记忆细胞值$c^t = Γ^t_f\circ c^{t-1} + Γ^t_u\circ \hat{c}^t$,使用输出门$Γ^o = \sigma(W_{oa}a^{t-1} + W_{ox}x^t + b_o)$对记忆细胞进行变换为下一层的输入$a^t=Γ^t\circ tanh(c^t)$

    TextRNN模型结构

    基于TensorFlow 2.x实现TextRNN模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from tensorflow.keras import Input, Model
from tensorflow.keras.layers import Embedding, Dense, Dropout, LSTM


class TextRNN(object):
def __init__(self, maxlen, max_features, embedding_dims,
class_num=5,
last_activation='softmax'):
self.maxlen = maxlen
self.max_features = max_features
self.embedding_dims = embedding_dims
self.class_num = class_num
self.last_activation = last_activation

def get_model(self):
input = Input((self.maxlen,))

embedding = Embedding(self.max_features, self.embedding_dims, input_length=self.maxlen)(input)
x = LSTM(128)(embedding)

output = Dense(self.class_num, activation=self.last_activation)(x)
model = Model(inputs=input, outputs=output)
return model