序列模型——循环序列模型 (理论部分)

##一. 序列模型常用领域如下:##

Speech recognition(语音识别)
Music generation (音乐生成): In this cases,only the Y is a sequence, and X can be a single integer or the empty set. Y
Sentiment classification (情感分析): X is a sequence, i.e. ,“There is nothing to like in this movie”. Y is how many stars do you think this review will be?
DNA sequence analysis (DNA序列分析): DNA can be represented via the four alphabets A, C, G, and T. When given a sequence of DNA, label which part of this DNA sequence say corresponds to a protein. (给定一段DNA序列,标明哪段DNA序列对应哪种蛋白质)
Machine translation (机器翻译): The input X is a given sentence, output Y is the translation in a different language.
Video activity recognition (物体行为识别): X is a sequence of video frames, Y is the activity.
Name entity recognition (命名实体识别): you might be given a sentence and asked to identify the people in that sentence.

这里写图片描述

##二. 数字符号##

对于命名实体识别,即Name entity recognition:

X: Harry Potter and Hermione Granger invented a new spell. ( X &lt; 1 &gt; X^{&lt;1&gt;} X<1> X &lt; t &gt; X^{&lt;t&gt;} X<t> X &lt; 9 &gt; X^{&lt;9&gt;} X<9> )
其中 X &lt; t &gt; X^{&lt;t&gt;} X<t> 代表X序列的第 t 个单词的索引, T x T_x Tx 代表序列X(输入)的长度

Y: Y &lt; 1 &gt; Y^{&lt;1&gt;} Y<1> Y &lt; t &gt; Y^{&lt;t&gt;} Y<t> Y &lt; 9 &gt; Y^{&lt;9&gt;} Y<9> 代表每个输入序列对应的输出的索引, T y T_y Ty 代表序列Y(输出)的长度

X ( i ) &lt; t &gt; X^{(i)&lt;t&gt;} X(i)<t> 代表第 i 个样本的第 t 个单词, T x ( i ) T^{(i)}_{x} Tx(i) 代表第 i 个样本的序列长度, 依次类推可得出 Y ( i ) &lt; t &gt; Y^{(i)&lt;t&gt;} Y(i)<t> T y ( i ) T^{(i)}_{y} Ty(i) 的含义。

在这个例子中 T y T_y Ty = T x T_x Tx = 9

这里写图片描述

三. 循环卷积网络模型

对于时间序列而言,传统的神经网络有俩大不足的地方:

  1. Inputs, outputs can be different lengths in different examples (在不同的例子中拥有不同的输入和输出),尽管可以填充使其输入和输出达到最大值,但似乎不是很好的方法。
  2. Doesn’t share features learned across different positions of text. (在序列的不同地方不能够共享学到的特征)

对于命名实体识别而言,若使用单向循环卷积网络,那么只能对于诸如 “ He said, ‘Teddy Roosevelt was a great President.’ " 对于判断Teddy是否为人名来说,单纯使用如下循环卷积网络,则判断 “Teddy” 时,只是简单的用到了 “He said,”.这里写图片描述

对于正向传播来说,我们应该有以下公式:
$ a^{} = g_{1} ( W_{a} [a^{}, x^{}] + b_{a}) $ … (我在想这里的 $ [a^{}, x^{}]$ 是不是应该是 $ [a^{}, x{<t>}]{T}$ )

y ^ &lt; t &gt; = g 2 ( W y a &lt; t &gt; + b y ) \hat{y}^{&lt;t&gt;} = g_{2} (W_{y} a^{&lt;t&gt;} + b_{y}) y^<t>=g2(Wya<t>+by)

其中, g 1 g_{1} g1 g 2 g_{2} g2 分别代表 非线性激活函数, g 1 g_{1} g1 一般为 tanh 或者 relu 函数, g 2 g_{2} g2 一般为 Sigmoid 或者 Softmax 函数

这里写图片描述

四.通过时间序列的反向传播

对于正向传播而言,其流程如下图所示, 得到 $a^{<0>} \bigoplus x^{<1>} = a^{<1>} ; a^{<1>} \bigoplus a^{<2>} = a^{2} ; … ; a^{t-1} \bigoplus x^{t} = a^{t} $ 和 $ a^{<1>} -> \hat{y}^{<1>}; a^{<2>} -> \hat{y}^{<2>}; … ; a^{} -> \hat{y}^{}$

