RNN-RBM for music composition 网络架构及程序解读

RNN(recurrent  neural network)是神经网络的一种,主要用于时序数据的分析,预测,分类等。

RNN的general介绍请见下一篇文章《Deep learning From Image to Sequence》。本文针对对deep learning有一点基础(神经网络基本training原理,RBM结构及原理,简单时序模型)的小伙伴讲一下Bengio一个工作(RNNRBM)的原理和实现。

本文重点内容:针对RNN(recurrent neural network)一个应用:music composition进行架构和程序解读,参见paper:Modeling Temporal Dependencies in high-dimensional Sequences

-----------------------------------------------------------------

Content:

1. RNN 的 general 架构及思想

2. RNN-RBM的定义

2.1 RTRBM结构

2.2 RNN-RBM网络架构

2.3 RNN-RBM的训练

3. RNN-RBM的实现及程序解读

-----------------------------------------------------------------

1. RNN 的 general 架构及思想

RNN是处理时序数据的NN模型,旨在建立时序数据模型,做模拟/预测/分类等。

fig1. Architecture of RNN

如上图A所示为RNN的基本结构,简单的说RNN就是由input units (u), internal units (x), output units (y)组成的neural network. 其中internal units 层内会有连接形成环。Intuitively,这样做的目的是希望让网络下一时刻的状态与当前时刻相关,即,一个有记忆的网络。

展开!如图B,是在t-1, t, t+1时刻network的参数传递(仅展示出forward-propagation中节点间相互decision情况)

2. RNN-RBM的定义:

2.1 RTRBM结构

首先我们以RTRBM(RNNRBM简化版,由Sutskever于08年提出)介入。以下是RTRBM的结构:

图中每一个红框框住了一个RBM,h是hidden states,v是visible nodes,比如表示为某一时刻的语音等(但实际上为了增加维度有些工作会把v(t)扩展为前后共n帧data的value),双向箭头表示h和v生成的条件概率,即:

(1)

其中σ是sigmoid函数。

对于每个时刻的RBM,v和h的联合概率分布为:

(2)

其中A(t)=,即所有t时刻之前的{v,h}集合。

此外对于RTRBM,可以理解为每个时刻可以由上一时刻的状态h(t-1)对该时刻产生影响(通过W‘和W‘‘),然后通过RBM得到一个(h(t),v(t))稳态。由于每一个参数都和上一时刻的参数有关,我们可以认为只有bias项是受hidden影响的,这样效果是一样的,即:

(2)

2.2 RNN-RBM网络架构

看到了RTRBM这个结构,bengio他们就想了,RTRBM结构里hidden layer描述的是visible的条件概率分布,只能保存暂时的信息(他应该指的是达到稳态后),那我能不能把这些rbm里的hidden layer用RNN代替?于是就冒出了RNN-RBM:

其中每个红框依然框住一个RBM,而下面绿框就表示了一个按时间展开了的RNN。这样设计的好处是把hiddenlayer分离了,一部分(h)只用于表示当前RBM的稳态state,另一部分(h^)表示RNN里的hidden节点。

PS:    关于RNN的网络结构:v(visible),u(internal units),h(hidden)

边:v-u, u-v, v-h(双向边,==h-v), u-h, u-u(实际上是环,只不过时序模型中unfold成u^t-u^{t+1})
这些边在不同level(sequence的不同时刻)是共享权值滴。
所以我们实际上要优化的参数就是上面的5个weight matrix加bv,bh,bu

2.3 RNN-RBM 的训练

1. 由计算h^

2. 由(2)计算bh, bv,并根据k-step block gibbs采样得到v(t)

3. 通过NLL的cost对RBM里的参数(W, bh, bv)进行求导并更新

4. 估计RNN参数(W2, W3, bh^)并进行更新

3. RNN-RBM的实现及程序解读

3.1 准备工作及环境配置

3.1.1  参考程序见 : http://deeplearning.net/tutorial/rnnrbm.html

