lstm需要优化的参数_LSTM的物理结构和一些细节

海晨威:一幅图真正理解LSTM的物理结构​zhuanlan.zhihu.com
cef3c2d317fa6ef7afd7caa370d8e670.png

a08002650f6cdc4cafb170ece8eda18e.png

这个是网上看的最多的图了,但是在理解lstm的应用过程中的时候这个图带来了不少麻烦。

6d696c9fafe89e3bfe0c87f79f2aa4dc.png

展开之后实际的物理结构是这样的,1、2图同颜色的点代表了同一个东西;

问题1:

6ecd4bcc50946a0e46336a1f0f699c11.png

这里的输入xt和ht是怎么结合的?比如:

cadc6330049edc4d6d1083036777bd21.png

这块儿很多地方都没讲清楚,实际上就是concat,直接concat起来了:

175b346680575ee688f2995ff6333230.png

问题2:LSTM的权重到底是啥样的?

这里直接以tf.keras的代码为例子看看就造了:

def build_model(look_back: int, batch_size: int=1) -> Sequential:model = Sequential()model.add(LSTM(units=128,activation='relu',batch_input_shape=(batch_size, look_back, 1),stateful=True,return_sequences=False))model.add(Dense(1, activation='linear'))model.compile(loss='mean_squared_error', optimizer='adam')return model
model = build_model(28, batch_size=1)

首先,当我们的units=128的时候,LSTM的最终输出(仅考虑最后一个时间步输出,并且不考虑sequence的输出)就是128维的向量定下来了,对应的输出就是:

1473fbd15c8d2e32807236f8e2dd6cf1.png

这里的最后一个ht的部分,注意这个ht既可以作为最终的输出,也是时间中的hidden state输入到下一个时间点的前向传播中去。

model.layers[0].trainable_variables

d85e0b2024ef7bbe9186f1dfb23fda71.png

Param <tf.Variable 'lstm_4/lstm_cell_4/recurrent_kernel:0' shape=(128, 512) dtype=float32, numpy=
array([[ 3.0333996e-03, 1.4155725e-02, -3.9381277e-02, ...,
4.0887762e-02, -3.1605218e-02, -1.7439183e-02],
[-5.2204579e-02, 1.6296864e-02, 4.4382092e-02, ...,
2.1501739e-02, 5.1224865e-02, -5.1180001e-02],
[ 1.9754471e-02, -2.7741276e-02, -3.0992866e-02, ...,
1.8080823e-02, -2.1589132e-02, 8.2989247e-04],
...,
[-2.9214425e-05, -2.5351198e-02, -4.1916996e-02, ...,
-5.0040476e-02, -1.1436570e-02, 4.7302879e-02],
[-4.4846401e-02, 3.3629253e-03, 1.7752033e-02, ...,
-4.5454025e-02, -8.5912934e-03, -1.8942051e-02],
[-1.8914735e-02, -4.9705409e-02, -5.3823508e-02, ...,
3.6144644e-02, -2.1415317e-02, 1.5490238e-02]], dtype=float32)>:

(截图不知道怎么搞的一直上传失败)

f3f09f1a91db0995acb5992f1aeb7c74.png

可以看到,LSTM层一共有3组参数,第一组是512个参数,我们的LSTM的units设置为128,因此

3190e12119f3fa811c3f40b9db6beb5a.png

ee2aa5888d85b623a78929b05e438f9b.png

这里的四个门,每一个门对应一个dense层,将input映射为128维,4个门一共4*128=512个参数,对应的就是第1组权重,注意,这里我们的输入的维度是1,因为就是简单的序列数据,没有其它的,所以这里第一个矩阵权重为(1,512),如果是embedding的话,比如embedding的维度是100,那么就是(100,512),tensorflow.keras这里把多个门的权重合并到一起来了。。。看了半天才看明白,其实严格一点应该是 4个 1*128的小矩阵,估计是为了工程上的便利和优化直接合并到一起了;

那么第三组的权重也很好理解,就是bias,

f3f09f1a91db0995acb5992f1aeb7c74.png

512个bias分别分配到这4个门的计算中;

最后是第二组权重,实际上就是

上一个时间步的ht-1到4个门的映射

6d696c9fafe89e3bfe0c87f79f2aa4dc.png

我们前面说过上一个时间步的ht-1和这个时刻的输入xt是concat的,所以应该是(128+1)*128*4 这样比较好理解,不过tf.keras的权重不是按照这样保存的就是了,所以看代码的时候会有一点疑惑,不过总算看明白了shift~

问题3 LSTM的两个dropout是drop啥?

LSTM中有两个dropout的参数:

一个是

| dropout: Float between 0 and 1. Fraction of the units to drop for the linear
| transformation of the inputs. Default: 0.

这个dropout实际上就是输入X的dropout,

dc7ffa295e626103ce6a83be0ea9d5f1.png

