《神经网络与深度学习》第一章(使用神经网络识别手写数字)读书笔记

说明:《神经网络与深度学习》(中文版可在网上免费获取)是浙江科技学院开放实验课程《Python与深度学习入门》的课外推荐读物。本读书笔记大部分为摘抄。本文章目前处于暂停更新状态,恢复更新时间待定。文章中的灰色引用块与手写数字识别有关。

1.1 感知器

⼀个感知器接受⼏个⼆进制输⼊,x1,x2,…,并产⽣⼀个⼆进制输出
《神经网络与深度学习》第一章(使用神经网络识别手写数字)读书笔记_第1张图片
在这里插入图片描述
其中wj为权值,threshold为阈值。
↓⼀个感知器⽹络
《神经网络与深度学习》第一章(使用神经网络识别手写数字)读书笔记_第2张图片
(注意:多输出箭头仅仅便于说明⼀个感知器的输出被⽤于其它感知器的输⼊。)
↓规则重写(简化)
规则重写(简化)
其中w和x对应权重和输⼊的向量,b =threshold为偏置。
偏置的意义:激活感知器的容易程度。(越大越容易)
用处:权衡依据来做出决策,逻辑运算。
↓用感知器实现的与非门
在这里插入图片描述
其中箭头上的数字代表输入变量的权重,圆圈内的数字代表偏置。
↓与非门是通用运算,其组合可实现任何逻辑功能。
《神经网络与深度学习》第一章(使用神经网络识别手写数字)读书笔记_第3张图片
如果图中存在双输出到同⼀个地⽅的箭头,则表示输出权值是缺省权值的2倍。
↓可以画⼀层额外的感知器——输⼊层——来⽅便对输⼊编码。
在这里插入图片描述
可以不把输⼊感知器看作感知器,⽽是简单定义为输出期望值的特殊单元。
(感受器组成的)神经网络与传统(以与非门为基础的)电路的区别:可以设计学习算法,能够⾃动调整⼈⼯神经元的权重和偏置。这种调整可以响应外部的刺激。

1.2 S型神经元

通过逐步修改权重和偏置来让⽹络接近期望⾏为是比较困难的(如果对权重(或者偏置)的微⼩的改动真的能够仅仅引起输出的微⼩变化,那我们可以利⽤这⼀事实来修改权重和偏置,让我们的⽹络能够表现得像我们想要的那样。

例如,假设⽹络错误地把⼀个“9”的图像分类为“8”。我们能够计算出怎么对权重和偏置做些⼩的改动,这样⽹络能够接近于把图像分类为“9”。

然后我们要重复这个⼯作,反复改动权重和偏置来产⽣更好的输出。这时⽹络就在学习。),因为⽹络中单个感知器上⼀个权重或偏置的微⼩改动有时候会引起那个感知器的输出完全翻转,那样的翻转可能接下来引起其余⽹络的⾏为以极其复杂的⽅式完全改变。
S 型神经元和感知器类似,但是被修改为权重和偏置的微⼩改动只引起输出的微⼩变化。S 型神经元的输⼊可以取0 和1 之间的任意实数,总的偏置b= σ(w· x+b),这⾥σ 被称为S型函数(又称逻辑函数,S型神经元又称逻辑神经元),定义为:
在这里插入图片描述
所以b=
在这里插入图片描述
我们可以显式设定⼀个约定来使S型神经元的输出为0或1,例如,

约定任何⾄少为0.5 的输出为表⽰ “这是⼀个9”,⽽其它⼩于0.5 的输出为表⽰“不是⼀个9”。

1.3 神经⽹络的架构

一个神经⽹络中最左边的称为输⼊层,其中的神经元称为输⼊神经元。最右边的,即输出层包含有输出神经元。中间层则被称为隐藏层。这种多层⽹络有时被称为多层感知器或者MLP。
设计⽹络的输⼊输出层通常是⽐较直接的。

例如,假设我们尝试确定⼀张⼿写数字的图像上是否写的是“9”。很⾃然地,我们可以将图⽚像素的强度进⾏编码作为输⼊神经元来设计⽹络。如果图像是⼀个64×64的灰度图像,那么我们会需要4096 = 64×64个输⼊神经元,每个强度取0和1之间合适的值。输出层只需要包含⼀个神经元,当输出值⼩于0.5 时表⽰“输⼊图像不是⼀个9”,⼤于0.5 的值表⽰“输⼊图像是⼀个9”。

隐藏层的设计堪称⼀⻔艺术。特别是,通过⼀些简单的经验法则来总结隐藏层的设计流程是不可⾏的。相反,神经⽹络的研究⼈员已经为隐藏层开发了许多设计最优法则。
前馈神经⽹络:以上⼀层的输出作为下⼀层的输⼊。
递归神经⽹络:含有可在激活一段时间后休眠的神经元,使得反馈环路可⾏。

1.4 ⼀个简单的分类⼿写数字的⽹络

