机器学习-循环神经网络入门(一)

本文为循环神经网络的基础文章,读完该篇文章因该会对循环神经网络有一个大概的认识。详细实战代码放在下一节。

机器学习-循环神经网络情感分类问题(二)

目录

使用循环神经网络的原因:

embedding层:

RNN(循环神经网络)层使用方法:

梯度裁剪:


使用循环神经网络的原因:

以情感分析为例,最终输出就是一个二分结果,但和图片输入不同的是输入的是文本输入是一个序列,卷积神经网络的效果并不好。

如果用传统的全连接层,对每个单词都经历若干全连接层提取单词的特征,最后再将所有的特征汇总。存在的问题是:如果句子比较长则参数量十分可观,并且由于每个单词连接的全连接层参数彼此不同,因此全连接层子网络只能感受当前词向量的输入,不能整体把握句子,导致整体语义的缺失。

共享权值:网络参数减少,效果变好,但此结构没有考虑序列的先后顺序,即使单词交换了获得的输出也是一样的。

因此提出使用循环神经网络。在t时刻的输入为特征向量输入\tiny x_{t}和上一时间戳输出的状态向量\small h_{t-1}

在t时刻的输出为实际输出\small o_{t}和向下一时间戳输出的状态向量\small h_{t}.

关于状态张量的公式为:

 需要两个权值矩阵和一个偏置值决定。此时\small h_{t}可以直接作为输出即\small o_{t},也可以经由简单的线性变换后输出。


embedding层:

把单词正整数编码变成一个密集向量,向量的元素是由浮点数组成,而不是0/1两个整数。字符不能作为神经网络的输入,输入是数字。embedding层将正整数或者one_hot编码转换为固定大小的向量,向量的每个元素都是浮点数。embedding层一般就用作第一层,为了生成向量。embedding层的输入一般包括:批处理数量(一共多少句话),单句话长度(单词数目)。输出一般包括:批处理数量,单词数目个密集向量,密集向量的长度。密集向量长度在设定embedding层的时候设定,同时设定单词的数目(输入要和这里设置的匹配)。

下面举个例子大家应该能更明白:假设设定embedding层规定:输入范围是0-999共1000个数字,向量长度64,单词个数16;给定输入:1000个数字中取得随机数,批处理数量为32,单词个数为16;得到输出:批处理数量为32,每个句子16个单词,每个单词长度为64。

假如不看批处理数量,我们可以直观用矩阵来表示:输入是one_hot编码,因此长度为1000,共有16个单词,因此是一个16*1000的矩阵,embedding层是输入范围为1000个数字,每个数字长度规定为64,因此是一个1000*64的矩阵,二者相乘得到16*64的矩阵,即每个句子16个单词,每个单词长度为64。相比one_hot编码,节约大量空间。


RNN(循环神经网络)层使用方法:

上述的\small h_{t}的计算一般是基于RNNCell来完成的。带Cell层一般是仅完成一个时间戳的前向运算,不带Cell的层也是基于Cell层的,在内部完成了多个时间戳的运算,比较方便。

SimpleRNNCell:简单来说就是代表了一个时间戳的输入输出运算。

一般会定义cell = layers.SimpleRNNCell(64),这表明经过这个Cell运算后得到的每个单词都是64维的向量。我们在这里要明白,每次对一个Cell的输入不是句子,而是一个单词。一句或很多个单词,依次输入每个Cell中,就是利用序列输入了循环神经网络。此时我们来看输出:由于就一个单词,因此输出是一个[句子数量,单词维度]的矩阵,并且作为状态向量\small h_{t}输入到下一个时间戳里面。还要强调一点是,经过循环神经网络一层层Cell最终循环神经网络的输出就是最后一个Cell的输出。

SimpleRNN:单层循环神经网络:layer = layers.SimpleRNN(64)。在此创建了向量长度为64的SimpleRNN层。给定输入,直接调用该神经网络即可。SimpleRNN直接就能完成整个前向运算,默认返回最后一个时间戳上的输出。


梯度裁剪:

循环神经网络随着层数加深,会出现权值连乘的情况,如果权值大于1多次连乘会导致梯度爆炸,如果权值小于1多次连乘会导致梯度弥散。根据我们梯度下降的公式,新参数=旧参数-学习率*梯度,如果梯度弥散会导致每次更新都使梯度保持不变,如果梯度爆炸会使得更新时参数突变。因此需要引入梯度裁剪来限制梯度。

方法1:tf.clip_by_value(a,0.6,0.8)可将张量a中的数值都限制在0.6~0.8之间。

方法2:限制梯度张量的范数来实现。tf.clip_by_norm(a,5),对于大于max(5)的 L2 范数的张量,通过裁剪后范数值缩减为 5。

这里简单介绍一下范数的概念:L0范数是张量中非0元素的个数;L1范数是张量中所有元素的绝对值之和;L2范数是张量中所有元素的平方和。

方法3:全局范数裁剪:神经网络的更新方向是由所有参数的梯度张量共同表示的,前两种方式只考虑单个梯度张量的限幅。可以通过 tf.clip_by_global_norm 函数快捷地缩放整体网络梯度𝑾的范数。

𝑾i表示网络参数的第𝑖个梯度张量,计算网络的总范数global_norm。

对𝑾i进行裁剪,其中max_norm是用户指定的全局最大范数值(自己给定)。

通过梯度裁剪能有效抑制梯度爆炸,防止网络恶化。

一般流程是:利用函数进行梯度计算,计算完成后进行梯度裁剪,最后进行更新参数。

梯度弥散一般通过增大学习率,减少网络深度,构建深度残差网络来实现。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《零基础入门深度学习(5) - 循环神经网络.pdf》是一本介绍深度学习中的循环神经网络的学习指南。循环神经网络是一种能够处理时间序列数据的机器学习模型,广泛应用于语言处理、自然语言生成、图像处理等领域。 该书以零基础入门为出发点,逐步介绍了深度学习循环神经网络的基本概念和原理,并通过实例演示了如何使用Python和常见的深度学习框架来构建和训练循环神经网络模型。 书中首先介绍了循环神经网络的基本结构和原理,包括循环单元的作用和实现方式。然后详细介绍了常见的循环神经网络模型,如LSTM和GRU,并解释了它们在处理长序列数据时的优势。 接下来,书中提供了大量的代码实例,帮助读者了解如何使用Python和深度学习框架来构建循环神经网络模型。这些实例包括文本情感分析、机器翻译、股票预测等应用场景,涵盖了循环神经网络在不同领域中的应用。 此外,该书还提供了一些常用的训练技巧和调参方法,帮助读者提高模型的性能和稳定性。最后,书中还介绍了一些最新的研究进展和发展趋势,帮助读者了解循环神经网络领域的最新动态。 总之,该书通过简单易懂的语言、清晰的实例和详细的代码解释,帮助读者快速入门深度学习中的循环神经网络。无论是初学者还是有一定基础的读者,都能从中获得实用的知识和技能,为在深度学习领域取得进一步的研究和实践打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值