白话机器学习-循环神经网络RNN

一 背景

本章将要介绍一种常用的神经网络结构 – 循环神经网络(recurrent neural network,RNN)。常规的神经网络比如全连接网络只能单独孤立的处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某种情况下,输入是有序列关系的,需要网络能够更好的处理序列的信息。

这种需要处理「序列数据 – 一串相互依赖的数据流」的场景就需要使用 RNN 来解决了。

典型的几种序列数据:

  1. 文章里的文字内容
  2. 语音里的音频内容
  3. 股票市场中的价格走势
  4. ……

二 循环神经网络简介

2.1 深度神经网络

传统的机器学习算法非常依赖人工提取的特征,在的图像识别、语音识别以及自然语言处理等领域存在特征提取的瓶颈。而基于全连接神经网络的方法也存在着参数过多、无法基于数据中的时序信息进行特征提取的问题。

循环神经网络通过挖掘时序数据中的时域信息,刻画相关的深度表达能力,在语音识别、语言模型、机器翻译等方面取得的重大的突破。

全连接神经网络或者卷积神经网络的模型结构特点,都是从输入层到隐含层再到输出层,层与层之间是全连接或者部分连接,但是每层之间是无连接的

考虑到这样一个问题,如果要预测句子的下一个单词是什么的时候,一般是需要使用到当前单词以及以前的单词,因为句子中的前后单词是有逻辑关系存在的。比如,当前单词是“非常”,如果前一个单词是“算法”,那么下一个单词大概率是“卷”,上下文之间有逻辑关联。这种情况下全连接神经网络与卷积神经网络就不合适,而循环神经网络就非常适合这种情景,并且它独特的网络结构-隐层的节点之间是有连接的,进而深度刻画一个时序当前的输出与之前信息的关系。

2.2 循环神经网络

有图真香,请看到下图

通过上图先对RNN的结构有一定的理解,整个RNN的网络结构由输入层、隐藏层与输出层组成,并且在隐藏层之间有相互的连接

下面我们详细分析下RNN的网络结构中的循环体

  • 网络结构 - 循环体:通过上图左侧与右侧(按照时间展开)的观察,整个的网络结构类似一个循环体,同时循环体内部又包含两个全连接层比如 S t 和 O t S_t和O_t StOt的计算。
  • 输入层:X是一个向量,它表示输入层的值,并且与隐藏层之间不是全连接,而是按照时刻进行与隐藏层之间进行对齐连接。
  • 隐藏层:S是一个向量,它表示隐藏层的值(节点数与向量S的维度相同);
  • 输出层:O是一个向量,它表示输出层的值;
  • 模型参数:U是输入层到隐藏层的权重矩阵,V是隐藏层到输出层的权重矩阵,W是隐藏层到隐藏层的权重矩阵,并且各个时刻的U、V、W矩阵共享参数

下面我们详细分析下RNN的算法流程

  1. 假设目前的网络处于t时刻,先分析一个循环体的运行过程,多个循环体就是单个的重复

  2. 循环体的输入与普通的全连接不一样的是,他有两路输入,需要将两路输入合并,合并后就与普通的全连接网络没啥两样,那么此时的输入是

    1. 输入层时刻t值 X t X_t Xt

    2. 隐藏层上一时刻值 S t − 1 S_{t-1} St1

  3. 计算时刻t的隐藏层的值,同时也是下一个时刻的输入值

    S t = f ( X t ∗ U + S t − 1 ∗ W ) S_t = f(X_t * U + S_{t-1} * W) St=f(XtU+St1W) 并且由于进行矩阵的维度拼接,可以简写为 S t = f ( ( X t ⊕ S t − 1 ) ∗ ( U ⊕ W ) ) S_t = f((X_t ⊕ S_{t-1}) * (U ⊕ W)) St=f((XtSt1)(UW))

  4. 计算时刻t的输出层的值

O t = g ( S t ∗ V ) O_t = g(S_{t} * V) Ot=g(StV)

  1. 至此一个循环体的全连接过程计算完毕,然后后续的 S t + 1 、 S t + 1 . . . . S_{t+1}、S_{t+1} .... St+1St+1....等时刻重复这个过程即可。

三 实战

下面,我们通过示例构造一个RNN的网络来进一步讲解与分析RNN的网络结构。

  • 假设隐藏层的状态的维度是2,输入层与输出层的维度都是1,并且循环体中的用于计算隐层状态的全连接层的参数 W s ( U ⊕ W ) W_s(U ⊕ W) Ws(UW)假设为

[ 0.1 0.2 0.3 0.4 0.5 0.6 ] \begin{bmatrix} 0.1&0.2 \\ 0.3&0.4 \\0.5& 0.6\end{bmatrix}\quad 0.10.30.50.20.40.6

  • 假设循环体中的用于计算隐层状态的全连层的偏置项为 b s = [ 0.1 , − 0.1 ] b_s = [0.1, -0.1] bs=[0.1,0.1]

  • 假设循环体中的用于计算输出层的全连接层的权重是:

