首先介绍一个学习DL4NLP的一个网站WildML,英文的,有空我也整理一下中文版。
这篇讲的是神经网络的基础,没有RNN、CNN等结构。废话少说,直接上要推导的一个简单的神经网络结构图。
例子:三层神经网络
这个神经网络包含一个输入层、一个隐含层和一个输出层。
注意输出的神经元有两个(多个),这个经常用在一个二(多)分类任务上,代表着每一类的概率,相应的激活函数变成了softmax函数(相当于多分类逻辑回归)。当然,如果用在其他任务上,输出结点的值含义可能不同,取值范围也可能不同。
softmax函数
导数:
激活函数
常用的激活函数有tanh、sigmoid和ReLU。激活函数是一个学问,需要单独整理一块。
下面简单叙述一下各个函数的表达式:
tanh
sigmoid
ReLU
前向传播公式
例子使用tanh激活函数,最后用softmax函数生成分布。
z2=xθ(1)
a2=tanh(z2)
z3=a2θ(2)
a3=ŷ =softmax(z3)
损失函数
这里使用cross entropy作为损失函数,表达式为:
其中N是样本数量,C是类别集合。
反向传播中的梯度求解
这里定义第l层第i个单元的计算误差:
其中 z(l)i 代表第l层的第i个神经元的输入值。
我们的目标是要求参数的所有参数的梯度,即 ∂J∂θ
这里推导通用的情况。
我们对 θ(l)i,j 求导( l<L ):
根据
δ
的定义:
这里的 θ 和 a 都是已知变量,为当前迭代的参数和输出。
表达为矩阵形式,
注意.*为矩阵对应元素之间两两相乘。
这样就可以反向传播求所有神经元的计算误差。
最后,
代入例子中计算梯度
计算第三层第i单元的计算误差
δ(3)i
:
*第三层的所有计算误差用 δ3 表示。
计算
δ2
:
计算关于
θ(2)
的偏导:
计算关于
θ(1)
的偏导:
到此,所有的
θ
都已经可以求出来,最后代入梯度下降公式更新参数:
参考资料:
http://www.wildml.com/2015/09/implementing-a-neural-network-from-scratch/