目录
循环神经网络 RNN
循环神经网络的主要用途是处理和预测序列数据。循环神经网络刻画了一个序列当前的输出与之前信息的关系。从网络结构上,循环神经网络会记忆之前的信息,并利用之前的信息影响后面节点的输出。
循环神经网络的一个重要的概念就是时刻。上图中循环神经网络的主体结构的输入除了来自输入层的,还有一个自身当前时刻的状态。在每一个时刻,会读取t时刻的输入,并且得到一个输出。同时还会得到一个当前时刻的状态,传递给下一时刻。将循环神经网络按照时间序列展开,如下图所示:
链式的特征揭示了 RNN 本质上是与序列和列表相关的。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个tanh层。
下图展示了一个循环神经网络的前向传播算法的具体计算过程:
在得到前向传播计算结果之后,可以和其他网络类似的定义损失函数。神经网络的唯一区别在于它每一个时刻都有一个输出,所以循环神经网络的总损失为前面所有时刻的损失函数的总和。
import numpy as np
X = [1,2,1,2,1,2,3,1]
state = [0.0,0.0]
# 定义不同输入部分的权重
w_cell_state = np.asarray([[0.1,0.2],[0.3,0.4]])
w_cell_input = np.asarray([0.5,0.6])
b_cell = np.asarray([0.1,-0.1])
# 定义输出层的权重
w_output = np.asarray([[0.1],[0.2]])
b_output = 0.1
# 按照时间顺序执行循环神经网络的前向传播过程
for i in range(len(X)):
before_activetion = np.dot(state, w_cell_state) + X[i] * w_cell_input + b_cell
state = np.tanh(before_activetion)
#计算当前时刻的最终输出
final_output = np.dot(state,w_output) + b_output
#输出每一时刻的信息
print("before_activation",before_activetion)
print("state",state)
print("final_output",final_output)
长短时记忆网络 LSTM
循环神经网络工作的关键点就是使用历史的信息来帮助当前的决策。循环神经网络能很好的利用传统的神经网络不能建模的信息,但同时,也带来了更大的挑战——长期依赖的问题。在有些问题中,模型仅仅需要短期内的信息来执行当前的任务。但同时也会有一些上下文场景更加复杂的情况。当间隔不断增大时,简单的循环神经网络可能会丧失学习到如此远的信息的能力。或者在复杂的语言场景中,有用的信息的间隔有大有小,长短不一,循环神经网络的性能也会受限。
LSTM与单一tanh循环结构不同,LSTM拥有三个门:“输入门”、“输出门”、“遗忘门”。
细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持。
LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个sigmod神经网络层和一个按位的乘法操作。
在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取和,输出一个在0到1之间的数值给每个在细胞状态中的数字。1表示“完全保留”,0表示“完全舍弃”。例如,当我们在句子中希望通过主语选择相应的代词,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。
下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmod层称 “输入门层” 决定什么值我们将要更新。然后,一个tanh层创建一个新的候选值向量,会被加入到状态中。
这样就把细胞状态从更新为了。
我们把旧状态与相乘,丢弃掉我们确定需要丢弃的信息。接着加上。这就是新的,根据我们决定更新每个状态的程度进行变化。
在语言模型的例子中,这里就是实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方。
最终,输出门层需要确定输出什么值,这个输出将会基于我们的细胞状态。首先,运行一个sigmod层来确定细胞状态的哪个部分将输出出去。接着,把细胞状态通过tanh进行处理(得到一个在-1到1之间的值)并将它和sigmod门的输出相乘。
单个细胞的输入和输出入下图所示:
demo参考自:
demo:github
参考文献