深入浅出神经网络与深度学习 (迈克尔·尼尔森(Michael Nielsen)) Chapter1

http://neuralnetworksanddeeplearning.com/chap1.html

 

https://twitter.com/haoel/status/1634401197544321024

一上午看了《深入浅出神经网络与深度学习》这本书的一半内容,写得真的好!真是深入浅出!

不过中文版书中的总是有一些低级错误(如下图所示),中文版的书从来都是对着英文版看的……

 

1.1 感知机perceptron

20 世纪五六十年代,科学家Frank Rosenblatt 发明了感知机,其受到了 Warren McCulloch 和 Walter Pitts 早期研究的影响。

 

what's weighted sum in perceptron?

In the context of the perceptron algorithm, the weighted sum refers to the linear combination of the input features and their corresponding weights. Specifically, given an input vector x = [x1, x2, ..., xn] and weight vector w = [w1, w2, ..., wn], the weighted sum is computed as:

z = w1*x1 + w2*x2 + ... + wn*xn

This is the linear combination of the input features x with their corresponding weights w. The weighted sum is then passed through an activation function, typically a step function, to produce the output of the perceptron. In other words, the weighted sum determines whether the perceptron should fire (output 1) or not (output 0) based on the input.

The weighted sum can also be expressed in vector notation as the dot product of the input vector x and the weight vector w:

z = w.dot(x)

In this form, the weighted sum is a concise way of representing the linear combination of the input features and their corresponding weights.

 

感知机接收若干个二进制输入 x1,x2,x3,...,并生成一个二进制输出,如图 1-3 所示。

图 1-3 中的感知机有 3 个输入 x1,x2,x3,一般来说输入还可以更多或更少。Rosenblatt 提出了
一条计算输出的简单规则。他引入权重 w1,w2,w3,用这些实数来表示输入对于输出的重要性。神
经元的输出究竟是 0 还是 1,则由加权和w1x1+w2x2+w3x3 小于或大于某个阈值来决定。

 

前面讲过,感知机通过权衡不同的因素来做出决策。感知机的另一种用法是执行基本的逻辑
运算,例如 AND、OR、NAND。

 

https://sites.math.northwestern.edu/~mlerma/courses/cs310-05s/notes/dm-boolalg

这里还是用了异或的例子,不过是只采用了与非门来生成x1 x2 

x1 and x2 as input of NAND gateA, the output is xA
x1 and xA as input of NAND gateB, the output is xB
x2 and xA as input of NAND gateC, the output is xC
xB and xC as input of NAND gateD, the output is xD, which is the bitwise sum

x1 x2 xA=x1 NAND x2 xB=x1 NAND xA xC=x2 NAND xA xD=xB NAND xC
0 0 1 1 1 0
0 1 1 1 0 1
1 0 1 0 1 1
1 1 0 1 1 0

 

另外一本书,深度学习入门:基于Python的理论与实现(斋藤康毅)

x1 and x2 as input of NAND, and the output as s1

x1 and x2 as input of OR, and the output as s2

s1 and s2 as the input of AND, and the output as y

x1 x2 s1=x1 NAND x2 s2=x1 OR x2 y=s1 AND s2
0 0 1 0 0
0 1 1 1 1
1 0 1 1 1
1 1 0 1 0

 

 

 

1.2 sigmod神经元

 

1.3 神经网络的架构

神经网络中最左边的为输入层,其中的神经元称为输入神经元;最右边是输出层,
包含输出神经元。在本例中,输出层只有一个神经元。由于中间层中的神经元既不是输入也不是
输出,因此称为隐藏层。“隐藏”听上去有些神秘,我第一次听到这个词时,以为它涉及某些深
奥的哲学或数学涵义,实际上它仅仅意味着“既非输入也非输出”。

 

令人困惑的是,由于历史的原因,尽管这种多层神经网络是由 sigmoid 神经元而不是感知机
构成的,但有时仍被称为多层感知机(multilayer perceptron,MLP),但本书不会使用这种称法,
因为可能引起混淆,这里只做简单介绍

 

设计神经网络的输入层和输出层通常比较简单,例如尝试确定一幅手写数字图像上写的是
“9”。我们自然会想到对图像像素的灰度进行编码,作为输入神经元来设计神经网络。如果图像
是一幅 64×64 的灰度图像,那么会需要 4096(64×64)个输入神经元,每个灰度在 0 和 1 之间取
合适的值。输出层只需要包含一个神经元,当输出值小于 0.5 时表示“输入图像不是 9”,大于
0.5 的值则表示“输入图像是 9”

 

1.4 一个简单的神经网络:分类手写数字

我们将使用一个三层神经网络来识别单个数字,如图 1-20 所示