可以把识别⼿写数字的问题分成两个⼦问题。⾸先,我们希望把包含许多数字的图像分成⼀系列单独的图像,每个包含单个数字。有很多途径可以解决分割的问题。⼀种⽅法是尝试不同的分割⽅式,⽤数字分类器对每⼀个切分⽚段打分。如果数字分类器对每⼀个⽚段的置信度都⽐较⾼,那么这个分割⽅式就能得到较⾼的分数。第⼆个问题,分类单独的数字。
⽹络的输⼊层包含给输⼊像素的值进⾏编码的神经元。输⼊像素是灰度级的,值为0.0 表⽰⽩⾊,值为1.0 表⽰⿊⾊,中间数值表⽰逐渐暗淡的灰⾊。
我们把输出神经元的输出赋予编号0 到9,并计算出哪个神经元有最⾼的激活值。

1.5 使⽤梯度下降算法进⾏学习

我们希望有⼀个算法,能让我们找到权重和偏置,以⾄于⽹络的输出y(x) 能够拟合所有的训练输⼊x。为了量化我们如何实现这个⽬标,定义⼆次代价函数(均⽅误差,MSE,损失或⽬标函数):
在这里插入图片描述
其中w 表⽰所有的⽹络中权重的集合,b 是所有的偏置,n 是训练输⼊数据的个数,a 表⽰当输⼊为x 时输出的向量,符号||v||表示向量v的模,求和则是在总的训练输⼊x 上进⾏的。
这样,我们的目标就可转化为最小化C的值。
可用梯度下降来解决多元函数的最⼩化问题。
当我们在v1 和v2 ⽅向分别将球体移动⼀个很⼩的量,微积分告诉我们C 将会有如下变化:
在这里插入图片描述
为了让球体滚落,要寻找⼀种选择Δv1 和Δv2 的⽅法使得ΔC 为负。定义Δv 为v 变化的向量,Δv ≡ (Δv1;Δv2)T,⽤∇C 来表⽰梯度向量,即:
在这里插入图片描述
所以,ΔC≈ ∇C · Δv
假设我们选取:Δv = -η∇C
其中的η是个很⼩的正数(称为学习速率),那么C 会⼀直减⼩,不会增加。
v的更新规则(定义梯度下降算法)可写成:
在这里插入图片描述
总结⼀下,梯度下降算法⼯作的⽅式就是重复计算梯度∇C,然后沿着相反的⽅向移动,沿着⼭⾕“滚落”。
在神经⽹络中,⽤权重和偏置代替变量vj,得到:
在这里插入图片描述
有种叫做随机梯度下降的算法能够加速学习。其思想就是通过随机选取⼩量训练输⼊样本来计算∇Cx,进⽽估算梯度∇C。训练输⼊数量为m 个,标记为X1,X2,…,Xm,并把它们称为⼀个⼩批量数据,则有
在这里插入图片描述
与神经⽹络的学习相联系,则有
在这里插入图片描述
其中两个求和符号是在当前⼩批量数据中的所有训练样本Xj 上进⾏的。然后我们再挑选另⼀随机选定的⼩批量数据去训练。直到我们⽤完了所有的训练输⼊,这被称为完成了⼀个训练迭代期(epoch)。然后我们就会开始⼀个新的训练迭代期。

1.6 实现我们的⽹络来分类数字

MNIST 数据分为60000 个训练图像和10000 个测试图像,训练图像又分为2部分,50,000 个图像⽤来训练神经⽹络,和⼀个单独的10,000 个图像的验证集。在本章中我们不使⽤验证数据。
核⼼⽚段是⼀个Network 类,⽤来表⽰⼀个神经⽹络。
Network 对象中的偏置和权重都是被随机初始化的,使⽤Numpy 的np.random.randn 函数来⽣成均值为0,标准差为1 的⾼斯分布。偏置和权重以Numpy 矩阵列表的形式存储。这里我们假设第⼀层神经元是⼀个输⼊层,并对这些神经元不设置任何偏置。记矩阵net.weights[1] 为w , wjk 是连接第⼆层的kth 神经元和第三层的jth 神经元的权重。这样,第三层神经元的激活向量是:a′= σ(wa + b)
其中a 是第⼆层神经元的激活向量,w为权重矩阵,b为偏置向量,σ指对向量wa + b 中的每个元素应⽤函数σ。
大部分工作由反向传播算法完成,因此update_mini_batch 的⼯作仅仅是对mini_batch 中的每⼀个训练样本计算梯度,然后适当地更新self.weightsself.biases
Network 对象做的主要事情是学习。这通过⼀个实现随即梯度下降算法的SGD ⽅法来实现。其中training_data 是⼀个(x, y) 元组的列表,表⽰训练输⼊和其对应的期望输出。变量epochs 和mini_batch_size 是迭代期数量,和采样时的⼩批量数据的⼤⼩。eta 是学习速率η。

你可能感兴趣的:(读书笔记,神经网络,人工智能,图像识别)