其中这里需要注意的是从 $ a^{t-1} 和 x^{t} 得到 a^{t} 需要系数 w_{a} 和 b_{a} (在每一个时间步 w_{a} 和 b_{a} 都是一样的)$, $ a^{t} 和 得到 y^{t} 需要系数 w_{y} 和 b_{y} (在每一个时间步 w_{y} 和 b_{y} 都是一样的)$

这里写图片描述

为了计算反向传播,需要一个损失函数,特别的有:
如果在一段序列中,输入的 X &lt; 1 &gt; X^{&lt;1&gt;} X<1> 是一个单词,那么 y t y^{t} yt 是这个而单词的概率为1,而 y ^ &lt; t &gt; \hat{y}^{&lt;t&gt;} y^<t> 是这个神经网络的输出,概率可能为1,那么代价函数可以定义为 “ 标 准 L o g i s t i c 回 归 损 失 函 数 ” “标准 Logistic 回归损失函数” Logistic,也叫作交叉熵损失函数,即如下所示:

L &lt; t &gt; ( y ^ &lt; t &gt; , y &lt; t &gt; ) = − y &lt; t &gt; l o g ( y &lt; t &gt; ) − ( 1 − y &lt; t &gt; ) l o g ( 1 − y &lt; t &gt; ) L^{&lt;t&gt;}(\hat {y}^{&lt;t&gt;}, y^{&lt;t&gt;}) = -y^{&lt;t&gt;} log (y^{&lt;t&gt;}) - (1-y^{&lt;t&gt;} )log (1- y^{&lt;t&gt;}) L<t>(y^<t>,y<t>)=y<t>log(y<t>)1y<t>log1y<t>, 这个是对于时间 t 的时候的损失函数

对于整个时间序列,则有损失函数:

L ( y ^ , y ) = ∑ t = 1 T − y &lt; t &gt; l o g ( y &lt; t &gt; ) − ( 1 − y &lt; t &gt; ) l o g ( 1 − y &lt; t &gt; ) L (\hat {y}, y) = \sum_{t=1}^{T}-y^{&lt;t&gt;} log (y^{&lt;t&gt;}) - (1-y^{&lt;t&gt;} )log (1- y^{&lt;t&gt;}) L(y^,y)=t=1Ty<t>log(y<t>)1y<t>log1y<t>

然后通过代价函数和梯度下降进行参数的学习,如下图所示,红色箭头代表 反向传播,绿色箭头代表正向传播。

这里写图片描述

五. 不同类型的循环神经网络

Many - to -many:
T x ( 多 个 ) T_{x} (多个) Tx T y ( 多 个 ) T_{y} (多个) Ty() 是一致的时候,我们称这个网络为 多对一 网络。例如英文翻译成中文的例子:

这里写图片描述

T x T_{x} Tx T y T_{y} Ty 长度不一致的时候,以 法语 跟 英语 之间翻译转换而言,我们可知其输入跟输出是不一样的,这就需要新的网络如下:
这里写图片描述
Many - to - one:
T x ( 多 个 ) T_{x} (多个) Tx() T y ( 1 ) T_{y} (1) Ty(1) 的时候,我们称这个网络为 多对一网络。 例如通过电影评价来给电影评星的情况:

这里写图片描述

One - to - many:
当 $T_{x} (1) $ 和 T y ( 多 个 ) T_{y} (多个) Ty() 的时候,我们称这个网络为 一对多网络。 例如通过一个音符或者一个数字来生成一段音乐:

当生成序列的时候,通常会把第一个合成的输出,也 feed 给下一层,所以实际上的网络结构如下图所示:

这里写图片描述

六. 语言模型和序列生成

为了建立 RNN 这样的模型,首先需要一个训练集,包含一个很大的英文文本语料库(word corpus), word corpus是自然语言 NLP 的一个专有名词。

