Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么LSTM的导数设置为零_Python_Machine Learning_Neural Network_Lstm - Fatal编程技术网

Python 为什么LSTM的导数设置为零

Python 为什么LSTM的导数设置为零,python,machine-learning,neural-network,lstm,Python,Machine Learning,Neural Network,Lstm,我正在查看以下代码: class LstmParam: def __init__(self, mem_cell_ct, x_dim): self.mem_cell_ct = mem_cell_ct self.x_dim = x_dim concat_len = x_dim + mem_cell_ct # weight matrices self.wg = rand_arr(-0.1, 0.1, mem_ce

我正在查看以下代码:


class LstmParam:
    def __init__(self, mem_cell_ct, x_dim):
        self.mem_cell_ct = mem_cell_ct
        self.x_dim = x_dim
        concat_len = x_dim + mem_cell_ct
        # weight matrices
        self.wg = rand_arr(-0.1, 0.1, mem_cell_ct, concat_len)
        self.wi = rand_arr(-0.1, 0.1, mem_cell_ct, concat_len) 
        self.wf = rand_arr(-0.1, 0.1, mem_cell_ct, concat_len)
        self.wo = rand_arr(-0.1, 0.1, mem_cell_ct, concat_len)
        # bias terms
        self.bg = rand_arr(-0.1, 0.1, mem_cell_ct) 
        self.bi = rand_arr(-0.1, 0.1, mem_cell_ct) 
        self.bf = rand_arr(-0.1, 0.1, mem_cell_ct) 
        self.bo = rand_arr(-0.1, 0.1, mem_cell_ct) 
        # diffs (derivative of loss function w.r.t. all parameters)
        self.wg_diff = np.zeros((mem_cell_ct, concat_len)) 
        self.wi_diff = np.zeros((mem_cell_ct, concat_len)) 
        self.wf_diff = np.zeros((mem_cell_ct, concat_len)) 
        self.wo_diff = np.zeros((mem_cell_ct, concat_len)) 
        self.bg_diff = np.zeros(mem_cell_ct) 
        self.bi_diff = np.zeros(mem_cell_ct) 
        self.bf_diff = np.zeros(mem_cell_ct) 
        self.bo_diff = np.zeros(mem_cell_ct) 

    def apply_diff(self, lr = 1):
        self.wg -= lr * self.wg_diff
        self.wi -= lr * self.wi_diff
        self.wf -= lr * self.wf_diff
        self.wo -= lr * self.wo_diff
        self.bg -= lr * self.bg_diff
        self.bi -= lr * self.bi_diff
        self.bf -= lr * self.bf_diff
        self.bo -= lr * self.bo_diff
        # reset diffs to zero
        self.wg_diff = np.zeros_like(self.wg)
        self.wi_diff = np.zeros_like(self.wi) 
        self.wf_diff = np.zeros_like(self.wf) 
        self.wo_diff = np.zeros_like(self.wo) 
        self.bg_diff = np.zeros_like(self.bg)
        self.bi_diff = np.zeros_like(self.bi) 
        self.bf_diff = np.zeros_like(self.bf) 
        self.bo_diff = np.zeros_like(self.bo) 
我不明白为什么这么早就为
self.wg_diff=np.zero((mem_cell,concat_len))应用导数。我不知道这里发生了什么。我也不明白为什么它们被设置为零。如果有人能解释一下原因,我们将不胜感激

self.wg_diff = np.zeros((mem_cell_ct, concat_len)) 
不是应用导数,它只是初始化一个数组,该数组稍后将保存损失函数相对于
wg
数组中的值的导数

apply_diff
中,此处应用渐变:

self.wg -= lr * self.wg_diff
关键是:在调用
\uuuu init\uuuuu
函数来创建
LstmParam
的实例和调用
apply\u diff
来应用梯度之间,不同的代码(您没有显示)必须修改
self.wg\u diff
,以便它实际包含导数

为了计算梯度

  • 向前传递需要使用一些数据作为输入,并在计算涉及
    wg
    中的值时计算输出
  • 然后使用损耗函数将输出与所需的正确输出进行比较
  • 计算损失后,向后传递计算梯度(损失函数相对于计算输出所涉及的所有权重的导数)。向后传递使用实际值填充
    self.wg_diff

为完整起见,请参阅下一行

self.wg_diff = np.zeros_like(self.wg)

正在为下一次向后传球重置渐变阵列。

@Mathis Muller非常感谢。这就是我认为可能发生的事情,但我不确定。整个代码非常长(200行),所以尽管我只想展示我感到困惑的部分。所以应用差异是根据导数和学习率改变权重?这是我试图理解的代码@user218030“应用差异是根据导数和学习率改变权重?”-是的。对于权重数组中的每个权重值,从权重中减去的是
learning\u rate*gradient
@Muller,谢谢。所以基本上每个门都有自己的权重,一旦正向传播发生,导数和学习率就会从权重中减去,得到每个门的新权重。一个问题-这是在LSTM的一个单元格完成后发生的,还是在所有输入都输入到每个单元格后发生的?@user218030我不明白,对不起!“门”和“单元”在LSTM中有技术含义,我不知道“LSTM的一个单元”、“每个门”和“所有输入”是什么意思。