循环神经网络--RNN--Sequence(时间序列)

Sequence

Sequence的含义:

是循环神经网络的输入格式,一种有时间先后关系的数据类型

如何表示Sequence?

那么如何表示这样的Sequence,也就是这样的一个序列信号呢?
表示的过程本质上就是一个string类型向数值类型的转换, 使用一个n维的向量来表示一个string类型的词/字。
因为数值和文本本身没有一一对应的关系在里边,而且文本它是有一个语义的,但却没有一个大小关系,但是我们的数值它是有一个大小关系的,所以怎么去表达,怎么去转换是非常有意义的,一个表示方法如果可以很好的表示一个单词的特性的话,可能后续去做一些任务,去做一些理解,去做一些分类 就会非常好,相反,如果你的表示方法或者你的内容的一个tensor选的不好的话,进行后边的任务会非常的麻烦,有一个专门的研究方向去研究怎么把一个文字变成一个数值类型,这个研究方向就叫做embedding

Sequence embedding(嵌入)

将Word embedding,Sequence embedding统一称为embedding

embedding 的表示方法:
  • [b, seq_len, feature_len]
  • [句子个数,句子长度(单词个数/时间戳的长度),特征长度(用来表示单词的向量的维度)]
举例
例1:

假设有10个单词,每个单词使用一个4维的向量表示,就可以使用一个这样的tensor进行表示:[1, 10, 4] =>[10, 4] (当维度上的值是1的时候可以省略,这里的4就是4个标量),若是有b几句话则是有[b, 10, 4] ([b,[10,4]],这样写是为了加深理解),就相当于这样的一个tensor

例2:

股市价格随着时间轴的变化价格的变动通过这个例子来看如何对时间序列上的信号进行表示。
表示方法:
这里的一个波形,是股市价格随着时间轴上的时间戳的变动得到一个这样的波形(假设总共有b个公司的股价变化),因为价格本身就是一个数值类型,本身就是一个标量,所以不需要进行从string类型到数值类型的转换,同时如果本身就是一个标量的话,不管这个标量是多少,feature_len一率使用1表示(1可以省略)
表示结果:[b, 25, 1] => [b, 25]

例3:

这里有一张图片:
在这里插入图片描述 在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在CNN中我们使用[b, 28, 28]来表示这张图片,现在换一种方式对这张图片进行理解:将原来的表示位置信息的第一个28理解为时间戳t(一共要扫描多少次)
每一次读到的特征信息作为列位置信息,纯粹当做一个feature,即将一个28行28列的二维图片数据从Sequence的角度进行理解的话就是要扫描 28次,每一次拿到一个一行的特征(如图所示,一部分一部分进行扫取)。

为什么要这样理解呢?
图片除了使用卷积网络进行处理还可以使用接下来要讲到的循环神经网络进行处理 使用循环神经网络进行处理的话必须按照循环神经网络的一个输入格式,也就是: 28个时间戳,每个戳的特征是28shape(维度)的这样的一个向量,使用这样的方式,用循环神经网络进行识别的话也是可以进行图片识别的,当然处理生活中实际的图片数据集的时候还是要使用卷积神经网络比较合适。

Batch

这里对上文中提到的b再进行一个进一步的探究

两种不同的表达方式

一:[b, word num, word vec]
二:[word num, b, word vec]
b:句子的数量
Word num:句子中单词的数量
Word vec:使用多少维度的向量来表示单词

表达方式二:
做运算的时候这样的方式更加适合做运算,因为,将batch维度与t的维度进行了交换,所以它的第0个维度就是t的维度就是将t维度理解为x轴,将波形数量维度理解为y轴也就是每一个t时刻都对应着曲线上一个点。
为什么这样好理解?
因为需要在时间轴上对信号进行逐个进行处理,所以这里主要维度使用时间维度比较容易展开但是不管使用哪一种格式,它实际上就是数据的一种存储格式
,具体实现起来还是按照正常的一个算法的逻辑取数据若使用表达方式一进行展开就必须在1维度上进行展开使用表达方式二就必须使用0维度展开,这两个维度都是时间维度。

▪ How to represent a word

对于一个非数值信号例如文本信号(文字,小说等),如何将这样一个string类型转换到一个数值类型里边去,这里的转换不仅仅是逻辑上的转换,而且要进行一个语义上的转化 。
[words, word vec]
如果不涉及语义表达,只是一个对应识别的话可以使用(one-hot)
例如:只是简单的要实现一个识别地名的话可以简单的使用这样的方式
在这里插入图片描述
这种的方法存在的问题:
▪ sparse(稀疏的):使用one-hot这样的方法存储效率比较低,大部分都是0,比如一个10k的数据量,就会造成9.9k的数据全是0

表达一个词语的时候要注意以下几个方面:
▪ sparse :是否过于稀疏
▪ high-dim :是否能够表示得好
▪ semantic similarity :是否具有语义相关性
▪ trainable :是否是可训练的

▪ semantic similarity :在语义空间的相似度,要在数值空间中使用欧式距离等来反映一个相似

▪ trainable :选择的方式要是可train的,因为这些不能凭空的想象出来,要借助强大的神经网络去慢慢的去拟合,去学到这种特征,去大量的喂单词,喂大量的这样的特性使得它的参数越学越好,当你输入一个单词看它的返回的信息,就可以知道系统的状态