对于句子 Cats ( y &lt; 1 &gt; y^{&lt;1&gt;} y<1>) average( y &lt; 2 &gt; y^{&lt;2&gt;} y<2>) 15( y &lt; 2 &gt; y^{&lt;2&gt;} y<2>) hours( y &lt; 3 &gt; y^{&lt;3&gt;} y<3>) of( y &lt; 4 &gt; y^{&lt;4&gt;} y<4>) sleep( y &lt; 5 &gt; y^{&lt;5&gt;} y<5>) a( y &lt; 6 &gt; y^{&lt;6&gt;} y<6>) day( y &lt; 7 &gt; y^{&lt;7&gt;} y<7>)

这里的 y &lt; 1 &gt; y^{&lt;1&gt;} y<1>, y &lt; 2 &gt; y^{&lt;2&gt;} y<2> 都是一个one-hot向量,即该词在word corpus中所占的索引。 同时还要定义句子是否结束了,那么可以用 EOS 来作为句子的结尾标记。

预测的步骤:
A.当我们要预测这个句子的时候,我们第一个输出初始化为 x &lt; 1 &gt; = 0 ^ x^{&lt;1&gt;} = \hat{0} x<1>=0^ 向量,同时 $ a^{<0>} = \hat{0}$向量,然后得到 a 1 a^{1} a1 经过 S o f t m a x Softmax Softmax 函数可以得到第一词,所以 y ^ &lt; 1 &gt; \hat{y}^{&lt;1&gt;} y^<1> 只是为了预测第一个词的概率。

B.在下一个时间步中,我们要把之前预测的第一个单词的概率 x &lt; 2 &gt; = y &lt; 1 &gt; x^{&lt;2&gt;} = y^{&lt;1&gt;} x<2>=y<1>, 作为输出算出 a &lt; 2 &gt; a^{&lt;2&gt;} a<2>, 然后最后得到 y ^ &lt; 2 &gt; \hat{y}^{&lt;2&gt;} y^<2>, 其中 y ^ &lt; 2 &gt; \hat{y}^{&lt;2&gt;} y^<2> 是第二个词的概率,即 P ( a v e r a g e ∣ C a t s ) P(average | Cats) P(averageCats).

C.然后 y ^ &lt; 2 &gt; \hat{y}^{&lt;2&gt;} y^<2> 是第三个词的概率,则可以得到 P ( a v e r a g e ∣ C a t s , a v e r a g e ) P(average | Cats, average) P(averageCats,average)

对于整个句子的概率,我们有 P ( y &lt; 1 &gt; , y &lt; 2 &gt; , y &lt; 3 &gt; ) = P ( y &lt; 1 &gt; ) P ( y &lt; 2 &gt; ∣ y &lt; 1 &gt; ) P ( y &lt; 3 &gt; ∣ y &lt; 1 &gt; , y &lt; 2 &gt; ) P(y^{&lt;1&gt;}, y^{&lt;2&gt;}, y^{&lt;3&gt;} ) = P(y^{&lt;1&gt;})P(y^{&lt;2&gt;} | y^{&lt;1&gt;}) P(y^{&lt;3&gt;}|y^{&lt;1&gt;},y^{&lt;2&gt;}) P(y<1>,y<2>,y<3>)=P(y<1>)P(y<2>y<1>)P(y<3>y<1>,y<2>)

这里写图片描述

七. 对新序列采样

在训练一个序列模型后,要想了解这个模型学了什么,可以对RNN进行一次新序列的采样。

八. 带有神经网络的梯度消失

对于在自然语言处理中,可能会经常处理以下文本:

  1. The cat, … (中间20个词), was full.
  2. The cats, … (中间20个词), were full.

对于上面说讲到的RNN 结构,并不会有长期的记忆功能,即第一句 was 很难 从 cat 学到是单数, 而第二句 were 很难从 cats 学到是否是复数,因为中间相差了大概有 几十个词,而普通的RNN并不具备长期记忆功能。

同时,对于梯度消失而言,当网络很深的时候,在进行反向传播的时候,可能会遇到梯度消失的时候。

这里写图片描述

九. GRU 单元(Gated Recurrent Unit)##

对于门控单元,我们令 C 抽象为记忆单元,那么我们有 C = memory cell

1. C &lt; t &gt; = a &lt; t &gt; 1. C^{&lt;t&gt;} = a^{&lt;t&gt;} 1.C<t>=a<t>

