深度学习应用于自然语言处理-前向神经网络
引言
深度学习的浪潮袭来,现已在各个领域中应用。深度学习的表现令人叹为观止,不得不说我们迎来了依靠深度学习的人工智能学习时代。
人工智能,让世界更美好。
这一章主要是通过学习 Stanford cs224d 课程已经阅读一些有些的博客所作出的总结。
本章介绍
从数学的角度对前向神经网络数学模型进行介绍、推导和证明。
前提知识
线性代数(Linear Algebra)
概率论(Probability Theory)
凸优化(Convex Optimization)
前向神经网络
所谓神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可以是另一个“神经元”的输入。以下是一个简单的三层前向全连接神经网络:

图中x为输入层,h为隐藏层,$\hat{y}$为输出层。在全连接网络中,上一层和下一层的每个神经元都相连。隐藏层在接收到输入x后会进行一个非线性变化,再将输出信号传递给下一层。非线性变换由激活函数(activation function)实现。在数学上,我们可以用矩阵乘法(Matrix multiplication)来解释:
式中sigmoid和softmax都是一个激活函数,W是指两层之间的权重,b是偏置量。我们可以看到x进行了线性变换后,再做非线性变换,x输出的信号将作为b的输入。
激活函数(Activation fuction)
激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。激活函数的缺点是如果模型比较复杂,面对样本数不大的情况时容易出现过拟合。常用的激活函数还有tanh函数,RelU函数等等。
sigmoid函数的数学形式:
sigmoid函数求导:
sigmoid函数和导数python实现:
|
|
softmax函数的数学形式:
softmax函数求导:
softmax函数的实现:
|
|
目标函数(Objective fuction)
目标函数,有时候又称损失函数(loss function),代价函数(cost function ),是网络中的性能参数,也是编译一个模型必须的两个参数之一。在训练模型时,我们的最终目标就是最大化或者最小化目标函数,用$J$表示目标函数。
交叉熵(Cross entropy)
一种常见的目标函数形式:
其中$i$代表响应的类别,$y_i$是训练样本中的标签,而$\hat{y}_i$模型预测结果。
一般情况下,我们对$y_i$使用one-hot编码,而$\hat{y}$代表了对应类别的概率$p(y_i|w,x)$,因此,$\sum_i\hat{y_i}=1$,在这里我们称$y_i$为预测函数。
*对$\hat{y}$求导:
对向量$\hat{\boldsymbol{y}}=(\hat{y}_1,\ \dots\ ,\hat{y}_c)$求导:
预测函数(Predict function)
对于预测函数$\hat{y}_i$,我们取$\hat{y}_i$最大的$i$作为模型最终预测的类别。使用softmax函数对输出层的输入进行归一化操作,数学表示为:
其中$c$表示类别个数,在这里即是输出层的神经元个数。$z_i$为输出层的输入。
根据softmax函数的求导可知,预测函数$\hat{y}_i$对$z_i$求导:
根据链式法则,目标函数$J$对$z_i$求导:
目标函数$J$对向量$z$求导:
前向传播(Forward propagation)
前向传播是求目标函数值的过程,从输入层开始,样本的特征向量$x$遍历模型,到达输出层$\hat{y}$,再将$\hat{y}$和 $y$进行比较,得到目标函数值$J$:
训练模型的过程就是优化目标函数的过程,我们需要最小化$J=J(\boldsymbol{W}_1,\boldsymbol{b}_1,\boldsymbol{W}_2,\boldsymbol{b_2})$,这歌优化过程我们可以使用梯度下降法,但是由于$J$是一个非凸函数,因此不能使用梯度下降法求得全局最优,也就是不能获得的$J$最小值。
随机梯度下降(Stochastic gradient descent)
我们可以求目标函数的梯度,它代表目标函数变化增加最快的地方。相反,沿着梯度相反的方向,梯度减少最快,所以我们可以使用迭代的方法更新参数,使得目标函数往着最优的方向进行优化,找到目标函数的最小值:
$t$表示第$t$次进行迭代更新,$\alpha$表示学习率,代表着每一次迭代要走的步长,$W$表示我们需要更新的参数,在本例子中,我们需要对$W_1$,$b_2$,$W_2$,$b_2$进行参数更新,每次迭代都需要进行梯度的计算,每次迭代都要计算目标函数的值。
假设训练样本数量为$N$,如果每次迭代都使用所有的训练样本。这时的目标函数是:
当$N$很大的时候,每次迭代都十分耗时,因此收敛的速度会较慢。我们可以使用一种逼近方法,称为mini-batch。
- mini-batch很简单,就是每次迭代更新只使用$k$个训练样本,$k$可以是100这种相对较小的数。
- 而随机梯度下降(SGD)是每次更新迭代只使用$1$个训练样本,即$k=1$。SGD是mini-batch的特殊情况,但是我们一般说SGD就是指mini-batch。
后向传播(Backward propagation)
后向传播就是一个求梯度的过程从输出层开始往输入层传入误差。
我们将三层全连接神经网络模型的前向传播表示为:
计算后向传播:
$\boldsymbol{\delta}_1$就是预测误差,得到上面传播的误差,我们对每一层的参数求梯度: