BPTT

BPTTRNN的BP——BackPropagationThroughTime.参考:零基础入门深度学习(5)-循环神经网络。知乎。1   defbackward(self,sensitivity_array,2activator):3”’4实现BPTT…

大家好,又见面了,我是你们的朋友全栈君。

RNN 的 BP —— Back Propagation Through Time.

参考:零基础入门深度学习(5) – 循环神经网络知乎

 

BPTT

BPTT

BPTT

BPTT

BPTT

 1   def backward(self, sensitivity_array, 
 2                  activator):
 3         '''
 4         实现BPTT算法
 5         '''
 6         self.calc_delta(sensitivity_array, activator)
 7         self.calc_gradient()
 8     def calc_delta(self, sensitivity_array, activator):
 9         self.delta_list = []  # 用来保存各个时刻的误差项
10         for i in range(self.times):
11             self.delta_list.append(np.zeros(
12                 (self.state_width, 1)))
13         self.delta_list.append(sensitivity_array)
14         # 迭代计算每个时刻的误差项
15         for k in range(self.times - 1, 0, -1):
16             self.calc_delta_k(k, activator)
17     def calc_delta_k(self, k, activator):
18         '''
19         根据k+1时刻的delta计算k时刻的delta
20         '''
21         state = self.state_list[k+1].copy()
22         element_wise_op(self.state_list[k+1],
23                     activator.backward)
24         self.delta_list[k] = np.dot(
25             np.dot(self.delta_list[k+1].T, self.W),
26             np.diag(state[:,0])).T
27     def calc_gradient(self):
28         self.gradient_list = [] # 保存各个时刻的权重梯度
29         for t in range(self.times + 1):
30             self.gradient_list.append(np.zeros(
31                 (self.state_width, self.state_width)))
32         for t in range(self.times, 0, -1):
33             self.calc_gradient_t(t)
34         # 实际的梯度是各个时刻梯度之和
35         self.gradient = reduce(
36             lambda a, b: a + b, self.gradient_list,
37             self.gradient_list[0]) # [0]被初始化为0且没有被修改过
38     def calc_gradient_t(self, t):
39         '''
40         计算每个时刻t权重的梯度
41         '''
42         gradient = np.dot(self.delta_list[t],
43             self.state_list[t-1].T)
44         self.gradient_list[t] = gradient

 

 1 class RNN2(RNN1):
 2     # 定义 Sigmoid 激活函数
 3     def activate(self, x):
 4         return 1 / (1 + np.exp(-x))
 5 
 6     # 定义 Softmax 变换函数
 7     def transform(self, x):
 8         safe_exp = np.exp(x - np.max(x))
 9         return safe_exp / np.sum(safe_exp)
10 
11     def bptt(self, x, y):
12         x, y, n = np.asarray(x), np.asarray(y), len(y)
13         # 获得各个输出,同时计算好各个 State
14         o = self.run(x)
15         # 照着公式敲即可 ( σ'ω')σ
16         dis = o - y
17         dv = dis.T.dot(self._states[:-1])
18         du = np.zeros_like(self._u)
19         dw = np.zeros_like(self._w)
20         for t in range(n-1, -1, -1):
21             st = self._states[t]
22             ds = self._v.T.dot(dis[t]) * st * (1 - st)
23             # 这里额外设定了最多往回看 10 步
24             for bptt_step in range(t, max(-1, t-10), -1):
25                 du += np.outer(ds, x[bptt_step])
26                 dw += np.outer(ds, self._states[bptt_step-1])
27                 st = self._states[bptt_step-1]
28                 ds = self._w.T.dot(ds) * st * (1 - st)
29         return du, dv, dw
30 
31     def loss(self, x, y):
32         o = self.run(x)
33         return np.sum(
34             -y * np.log(np.maximum(o, 1e-12)) -
35             (1 - y) * np.log(np.maximum(1 - o, 1e-12))
36         )

 

转载于:https://www.cnblogs.com/niuxichuan/p/8094800.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152280.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 国内不错的激活成功教程软件网站!

    国内不错的激活成功教程软件网站!无忧软件网-[url]http://www.51soft.com/[/url]精品软件秀-http://www.ohsoft.com/163软件园-http://www.soft163.com/中华激活成功教程联盟-http://www.softsdown.com/软件万花筒-http://www.superdown.com/番外地工作室-http://fwd.y…

    2022年6月21日
    42
  • Java调用so文件[通俗易懂]

    Java调用so文件[通俗易懂]公司的硬件让我帮忙调用一个so文件,想着一直都没机会自己写一个jni,于是就答应了,在调用的过程中还踩了不少坑,特地写一篇博客记录一下。一、使用技术原本是想直接用java自带的jni,但是我们硬件只给了一个so文件,而且里面的函数命名等规则不符合java的jni调用标准,于是就打算使用框架jna来调用。JNA就是建立在JNI之上,它简化了Java调用原生函数的过程。JNA提供了一…

    2022年9月19日
    6
  • Java优化_解决if嵌套过多

    Java优化_解决if嵌套过多文章目录 一、使用策略模式 二、其他方案 1.分解条件表达式 2.合并重复的条件判断 3.提前判断返回 4.引入断言工具类 5.善用 Optional 6.使用枚举 7.枚举多态 8.类多态 9

    2022年9月15日
    2
  • 个人开发者app消息推送简单实现思路

    个人开发者app消息推送简单实现思路最近新做了一个app,中午没事大脑在简单的思索者。。假如:我的这个app很火,用的人会很多,那么它就成了我的一个个人平台。如果我想让给广大用户推送一个新消息,该怎么办?当然你可以百度搜服务器消息推送实现之类的。但是软而一想,能不能通过一个简单方法实现呢。我想应该是有的。前期准备:1.首先我们花几十元注册个域名2.购买个便宜的主机,网上有一年几十元的那种3.将域名解析

    2022年5月11日
    44
  • ssl证书怎么用_为什么会ssl证书无效

    ssl证书怎么用_为什么会ssl证书无效1.打开网站:https://freessl.cn/按提示操作,验证类型:离线验证;2.会给出一个域名的访问路径和一个文件内容,按照域名解析的主机配置nginx或其它的web服务,返回文件给出的内容;3.确认文件url和内容无误后点验证;4.通过后可以在KeyManager里的证书管理里看到颁发的证书;5.点更多然后选择导出Nginx证书,crt为证书,key为密钥;6.将文件分发到nginx等其它需要证书的服务上去使用;注意:这里最关键的一步就是,你的域…

    2025年8月12日
    3
  • 常用的傅里叶变换性质_傅里叶变换常用公式

    常用的傅里叶变换性质_傅里叶变换常用公式《信号与系统(第二版)》杨晓非何丰https://wenku.baidu.com/view/cbb9e8f87e192279168884868762caaedd33ba95.html傅里叶变换

    2022年8月3日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号