再探循环神经网络

逻辑清韵
• 阅读 1578

上一篇中,我们讨论了循环神经网络相关的基本内容,今天我们继续探讨一下循环神经网络还有那些需要注意的更高级的用法。

降低过拟合

在之前的讨论中,我们经常聊起过拟合的问题,我们一般判断训练的网络什么情况下算作训练完成,查看其精度和损失时,也都看的是其过拟合之前的数据,避免过拟合的一种方法是用 dropout 方法,随机清零的方式去实现,但是在循环神经网络中,这个问题就有点复杂了。

人们在大量的实验中早已经发现,在循环层前进行 dropout 对于降低过拟合没什么帮助,甚至可能会影响网络的正常训练,在循环层中如何 dropout 是在 2015 年的一篇论文中提出来的,具体的方式是:在每一个时间步中,使用相同的 dropout 掩码,并且将这个不随时间步变化的 dropout 掩码应用于层的内部循环激活,这样就可以将其学习的误差传递下去,如果在 Keras 中使用 LSTM、GRU 等循环神经网络都可以通过设置 dropout(输入单元 dropout) 和 recurrent_out (循环单元 dropout)来降低过拟合,一般情况下,最佳情况不会有大的下降,但会稳定更多,是调优网络的一个思路。用的方法是:

model.add(layers.GRU(32, dropout=0.2, recurrent_dropout=0.2, input_shape=(None, float_data.shape[-1])))

循环层堆叠

我们训练网络一般的过程都是构建一个网络,在未出现严重过拟合前我们都会尽可能大的增加网络容量(让特征点更多),这有助于让网络模型更好的抓住数据的特征,对于循环神经网络,也是类似的思路,进行循环层的堆叠,且一般情况下,都会让数据变得更好,这是最常用其有效(使数据变好,具体提高程度视情况而不同)的调优方法,Google 产品中有挺多类似的做法。用的方法是:

model.add(layers.GRU(32, dropout=0.1, recurrent_dropout=0.5, return_sequences=True, input_shape=(None, float_data.shape[-1])))
model.add(layers.GRU(64, activation='relu', dropout=0.1, recurrent_dropout=0.5))

使用双向 RNN

针对这个问题,我一直觉得是一个玄学。双向 RNN,顾名思义,就是这个循环网络中包含两个方向相反的普通 RN,一个正向处理数据,一个反向处理数据,因为我们知道 RNN 是对顺序敏感的前一项处理出的数据值,会作用到下一项数据上,因此数据的不同不同方向的处理会获取到数据的不同特征,或者说反向的 RN 会识别出被正向 RN 忽略的特征,进而补充正向 RN 的不足,如此一来,可能使得整个 RNN 效果更好,略有玄学特征但是也可以理解吧,总之这也是一个有效的办法。用的方法是:

model.add(layers.Bidirectional(layers.LSTM(32)))

对于神经网络来说,具体哪一种调优的方法真的有效效果更好,其实根据实际问题实际的数据有比较大的差别,不能一概而论,因此这也是一项需要经验和耐心的工作,也许你还会发出这样的疑问:“我去,为什么这样不行?我去,为什么这样还不行?我去,为什么这样行了?”

当然,还有一些其他的方法对于更好的训练网络可能有用,比如调节激活函数、调节优化器学习率等,用点耐心会训练出你满意的网络的。

循环神经网络就暂时先讨论这些吧,还有很多细节但是很重要的问题还没有详细介绍,日后有机会继续讨论。

愿世界和平!

  • 本文首发自公众号:RAIS
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
机器学习基础
本章涵盖了以下主题:分类和回归之外的其他类型的问题;评估问题,理解过拟合、欠拟合,以及解决这些问题的技巧;为深度学习准备数据。请记住,在本章中讨论的大多数技术都是机器学习和深度学习通用的,一部分用于解决过拟合问题的技术(如dropout)除外。4.1 三类机器学习问题在之前的所有例子中,尝试解决的是分类(预测猫或狗)或回归(预测用户在平台上花费的平均时
机器学习基础
机器学习基础本章涵盖了以下主题:分类和回归之外的其他类型的问题;评估问题,理解过拟合、欠拟合,以及解决这些问题的技巧;为深度学习准备数据。请记住,在本章中讨论的大多数技术都是机器学习和深度学习通用的,一部分用于解决过拟合问题的技术(如dropout)除外。4.1 三类机器学习问题在之前的所有例子中,尝试解决的是分类(预测猫或狗)或回归(预测用户在平台上
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
逻辑清韵
逻辑清韵
Lv1
独怜幽草涧边生,上有黄鹂深树鸣。春潮带雨晚来急,野渡无人舟自横。
文章
4
粉丝
0
获赞
0