2. C ~ &lt; t &gt; = t a n h ( W c [ c &lt; t − 1 &gt; , x t ] + b c ) 2. \widetilde{C}^{&lt;t&gt;} = tanh( W_{c} [c^{&lt;t-1&gt;}, x^{t}] + b_{c}) 2.C <t>=tanh(Wc[c<t1>,xt]+bc) (候选的抽象记忆单元,等待更新)

3. Γ u ( u 为 u p d a t e 的 意 思 ) = σ ( W u [ c &lt; t − 1 &gt; , x t ] + b u ) 3. \Gamma{u} (u为update的意思) = \sigma( W_{u} [c^{&lt;t-1&gt;}, x^{t}] + b_{u}) 3.Γu(uupdate)=σ(Wu[c<t1>,xt]+bu) (这一步是GRU真正的思想,有个门,0或者1,使用了sigmoid 参数)

$4. {C}^{} = \Gamma{u} * \widetilde{C}^{} + (1- \Gamma{u})*C^{} $ (如果 Γ u = 1 \Gamma{u}=1 Γu=1 的话,意味着要更新,如果 Γ u = 0 \Gamma{u}=0 Γu=0 的话,意味着不更新)

举个例子: 当句子为 The cat, which already ate … ,was full.

当在cat的时候, c &lt; t &gt; = 1 ( 代 表 单 数 ) , Γ u = 1 c^{&lt;t&gt;} = 1(代表单数), \Gamma{u}=1 c<t>=1(),Γu=1, 在这个时候更新, 但是当到cat 后面的单词…, Γ = 0 \Gamma =0 Γ=0(没有更新),这时候 $c^{}=1 $(因为没有更新,所以一直为单数)

示意图如下所示(简化版的GRU单元):

这里写图片描述

在上图中,很容易看到, x &lt; t &gt; x^{&lt;t&gt;} x<t>, C &lt; t − 1 &gt; = a &lt; t − 1 &gt; C^{&lt;t-1&gt;} = a^{&lt;t-1&gt;} C<t1>=a<t1> 作为输入(一般而言会初始化为0向量),通过 tanh 激活函数得到 C ~ &lt; t &gt; \widetilde{C}^{&lt;t&gt;} C <t>, 通过 sigmoid 激活函数得到 Γ u \Gamma{u} Γu (0 或 1), 最后通过 C &lt; t &gt; = Γ u ∗ C ~ &lt; t &gt; + ( 1 − Γ u ) ∗ C &lt; t − 1 &gt; {C}^{&lt;t&gt;} = \Gamma{u} * \widetilde{C}^{&lt;t&gt;} + (1- \Gamma{u})*C^{&lt;t-1&gt;} C<t>=ΓuC <t>+(1Γu)C<t1>(黑框) 得到 C &lt; t &gt; = a &lt; t &gt; C^{&lt;t&gt;}=a^{&lt;t&gt;} C<t>=a<t>。 最后添加一个门的相关性,如下所示:

这里写图片描述

十. 长短期记忆(LSTM)

对于上面提到的 GRU,更加强大的有 LSTM,其具有三个门, 在LSTM里,不再跟上面一样具有 C &lt; t &gt; = a &lt; t &gt; C^{&lt;t&gt;}=a^{&lt;t&gt;} C<t>=a<t> 的性质。

