文章目录
前言
这一系列博文记录学习深度学习的一些零散的笔记。从神经网络的基础到优化算法,再到深度学习神经网络(DNN)、卷积神经网络(CNN)和循环神经网络(RNN)。
一、感知机与神经网络
深度学习作为当前机器学习一个最热门的发展方向,仍然保持着传统机器学习方法的理念和特征。从有监督学习的角度来看,深度学习与机器学习并无本质上的差异。隐藏层使得感知机能够发展为拟合万物的神经网络模型,而反向传播算法则是整个神经网络训练的核心要义。
为了学习深度学习和各种结构的神经网络,我们需要先从头开始。感知机作为神经网络和支持向量机的理论基础,一定要清楚其中的模型细节。
如上图,从左到右为感知机模型的计算执行过程:模型接受了 x 1 , x 2 , x 3 x_1, x_2, x_3 x1,x2,x3三个输入,将输入与权值参数 w w w进行加权求和并经过sigmoid函数进行激活,将激活结果 y y y作为输出。当执行完前向计算得到输出之后,根据当前的输出和实际的输出按照损失函数计算当前损失,计算损失函数关于权值和偏置的梯度,然后根据梯度下降法更新权值和偏置,经过不断地迭代调整权值和偏置使损失函数最小。以上便是完整的单层感知机的训练过程。
单层感知机表达能力有限,对于线性不可分的情况,一般有两个解决办法,一个是支持向量机,旨在通过核函数映射来处理非线性的情况,另一种就是神经网络模型,即多层感知机(Multi-Layer Perception, MLP),与单层感知机在结构上的区别主要在于MLP多了若干隐藏层,这使得神经网络能够处理非线性问题。
和单层感知机一样,神经网络的训练依然包括前向计算和反向传播两个主要过程。下面介绍神经网络的工作机制。
假设输入层为 x x x,输入层和隐藏层之间的权值和偏置分别为 w 1 w_1 w1和 b 1 b_1 b1,线性加权计算结果为 Z 1 = w 1 x + b 1 Z_1=w_1 x + b_1 Z1=w1x+b1,采用sigmoid激活函数,激活输出为 a 1 = σ ( Z 1 ) a_1 = \sigma(Z_1) a1=σ(Z1)。而隐藏层到输出层的权值和偏置分别为 w 2 w_2 w2和 b 2 b_2 b2,线性加权计算结果为 Z 2 = w 2 x + b 2 Z_2=w_2 x + b_2 Z2=w2x+b2,激活输出为 a 2 = σ ( Z 2 ) a_2 = \sigma(Z_2) a2=σ(Z2)。所以,这个两层网络的前向计算过程为 x → Z 1 → a 1 → Z 2 → a 2 x \to Z_1 \to a_1 \to Z_2 \to a_2 x→Z1→a1→Z2→a2。这里损失函数采用如下的交叉熵损失函数
L ( y , a ) = − ( y l o g a + ( 1 − y ) l o g ( 1 − a ) ) L(y,a) = -(yloga+(1-y)log(1-a)) L(y,a)=−(yloga+(1−y)log(1−a)) 反向传播是基于梯度下降策略的,主要是以目标参数的负梯度方向对参数进行更新。将前向计算过程反过来,那么基于损失函数的梯度计算顺序就是 d a 2 → d Z 2 → d w 2 → d b 2 → d a 1 → d Z 1 → d w 1 → d b 1 da_2 \to dZ_2 \to dw_2 \to db_2 \to da_1 \to dZ_1 \to dw_1 \to db_1 da2→dZ2→dw2→db2→da1→dZ1→dw1→db1. 以交叉熵损失函数为代表的两层神经网络的反向传播向量化求导计算公式如下:
∂ L ∂ a 2 = ∂ ∂ a 2 L ( y , a 2 ) = − y a 2 + 1 − y 1 − a 2 \frac{\partial L}{\partial a_2} = \frac{\partial}{\partial a_2} L(y, a_2) = -\frac{y}{a_2}+\frac{1-y}{1-a_2} ∂a2∂L=∂a2∂L(y,a2)=−a2y+1−a21−y ∂ L ∂ Z 2 = ∂ L ∂ a 2 ∂ a 2 ∂ Z 2 = a 2 − y \frac{\partial L}{\partial Z_2} = \frac{\partial L}{\partial a_2} \frac{\partial a_2}{\partial Z_2} = a_2-y ∂Z2∂L=∂a2∂L∂Z2</