本文以一个简单的神经网络为例,应用上次的公式求解该神经网络中的各个参数的梯度
神经网络的前向传播过程如下:
x=[Lw0,Lw1,...,Lwm−1]z=xW+b1h=relu(z)θ=hU+b2ˆy=softmax(θ)J=CE(y,ˆy)各个参数的维度如下:
L∈R|V|×db1∈R1×DhW∈Rmd×Dhb2∈R1×NcU∈RDh×Nc其中, | V | 是词汇表的大小,d是embedding词向量的长度,m是特征数目,Dh是隐含层的神经元数目,Nc是输出类的个数 |
需要计算的参数梯度如下:
∂J∂U∂J∂b2∂J∂W∂J∂b1∂J∂Lwi推导前,我们先定义下ReLu函数的梯度:
ReLU(x)=max(x,0)ReLU′(x)={1abcif x>00abcif otherwise=sgn(ReLU(x))sgn表示函数的符号
在推导前,我们再定义下两个比较重要的中间变量∂J∂θ和 ∂J∂z,这两个可以看做输出层和中间隐层的误差信号:
δ1=∂J∂θ=ˆy−ythis is just identity (7)δ2=∂J∂z=∂J∂θ∂θ∂h∂h∂zusing the chain rule=δ1∂θ∂h∂h∂zsubstituting in δ1=δ1 UT∂h∂zusing identity (2)=δ1 UT∘relu′(z)using identity (4)=δ1 UT∘sgn(h)we computed this earlier检查我们的推导是否正确的一个常用的方法就是看梯度中各个项的维度是否匹配.以上面的为例:
∂J∂z=δ1UT∘sgn(h)(1×Dh)(1×Nc)(Nc×Dh)(Dh)下面依次推导上面的梯度
1.∂J∂U
∂J∂U=∂J∂θ∂θ∂U=δ1∂θ∂U=hTδ1using identity (6)2.∂J∂b2
∂J∂b2=∂J∂θ∂θ∂b2=δ1∂θ∂b2=δ1using identity (3)3.∂J∂W
∂J∂W=∂J∂θ∂z∂W=δ2∂z∂W=xTδ2using identity (6)4.∂J∂b1
∂J∂b1=∂J∂θ∂z∂b1=δ2∂z∂b1=δ2using identity (3)5.∂J∂Lwi
∂J∂Lwi=∂J∂z∂z∂Lwi=δ2∂z∂Lwi下面求解∂z∂Lwi.
xW=[Lw0,Lw1,...,Lwm−1]W=[Lw0,Lw1,...,Lwm−1][W0:dWd:2d⋮W(m−1)d:md]=Lw0W0:d+Lw1Wd:2d+⋯+Lwm−1W(m−1)d:md=m−1∑j=0LwjWdj:d(j+1)Lw0是x中第1个单词的embedding向量,长度为d
从上面可以看出,∂z∂Lwi只有第i项是非零的, 所以
∂z∂Lwi=∂∂LwiLwiWdi:d(i+1)=(Wdi:d(i+1))T