C ~ &lt; t &gt; = t a n h ( w c [ a &lt; t − 1 &gt; , x t ] + b c ) \widetilde{C}^{&lt;t&gt;}= tanh(w_{c} [a^{&lt;t-1&gt;}, x^{t}]+b_{c}) C <t>=tanh(wc[a<t1>,xt]+bc)
Γ u = σ ( w a [ a &lt; t − 1 &gt; , x t ] + b u ) \Gamma{u}=\sigma(w_{a}[a^{&lt;t-1&gt;},x^{t}]+b_{u}) Γu=σ(wa[a<t1>,xt]+bu) (更新门)
Γ f = σ ( w f [ a &lt; t − 1 &gt; , x t ] + b f ) \Gamma{f}=\sigma(w_{f}[a^{&lt;t-1&gt;},x^{t}]+b_{f}) Γf=σ(wf[a<t1>,xt]+bf) (遗忘门)
Γ o = σ ( w o [ a &lt; t − 1 &gt; , x t ] + b o ) \Gamma{o}=\sigma(w_{o}[a^{&lt;t-1&gt;},x^{t}]+b_{o}) Γo=σ(wo[a<t1>,xt]+bo) (输出门)
C &lt; t &gt; = Γ u ∗ C ~ &lt; t &gt; + Γ f ∗ C &lt; t − 1 &gt; C^{&lt;t&gt;}=\Gamma_{u}*\widetilde{C}^{&lt;t&gt;} + \Gamma_{f}*C^{&lt;t-1&gt;} C<t>=ΓuC <t>+ΓfC<t1>
$ a^{}=\Gamma_{o} * tanhC^{}$

这里写图片描述

正如下图横线所示,只要正确设置了更新门和遗忘门,LSTM 是很容易把 c 0 c^{0} c0 一直传递下去的。其中值得指出的是,门值 Γ o \Gamma_{o} Γo 不仅仅取决于 a &lt; t − 1 &gt; , x &lt; t &gt; a^{&lt;t-1&gt;},x^{&lt;t&gt;} a<t1>,x<t> 参数, 也可以取决于上一个记忆细胞的值,即 Γ o = σ ( w o [ a &lt; t − 1 &gt; , x t ] + b o ) \Gamma{o}=\sigma(w_{o}[a^{&lt;t-1&gt;},x^{t}]+b_{o}) Γo=σ(wo[a<t1>,xt]+bo) 也可以写成 Γ o = σ ( w o [ a &lt; t − 1 &gt; , x t , C &lt; t − 1 &gt; ] + b o ) \Gamma{o}=\sigma(w_{o}[a^{&lt;t-1&gt;},x^{t}, C^{&lt;t-1&gt;}]+b_{o}) Γo=σ(wo[a<t1>,xt,C<t1>]+bo), 然后通过窥视孔连接(peephole connection)可以达到改变三个门的值。

但是必须清楚的是:第 50 个 C &lt; t &gt; C^{&lt;t&gt;} C<t> 只能影响第50个元素,第100个 C &lt; t &gt; C^{&lt;t&gt;} C<t> 只会影响第100个元素(这里的元素指的是门的值)

这里写图片描述

十一. 双向神经网络

对于句子:

He said, “Teddy bears are on sale!”
He said, “Teddy Roosevelt was a great President!”

对这俩个句子, 当我们只看前三个单词的时候,并不能清楚的知道 “Teddy” 是人还是泰迪熊,这就需要双向传播了。

双向 RNN 的双向传播的基本原理:

  1. (蓝色框框) a → &lt; 1 &gt; \overrightarrow{a}^{&lt;1&gt;} a <1> , a → &lt; 2 &gt; \overrightarrow{a}^{&lt;2&gt;} a <2>, a → &lt; 3 &gt; \overrightarrow{a}^{&lt;3&gt;} a <3> , a → &lt; 4 &gt; \overrightarrow{a}^{&lt;4&gt;} a <4> 来代表前向的循环单元,这里可以用 LSTM 或者 GRU 都可以。

2.(绿色框框) a ← &lt; 1 &gt; \overleftarrow{a}^{&lt;1&gt;} a <1> , a ← &lt; 2 &gt; \overleftarrow{a}^{&lt;2&gt;} a <2>, a ← &lt; 3 &gt; \overleftarrow{a}^{&lt;3&gt;} a <3> , a ← &lt; 4 &gt; \overleftarrow{a}^{&lt;4&gt;} a <4> 来代表反向的循环单元,同样的可以用LSTM 和 GRU来表示。

给定一个输入序列, X 1 X^{1} X1 X 4 X^{4} X4, 这个序列首先计算前向的 a &lt; 1 &gt; a^{&lt;1&gt;} a<1>, 然后计算前向的 a &lt; 2 &gt; a^{&lt;2&gt;} a<2>, 然后是 a &lt; 3 &gt; , a &lt; 4 &gt; a^{&lt;3&gt;}, a^{&lt;4&gt;} a<3>,a<4>, 而反向序列,则是从计算 a &lt; 4 &gt; a^{&lt;4&gt;} a<4> 开始的,然后到达 a &lt; 1 &gt; a^{&lt;1&gt;} a<1>。(这里值得注意的是,虽然是反向的,但是计算的激活值还是前向的,即训练出来的参数还是为前向传播服务的,即前向传播一部分是从左到右,一部分又是从右到左的)