Word embedding

如何做 Word embedding

在这里插入图片描述
这里的数字就是与string(单词)一一对应的,后边就是单词对应的embedding的一个vector,这个向量的一个长度它是可以学习的,向量的内容也是可以学习的,向量越大表达语义的能力也就越强,可以使用[100],[1000],也就是100,1000维的向量

常用的embedding有哪些呢?

除了可以自由的去学习一个embedding(自己学习如何学习?),还有一些非常典型的embedding的方法。
为什么这样说呢?
因为我们的语言只有一种,或者说人的常用的沟通方法只有一种,一个单词的语义一般不会发生变化的,所以针对一个单词的表示方法,我们其实可以有一个非常典型的表示方法,这样的表示方法会在短时间内非常的有效,甚至在一段很长的时间里边我们也只使用这样的一个表示方法就可以了 ,这个就是别人已经学到的后边测试发现效果比较好的一套表示方法,有两种,一个就是Word2Vec,在一个就是GloVe 。

▪ Word2Vec vs GloVe
其实这两种方法就是学到了一个比较好的表示
什么叫做比较好?
比较好就是:做后边的分类,或者说做后边的一个任务,比如说对话任务,或者说给一个图片一个说明的任务,发现性能比较好,也就是说embedding转化比较好。
这里一种最简单的一个比较好的转化方式 :比如说在两个语言里边表示同一个意思的单词距离比较近(相似度高,就称之为性能比较好)

如何自己学习一个embedding方法

如果不使用既定的表示方法想要自己学习一个方法,应该怎么做呢?
有一个这样的层,专门去帮助我们学到一个语言(文字)的表示方法即layers下边的Embedding 层。

In [1]: from tensorflow.keras import layers
In [2]: import tensorflow as tf
In [3]: x = tf.range(5)
In [4]: x
Out[4]: <tf.Tensor: id=3, shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4])>
In [5]: x = tf.random.shuffle(x)
In [6]: x
Out[6]: <tf.Tensor: id=5, shape=(5,), dtype=int32, numpy=array([4, 1, 2, 3, 0])>
In [7]: net = layers.Embedding(10,4)
In [8]: net(x)
Out[8]:
<tf.Tensor: id=21, shape=(5, 4), dtype=float32, numpy=
array([[-0.03131749, -0.04545597, -0.02411698, -0.03784136],
       [-0.01349112, -0.02416377,  0.01802744,  0.02452108],
       [ 0.02917669, -0.01889709, -0.03390733,  0.04074452],
       [ 0.00788559, -0.00146688,  0.00848123, -0.04820286],
       [ 0.04765613,  0.03099203, -0.01576583, -0.00163698]],
      dtype=float32)>

首先是对输入x的理解:
这里的输入X(一个0-4的数值,假如是随机代表四个城市),使用shuffle进行打乱顺序。将数字(城市)输入到Embedding层里边,比如这里的0表示Paris,4表示Roma。确定好了输入之后,接下来使用layer.Embedding()训练一个Embedding层(就相当于建了一个很多储物格的柜子,格子的个数以及每个格子的大小需要设置,每个格子上边都有0-9的编号,每一个格子都使用一个维度为4的向量表示,例如这里这个柜子总共有10个格子,每个格子的大小(维度)是4)。训练好了以后,下一次对系统来说拿到这样的一个语句,比如说拿到Paris这个单词,就进行查表或者直接把Paris(0)送到Embedding里边去,它就可以直接得到这个Embedding,拿到embedding得到的向量以后就可以做后续的任务

In [16]: net.trainable  #使用一个简单的trainable可以看一下它是与否可以training
Out[16]: True
In [17]: net.trainable_variables
Out[17]:
[<tf.Variable 'embedding/embeddings:0' shape=(10, 4) dtype=float32, numpy=
 array([[ 0.04765613,  0.03099203, -0.01576583, -0.00163698],
        [-0.01349112, -0.02416377,  0.01802744,  0.02452108],
        [ 0.02917669, -0.01889709, -0.03390733,  0.04074452],
        [ 0.00788559, -0.00146688,  0.00848123, -0.04820286],
        [-0.03131749, -0.04545597, -0.02411698, -0.03784136],
        [-0.01150789, -0.00118045, -0.02419814, -0.04599314],
        [-0.00971544,  0.03840559, -0.02483718, -0.04274218],
        [ 0.03491205, -0.03886842, -0.02160722,  0.04437952],
        [-0.00266856, -0.00759564, -0.04500618,  0.02986855],
        [-0.04431057, -0.03279338,  0.01783092,  0.03650146]],
       dtype=float32)>]

这里的embedding层是可以trian的,这里的layers.Embedding其实和之前的Dense层和conv层是一样的,它有内部的参数是可以training的,现在得到的输出或者说一个embedding,因为没有经过training,它其实是一个random的,所以这里的表示方法并不一定好,并不满足之前semantic的一个要求,要想满足它,就要进行training, training使得你的一个效果会表达的越来越好,最终会得到一个4维的vector,可以很好的满足语义相关性

和卷积很类似,里边也是一个这样的w叫做embedding,它的shape是[10,4]

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值