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的一个单元”、“每个门”和“所有输入”是什么意思。