04d428f79ffdc2270bf3df24e4168312.png

也就是这个部分做dropout

一个是

| recurrent_dropout: Float between 0 and 1. Fraction of the units to drop for
| the linear transformation of the recurrent state. Default: 0.

686a3a369dda73b0f417ea025b26ec94.png

是针对于这个部分做dropout,

常规的dropout层是对LSTM最终的输出进行dropout。

问题四 :stateful LSTM 和 stateless LSTM有啥区别?

首先我们需要知道的是,我们平常大部分时候使用的LSTM都是属于stateless LSTM。

6ecd4bcc50946a0e46336a1f0f699c11.png

举个例子,比如情感分析:

“我 喜欢 你”当我们把这个句子的每个词embedding之后进入上面的这个LSTM的结构,到最终的时间步后,输出结束,此时,ht作为输出接一个分类层完成任务。

这个时候,tf.keras中的LSTM默认会reset_state,也就是

ecb802c7bdcda8b69f467ae2aeec9679.png

cell state和 hidden state都没有消失了。然后进入下一个句子的前向传播;

stateful LSTM则可以将当前句子的最终的cell state和hidden state的输出作为下个句子的初始的cell state和hidden state。

stateful LSTM:能让模型学习到你输入的samples之间的时序特征,适合一些长序列的预测,哪个sample在前,那个sample在后对模型是有影响的。
stateless LSTM:输入samples后,默认就会shuffle,可以说是每个sample独立,之间无前后关系,适合输入一些没有关系的样本。详细可见:
尤鱼哥:Keras之stateful LSTM全面解析+实例测试​zhuanlan.zhihu.com
757da6a1b25b16a9b7719d8560f2a4ce.png

很好理解了。

我们在做时间序列预测的时候可以同时考虑stateful LSTM和stateness LSTM看看哪个效果好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OLED中的Demura

OLED作为一种电流型发光器件已越来越多地被应用于高性能显示中。由于它自发光的特性&#xff0c;与LCD相比&#xff0c;AMOLED具有高对比度、超轻薄、可弯曲等诸多优点。但是&#xff0c;亮度均匀性和残像仍然是它目前面临的两个主要难题&#xff0c;要解决这两个问题&#xff…

python的编程模式有哪两种_python程序的两种运行方式是什么

python程序的两种运行方式是什么 第一种方式&#xff1a;REPL 所谓REPL即read、eva、print、loop&#xff08;读取、计算、打印、循环&#xff09;&#xff0c;实现REPL运行方式有以下两种&#xff1a; 1、IDLE&#xff08; 集成开发环境或集成开发和学习环境&#xff09;是Pyt…

halcon 旋转_Halcon视觉软件应该如何系统学习?

End 声明&#xff1a;部分内容来源于网络&#xff0c;仅供读者学习、交流之目的。文章版权归原作者所有。如有不妥&#xff0c;请联系删除。

JavaScript--关于变量提升思考

下面例子仅仅是思考变量提升使用&#xff1a; 在实际开发中并不推荐使用相同名字的变量和函数&#xff01; 1 // 如果变量和函数同名的话&#xff0c;函数优先提升 2 console.log(a); 3 function a() { 4 console.log(aaaaa); 5 } 6 var a 1; 7 console.log(a); 更多简单经典…

C++求复数的角度_【研读.教材分析】“勾股定理”教学——基于单元整体的角度再思考...

(西安市第八十六中学 刘丽丽)学科教学要注重知识的“生长点”和“延伸点”&#xff0c;把课时知识置于学科整体逻辑体系中&#xff0c;关注结构和通法&#xff0c;处理好局部与整体之间的关系。所以在北师大版八年级上册数学第一章《勾股定理》的备课中&#xff0c;我再次以问…

vc++64位系统下long的长度为4个字节_Java与系统硬件的亲密接触「伪共享」

作者&#xff1a;码洞来源&#xff1a;https://zhuanlan.zhihu.com/p/32764602在解释【伪共享】这个概念之前&#xff0c;我们先来运行一段代码&#xff0c;小编的电脑上有4个core。这个程序的逻辑是4个线程共享同一个数组读写不同下标的变量。每个线程循环1亿次读写&#xff0…

linux 端口号查看

linux 端口号查看netstat -anp |grep 端口号最后一列是端口号转载于:https://www.cnblogs.com/ditmark/p/7669804.html

pwm波如何控制电机代码_PWM波控制720电机

详细方案四&#xff1a;pwm与720电机控制电机硬件分析什么是电机&#xff1f;电机(俗称"马达")是指依据电磁感应定律实现电能转换或传递的一种电磁装置。它的主要作用是产生驱动转矩&#xff0c;作为用电器或各种机械的动力源。其中本四轴采用的电机是直流电机。直流…

arduino使用oled代码_【惊不?】Arduino改造古董卡西欧计算器为作弊神器

