Keras深度学习实战——神经网络基础与模型训练过程详解

Posted 盼小辉丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras深度学习实战——神经网络基础与模型训练过程详解相关的知识,希望对你有一定的参考价值。

Keras深度学习实战(1)——神经网络基础与模型训练过程详解

0. 前言

神经网络是一种性能强大的学习算法,其灵感来自大脑的运作方式。类似于神经元在大脑中彼此连接的方式,神经网络获取输入后,通过某些函数在网络中进行传递输入信息,连接在其后的一些神经元会被激活,从而产生输出。

1. 神经网络基础

1.1 简单神经网络的架构

人工神经网络受到人脑运作方式的启发。从本质上讲,它是对线性回归和逻辑回归的一种改进,神经网络在计算输出时引入了多种非线性函数。此外,神经网络在修改网络体系结构以利用结构化和非结构化数据跨多个域解决问题方面具有极大的灵活性。函数越复杂,网络对于输入的数据拟合能力就越大,因此预测的准确性就越高。神经网络的典型结构如下:

神经网络中的层 (layer) 是一个或多个节点(或称计算单元)的集合,层中的每个节点都连接到下一层中的每个节点。输入层由预测输出值所需的输入变量组成。输出层中节点的数量取决于我们要预测连续变量还是分类变量。如果输出是连续变量,则输出层一个节点。
如果输出结果是 n n n 个类别的预测类的分类,则输出层中将有 n n n 个节点。隐藏层用于将输入层的值转换为高维空间中的值,以便我们可以从输入中了解数据的更多特征。隐藏层中节点的工作方式如下:

在上图中, x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn 是自变量, x 0 x_0 x0 是偏置项,类似于线性方程 y = k x + b y=kx+b y=kx+b 里的 b b b w 1 , w 2 , . . . , w n w_1, w_2, ..., w_n w1,w2,...,wn 是赋予每个输入变量的权重。如果 a a a 是隐藏层中的节点之一,则计算方法如下所示:

a = f ( ∑ w i N w i x i ) a=f(\\sum _w_i ^N w_ix_i) a=f(wiNwixi)

f f f 函数是激活函数,用于在输入和它们相应的权重值的总和上引入非线性。可以通过使用多个隐藏层实现更强的非线性能力。
综上,神经网络是相互连接的层中节点权重的集合。该集合分为三个主要部分:输入层,隐藏层和输出层。神经网络中可以具有 n n n 个隐藏层,术语“深度学习”通常表示具有多个隐藏层的神经网络。 当神经网络需要学习具有复杂上下文(例如图像识别)或上下文不明显的任务时,就必须具有隐藏层,隐藏层也被称为中间层。

1.2 神经网络的训练

训练神经网络实际上就是通过重复两个关键步骤来调整神经网络中的权重:前向传播和反向传播。

  1. 在前向传播中,我们将一组权重应用于输入数据,将其传递给隐藏层,对隐藏层计算后的输出使用非线性激活,通过若干个隐藏层后,将最后一个隐藏层的输出与另一组权重相乘,就可以得到输出层的结果。对于第一次正向传播,权重的值将随机初始化。
  2. 在反向传播中,尝试通过测量输出的误差,然后相应地调整权重以降低误差。神经网络重复正向传播和反向传播以预测输出,直到获得令误差较小的权重为止。

1.3 神经网络的应用

最近,神经网络在各种应用中的广泛采用。神经网络可以通过多种方式进行构建。以下是一些常见的构建方法:

底部的紫色框代表输入,其后是隐藏层(中间的黄色框),顶部的粉色框是输出层。一对一的体系结构是典型的神经网络,在输入和输出层之间具有隐藏层。不同体系结构的示例如下:

架构示例
one-to-many输入是图像,输出是图像的预测类别概率
many-to-one输入是电影评论,输出评论是好评或差评
many-to-many将一种语言的句子使用神经网络翻译成另一种语言的句子

现代神经网络中经常用到的一种架构称为卷积神经网络 (Convolutional Neural Networks, CNN),可以用来理解图像中的内容并检测目标内容所在的位置,该体系架构如下所示(在之后的学习中会进行详细介绍):

神经网络在推荐系统,图像分析,文本分析和音频分析的都有着广泛的应用,神经网络能够灵活地使用多种体系结构解决问题,可以预料的是,神经网络的使用范围将会越来越广。
接下来,我们将根据神经网络训练的两个关键步骤——前向传播和反向传播——介绍神经网络模型的构建。

2. 从零开始构建前向传播

为了进一步了解前向传播的工作方式,我们将通过一个简单的示例来构建神经网络,其中神经网络的输入为 (1, 1),对应的输出为 0。
我们使用的神经网络具有一个隐藏层,一个输入层和一个输出层。由于要使输入层能够以更大的维度表示,因此隐藏层中的神经元数量多于输入层中的神经元。

2.1 计算隐藏层节点值

第一次进行正向传播时,首先需要为所有连接分配权重,这些权重是基于高斯分布随机选择的,但是神经网络训练过程之后的最终权重不需要服从特定分布,假定初始网络权重如下:

接下来,我们将输入与权重相乘以计算隐藏层中隐藏单元的值,隐藏层的节点单位值计算结果如下:

