序列模型(Sequence Model)
基于文本内容及其前后信息进行预测
基于目标不同时刻状态进行预测
基于数据历史信息进行预测
序列模型:输入或者输出中包含有序列数据的模型
突出数据的前后序列关系
两大特点:
- 输入(输出)元素之间是具有顺序关系。不同的顺序,得到的结果应该是不同的,比如“不吃饭”和“吃饭不”这两个短语意思是不同的
- 输入输出不定长。比如文章生成、聊天机器人
循环神经网络(RNN)
前部序列的信息经处理后,作为输入信息传递到后部序列
任务:
自动寻找语句中的人名:
词汇数值化:建立一个词汇-数值一一对应的字典,然后把输入词汇转化数值矩阵
字典生成的另外一种方式
不同类型的RNN模型
RNN常见结构
多输入对多输出、维度相同RNN结构
应用:特定信息识别
应用:情感识别
举例:I feel happy watching the movie
判断:positive
应用:序列数据生成器
举例:文章生成、音乐生成
应用:语言翻译
普通RNN结构缺陷
- 前部序列信息在传递到后部的同时,信息权重下降,导致重要信息丢失
- 求解过程中梯度消失
需要提高前部特定信息的决策权重
长短期记忆网络(LSTM)
- 忘记门:选择性丢弃a与x中不重要的信息
- 更新门:确定给记忆细胞添加哪些信息
- 输出门:筛选需要输出的信息
- 在网络结构很深(很多层)的情况下,也能保留重要信息
- 解决了普通RNN求解过程中的梯度消失问题
双向循环神经网络(BRNN)
做判断时,把后部序列信息也考虑
深层循环神经网络(DRNN)
解决更复杂的序列任务,可以把单层RNN叠起来或者在输出前和普通mlp结构结合使用
实战准备
实战一:RNN实现股价预测
提取序列数据:
def extract_data(data,slide):
x=[]
y=[]
for i in range(len(data)-slide):
x.append([a for a in data[i:i+slide]])
y.append(data[i+slide])
x=np.array(x)
x=x.reshape(x.shape[0],x.shape[1],1)
return x,y
建立普通RNN模型:
from keras.models import Sequential
from keras.layers import Dense,SimpleRNN
model = Sequential()
#增加一个RNN层
model.add(SimpleRNN(units=5,input_shape=(X.shape[1],X.shape[2]),activation='relu'))
#增加输出层
model.add(Dense(units=1,activation='linear'))
model.compile(optimizer='adam',loss='mean_squared_error')
实战二:LSTM自动生成文本
文本加载:
rew_data = open('flare').read()
# 移除换行字符'\n'
data = rew_data.replace('\n','').replace('\r','')
字符字典建立:
#字符去重
letters = list(set(data))
#建立数字到字符的索引字典
int_to_char = {
a:b for a,b in enumerate(letters)}
#建立字符到数字的索引字典
char_to_int = {
b:a for a,b