一台朴实无华的计算器&#xff0c;卡西欧牌。看起来和千万学子们所使用的计算器一样&#xff0c;没什么特别的&#xff0c;还带着一些陈旧的使用痕迹。但如果你用磁铁碰一下&#xff1a;咦&#xff0c;简直像打开了探险电影里的神秘机关&#xff0c;右上角的太阳能电池板部分居…

python字符串数组_python将字符串转换成数组的方法

Python这篇文章主要介绍了Python __setattr__、 __getattr__、 __delattr__、__call__用法示例,本文分别对这几个魔法方法做了讲解,需要的朋友可以参考下 ... junjie4882019-11-22 Python这篇文章主要介绍了Python实现list反转的方法,实例总结了关于list的各种较为常见的操作技…

vsc写vue生成基本代码快捷键_基于vue2.X的webpack基本配置,教你手动撸一个webpack4的配置...

webpack说复杂也不复杂。不复杂&#xff0c;核心概念不外乎是entry, output, loader, plugins。webpack4还新增了optimization选项&#xff0c;用于代码分割和打包优化。现在webpack官网文档已经写的挺棒了。而当你真正开始手写一个webpack.config.js的时候&#xff0c;你就会发…

几款效率神器助你走上人生巅峰

一、背景 在我的工作和生活中&#xff0c;我一直都很注重效率工具的使用&#xff0c;这么些年下来也积累好几款很不错&#xff0c;但是又不为大多数人所熟知的软件工具&#xff0c;我用起来得心应手&#xff0c;很不错。那我就像在此给大家做个分享&#xff0c;希望你们都能多多…

macos下载的安装包在哪里_macbook任意降级,为您带来mac os完美降级教程

最近有许多用户反映升级了最新的系统出现了各种奇葩问题&#xff0c;更关键的是&#xff0c;很多常用&#xff08;专业&#xff09;软件不能使用了。因此有许多用户想要降级&#xff0c;现在macdown小编为您带来mac os完美降级教程&#xff0c;有需要的赶紧收藏啦&#xff01;第…

kodi刮削器 中文_教你PLEX插件播放4K不能使用KODI解码导致卡顿的解决办法

文章作者Hao4K用户nothero自从买了这个索尼9500g&#xff0c;三天两头的出问题&#xff0c;而且还经常重启&#xff0c;经常卡顿。大法的画质确实不错&#xff0c;但是这系统稳定性实在是不敢恭维...最近装了一个KODI-PLEX插件&#xff0c;安利安利{:4_96:}&#xff0c;画面实在…

玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息...

项目的Github地址&#xff1a;https://github.com/ggrcwxh/LastTime 采用基于git的多人协作开发模式 软件采用mvc设计模式&#xff0c;前端这么艺术的事我不太懂&#xff0c;交给斌豪同学去头疼了。第一轮先实现查询通话记录返回对应号码上一次的通话时间。 真机测试下的效果图…

jvm垃圾回收机制_深入理解JVM的垃圾回收机制

​如何判断对象已“死”Java堆中存放着几乎所有的对象实例&#xff0c;垃圾回收器在堆进行垃圾回收前&#xff0c;首先要判断这些对象那些还存活&#xff0c;那些已经“死去”。判断对象是否已“死”有如下几种算法&#xff1a;1引用计数法引用计数法描述的算法为&#xff1a;给…

chown -r oracle:oinstall /oracle,CentOS7安装Oracle12c图文详解

root身份安装依赖包&#xff1a; yum -y install binutils compat-libcap1 compat-libstdc-33 compat-libstdc-33*.i686 elfutils-libelf-devel gcc gcc-c glibc*.i686 glibc glibc-devel glibc-devel*.i686 ksh libgcc*.i686 libgcc libstdc libstdc*.i686 libstdc-devel li…

在苹果笔记本如何使用python_mac下如何将python2.7改为python3

1.查看当前电脑python版本 python -V // 显示2.7.x 2.用brew升级python brew update python 3.如果安装成功&#xff0c;去系统目录下回看到两个版本的python cd usr/local/Cellar/ //到此目录下 cd python/ //进入python目录下 查看已安装的python版本&#xff0c;如果有2.x 和…

[BZOJ1834][ZJOI2010]network 网络扩容 最大流+费用流

1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 3330 Solved: 1739 [Submit][Status][Discuss]Description 给定一张有向图&#xff0c;每条边都有一个容量C和一个扩容费用W。这里扩容费用是指将容量扩大1所需的费用。求&#xff1a; 1、 …

python需要花钱下载吗_用Python下载知乎视频,非常实用

原标题&#xff1a;用Python下载知乎视频&#xff0c;非常实用Python下载知乎视频。 # -*- coding: utf-8 -*- """ 下载知乎视频&#xff1a; 依赖&#xff1a; pip install requests mac 安装 ffmpeg: brew install ffmpeg """ import re impor…