参数学习
损失函数
损失函数用交叉熵损失:
L(y,y^)=−y⊤logy^
其中 y∈{0,1}C 为真实标签的 one-hot 向量,y^ 为模型输出。
假设训练集为 D={(x(n),y(n))}n=1N,对于样本 x(n),网络的输出为 y^(n)。则在整个数据集上的代价函数为:
J(w,b)=N1n=1∑NL(y(n),y^(n))+21λ∥w∥22
其中:
梯度下降
参数可以通过梯度下降法来进行学习。在梯度下降法的每次迭代中,第 l 层的参数 w(n) 和 b(n) 的更新方式为:
w(l)b(l)←w(l)−α⋅∂w(l)∂J(w,b)=w(l)−α(N1n=1∑N(∂w(l)∂L(y(n),y^(n)))+λw(l))←b(l)−α⋅∂b(l)∂J(w,b)=b(l)−α(N1n=1∑N∂b(l)∂L(y(n),y^(n)))
其中 α 为学习率(learning rate)。
反向传播
梯度下降法需要计算损失函数对各参数的偏导(即梯度)。如果直接用链式法则逐一对每个参数求偏导会比较低效,因为有的子表达式会被重复计算很多次。因此神经网络中会用反向传播(back propagation)算法来更高效的计算梯度。
反向传播流程
定义第 l 层神经元的误差项 δ(l) 为:
δ(l)=∂z(l)∂J∈RMl
δ(l) 表示了第 l 层神经元对最终代价的影响,也间接反映了不同神经元对网络能力的贡献程度。
那么反向传播有四条核心公式:
- 计算输出层的误差项 δ(L):
δ(L)=∇aJ⊙σ′(z(L))(BP1)
∇aJ 是一个向量,它的第 i 个元素为 ∂ai(L)∂J。∇aJ 可以理解为代价函数随输出的激活值的变化而变化的速度,σ′(z(L)) 可以理解为在 z(L) 处激活函数 σ 变化的速度。
- 使用下一层的误差项 δ(l+1) 来计算当前层的误差项 δ(l):
δ(l)=((w(l+1))⊤δ(l+1))⊙σ′(z(l))(BP2)
这就是误差的反向传播。反向传播的含义就是:第 l 层的某个神经元的误差项 = 所有与该神经元相连的第 l+1 层的神经元的误差项的权重和 * 该神经元激活函数的梯度。
- 计算偏置 b 的梯度:
∂b(l)∂J=δ(l)(BP3)
- 计算权重 w 的梯度:
∂w(l)∂J=δ(l)(a(l−1))⊤(BP4)
然后就是按梯度下降法,用算出来的梯度去更新参数。
公式证明
证明一下反向传播的四条核心公式:
BP1
BP1 链式法则一步推出来
BP2
由 z(l+1)=w(l+1)a(l)+b(l+1):
∂a(l)∂z(l+1)=(w(l+1))⊤∈RMl×Ml+1
由 a(l)=σ(z(l)):
∂z(l)∂a(l)=∂z(l)∂σ(z(l))=diag(σ′(z(l)))∈RMl×Ml
diag(σ′(z(l))) 表示一个对角线元素全为 σ′(z(l)),其他元素全为 0 的矩阵。
因此根据链式法则,第 l 层的误差项为:
δ(l)=∂z(l)∂J=∂z(l+1)∂J⋅∂a(l)∂z(l+1)⋅∂z(l)∂a(l)=δ(l+1)⋅(w(l+1))⊤⋅diag(σ′(z(l)))=((w(l+1))⊤δ(l+1))⊙σ′(z(l))∈RMl
BP3
由 z(l)=w(l)a(l−1)+b(l):
∂b(l)∂z(l)=IMl∈RMl×Ml
IMl 表示 Ml×Ml 的单位矩阵。
由链式法则:
∂b(l)∂J=∂z(l)∂J⋅∂b(l)∂z(l)=∂z(l)∂J=δ(l)
BP4
由 z(l)=w(l)a(l−1)+b(l):
∂wij(l)∂z(l)=[∂wij(l)∂z1(l),…,∂wij(l)∂zi(l),…,∂wij(l)∂zMl(l)]=[0,…,∂wij(l)∂(wi:(l)a(l−1)+bi(l)),…,0]=[0,…,aj(l−1),…,0]∈R1×Ml
其中 wi:(l) 为权重矩阵 w(l) 的第 i 行。
由链式法则:
∂wij(l)∂J=∂z(l)∂J⋅∂wij(l)∂z(l)=[δ1(l),…,δi(l),…,δMl(l)][0,…,aj(l−1),…,0]=δi(l)aj(l−1)
其中 δi(l)aj(l−1) 相当于向量 δ(l) 和向量 a(l−1) 的外积的第 i,j 个元素。因此上式可以写为:
[∂w(l)∂J]ij⇒∂w(l)∂J=[δ(l)(a(l−1))⊤]ij=δ(l)(a(l−1))⊤∈RMl×Ml−1