则公式为 y ^ = g ( w a [ a → &lt; t &gt; , a ← &lt; t &gt; ] + b a ) \hat{y}=g(w_{a}[\overrightarrow{a}^{&lt;t&gt;}, \overleftarrow{a}^{&lt;t&gt;}]+b_{a}) y^=g(wa[a <t>,a <t>]+ba)

这里写图片描述

十二. 深层循环神经网络

对于深层循环神经网络,其实就是在每一个时间段的输出对其进行另一个神经网络的叠加。 值得注意的是,每一层的神经网络参数 w a , b a w_{a}, b_{a} wa,ba w y , b y w_{y}, b_{y} wy,by 在每一个时间节点都是共享同样的参数的。

这里写图片描述

对于参数 a [ 2 ] &lt; 3 &gt; a^{[2]&lt;3&gt;} a[2]<3> 而言 ,其输入参数来自于bottom 和 left,其表达式可写为:

$a^{[2]<3>} = g (w^{[2]}{a} [a^{[2]<2>}, a^{[1]<3>}] + b{a}^{[2]}) $

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
时间序列预测是一种常见的问题,可以使用LSTM(长短期记忆)模型来解决。LSTM是一种循环神经网络RNN),能够有效地捕捉时间序列中的长期依赖关系。 下面是一个使用Python和Keras库实现LSTM模型进行时间序列预测的示例代码: ```python import numpy as np import pandas as pd from keras.models import Sequential from keras.layers import LSTM, Dense # 读取时间序列数据 data = pd.read_csv('data.csv') # 替换为实际的数据文件路径 # 数据预处理 # 将数据拆分为训练集和测试集 train_data = data.iloc[:800] # 使用前800个数据作为训练集 test_data = data.iloc[800:] # 使用后面的数据作为测试集 # 构建特征和标签 def create_dataset(dataset, look_back): X, Y = [], [] for i in range(len(dataset) - look_back): X.append(dataset[i:i + look_back]) Y.append(dataset[i + look_back]) return np.array(X), np.array(Y) look_back = 10 # 定义用于预测的时间步长 train_X, train_Y = create_dataset(train_data, look_back) test_X, test_Y = create_dataset(test_data, look_back) # 构建LSTM模型 model = Sequential() model.add(LSTM(units=50, activation='relu', input_shape=(look_back, 1))) model.add(Dense(units=1)) model.compile(optimizer='adam', loss='mean_squared_error') # 训练模型 model.fit(train_X, train_Y, epochs=100, batch_size=32) # 预测 train_predict = model.predict(train_X) test_predict = model.predict(test_X) # 可视化结果 import matplotlib.pyplot as plt # 绘制训练集和测试集的实际值 plt.plot(np.arange(len(train_data)), train_data, 'b', label='actual') plt.plot(np.arange(len(train_data), len(train_data) + len(test_data)), test_data, 'g', label='actual') # 绘制训练集和测试集的预测值 plt.plot(np.arange(look_back, len(train_predict) + look_back), train_predict, 'r', label='predicted') plt.plot(np.arange(len(train_predict) + look_back, len(train_predict) + look_back + len(test_predict)), test_predict, 'y', label='predicted') plt.legend() plt.show() ``` 在上面的代码中,首先读取时间序列数据,然后将数据拆分为训练集和测试集。接下来,通过定义一个`create_dataset`函数将时间序列数据转换为特征和标签,其中特征是前`look_back`个时间步长的数据,标签是下一个时间步长的数据。然后,使用Keras库构建一个简单的LSTM模型,并编译模型。 训练模型时,使用训练集的特征和标签进行训练。训练完成后,使用训练集和测试集的特征进行预测,并将结果可视化。 请注意,上述代码仅为示例,实际使用时可能需要根据具体情况进行适当调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值