Deep learning
深度学习其实就是使用多层的神经网络模型来进行机器学习。神经网络也有很多种,最基本的全连接前馈神经网络的原理其实并不复杂,就是多个线性函数加一个激活函数构成一个个神经元,神经元的左边是线性函数的输入,神经元的输出是线性函数经过激活函数后的值,每层有多个神经元,如果将激活函数选为 sigmoid 函数的话,每个神经元的输入输出其实就是前面所讲的 logistic regression 的输入输出,每层的多个神经元的关系其实就是多个 Logistic Regression 的关系。层与层之间的关系是前一层的输出是后一层的输入。其结构如下所示,红框就是一个神经元:

全连接前馈神经网络的最后一层会是一个 softmax 层,这个和多分类任务中最后要通过一个 softmax 函数是一样的。多分类(N 分类)任务中,其实就是训练了 N 个分类器,每个类一个分类器,最后将一个待预测的样本分别输入到这 N 个分类器中得到 N 个结果,softmax做了一个放大的作用,使大的更大小的更小,最后的结果其实就是这个样本分别属于某个类的概率。例如第 n n n 分类器的输出为 x n x_n xn ,则该样本属于第 n n n 类的概率是:
y n = e x n ∑ i = 1 N e x i y_n = \frac {e^{x_n}} {\sum_{i=1}^Ne^{x_i}} yn=∑i=1Nexiexn

如果只看神经网络的倒数第二层和最后的输出层,其实这就是一个普通的多分类 Logistic regression ,只不过输入的不是原来的 x \boldsymbol x x 了,而是经过了多个隐藏层变换后的 x 1 , . . . , x K x_1, ... ,x_K x1,...,xK 。在很多应用上,中间的隐藏层取代了原来需要人为设计的特征工程的部分,原来的特征提取是依靠人对某一个专门的应用来实现的。现在就交给了隐藏层自己去寻找。但其实,隐藏层的结构还是需要人自主去设计的,所以对于一个问题,使用深度学习其实并不能算是简化了问题的难度,而是把一个问题变成了另一个问题,即把原来需要人来进行特征提取的难题变成了如何设计神经网络的结构的问题。如果对设计网络结构更有经验的话,那么可能直接使用一个神经网络来完成某个问题的效果会更好,而如果对特征变换掌握的更好的话,运用特征变换的方法可能效果会更好。比如在语音辨识问题上,现在的深度学习网络能够替代原先的很多人为设计的特征变换的模块,但依旧无法取代离散傅里叶变化那部分,至少仅仅只能达到相似的效果,这可能说明,离散傅里叶变换还是很有效的特征变换方式。直接使用这个变换而非想要训练一个网络来替代至少目前来说还是更有效的。
Neural network
神经网络的训练步骤和前面所学的线性回归、Logistic Regression 并没有什么区别,第一步都是确定你的函数集或者说你的模型是什么样的,在神经网络中具体就是你使用什么网络(全连接前馈神经网络?卷积神经网络?反馈神经网络?),每个层有几个神经元,准备设几个层。
第二步是决定怎么度量你的模型的好坏,比如在线性回归中采用的模型的输出与标签差值的平方作为损失值,而 Logistic Regress 中采用的是交叉熵,在神经网络中进行分类任务时也是采用的交叉熵来度量模型在训练集上的表现,其公式为:
C ( y , y ^ ) = − ∑ i = 1 N y i ^ ln y i C(y,\hat {y}) = -\sum_{i=1}^N \hat{y_i} \ln y_i C(y,y^)=−i=1∑Nyi^lnyi
在所有训练集样本上的损失就是每个样本的交叉熵的和或均值。
第三步就是决定采用什么方法来寻找损失值最小时的模型参数,也就是优化问题,在神经网络上采用的依旧是前面用到的梯度下降的方法来进行,不同的是,由于神经网络非常的复杂,像原来一样通过公式计算梯度的表达式是一件不太现实的事,神经网络是通过 Backpropagation 来实现的。

Backpropagation
反向传播的数学原理就是微积分中的链式法则 (Chain rule) ,也就是复合函数的求导法则。具体有两种情况:
Case 1 : y = g ( x ) 、 z = h ( y ) y = g(x)、z=h(y) y=g(x)、z=h(y) ,则有
d z d x = d z d y d y d x \frac {dz} {dx} = \frac {dz} {dy}\frac {dy} {dx} dxdz=dydzdxdy
Case 2 : x = g ( s ) 、 y = h ( s ) 、 z = f ( x , y ) x=g(s)、y=h(s)、z=f(x,y) x=g(s)、y=h(s)、z=f(x,y) ,则有
d z d s = ∂ z ∂ x d x d s + ∂ z ∂ y d y d s \frac {dz} {ds} = \frac {\partial z} {\partial x}\frac {dx} {ds}+\frac {\partial z} {\partial y}\frac {dy} {ds} dsdz=∂x∂zdsdx+∂y∂zdsdy
对应到神经网络中,我们想要训练的参数是网络中的每条线上的权重值,例如对下图中任意一个神经元,我们想要算其中一个权重参数 w 1 w_1 w1 的偏导 ∂ C ∂ w 1 \frac {\partial C} {\partial w_1} ∂w1∂C ,其中 C C C 是度量神经网络好坏的交叉熵函数:

那么由链式法则(case 1中的原理):
∂ C ∂ w 1 = ∂ C ∂ z ∂ z