4_Making RNNs More Effective(提升RNN的效果)

一、Stacked RNN(多层RNN)

image-20210331162230834

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()

image-20210331162748194

二、Bidirectional RNN(双向RNN)

  • 训练两条RNN,一条从左往右,另一条从右往左。
  • 两条RNN是独立的,不共享参数,也不共享状态
  • 两条RNN各自输出自己的状态向量,然后把他们的状态向量进行合并,计作向量y。

image-20210331163915882

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()

image-20210331165518288

三、Pretrain(预训练)

预训练在深度学习中非常常用:比如在训练卷积神经网络的时候,如果网络太大而训练集不够大,那么可以先在大数据上做预训练,这样可以让神经网络有比较好的初始化,也可以避免过拟合。

Observation: The embedding layer contributes most of the parameters!

有320000个参数,而我们只有20000个训练样本,这个embedding layer太大,导致模型过拟合。

解决办法:对embedding layer层做预训练。

image-20210331170702896

3.1 Pretrain the Embedding Layer

第一步,首先找一个更大的数据集,可以是情感分析的数据,也可以是其它类型的数据,但是任务最好是接近情感分析的任务,最好是学出来的词向量带有正面或者负面的情感,两个任务越相似,预训练之后的transformer就会越好,有了大数据集之后要搭建一个神经网络,这个神经网络是什么样的结构都可以(可以不用是RNN,只要这个神经网络有Embedding layer),然后在这个大数据集上训练神经网络。

image-20210331172843835

第二步,训练好之后,把上面的层全部丢弃,只保留Embedding Layer和训练好的模型参数。

image-20210331172912793

第三步,搭建自己的RNN网络,这个新的RNN网络跟之前预训练的可以有不同的结构。搭建好之后,新的RNN层和全连接层都是随机初始化,而Embedding Layer的参数是预训练出来的,要把Embedding Layer的参数固定住,不训练这个Embedding Layer,只训练其它的层。

image-20210331172936798

四、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). 如果训练数据较小,在大数据集上预训练
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少云清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值