从软件工程的角度写机器学习7——-LSTM网络实现

LSTM网络实现

问题描述

影片评价问题:
输入一个英文句子,输出好/坏的二元评价,比如
The movie is very bad -> 0
Wonderful -> 1

算法思路

本图中的数字仅为示例,并非真实数据
框图

Embedding层

在上一篇卷积神经网络的实现中,我们将类别直接映射为{0,0…1,…0}这样的向量,但对于单词而言,这个向量维度太大了(500个单词就是500维…),结合后面的时间序列展开会变成非常庞大,因此,我们需要新的方式。

新的方式就是引入一个Embedding Layer:
1、统计所有互不相同的单词个数,记为n。
2、先将单词转换为数字序号{0,1,2……,n-1}。
3、初始化一个 (n,m) 的系数矩阵。
4、读取序号所对应的行,这个m维向量即为转换结果
这个系数矩阵及这个映射即 Embedding Layer,系数矩阵通过后向传播算法训练。
毫无疑问,这个层的系数矩阵非常的大,训练它也是比较麻烦的,也可以用word2vec等现有的库去把单词转化为向量。

时间序列的处理

在情感分析这个问题中,每条句子的长短不一,而每个单词被映射为相同长度的向量,句子中的单词存在先后关系,因此构成了一个时间序列。

在实际计算中,时间序列按固定的迭代次数,展开处理。比如取定迭代次数为50,单词转化成的向量长度为10(m=10),则展开的向量为50*10=500。

句子的长短不一,有的比50大,那就截断,只取最后50个单词;有的比50小,就需要引入mask,标志这个展开向量后面若干是无效的。

LSTM公式

LSTM 层的输入是一个 t*m 的向量,输出也是一个 t*m 的向量,在运算时,分成 t 个 m 长度的向量逐个计算:
(x0,x1,x2,...,xt1,xt)>(h0,h1,h2,...,ht)

参考 http://deeplearning.net/tutorial/lstm.html
这篇文档讲得非常清楚,就是如下一系列的核心公式:
it=σ(Wixt+Uiht1+bi)
Ct¯=tanh(Wcxt+Ucht1+bc)
ft=σ(Wfxt+Ufht1+bf)
Ct=itCt¯+ftCt1
ot=σ(Woxt+Uoht1+bo)
ht=ottanh(Ct)

反向传播

Embedding 层的反向传播

Embedding 层的反向传播仅对系数有效。
在正向传播时记录下所选取的index,把相应的差分加到相应的行上去即可。
(详细待补)

LSTM 层的反向传播

LSTM层的反向传播需要分别计算
输入差: Δx0,Δx1,...,Δxt
以及系数差: ΔWi,ΔUi,Δbi,ΔWc,ΔUc,Δbc,ΔWf,ΔUf,Δbf,ΔWo,ΔUo,Δbo
为了计算,需要分别对 it,Ct¯,ft,Ct,ot,ht 求导展开,大致思路可以参考下面的草稿图(右上角那幅图是计算输入差的,其余是计算系数差,式中计算单元均是矩阵,最后的连线是矩阵乘法,之前的是矩阵元素乘法)

LSTM Backward

需要注意的是: Δhi 包括两个部分,第一部分由 Δhi+1 传递过来,第二部分是外连的层传递的(如果是接的 max 层,那只有 Δht 有输出层的反向传播)

LSTM的反向传播是相当麻烦的,如果实现了自动求导,会轻松不少。

代码工程

待补

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值