细想BP算法,CNN(卷积神经网络可参考[])我们会发现, 他们的输出都是只考虑前一个输入的影响而不考虑其它时刻输入的影响, 比如简单的猫,狗,手写数字等单个物体的识别具有较好的效果. 但是, 对于一些与时间先后有关的, 比如股票的每日涨跌,文档前后文内容的预测等, 这些算法不是很适合出列这些,所以RNN就出现了。
循环神经网络(Recurrent Neural Network, RNN)是一类以(sequence)数据为输入,在序列的演进方向进行(recursion)且所有节点(循环单元)按链式连接的(recursive neural network)。
RNN是一种特殊的神经网络结构, 它是根据人的认知是基于过往的经验和记忆
这一观点提出的. 它与DNN,CNN不同的是: 它不仅考虑前一时刻的输入,而且赋予了网络对前面的内容的一种记忆
功能.
我的理解就是 可以将输入的一连串数据 通过将前一次传入数据经过计算的结果(举个例子就是传统神经网络当中的权重参数)带入到下一次计算中 也就是实现前后数据相关性
x为输入层
h为隐藏层
out为输出层
RNN就是在CNN的基础上在隐藏层进行了改进
可以将前一个时刻训练出来的结果特征也可以对后一时刻的结果产生影响
比如第一个传入的数据是x1,在传入x2数据时,x1的中间特征结果h1也会参与到计算x2中间特征h2结果的过程中,它们两个是同时传入到隐层当中的
CNN主要运用到CV(计算机视觉)
RNN主要运用到NLP(自然语言处理)
X0,X1,X2...Xt表示输入数据
有写数据可能没有人为的切分成时间序列 但是可以自己来切分
例如可以把今天分为多个时间段,X0表示早上股票的价格,X1表示上午股票的价格,X2表示中午股票的价格...
h0,h1,h2...ht 代表中间结果 最后选出一个结果ht 剩下的h0,h1...就当成中间结果
例如:
输入I am Chinese,I Love China
那么X0就是输入的I X1就是输入的am...Xt就是输入的China
但是单词不能进行编码 所以就引出来了一个Word Embedding
World Vector就是找到一个映射或者函数,生成在一个新的空间上的表达。通俗的翻译可以认为是单词嵌入,就是把X所属空间的单词映射为到Y空间的多维向量,那么该多维向量相当于嵌入到Y所属空间中。
通俗易懂的说就是可以将一个词转换成一个向量 方便计算机识别计算
首先了解一下什么是梯度消失和梯度爆炸
梯度消失:
网络层之间的梯度(值小于 1.0)重复相乘导致的指数级减小会产生梯度消失,主要是因为网络层数太多,太深,导致梯度无法传播,如果导数小于1,那么随着网络层数的增加梯度更新信息会朝着指数衰减的方式减少,从而导致层数比较浅的权重没有更新,这就是梯度消失。
梯度爆炸:
如果导数大于1,梯度呈指数级增长,变的非常大,然后导致网络权重的大幅更新,使网络变得不稳定。
相关文档可以参考于(侵权必删)
RNN在训练中很容易发生梯度爆炸和梯度消失,这导致梯度不能在较长序列中一直传递下去,从而使RNN无法捕捉到长距离的影响。
通常来说,梯度爆炸更容易处理一些。因为梯度爆炸的时候,我们的程序会收到NaN错误。我们也可以设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。
梯度消失更难检测,而且也更难处理一些。总的来说,我们有三种方法应对梯度消失问题:
1、合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。
2、使用relu代替sigmoid和tanh作为激活函数。
3、使用其他结构的RNN,比如长短时记忆网络(LTSM)
假如需要判断用户的说话意图(问天气、问时间、设置闹钟…),用户说了一句“what time is it?”我们需要先对这句话进行分词:
然后按照顺序输入 RNN ,我们先将 “what”作为 RNN 的输入,得到输出「01」
然后,我们按照顺序,将“time”输入到 RNN 网络,得到输出「02」。
这个过程我们可以看到,输入 “time” 的时候,前面 “what” 的输出也产生了影响(隐藏层中有一半是黑色的)。
以此类推,前面所有的输入都对未来的输出产生了影响,大家可以看到圆形隐藏层中包含了前面所有的颜色。如下图所示:
当我们判断意图的时候,只需要最后一层的输出「05」,如下图所示:
短期的记忆影响较大(如橙色区域),但是长期的记忆影响就很小(如黑色和绿色区域),这就是 RNN 存在的短期记忆问题。
文章出处:(侵权必删)
但是在LSTM网络就可以解决
LSTM就是在RNN的基础上进行改进 加上了一个C参数控制单元 可以控制当前模型复杂度
模型复杂度可以进行信息的过滤 因为RNN当中吸取的信息太多了 并不都是有用的
LSTM就可以进行过滤判断选择遗忘掉
下面这个图片可以更好的理解
如果建立一个机器模型 能把文本数据直接输入到算法当中吗?
计算机只认识一些数值数据 所以要把传入的数据转换成数值数据
词嵌入模型: 利用深度学习方法,通过训练大规模语料库来学习词的向量表示,能够捕捉词的语义和语法信息,将词表示为高维空间中的向量
例如:
在词向量空间当中 意思相近的位置离得比较近
将单词转换成向量之后就可以进行计算 向量和向量之间就可以进行相似度的计算
Word2Vec将单词转换成50维度大小的向量 有多少维就有多少个数 可以看作是50个特征
词向量通过热度图展现出的结果(颜色越深数值越大):
在结果中可以发现,相似的词在特征表达中比较相似,证明词的特征是有实际意义的
man和boy有相同之处 如图:
man,boy和water却没有很明显的相似 实际意义就是在词向量空间当中 man和boy的位置比较近,water和他们两个离的位置比较远
Thou和shalt是两个输入的词 和神经网络当中多分类任务相似 最后要做分类任务 在语言库当中 是哪个词的概率最高 中间的大部分就是NN(神经网路)
Embedding_lookup:
嵌入查找,也称为词嵌入(Word Embedding),是一种将文本数据转换为数值表示的技术,在自然语言处理(NLP)中广泛应用。它通常用于深度学习模型中,如神经网络,特别是循环神经网络(RNNs)和Transformer架构。在词嵌入中,每个词汇(比如单词、短语或字符)都被映射到一个多维向量空间中的点,这个过程捕捉了词语之间的语义和语法关联。
举个例子,如果你有一个词汇表,你可以为每个词分配一个固定大小的向量,相似的词在向量空间中的距离会比较近。这使得机器能够理解和处理诸如“国王”和“王子”这样的词有类似的含义,因为它们的向量更接近。常见的词嵌入模型包括Word2Vec、GloVe和FastText等。
每一行表示一个单词的向量 格子里是数值 可以看作是特征
Thou shalt输入之后需要在Embedding_lookup词库的大表当中找到对应的向量
找到词向量之后就可以进行卷积计算然后进行一系列操作
Embedding lookup的数据来源:
也就是一开始词库大表是随机进行初始化的 随着训练的进行 每次都会把输入的数据 再进行更新
神经网络要解决的问题是输入词的词向量应该是什么表达 计算机可以把它下一个词猜的更加准确
下面是输入两个输出一个 实际上也可以输入三个输出一个
框起来的像个窗口 第一次框起来三个 有个东西叫做滑动窗口 第二次的时候就往后移动一个单词 此时的输出变成了输入 然后再进行滑动....
第一个训练数据:
输入A,B
输出C
第二个训练数据:
输入A,B
输出C
.
.
.
.
CBOW(Continuous Bag of Words)也是一种流行的词嵌入模型,与Skip-gram相对应。CBOW全称为Continuous Bag of Words Model,它的基本思想是通过上下文中词语的组合来预测目标词。换句话说,它是从给定词语的上下文集中学习一个词的表示。
在训练过程中,CBOW试图找出一组中心词的上下文词语(通常取窗口大小范围内的词),然后用这些词的平均值作为输入,预测出中心词。与Skip-gram相反,CBOW更侧重于局部上下文,尤其是在计算效率上较高,因为只需要一次平均操作。
尽管CBOW对于某些任务可能会表现得不如Skip-gram准确,但它在一些场景下由于计算效率的优势而被广泛使用,特别是在需要处理大量数据和实时性的任务中。
CBOW的输入是上下文 输出是中间的词 一般框的窗口大小都是奇数个的
框了5个
中间词的上下文是:by,a bus,in
所以此时的输入是上(中间词的左边部分)下(中间词的右边部分)文
输入:by,a,bus,in
输出:red
模型:
w(t)是输出
想要更深一步的理解内容请参考[]
Skip-gram是一种词嵌入模型,由Google在2013年提出的Word2Vec算法的一个变种。它的核心思想是基于上下文预测目标词,即给定一个词语周围的单词,尝试预测该词语本身。在这个过程中,每个词都被编码成一个向量,相似的词在向量空间中的距离也较近。
在训练过程中,Skip-gram会尝试最大化其周围固定数量的邻居词出现的概率。这使得模型能够捕捉到词汇之间的潜在语义关系,比如“国王”与“王后”、“男人”与“女人”可能是邻近的词向量。
Skip-gram相比于其他词嵌入模型如CBOW(连续词袋模型),更注重全局上下文信息,因为它不仅考虑当前词的前一个或后一个词,而是考虑到整个窗口内的单词。因此,它在处理长距离依赖方面表现较好。
Skipgram就是CBOW反过来
Skipgram是输入中间数据 输出两边数据
输入:red
输出:by,a bus,in
每次也是和CBOW窗口一样 移动一个
总的来说就是:
有了输入数据 通过一个Embedding_lookup去查看一下当前这个词在词库表或者表周围它对应的向量是什么 然后传到神经网络当中 每次训练 然后更新这个大表当中输入数据所对应的词向量
模型:
其实和神经网络一样 通过一个前向传播 得到一个loss 然后通过loss函数计算的errro值 再计算一下反向传播一步步该怎么走 权重参数该怎么更新 只不过这里有些特别 之前wx = f 要求权重参数w对结果做的贡献 现在还要更新x 所以现在是两步走 一步是更新权重参数w 一步是更新输入数据x
如果词库有5w个不同的词 得到最终希望属于正确类别得分概率越高值越好 最终想得到的分类就会有5w个 有5w个分类任务 对于最后一层SOFTMAX计算量将会很大
对于一个输入和输出数据来说 都把他们当成是输入数据 让神经网络判断B这个词是A这个词后面的一个可能性概率是多少并输出 希望神经网络预测出来的结果和1越接近越好 所以标签target为1
缺点:
出发点非常好 但是此时训练集构建出来的标签全为1 无法进行较好的训练
需要人为的创建一些词 只要不是语料库当中的词 不是上下文的词 通通都是0 这些词就是负样本
正样本是target为1 是上下文的词 是训练集当中的词
对数据进行改进 对数据集重新构建 有0有1 变成了一个2分类任务
负采样的个数一般是5个较为合适
左边为原始Skipgram 右边为改进后的
Embedding:
最终要维护的词向量大表 包含所有的词向量
Context:
就是输出的结果Output
把下面这一块当作神经网络当中的NN做的事情理解就可以了 负采样也要进行更新
输入数据一开始是随机初始化的 后来会不断进行变化 越接近于计算机能够理解
当不断训练完之后 Embedding词汇表越更新越准 词向量模型就完整的训练好了
因篇幅问题不能全部显示,请点此查看更多更全内容