输入层包含对输入像素的值进行编码的神经元。稍后会介绍,神经网络所用的训练数据由很
多扫描得到的手写数字图像组成(像素是 28 28  ),因此输入层共包含 784( 28 28  )个神经元。
简单起见,图 1-20 忽略了大部分输入神经元。输入像素表示为灰度,值为 0.0 表示白色,值为
1.0 表示黑色,中间数值表示灰度

 

神经网络的第 2 层是隐藏层,其中 n 表示神经元的数量,n 可以取不同的值。本示例的隐藏

层仅包含 15 个神经元。
输出层包含 10 个神经元。如果第 0 个神经元被激活,即输出约为 1,则表明神经网络认为数
字是一个“0”;如果第 1 个神经元被激活,则表明神经网络认为数字是一个“1”,以此类推。
确切地说,我们把输出神经元的输出以 0~9 编号,并计算哪个神经元的激活值最大。如果编号
为 6 的神经元被激活,那么说明神经网络猜测输入的数字为“6”,其他神经元的行为与之类似。

 

你可能会好奇为什么这里用了10 个输出神经元,毕竟我们的目标是让神经网络能判断 0~9
中的哪个数字与输入图片匹配。一个看似更自然的方法是使用 4 个输出神经元,把每一个数字当
作一个二进制值,看其输出更接近 0 还是 1。4 个神经元足以编码这个问题了,因为对于输入数
字而言 4 2 16  (大于 ) 10 。那么为什么要用 10 个神经元呢?这样做不会效率更低吗?这个决策
是基于经验的:我们可以试验两种神经网络设计,结果证明对于这个特定的问题,含有 10 个输
出神经元的神经网络比 4个的识别效果更好。为什么含有 10个输出神经元的神经网络更有效呢?
是否有启发式方法能提前告知我们用 10 个输出编码比用 4 个输出编码更好呢

 

1.5 利用梯度下降算法进行学习

前面设计的神经网络如何学习识别数字呢?首先需要一个供学习使用的数据集——训练数
据集,简称训练集。我们将使用 MNIST 数据集,它包含数以万计的手写数字扫描图像及其正确
的分类信息。该数据集基于由 NIST(美国国家标准与技术研究院)收集的两个数据集改进后的
子集。

 

MNIST 数据分为两部分。第一部分包含 60 000 幅用作训练数据的图像,这些图像扫描自 250
人的手写样本,其中一半人是美国人口普查局的员工,另一半人是高中生。这些图像是 28×28 大
小的灰度图。第二部分是 10 000 幅用作测试数据的图像,也是 28×28 大小的灰度图。我们将用
这些测试数据来评估神经网络识别数字的水平。为了保证测试结果,测试数据取自跟原始训练数
据不同的另外 250 人(仍然是美国人口普查局员工和高中生)所写的数字,这样系统会尝试识别
训练时未见过的手写数字

 

我们用符号 x 表示训练输入。方便起见,把训练输入 x 看作28 28 784   维的向量。向量中的
每一项代表图像中单个像素的灰度值。我们用 y =y(x) 表示对应的目标输出,其中 y是一个 10维向
量。例如对于一个写成“6”的训练图像 x,神经网络的目标输出就是 y(x)= (0, 0, 0, 0, 0, 0,1, 0, 0, 0)T
注意,T 是转置操作,它把行向量转换成列向量

 

1.6  实现分类数字的神经网络

下面编写一个程序来学习如何识别手写数字,会用到随机梯度下降算法和 MNIST 训练数据。
首先获取 MNIST 数据,可以使用 Git 克隆本书代码仓库:
git clone https://github.com/mnielsen/neural-networks-and-deep-learning.git

前面介绍 MNIST 数据时,提到它分为 60 000 幅训练图像和 10 000 幅测试图像,这是官方描
述。这里用稍微不同的方法划分数据——测试集保持原样,但是将训练集分成两部分:一部分包
含 50 000 幅图像,用于训练神经网络,其余 10 000 幅图像组成验证集。本章不使用验证集,但
后文会介绍,它有助于设置神经网络中的某些超参数,例如学习率等,这些超参数不能由学习算
法直接选择。尽管验证数据不是原始 MNIST 数据的一部分,但许多人以这种方式使用 MNIST
数据,而且验证数据在神经网络中很常用。后文在提到“MNIST 训练数据”时,指的都是图像

数量为 50 000 幅的数据集,而不是图像数量为 60 000 幅的原始数据集①。
除了 MNIST 数据,还要用到 Python 库 NumPy,用于进行快速的线性代数运算

 

posted @ 2023-04-09 16:20  ChuckLu  阅读(354)  评论(0编辑  收藏  举报