h 1 = 1 × 0.8 + 1 × 0.2 = 1 h 2 = 1 × 0.4 + 1 × 0.9 = 1.3 h 3 = 1 × 0.3 + 1 × 0.5 = 0.8 h_1=1\\times 0.8+1\\times 0.2 = 1\\\\ h_2=1\\times 0.4+1\\times 0.9 = 1.3\\\\ h_3=1\\times 0.3+1\\times 0.5 = 0.8 h1=1×0.8+1×0.2=1h2=1×0.4+1×0.9=1.3h3=1×0.3+1×0.5=0.8

下图展示了计算隐藏层的节点值后的网络示意图:

在以上步骤中,我们计算了隐藏节点的值。为简单起见,我们并未在隐藏层的节点中添加偏置项。接下来,我们将通过激活函数传递隐藏层的值,以便在输出中增加非线性。
NOTE:如果我们不在隐藏层中应用非线性激活函数,则神经网络本质上将成为从输入到输出线性连接。

2.2 应用激活函数

可以在网络中的多个网络层中应用激活函数,使用它们可以实现高度非线性,这对于建模输入和输出之间的复杂关系非常关键。在我们的示例中,使用 Sigmoid 激活函数如下所示:
s i g m o i d ( x ) = 1 1 + e − x sigmoid(x)=\\frac 1 1+e^-x sigmoid(x)=1+ex1
通过将 Sigmoid 激活函数应用于隐藏层,我们得到以下结果:

f i n a l _ h 1 = s i g m o i d ( 1.0 ) = 0.73 f i n a l _ h 2 = s i g m o i d ( 1.3 ) = 0.78 f i n a l _ h 3 = s i g m o i d ( 0.8 ) = 0.69 final\\_h_1 = sigmoid(1.0) = 0.73\\\\ final\\_h_2 = sigmoid(1.3) = 0.78\\\\ final\\_h_3 = sigmoid(0.8) = 0.69 final_h1=sigmoid(1.0)=0.73final_h2=sigmoid(1.3)=0.78final_h3=sigmoid(0.8)=0.69
下图展示了隐藏层的应用非线性激活函数后节点值的情况:

关于更多激活函数的介绍,参考《深度学习常用激活函数》

2.3 计算输出层值

现在我们已经计算了隐藏层的值,最后将计算输出层的值。在下图中,我们将隐藏层值通过随机初始化的权重值连接到输出层。计算隐藏层值和权重值乘积的总和,得到输出值:

o u t p u t = 0.73 × 0.3 + 0.79 × 0.5 + 0.69 × 0.9 = 1.235 output = 0.73\\times 0.3+0.79\\times 0.5 + 0.69\\times 0.9= 1.235 output=0.73×0.3+0.79×0.5+0.69×0.9=1.235

使用隐藏层值和权重值,我们可以得到网络的输出值,如下图所示:

因为第一次正向传播使用随机权重,所以输出神经元的值与目标相差很大,相差为 +1.235 (目标值为0)。

2.4 计算损失值

损失值(也称为成本函数)是在神经网络中优化的值。为了了解如何计算损失值,我们分析以下两种情况:

  • 连续变量预测
  • 分类(离散)变量预测

2.4.1 在连续变量预测过程中计算损失

通常,当预测值为连续变量时,损失函数使用平方误差,也就是说,我们尝试通过更改与神经网络相关的权重值来最小化均方误差:

J ( θ ) = 1 m ∑ i = 1 m ( h ( x i ) − y i ) 2 J(\\theta)=\\frac 1 m \\sum _i=1 ^m(h(x_i)-y_i)^2 J(θ)=m1i=1m(h(xi)yi)2

其中, y i y_i yi 是实际值, h ( x ) h(x) h(x) 是我们对输入 x x x 进行变换以获得预测值 y y y 的网络模型, m m m 是输入数据集中的数据个数。

2.4.2 在分类(离散)变量预测中计算损失

当要预测的变量是离散变量时(也就是说,变量中只有几个类别),我们通常使用分类交叉熵损失函数。当要预测的变量具有两个不同的值时,损失函数为二分类交叉熵,而当要预测的变量具有多个不同的值时,损失函数为多分类交叉熵。

  • 二分类交叉熵公式如下:

( y l o g ( p ) + ( 1 − y ) l o g ( 1 − p ) ) (ylog(p)+(1−y)log(1−p)) (ylog(p)+(1y)log(1p))

  • 多分类交叉熵定义如下:

− ∑ i = 1 n y i l o g ( p n ) -\\sum _i=1 ^n y_i log(p_n) i=1nyilog(pn)

其中, y y y 是输入实际对应的真实值, p p p 是输出的预测值, n n n 是数据量的总数。

2.4.3 计算网络损失值

由于我们在以上示例中预测的结果是连续的,因此损失函数值是均方误差,其计算方法如下

以上是关于Keras深度学习实战——神经网络基础与模型训练过程详解的主要内容,如果未能解决你的问题,请参考以下文章

Keras深度学习实战——批归一化详解

Keras深度学习实战——神经网络性能优化技术详解

Keras深度学习实战——深度学习过拟合问题及解决方法

Keras深度学习实战——卷积神经网络的局限性

Keras深度学习实战(10)——迁移学习

Keras深度学习实战——卷积神经网络详解与实现