[ 1.0 2.0 ] \begin{bmatrix} 1.0 \\ 2.0 \end{bmatrix}\quad [1.02.0]

  • 假设循环体中的用于计算输出层的全连接层的偏置项为 b s = [ 0.1 ] b_s = [0.1] bs=[0.1]
  • 假设初始状态为[0, 0],在 t 0 t_0 t0时刻输入是1,那么进行向量拼接得到[0, 0, 1],则循环体中的用于计算隐层状态的全连接层为如下,同时这个结果也将作为下一个时刻的输入状态。

t a n h [ [ 0 , 0 , 1 ] × [ 0.1 0.2 0.3 0.4 0.5 0.6 ] + [ 0.1 , − 0.1 ] ] = t a n h ( [ 0.6 , 0.5 ] ) = [ 0.537 , 0.462 ] tanh \left[[0,0,1] \times \begin{bmatrix} 0.1 &0.2 \\0.3&0.4\\0.5&0.6\end{bmatrix}\quad + [0.1, -0.1]\right] = tanh([0.6, 0.5]) = [0.537, 0.462] tanh[0,0,1]×0.10.30.50.20.40.6+[0.1,0.1]=tanh([0.6,0.5])=[0.537,0.462]

  • 那么用于计算输出层 O t O_t Ot的全连接层为

[ 0.537 , 0.462 ] × [ 1.0 2.0 ] = 1.56 [0.537, 0.462] \times \begin{bmatrix} 1.0\\2.0\end{bmatrix}\quad = 1.56 [0.537,0.462]×[1.02.0]=1.56

  • 类似的推导,我们可以得到 t 1 t_1 t1时刻的状态为[0.860, 0.884],输出为2.73。在得到循环神经网络的前向传播的结果之后,可以和其他的神经网络结构一样定义Loss损失函数。

四 源码

通过上面的讲解与分析,相信大家对RNN应该已经有了全面的理解,下面附上代码,大家可以通过代码再进行下加深理解。

#coding=utf-8
#简单的RNN网络前向传播结构实现
import numpy as np

#定义输入以及初始状态,后面的状态都是动态计算
X=[1,2]
state = [0.0,0.0]

#分开定义参数,便于计算
w_cell_state = np.asarray([[0.1,0.2],[0.3,0.4]])
w_cell_input = np.asarray([0.5,0.6])
b_cell = np.asarray([0.1,-0.1])
w_output=np.asarray([[1.0],[2.0]])
b_output = np.asarray([0.1])

for i in range(len(X)):
    before_activation = np.dot(state,w_cell_state)+X[i]*w_cell_input+b_cell
    state = np.tanh(before_activation)
    final_output = np.dot(state,w_output)+b_output
    print("before activation: ",before_activation)
    print("state",state)
    print("output:",final_output)

github地址:https://github.com/dubaokun/code/tree/master/3-Machine-Learning/2-deep-ml/rnn/rnn.py

五 番外篇

个人介绍:杜宝坤,隐私计算行业从业者,从0到1带领团队构建了京东的联邦学习解决方案9N-FL,同时主导了联邦学习框架与联邦开门红业务。
框架层面:实现了电商营销领域支持超大规模的工业化联邦学习解决方案,支持超大规模样本PSI隐私对齐、安全的树模型与神经网络模型等众多模型支持。
业务层面:实现了业务侧的开门红业务落地,开创了新的业务增长点,产生了显著的业务经济效益。
个人比较喜欢学习新东西,乐于钻研技术。基于从全链路思考与决策技术规划的考量,研究的领域比较多,从工程架构、大数据到机器学习算法与算法框架均有涉及。欢迎喜欢技术的同学和我交流,邮箱:baokun06@163.com

六 公众号导读

自己撰写博客已经很长一段时间了,由于个人涉猎的技术领域比较多,所以对高并发与高性能、分布式、传统机器学习算法与框架、深度学习算法与框架、密码安全、隐私计算、联邦学习、大数据等都有涉及。主导过多个大项目包括零售的联邦学习,博哥与社区做过多次分享,另外自己坚持写原创文章,多篇文章有过万的阅读。公众号大家可以按照话题进行连续阅读,里面的章节我都做过按照学习路线的排序,话题就是公众号里面下面的标红的这个,大家点击去就可以看本话题下的多篇文章了,比如下图(话题分为:一、隐私计算 二、联邦学习 三、机器学习框架 四、机器学习算法 五、高性能计算 六、广告算法 七、程序人生),知乎号同理关注专利即可。

一切有为法,如梦幻泡影,如露亦如电,应作如是观。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值