3.1.2  下载midi包(http://www.iro.umontreal.ca/~lisa/deep/midi.zip),extract到python包目录下(我的是/usr/lib/python2.7/dist-packages)

3.1.3  下载数据集(Nottingham Database of folk tunes),放在代码同文件夹下的data/

3.2 程序关键点解读:

1. build_rbm: 构建单个RBM, 进行k次vhv采样

输入:5个参数v(visible), W(RBM weight), bv(v_bias), bh(h_bias), k(param k in CD-k)
    输出:
        v_sample(CD-k对visible的采样结果),
        cost(RBM中的cost<NLL>,即FE(input)-FE(v_sample), FE表示Free Energy. 后面要用cost对参数求导),
        monitor(cost monitor,CD-k中用重构cross-entropy代替上面cost用来观测)
        updates(Gibbs采样的update dictionary)

2. build_rnnrbm: 构建RNN-RBM
    输入:n_visible, n_hidden(conditional RBM 的隐节点数), n_hidden_recurrent(RNN的隐节点数)
          default:n_visible = 88(钢琴音阶),n_hidden = 150, n_hidden_recurrent = 100
    输出:
        v: 训练的时序数据
        v_t: visible 的采样时序数据
        params: W,bv(b_vias),bh,Wuh,Wuv,Wvu,Wuu,bu (8个待train参数)
        v_sample, cost, monitor, updates_rbm = build_rbm(v, W, bv_t[:], bh_t[:], k=15)
        updates_train: 训练模式下的param更新dictionary
        updates_generate: 生成模式下param更新dictionary
    嵌套函数:
        recurrence(v_t, u_tm1):
        训练模式下,直接根据当前v_t和u_tm1生成u_t
        生成模式下,v_t输入为None,recurrence从全零开始gibbs采样k次生成v_t,并计算相应u_t
    注: line 156: (u_t, bv_t, bh_t), updates_train = theano.scan(lambda v_t, u_tm1, *_: recurrence(v_t, u_tm1),sequences=v, outputs_info=[u0, None, None], non_sequences=params)对sequence=v的每一个时刻跑recurrence得到相应bv_t,bh_t;然后用它们估计下一时刻的v(gibbs sampling):v_sample, cost, monitor, updates_rbm = build_rbm(v, W, bv_t[:], bh_t[:], k=15)

3. RnnRbm.train:
    输入:files: 文件名,batch_size, num_epochs
    功能:训练模式。将train目录下的每个mid文件分成batch进行SGD更新参数,并计算cost.
    输出:train目录下所有mid文件的cost均值

4. RnnRbm.generate:
    功能:生成模式。用build_rnnrbm的recurrence生成长为updates_generate的n_step(line 166:默认为200)的sequence.
    (v_t, u_t), updates_generate = theano.scan(lambda u_tm1, *_: recurrence(None, u_tm1),outputs_info=[None, u0], non_sequences=params, n_steps=200)

5. 几个n_steps:
    1.  line 60: chain, updates = theano.scan(lambda v: gibbs_step(v)[1], outputs_info=[v], n_steps=k)的k表示Gibbs的CD-k采样采k次而不等到converge

2.line 148: recurrence中 v_t, _, _, updates = build_rbm(T.zeros((n_visible,)), W, bv_t, bh_t, k=25);k=25 表示recurrence进行Gibbs采样25次(意义同1)

3. line 164: (v_t, u_t), updates_generate = theano.scan(lambda u_tm1, *_: recurrence(None, u_tm1), outputs_info=[None, u0], non_sequences=params, n_steps=200) 生成模式下n_step=200即生成的sequence(v_t)长200, 哪为什么最后可视化出来横坐标只有60呢?看RnnRbm中dt的作用。最后我们画的是extent = (0, self.dt * len(piano_roll)) + self.r。这里默认dt = 0.3,len(piano_roll)=200. 懂了?
    
    4. line 156: (u_t, bv_t, bh_t), updates_train = theano.scan(lambda v_t, u_tm1, *_: recurrence(v_t, u_tm1), sequences=v, outputs_info=[u0, None, None], non_sequences=params)这里没有显示n_step,但是scan的重复次数0实际上是由sequence长度定的。

时间: 2024-08-24 03:24:14

RNN-RBM for music composition 网络架构及程序解读的相关文章

B/S网络架构

B/S基于统一的应用层协议HTTP来交互数据,目前的B/S网络架构大多采用如图所示的架构设计,既要满足海量用户访问请求,又要保持用户请求的快速响应. 当一个用户在浏览器输入www.taobao.com这个URL时,将会发生很多操作.首先它会请求DNS把这个域名解析成对应的IP地址,然后根据这个IP地址在互联网中找到对应的服务器,向这个服务器发起一个get请求,由这个服务器决定返回默认的数据资源给访问的用户.在服务器端实际上还有很复杂的业务逻辑:服务器可能有很多台,到底指定哪台服务器来处理请求:还

企业网络架构规划及配置实施(实用)

企业基础网络架构规划及配置实施 一.网络规划 出口地址段:202.1.1.0/24 路由器出口:202.1.1.1/24 ISP网关:202.1.1.2/24 互联地址段 192.168.90.0/24 路由器:192.168.90.1/24 核心交换机:192.168.90.2/24 管理地址段:192.168.100.0/24 核心管理地址:192.168.100.1/24 接入LI-1:192.168.100.11/24 接入LI-2:192.168.100.12/24 接入LI-3:19

网络架构

网络架构: 两种:C/S Client Server 特点: 客户端和服务端都需要填写. 客户端需要维护. 客户端可以分担部分运算. 如大型运算,比如网络游戏. B/S Browser Server 特点: 只需要编写服务端,客户端其实就是已有的浏览器. 客户端是不需要维护的. 运算全在服务端.

网络架构、云平台和微信公众平台开发接入

版权声明:本文为博主原创文章,未经博主允许不得转载. 云与后端相关的技术似乎并不属于嵌入式和物联智能硬件开发工程师的范畴,但是嵌入式开发工程师有必要认识成熟的网络架构和相关的云技术,以拓展自己在系统架构方面的视野.大数据分析是物联网背后的核心价值,物联智能硬件是物联大系统的终端,开发工程师不仅要深入精通物联技术,也应该去理解大系统,甚至整个生态领域的相关技术. 作为嵌入式开发工程师,也许并不需要熟悉云和后端的技术开发,但至少要对其中用到的技术和接口有一定的认识. 一.网络架构 常见的网络架构分为

[转]漫谈数据中心CLOS网络架构

http://djt.qq.com/article/view/238 1.数据中心网络架构挑战 随着技术的发展,数据中心的规模越来越大,一个数据中心的服务器容量从几年前的几千台服务器发展到今天的几万甚至几十万台.为了降低网络建设和运维成本,数据中心网络的设计者们也竭力将一个网络模块的规模尽可能扩大.同时,数据中心网络内部东西向流量也日益增加,在一些集群业务的需求驱动下,数据中心网络设计者们甚至开始讨论一个网络模块内10000台千兆线速服务器的可能性. 常见的数据中心网络模块的典型架构是双核心交换

1.HCNA-HNTD——企业网络架构介绍

最初,企业网络是指某个组织或机构的网络互联系统.企业使用该互联 系统主要用于共享打印机.文件服务器等,使用email实现用户间的高效 协同工作.现在,企业网络已经广泛应用在各行各业中,包括小型办公 室.教育.政府和银行等行业或机构. 大型企业的网络往往跨越了多个物理区域,所以需要使用进程互连技术 来连接企业总部和分支机构,从而使得出差的员工能随时随地接入企业 网络实现移动办公,企业的合作伙伴和客户也能够及时高效的访问到企业的相应资源及工具.在实现进程互连的同时,企业还会基于对数据的 私密性和安全

Openstack Liberty网络架构实现分析(一)

春节前在研究Openstack最新版本Liberty网络时,发现了一篇较好的介绍Liberty网络实现和一些新技术的文章.经过仔细研究后决定写写研究后的体会. 此系列文章分为7个部分,分别介绍: 1.Liberty网络总览 2.网络架构 3.Neutron配置 4.网络创建 5.添加路由.网络和子网 6.在租户网络启动虚机 7.在FLAT网络启动虚机 文章连接:OpenStack Liberty Neutron Deployment (Part 1-7 Overview) http://www.

深入理解openstack网络架构(1)

原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture 前言 openstack网络功能强大同时也相对更复杂.本系列文章通过Oracle OpenStack TechPreview介绍openstack的配置,通过各种场景和例子说明openstack各种不同的网络组件.本文的目的在于提供openstack网络架构的全景图并展示各个模块是如何一起协作的.这对openstack的初学者

网络运行原理/网络架构/http协议

1 网络架构B/S 架构 :浏览器/服务器 网站(性能放在服务器上 )C/S 架构: 客户端/服务器 qq 微信 快播 大公司 游戏客户端(性能取决于自己的电脑) window mac DNS:域名解析系统  有时候出现qq可以用  网站不能 访问 可以重置移动dns 1.1. HTTP协议 http://www.itsource.cn 1.HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议之上的一个应用层协议,用于定义WEB浏览器与W