一、Stacked RNN(多层RNN)
from keras.models import Sequential from keras.layers import LSTM,Embedding,Dense # 设置超参数 vocabulary = 10000 # 词典里面有10000个词汇 embedding_dim=32 # shape(x)=32,词向量x的维度为32 word_num = 500 # 每个电影评论有500个单词,如果超过500个单词,就会被截掉;如果不到500,就会补够。 state_dim =32 # shape(h) = 32,状态向量h的维度为32 # 开始搭建网络 model = Sequential() # 建立Sequential()模型 # 往model里面加层,Embedding层,把词映射成向量 model.add(Embedding(vocabulary,embedding_dim,input_length=word_num)) # 需要指定状态向量h的维度,设置RNN层的return_sequences=False,表示RNN只输出最后一个状态向量h,把之前的状态向量舍去 model.add(LSTM(state_dim,return_sequences=True,dropout=0.2)) model.add(LSTM(state_dim,return_sequences=True,dropout=0.2)) model.add(LSTM(state_dim,return_sequences=False,dropout=0.2)) # 全连接层,输入RNN的最后一个状态h,输出0-1之间的数 model.add(Dense(1, activation="sigmoid")) model.summary()
二、Bidirectional RNN(双向RNN)
- 训练两条RNN,一条从左往右,另一条从右往左。
- 两条RNN是独立的,不共享参数,也不共享状态
- 两条RNN各自输出自己的状态向量,然后把他们的状态向量进行合并,计作向量y。
from keras.models import Sequential from keras.layers import LSTM,Embedding,Dense,Bidirectional # 设置超参数 vocabulary = 10000 # 词典里面有10000个词汇 embedding_dim=32 # shape(x)=32,词向量x的维度为32 word_num = 500 # 每个电影评论有500个单词,如果超过500个单词,就会被截掉;如果不到500,就会补够。 state_dim =32 # shape(h) = 32,状态向量h的维度为32 # 开始搭建网络 model = Sequential() # 建立Sequential()模型 # 往model里面加层,Embedding层,把词映射成向量 model.add(Embedding(vocabulary,embedding_dim,input_length=word_num)) # 需要指定状态向量h的维度,设置RNN层的return_sequences=False,保留两条链最后的状态,把之前的状态向量舍去 model.add(Bidirectional(LSTM(state_dim,return_sequences=False,dropout=0.2))) # 全连接层,输入RNN的最后一个状态h,输出0-1之间的数 model.add(Dense(1, activation="sigmoid")) model.summary()
三、Pretrain(预训练)
预训练在深度学习中非常常用:比如在训练卷积神经网络的时候,如果网络太大而训练集不够大,那么可以先在大数据上做预训练,这样可以让神经网络有比较好的初始化,也可以避免过拟合。
Observation: The embedding layer contributes most of the parameters!
有320000个参数,而我们只有20000个训练样本,这个embedding layer太大,导致模型过拟合。
解决办法:对embedding layer层做预训练。
3.1 Pretrain the Embedding Layer
第一步,首先找一个更大的数据集,可以是情感分析的数据,也可以是其它类型的数据,但是任务最好是接近情感分析的任务,最好是学出来的词向量带有正面或者负面的情感,两个任务越相似,预训练之后的transformer就会越好,有了大数据集之后要搭建一个神经网络,这个神经网络是什么样的结构都可以(可以不用是RNN,只要这个神经网络有Embedding layer),然后在这个大数据集上训练神经网络。
第二步,训练好之后,把上面的层全部丢弃,只保留Embedding Layer和训练好的模型参数。
第三步,搭建自己的RNN网络,这个新的RNN网络跟之前预训练的可以有不同的结构。搭建好之后,新的RNN层和全连接层都是随机初始化,而Embedding Layer的参数是预训练出来的,要把Embedding Layer的参数固定住,不训练这个Embedding Layer,只训练其它的层。
四、Summary(总结)
SimpleRNN and LSTM are two kinds of RNNs; always use LSTM instead of SimpleRNN.
Use Bi-RNN instead of RNN whenever possible.
Stacked RNN may be better than a single RNN layer (if n is big).
Pretrain the embedding layer (if n is small). 如果训练数据较小,在大数据集上预训练