TensorFlow2.0深度学习(六)神经网络

1. 感知机

        感知机模型的结构如下图所示,它接受长度为n的一维向量x=[x_1,x_2,...,x_n],每个输入节点通过权值为w_i, i\in[1,n]的连接汇集为

z=w_1x_1+w_2x_2+...+w_nx_n+b

其中b称为感知机的偏置,一维向量w=[w_1,w_2,...,w_n]称为感知机的权值,z称为感知机的净活性值。写成向量形式:

z=w^T+b

        可以看到感知机是线性模型,并不能处理线性不可分问题。通过在线性模型后添加激活函数后得到活性值。

a=\sigma(z)=\sigma(w^Tx+b)

其中激活函数可以是阶跃函数。如下图所示。阶跃函数的输出只有0/1两种数值,当z<0时输出0,代表类别0;当z≥0时输出1,代表类别1:

\left.a=\left\{\begin{matrix}1&\boldsymbol{w}^T\boldsymbol{x}+b\geq0\\0&\boldsymbol{w}^T\boldsymbol{x}+b<0\end{matrix}\right.\right.

也可以是符号函数:

\left.a=\left\{\begin{matrix}1&\boldsymbol{w}^T\boldsymbol{x}+b\geq0\\-1&\boldsymbol{w}^T\boldsymbol{x}+b<0\end{matrix}\right.\right.

        添加激活函数后,感知机可以用来完成二分类任务的分类。阶跃函数和符号函数在z=0处是不连续的,其他位置导数为0,无法利用梯度下降算法进行参数优化。

        为了能够让感知机模型从数据中自动学习,Frank Rosenblatt提出了感知机的学习算法。

其中\eta为学习率。

        以感知机为代表的线性模型不能解决异或等线性不可分问题。

2. 全连接层

        感知机模型的不可异特性严重约束力它的潜力,使得它只能解决极其简单的任务。实际上,现代深度学习动辄数百万甚至上亿的参数规模,它的核心结构与感知机并没有多大差别,它在感知机的基础上,将不连续的阶跃激活函数换成了其他平滑连续激活函数,并通过堆叠多层网络层来增强网络的表达能力

        本节通过替换感知机的激活函数,同时并行堆叠多个神经元来实现多输入、多输出的网络层。如下图所示,并行堆叠了2个神经元,即2个替换了激活函数的感知机,构成3输入节点,2个输出节点的网络层。其中第一个输出节点的输出

o_1=\sigma(w_{11}*x_1+w_{21}*x_2+w_{31}*x_3+b_1)

第二个输出节点的输出

o_2=\sigma(w_{12}*x_1+w_{22}*x_2+w_{32}*x_3+b_1)

输出向量为o=[o_1,o_2]。整个网络层可以通过一次矩阵运算完成。

O=X@W+b

其中输入矩阵X shape定义为[b, d_{in}],b为样本数量,此处只有1个样本参与前向运算,d_{in}为输入节点数;权值矩阵W shape定义为[d_{in},d_{out}]d_{out}为输出节点数,偏置向量b shape定义为[d_{out}]。

        考虑批量并列计算,例如2个样本,则可以将上式推广到批量形式:

其中输出矩阵O包含了b个样本的输出特征,shape为[b,d_{out}]。由于每个输出节点与全部的输入节点相连接,这种网络层称为全连接层(Fully-connected Layer),或者稠密连接层(Dense Layer),W矩阵叫做全连接层的权值矩阵,b向量叫做全连接层的偏置。

2.1 张量方式实现

        在TensorFlow中,要实现全连接层,只需要定义好权值张量W和偏置张量b,并利用TensorFlow提供的批量矩阵相乘函数tf.matmul()即可完成网络层的计算。如下代码创建输入X矩阵为b=2个样本,每个样本的输入特征长度为d_{in}=784,输出节点数为d_{out}=256,故定义权值矩阵W的shape为[784,256],并采用正态分布初始化W;偏置向量b的shape定义为[256],在计算完X@W后相加即可,最终全连接层的输出O的shape为[2,256],即2个样本的特征,每个特征的长度为256。

2.2 层方式实现

        全连接层本质上是矩阵的相乘相加运算,实现并不复杂。但是作为最常用的网络层之一,TensorFlow中有更加高层、使用更方便的层实现方式:layers.Dense(units, activation),只需要指定输出节点数Units和激活函数类型即可。输入节点数将根据第一次运算时的输入shape确定,同时根据输入、输出节点数自动创建并初始化权重矩阵W和偏置向量b,使用非常方便。其中activation参数指定当前层的激活函数,可以为常见的激活函数或自定义激活函数,也可以指定为None无激活函数。

        上述通过一行代码即可创建一层全连接层fc,并指定输出节点数为512,输入的节点数在fc(x)计算时自动获取,并创建内部权重矩阵W和偏置b。可以通过类内部的成员名kernel和bias来获取权重矩阵W和偏置b。

        在优化参数时,需要获得网络的所有待优化的参数张量列表,可以用过类的trainable_variables来返回待优化参数列表。可以通过non_trainable_variables成员返回所有不需要优化的参数列表。如果希望获得所有参数列表,可以通过类的variables返回所有内部张量列表

        利用网络层类对象进行前向计算时,只需要调用类的__call__方法即可,即写成fc(x)方式,它会自动调用类的__call__方法,在__call__方法中自动调用call方法,全连接层类在call方法中实现了\sigma(X@W+b)的运算逻辑,最后返回全连接层的输出张量。

3. 神经网络

        通过层层堆叠全连接层,保证前一层的输出节点数与当前层的输入节点数匹配,即可堆叠出任意层数的网络。把这种由神经元构成的网络叫做神经网络。如下图所示,通过堆叠4个全连接层,可以获得层数为4的神经网络,由于每层均为全连接层,称为全连接网络。其中第1~3个全连接层在网络中间,称之为隐藏层1,2,3,最后一个全连接层的输出作为网络的输出,称为输出层。隐藏层1,2,3的输出节点数分别为[256,128,64],输出层的输出节点数为10。

        在设计全连接网络时,网络的结构配置等超参数可以按着经验法则自由设置,只需要遵循少量的约束即可。其中隐藏层1的输入节点数需和数据的实际特征长度匹配,每层的输入层节点数与上一层输出节点匹配,输出层的激活函数和节点数需要根据任务的具体设定进行设计。

3.1 张量方式实现

        对于多层神经网络,以上图网络结构为例,分别定义各层的权值矩阵W和偏置向量b如下:

        在计算时,只需要按照网络层的顺序,将上一层的输出送入到当前层的输入即可,重复直至最后一层,将输出层的输出作为网络的输出:

最后一层是否需要添加激活函数通常视具体的任务而定。

        在使用TensorFlow自动求导功能计算梯度时,需要将前向计算过程放置在tf.GradientTape()环境中,从而利用GradientTape对象的gradient()方法自动求解参数的梯度,并利用iotimizers对象更新参数。

3.2 层方式实现

        通过层方式实现起来更加简洁,首先建立各个网络层,并指定各层的激活函数类型:

        在前向计算时,依序通过各个网络层即可:

        对于这种数据依次向前传播的网络,也可以通过Sequential容器封装成一个网络大类对象,调用大类的前向计算函数即可完成所有层的前向计算:

        前向计算时只需要调用一次网络大类对象即可完成所有层的按序计算:

3.3 优化目标

        把神经网络从输入到输出的计算过程叫做前向传播。神经网络的前向传播过程,也是数据张量从第一层流动至输出层的过程:从输入数据开始,途径每个隐藏层,直至得到输出并计算误差。

        前向传播的最后一步就是完成误差的计算

\mathcal{L}=g(f_\theta(x),y)

其中,f_{\theta}(\cdot)代表了利用\theta参数化的神经网络模型,g(·)称之为误差函数,用来描述当前网络的预测值f_{\theta}(\cdot)与真实标签y之间的差距度量。希望通过在训练集\mathbb{D}^{train}上面学习到一组参数\theta使得误差最小:

\theta^*=\underbrace{argmin}_\theta g(f_\theta(x),y),x\in\mathbb{D}^{train}

上述优化问题一般采用误差反向传播算法求解网络参数\theta的梯度信息,并利用梯度下降算法迭代更新:

\theta^{\prime}=\theta-\eta*\nabla_\theta\mathcal{L}

利用误差反向传播算法进行反向计算的过程也叫反向传播。

        从另一个角度来理解神经网络,它完成的是特征的维度变换的功能,比如4层的MNIST手写数字图片识别的全连接网络,它依次完成了784->256->128->64->10的特征降维过程。原始的特征通常具有较高的纬度,包含了很多底层特征及无用信息,通过神经网络的层层特征变换,将较高的维度降维到较低的维度,此时的特征一般包含了与任务强相关的高层特征信息,通过对这些特征进行简单的逻辑判定即可完成特定的任务。

        网络的参数量是衡量网络规模的重要指标。考虑权值矩阵W,偏置b,输入特征长度为d_{in},输出特征长度为d_{out},其参数量为d_{in}*d_{out},再加上偏置b的参数,总参数量为d_{in}*d_{out}+d_{out}。对于多层的全连接神经网络,比如784->256->128->64->10,总参数量计算表达式:

256*784+256+128*256+128+64*128+64+10*64+10=242762

约242K个参数量。

4. 激活函数
4.1 Sigmoid

Sigmoid:=\frac1{1+e^{-x}}

通过tf.nn.sigmoid实现

4.2 ReLU

ReLU(x):=max(0,x)

通过tf.nn.relu实现

4.3 LeakyReLU

\left.LeakyReLU=\left\{\begin{matrix}x\quad x\geq0\\p*x\quad x<0\end{matrix}\right.\right.

        p为用户自行设置的某较小数值的超参数。当p=0时,LeakyReLU函数退化为ReLU函数;当p≠0时,X<0能够获得较小的梯度值p,从而避免出现梯度弥散现象。

通过tf.nn.leaky_relu(x, alpha)实现

4.4 Tanh

\begin{aligned}tanh(x)&=\frac{(e^x-e^{-x})}{(e^x+e^{-x})}\\&=2*sigmoid(2x)-1\end{aligned}

通过tf.nn.tanh实现

5. 输出层设计

        特别地讨论网络的最后一层的设计,它除了和所有的隐藏层一样,完成维度变换、特征提取的功能,还作为输出层使用,需要根据具体的任务场景来决定是否使用激活函数,以及使用什么类型的激活函数。

        根据输出值的区间范围来分类讨论。常见的几种输出类型包括:

  • o\in R^d 输出属于整个实数空间,或者某段普通的实数空间,如函数值趋势的预测等。
  • o\in[0,1] 输出值特别地落在[0,1]区间,如图片生成,二分类问题的概率等。
  • o\in[0,1],\sum_io_1=1 输出值落在[0,1]区间,并且所有输出值之和为1,如多分类问题。
  • o\in[-1,1] 输出值在[-1,1]之间
5.1 普通实数空间

        这一类问题比较普遍,像正弦函数曲线预测、年龄的预测、股票走势的预测等都属于整个或部分连续的实数空间,输出层可以不加激活函数。误差的计算直接基于最后一层的输出o和真实值y进行计算。

5.2 [0,1]区间       

        输出值属于[0,1]区间也比较常见,比如图片的生成,二分类问题等。在机器学习中,一般会将图片的像素值归一化到[0,1]区间,如果直接使用输出层的值,像素的值范围会分布在整个实数空间。为了让像素的值范围映射到[0,1]的有效实数空间,需要在输出层后添加某个合适的激活函数\sigma,其中Sigmoid函数刚好具有此功能。

        同样的,对于二分类问题,如硬币的正反面预测,输出层可以只需要一个节点,表示某个事件A发生的概率P(A|x)。如果把网络的输出o表示正面事件出现的概率,那么反面事件出现的概率即为1-o,网络结构如下所示。

只需要在输出层的净活性值z后添加Sigmoid函数即可将输出转移为概率值。

5.3 [0,1]区间,和为1

        输出值o_i\in[0,1],所有输出值之和为1,这种设定以多分类问题最为常见。如下图所示,输出层的每个输出节点代表了一种类别,图中网络结构用于处理3分类任务,3个节点的输出值分布代表了当前样本属于类别A,B,C的概率。

        可以在输出层添加Softmax。Softmax函数定义为:

\sigma(z_i)=\frac{e^{z_i}}{\sum_{j=1}^{d_{out}}e^{z_j}}

        Softmax函数不仅可以将输出值映射到[0,1]区间,还满足所有的输出值之和为1的特性。示例如下:

        与Dense层类似,Softmax函数也可以作为网络层类使用,通过类layers.Softmax(axis=-1)可以方便添加Softmax层,其中axis参数指定需要进行计算的维度。

        在Softmax函数的数值计算过程中,容易因输入值偏大发生数值溢出现象;在计算交叉熵时,可会出现数值溢出的问题。为了数值计算的稳定性,TensorFlow中提供了一个统一的接口,将Softmax与交叉熵损失函数同时实现,同时也处理了数值不稳定的异常,一般推荐使用,避免单独使用Softmax函数与交叉熵损失函数。函数式接口为tf.keras.losses.categorical_crossentropy(y_true, y_pred, from_logits=False),当from_logits设置为True时,y_pred表示须为未经过Softmax函数的变量z;当from_logits设置为False时,y_pred表示为经过Softmax函数的输出。

5.4 [-1,1]

        如果希望输出值的范围分布在[-1,1],可以简单地使用tanh激活函数。

6. 误差计算

        常见的误差计算函数有均方差、交叉熵、KL散度、Hinge Loss函数等。其中均方差主要用于回归问题,交叉熵主要用于分类问题。

6.1 均方差

MSE:=\frac1{d_{out}}\sum_{i=1}^{d_{out}}(y_i-o_i)^2

在TensorFlow中,可以通过函数方式或层方式实现MSE误差计算:

6.2 交叉熵

H(p,q){:}=-\sum_{i=0}p(i)\log_2q(i)

通过变换,交叉熵可以分解为p的熵H(p)与p,q的KL散度和:

H(p,q)=H(p)+D_{KL}(p|q)

其中KL定义为

D_{KL}(p|q)=\sum_{x\epsilon X}p(x)log\left(\frac{p(x)}{q(x)}\right)

KL散度用于衡量2个分布之间距离的指标。

7. 神经网络类型       

        全连接层是神经网络中最基本的网络模型,全连接层前向计算简单,梯度求导也较简单,但是它有一个最大的缺陷,在处理较大特征长度的数据时,全连接层的参数量往往较大,使得训练深层数的全连接网络比较困难。

7.1 卷积神经网络

        如何识别、分析并理解图片、视频等数据是计算机视觉的一个核心问题,全连接层在处理高维度的图片、视频数据时往往网络参数量巨大,训练非常困难。通过利用局部相关性和权值共享的思想,Yann Lecun 在 1986 年提出了卷积神经网络(Convolutional NeuralNetwork,CNN)。随着深度学习的兴盛,卷积神经网络在计算机视觉中的表现几乎碾压了所有其他的模型算法,呈现统治计算机视觉领域之势。这其中比较流行的模型有用于图片分类的 AlexNet,VGG,GoogLeNet,ResNet,DenseNet 等,用于目标识别的 RCNN,FastRCNN,Faster RCNN,Mask RCNN 等。

7.2 循环神经网络

        除了具有空间结构的图片、视频等数据之外,序列信号也是非常常见的一种数据类型,其中一个最具代表性的序列信号就是文本数据。如何处理并理解文本数据是自然语言处理的一个核心问题。卷积神经网络由于缺乏 Memory 机制和处理不定长序列信号的能力,并不擅长自然语言处理任务。循环神经网络(Recurrent Neural Network,RNN在Yoshua Bengio,Jurgen Schmidhuber 等人的持续研究下,被证明非常擅长处理序列信号1997 年,Jurgen Schmidhuber 提出了 LSTM 网络,作为 RNN 的变种,它较好地克服了RNN 缺乏长期记忆、不擅长处理长序列的问题,在自然语言处理中得到了广泛的应用。基于 LSTM 模型,Google 提出了用于机器翻译的 Seq2Seq 模型,并成功商用于谷歌神经机器翻译系统(GNMT)。其他的 RNN变种还有 GRU,双向 RNN 等。

7.3 注意力(机制)网络

        RNN 并不是自然语言处理的最终解决方案,近年来随着注意力机制(Attention)的提出,克服了 RNN 训练不稳定、难以并行化等缺陷,在自然语言处理和图片生成等领域中逐渐崭露头角。注意力机制最初在图片分类任务上提出,但逐渐开始侵蚀 NLP 各大任务2017 年,Google 提出了第一个利用纯注意力机制实现的网络模型 Transformer,随后基于Transformer 相继提出了一系列的用于机器翻译的注意力网络模型,如 GPT,BERT,GPT-2等。在其他领域,基于注意力机制,尤其是自注意力(Self-attention)机制构建的网络也取得了不错的效果,比如基于自注意力机制的 BigGAN 模型等。

7.4 图神经网络

        图片、文本等数据具有规则的空间、时间结构,称之为 Euclidean Data。卷积神经网络和循环神经网终被证明非常擅长处理这种类型的数据。而像类似于社交网络、通信网络蛋白质分子结构等一系列不规则的空间拓扑结构的数据,它们显得力不从心。2016 年,Thomas Kipf等人基于前人在一阶近似的谱卷积算法上提出了图卷积网络(GraphConvolution Network,GCN模型。GCN 算法实现简单,从空间一阶邻居信息聚合的角度也能直观理解,在半监督任务上取得了不错效果。随后,一系列的网络模型相继被提出,如 GAT,EdgeConv,DeepGCN 等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值