精华内容
下载资源
问答
  • BPTT

    2017-12-23 23:22:00
    RNN 的 BP —— Back Propagation Through Time. 参考:零基础入门深度学习(5) - 循环神经网络。知乎。 1 def backward(self, sensitivity_array, 2 activator): ... 4 实现BPTT...

    RNN 的 BP —— Back Propagation Through Time.

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

     

     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

    展开全文
  • Truncated BPTT

    2020-12-06 11:20:34
    <div><p>Is it possible to do truncated BPTT currently? I have a really long time series: <code>1411889</code> samples This overflows when trying to train on any backend.</p><p>该提问来源于开源项目&#...
  • BPTT算法推导

    2021-03-01 20:24:52
  • StreamDataset and bptt

    2020-12-01 12:17:59
    <div><p>Hi, thanks for your work. The following code line confused me: ...Which means cut off complete ... How to set Hyper-parameter bptt.</p><p>该提问来源于开源项目:facebookresearch/XLM</p></div>
  • BPTT paper This report provides detailed description and necessary derivations for the BackPropagation Through Time (BPTT) algorithm. BPTT is often used to learn recurrent neural networks (RNN). ...
  • Dynamic bptt_size

    2021-01-06 21:22:07
    <p>For <code>bptt_len, is it possible to create it dynamically? Probably following <code>batch_size</code> by adding <code>batch_size_fn</code> to support dynamic functionality. The use case for this ...
  • <pre><code>bptt = args.bptt if np.random.random() < 0.95 else args.bptt / 2.</code></pre> <p>Yall already have... <pre><code>seq_len = max(5, int(np.random.normal(bptt, 5)))</code></pre>该...
  • RNN BPTT算法详细推导

    2020-07-03 23:12:56
    BPTT算法推导 BPTT全称:back-propagation through time。这里以RNN为基础,进行BPTT的推导。 BPTT的推导比BP算法更难,同时所涉及的数学知识更多,主要用到了向量矩阵求导、向量矩阵微分、向量矩阵的链式求导法则,...

    BPTT算法推导

    BPTT全称:back-propagation through time。这里以RNN为基础,进行BPTT的推导。

    BPTT的推导比BP算法更难,同时所涉及的数学知识更多,主要用到了向量矩阵求导、向量矩阵微分、向量矩阵的链式求导法则,想要完全理解掌握BPTT的推导,这些是基础工具。

    向量矩阵求导主要参考刘建平的相关博客:https://www.cnblogs.com/pinard/p/10750718.html

    RNN的BPTT推导主要参考刘建平的相关博客:https://www.cnblogs.com/pinard/p/6509630.html

    上图是RNN的经典图示。

    RNN的BPTT推导:

    在刘的博客中,损失函数为交叉熵损失函数,输出的激活函数为softmax函数,隐藏层的激活函数为tanh函数;

    但是按照这种配置,无法推导出后续的表达式;经过思考,我认为应该是以下的配置:

    损失函数为交叉熵损失函数(二元交叉熵损失函数),输出的激活函数应该为sigmoid函数,隐藏层的激活函数为tanh函数。(二分类问题)

    对于RNN,由于在序列的每个位置都有损失函数,因此最终的损失LL为:
    L=t=1τL(t)=t=1τytlogy^t+(1yt)log(1y^t) L = \sum_{t=1}^{\tau}L^{(t)}=-\sum_{t=1}^{\tau}y^t\log\hat{y}^{t}+(1-y^t)\log(1-\hat{y}^t)

    Lc=t=1τLtc=t=1τ(y^tyt) \frac{\partial L}{\partial c} = \sum_{t=1}^{\tau}\frac{\partial L^t}{\partial c} = \sum_{t=1}^{\tau}(\hat{y}^t-y^t)

    按照刘的说法,如果是softmax的激活函数,那么这里的cc应该是向量,但是在他的文章中,cc的符号是标量符号。主要是如果按照softmax来进行推导,得不到后续的公式,这里暂且先按照sigmoid函数来。
    Ltc=Lty^ty^tototcLty^t=y^t(ytlogy^t+(1yt)log(1y^t))=yty^t+1yt1y^ty^tot=ot(sigmoid(ot))=sigmoid(ot)(1sigmoid(ot))=y^t(1y^t)otc=c(Vht+c)=1 \frac{\partial L^t}{\partial c} = \frac{\partial L^t}{\partial \hat{y}^t}\cdot \frac{\partial \hat{y}^t}{\partial o^t}\cdot\frac{\partial o^t}{\partial c}\\\frac{\partial L^t}{\partial \hat{y}^t} =-\frac{\partial }{\partial \hat{y}^t}(y^t\log\hat{y}^{t}+(1-y^t)\log(1-\hat{y}^t))\\=-\frac{y^t}{\hat{y}^t}+\frac{1-y^t}{1-\hat{y}^t}\\\frac{\partial \hat{y}^t}{\partial o^t}=\frac{\partial}{\partial o^t}(sigmoid(o^t))\\=sigmoid(o^t)(1-sigmoid(o^t))\\=\hat{y}^t(1-\hat{y}^t)\\\frac{\partial o^t}{\partial c} = \frac{\partial}{\partial c}(Vh^t+c)\\=1
    检查一下第一个表达式,由于每个变量都是标量,所以可以按照标量的链式求导法则来求导。把每个表达式的值代入,发现的确如此。由上面的推导,还可以得到:
    Ltot=Ltc(1) \frac{\partial L^t}{\partial o^t} = \frac{\partial L^t}{\partial c}\tag{1}

    LV=t=1τLtV=t=1τ(y^tyt)(ht)T(2) \frac{\partial L}{\partial V} = \sum_{t=1}^\tau \frac{\partial L^t}{\partial V} = \sum_{t=1}^\tau(\hat{y}^t-y^t)(h^t)^T\tag{2}

    其中,LR,VR1×m,htRmL\in \bold{R}, V\in\bold{R}^{1\times m}, h^t\in \bold{R}^m,注意到,这里涉及到标量对向量的求导,采用分母布局,注意检查等号两边的维度是否相同,参与运算的变量保证能够进行矩阵相乘,必要的时候需要调整位置以便能完成相应的矩阵乘法。公式2的推导很简单,因为LtV=LtototV\frac{\partial L^t}{\partial V} = \frac{\partial L^t}{\partial o^t}\cdot\frac{\partial o^t}{\partial V}

    接下来就是W,U,bW,U,b的梯度计算了,这三者的梯度计算是相对复杂的。从RNN的结构可以知道,反向传播时,在某个时刻t的梯度损失由当前位置的输出对应的梯度损失和t+1t+1时刻的梯度损失两部分共同决定,而t+1t+1时刻的梯度损失有相同的结构,可以看出是循环嵌套的。因此WW在某一位置t的梯度损失需要一步步计算。我们定义序列索引tt的隐藏状态的梯度为:
    δt=Lht(3) \delta^t = \frac{\partial L}{\partial h^t}\tag{3}
    注意到公式3也是标量对向量的导数

    这样我们可以像DNN一样从δt+1\delta^{t+1}递推δt\delta^t
    δt=Lototht+(ht+1ht)TLht+1=VTt=1τ(y^tyt)+WTdiag(1(ht+1)2)δt+1(4) \delta^t = \frac{\partial L}{\partial o^t}\cdot\frac{\partial o^t}{\partial h^t}+(\frac{\partial h^{t+1}}{\partial h^t})^T\cdot\frac{\partial L}{\partial h^{t+1}}\\=V^T\sum_{t=1}^{\tau}(\hat{y}^t-y^t)+W^Tdiag(1-(h^{t+1})^2)\delta^{t+1}\tag{4}
    公式4和刘的表达式不一样,个人认为我的应该是对的,刘的公式按照向量的求导法则,表达式中的维度不一致。第一步参考刘的矩阵微分系列博客。第二步中的第二部分,第一次看的时候没有明白,也花了挺多时间推导,这里记录一下。
    ht+1=tanh(Wht+Uxt+1+b) h^{t+1} = tanh(Wh^t+Ux^{t+1}+b)
    其中,WRm×m,xtRn,URm×nW\in \bold{R}^{m\times m}, x^t\in \bold{R}^n,U\in\bold{R}^{m\times n}tanh(x)=1(tanh(x))2tanh^{'}(x)=1-(tanh(x))^2

    ht+1ht\frac{\partial h^{t+1}}{\partial h^t},这是向量对向量的求导,按照分子布局求导结果的维度是m×mm\times m。这里我们按照定义来求:
    hit+1ht \frac{\partial h_i^{t+1}}{\partial h^t}
    此时变成了标量对向量的求导,按照分母布局,结果维度应该和hth^t相同,此时
    hit+1=tanh(Wi,:ht) h_i^{t+1} = tanh(W_{i,:}h^t)
    省略了与hh无关的项。那么:
    hit+1ht=(1(hit+1)2)ht(Wi,:ht)=(1(hit+1)2)Wi,:T \frac{\partial h_i^{t+1}}{\partial h^t} = (1-(h_i^{t+1})^2)\frac{\partial }{\partial h^t}(W_{i,:}h^t)\\=(1-(h_i^{t+1})^2)W_{i,:}^T
    此时结果的维度是m×1m\times 1,由于是按照分子布局,ii对应最后矩阵的第ii行,所以这里应该在转置一下,变成:
    (1(hit+1)2)Wi,: (1-(h_i^{t+1})^2)W_{i,:}

    所以:
    ht+1ht=diag(1(ht+1)2)W \frac{\partial h^{t+1}}{\partial h^t}=diag(1-(h^{t+1})^2)W

    其中,diag(1(ht+1)2)diag(1-(h^{t+1})^2) indicates the diagonal matrix containing the elements 1(hit+1)21-(h_i^{t+1})^2(来自花书英文版385页)。

    将其代入公式4,就明白为什么是那样的表达式了。

    这里在记录一下另一个点,
    tanh(Wht) tanh(Wh^t)
    这是一个向量,有:
    Wht(tanh(Wht))=diag(1(tanh(Wht))2) \frac{\partial }{\partial Wh^t}(tanh(Wh^t))=diag(1-(tanh(Wh^t))^2)
    其实这就是向量对向量的求导,按照分子布局求导结果为m×mm\times m的矩阵,刚好对角矩阵是一个m×mm\times m的矩阵,这间接说明了等式的正确性。

    在刘的https://www.cnblogs.com/pinard/p/10825264.html第三节的最后部分,给出了四个非常重要的表达式,这里记录下接下来会用到的一个表达式:
    z=f(y),y=Xa+b>zX=zyaT(5) z = f(y), y = Xa+b \quad-> \frac{\partial z}{\partial X}=\frac{\partial z}{\partial y}a^T\tag{5}
    其中,zz为标量,y,a,by,a,b为向量,XX为矩阵。不过发现好像用不到。。。

    有了δt\delta^t的表达式后,我们求W,U,bW,U,b就方便很多了,有
    LW=t=1τdiag(1(ht)2)δt(ht1)TLW=hτWLhτ+...+h1WLh1=t=1τhtWLht(6) \frac{\partial L}{\partial W} = \sum_{t=1}^{\tau}diag(1-(h^t)^2)\delta^t(h^{t-1})^T\\\frac{\partial L}{\partial W} = \frac{\partial h^\tau}{\partial W}\frac{\partial L}{\partial h^\tau}+...+\frac{\partial h^1}{\partial W}\frac{\partial L}{\partial h^1}\\=\sum_{t=1}^\tau\frac{\partial h^t}{\partial W}\frac{\partial L}{\partial h^t}\\\tag{6}
    老实说,这一步我不确定是否正确,因为这涉及到了向量对矩阵的导数,这玩意儿我还不会。不过这一步解释了为什么公式6里面有个累加符号。后续推导就更不会了,会的大佬请不吝赐教。不过感觉上好像是这么回事。只要这一步搞懂了,对U,bU,b的求导是类似的,可以参考刘的博客,这里就不写了。(太菜了,关键步骤不会)

    从表达式4可以看出RNN梯度消失和梯度爆炸的根本原因(展开后就能知道为什么了)。
    后续补充LSTM的BPTT。(毕竟面试的时候会要求公式层面的对LSTM防止梯度消失和梯度爆炸的理解)

    展开全文
  • 最基础的深度学习BPTT算法,用纯python代码实现,便于理解RNN底层网络结构,提高认识。
  • ***BPTT算法

    2019-03-21 21:42:51
    参考:BPTT算法推导
    展开全文
  • <p>In the current <code>LanguageModelDataset.bptt_batchify, elements of the "last batch" (defined as the extra words at the end of the dataset: <code>data[(len(data) // batch_size) * batch_...
  • BPTT for multiple layers

    2019-09-25 11:56:49
    单层rnn的bptt: 每一个时间点的误差进行反向传播,然后将delta求和,更新本层weight。 多层时: 1、时间1:T 分层计算activation。 2、时间T:1 利用本时间点的误差,分层计算weight delta,和之前时间点的...
  • RNN BPTT算法推导

    千次阅读 2019-03-26 22:29:58
    BPTT(沿时反向传播算法)基本原理与BP算法一样,包含三个步骤: 前向计算每个神经元的输出值 反向计算每个神经元的误差项δjδ_jδj​,它是误差函数E对神经元j的加权输入netjnet_jnetj​的偏导数 计算每个权重的梯度...
  • RNN-bptt简单推导

    千次阅读 2018-01-22 17:00:30
    摘要: 在前面的文章里面,RNN训练与BP算法,我们提到了RNN的训练算法。但是回头看的时候在时间的维度上没有做处理,所以整个推导...这里首先解释一下所谓的bpttbptt的思路其实很简单,就是把整个RNN按时间的维度展
  • <ul><li><code>LanguageModelStream.bptt_batchify()</code> returns a mask</li><li>The mask can be recovered by <code>mask = data != vocab[vocab.padding_token]</code></li><li>We can either change...
  • BPTT-RNN训练算法

    2020-06-14 16:09:58
    BPTT:与BP类似,加上时序演化。 输出的激活函数:双曲正切,通过softmax,损失交叉熵。 举一个例子:求E3对V的梯度 y是输出值,z是输入激活函数的值,z=V*S3.最后求和可得E对V的梯度!!(梯度下降) E对W梯度 W是...
  • RNN训练方法介绍-BPTT

    万次阅读 2017-12-04 15:32:32
    url:... Training RNN——BPTT ...由于RNN和时间序列有关,因此我们不能通过Backpropagation来调参,我们使用的是Backpropagation through time(BPTT) 回顾Backpropagation  
  • RNN训练算法BPTT介绍

    千次阅读 2018-11-02 11:12:30
    本篇文章第一部分翻译自:... 最近看到RNN,先是困惑于怎样实现隐藏层的互联,搞明白之后又不太明白如何使用BPTT进...
  • LSTM简介以及数学推导 FULL BPTT
  • 【参考资料】 【1】《python深度学习:基于PyTorch》 1. BPTT 2. BPTT
  • RNN里的BPTT算法

    千次阅读 2017-09-22 11:02:34
    这两天对RNN循环神经网络进行了学习,由一无所知到现在对什么是RNN以及它的前向传播和反向传播有了认识,尤其是BPTT算法的推导有些繁琐,但是推过一次后,对RNN反向传播求梯度的过程有了更清晰的认识。 下面是朴素...
  • 随时间反向传播(BPTT)算法 先简单回顾一下RNN的基本公式: st=tanh(Uxt+Wst−1)st=tanh⁡(Uxt+Wst−1) y^t=softmax(Vst)y^t=softmax(Vst) RNN的损失函数定义为交叉熵损失: ...
  • RNN(二) 前向和BPTT

    2019-04-27 18:03:40
    RNN(二) 前向和BPTT
  • RNN上的BPTT的简单推导

    千次阅读 2017-03-10 22:23:22
    RNN上的BPTT的简单推导
  • LSTM中BPTT的推导

    千次阅读 2016-11-24 10:04:42
    今天是2016年11月24号,... BPTT):http://blog.csdn.net/a635661820/article/details/45390671 LSTM的简介已经很明了,重点是数学推导,要烂熟于心(标准:不需要经过大脑,要神经反射一般) 数学基础差,没办法呀
  • 随时间反向传播算法BPTT

    千次阅读 2018-09-11 20:17:13
    其实直到现在,我对BPTT算法的理解都不太顺畅,暂时把目前的想法记录下来,之后自己实现一遍来加深理解。如果您看出了问题希望能提出来,感激不尽。 循环神经网络因为不仅有空间上的层间关系,还有时序上的联系,...
  • RNN中BPTT的推导和可能的问题

    千次阅读 2017-07-30 22:17:57
    最近开始啃LSTM,发现BPTT这块还是不是很清晰,结合RNN,把这块整理整理 RNN前馈神经网络(feedforward neural networks)如下图所示(这块内容可见我的博客神经网络BP算法): 假设我们的训练集只有一个实例(x...
  • RNN网络的学习算法-BPTT笔记 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 ...
  • 循环神经网络——RNN的训练算法:BPTT基本步骤前向计算误差项的计算权重梯度的计算RNN的梯度爆炸和消失问题 基本步骤 BPTT算法是针对循环层的训练算法,它的基本原理和BP算法是一样的,也包含同样的三个步骤: 1.前...
  • RNN BPTT

    2017-07-25 10:45:00
    双向LSTM 转载于:https://www.cnblogs.com/wuxiangli/p/7232776.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 439
精华内容 175
关键字:

bptt