【机器学习】什么是神经网络?如何去搭建神经网络?神经网络的原理是什么?

系列文章目录

第十章 Python 机器学习入门之神经网络基础知识



一、神经网络的一些基本知识

1 神经元和大脑

神经元和大脑  neurons and the brain

大脑是如何工作的? 它与神经网络有什么关系?

neural networks 神经网络一开始的动机就是试图建立模拟大脑的软件

那么大脑是如何工作的?
我们的所有思想都来自大脑中的神经元,它们发送电脉冲,有时会形成与其他神经元的新连接,

但是,今天神经网络与大脑的学习方式无关,
人工神经网络使用了一种非常简化的数学模型来模拟生物神经元的作用,
一个神经元,当它有了inputs 输入后,就会进行处理,从而outputs 输出, 它的输出可能是另一个神经元的输入

在构建人工神经网络 neural networks 或深度学习 deep Learning 算法时,我们一般会同时模拟许多这样的神经元

如图,我们通常都不止一个神经元,可能时3个,或者更多。

输入一个数字,它会输出一些其他是数字
神经网络也被叫成深度学习 deep Learning

2 为什么神经网络现在这么热门?

以前我们记账,做笔记什么的都是使用纸张,现在都可以数字化,这些就会使得数据量非常大

我们现有的模型,比如传统算法像线性回归,逻辑回归等,它们对一些东西的预测精度有限

简单的说就是我们提供给它们大量的训练数据,它们预测的精度都是有限的,

现在,提供大量的数据,这些传统算法都没有办法有效利用,

经过研究,发现神经网络可以解决这个问题,当我们拥有大量的数据 big data 时,训练一个大型的神经网络,它的预测精度会非常高,得到我们想要的解决,使用传统的算法是无法实现这个的

除此之外,神经网络可以在gpu 上运行也是它热门的原因之一。

3 神经网络在需求预测中的工作原理

我们说明神经网络是如何工作的,我们从一个例子开始,

我们知道了一件衬衫的价格,来预测它是否会卖的好。

这是一个分类问题,我们可以使用逻辑回归中的sigmoid 函数

在神经网络中,我们会给计算公式一个符号 a ,这个代表激活,表示一个神经元向下一个神经元发送了多少输出

如图,如果我们只有一个神经元了,那么输入一个价格,它会经过神经元的处理,也就是公式a , 然后它会输出概率

这是单个神经元,构建神经网络,只需要取一堆这样的神经元,将它们链接起来,放在一起

如图,x 是特征向量,input layer 通常称为第0层

输入的数据会被送到一个隐藏层 hidden layer, 我们称为第一个隐藏层,这个隐藏层有3个神经元,
那么它将输出一个包含3 个激活值的向量,这3个数字在输入到第二个隐藏层,第二个隐藏层有2 个神经元,
那么它将输出一个包含2 个激活值的向量,这2个值输入到输出层,输出神经网络的预测

神经网络在计算机视觉中的工作方式更加方便,
我们只需要向神经网络提供不同的数据,神经网络就会自动学习检测,不同的特征值以便尝试检测汽车,人脸等

4 神经网络中的网络层

neural network layer
如果我们会构建一层神经元,那我们只需要将构建的神经元组合起来就可以形成一个大型神经网络
让我们来看看一层神经元是怎么工作的

有4个特征值被输入到隐藏层中的3个神经元的这一层,如何将其输出到带有一个神经元的输出层
来看看隐藏层的计算
4个特征值是隐藏层中每个神经元的输入,这3个神经元中的每一个都只是实现了一个小的逻辑回归单元

以第一个神经元为例,它有两个参数 w,b ,为了表示这是第一个隐藏层的第一个神经元,我们会给它添加下标w_1,b_1,上标[1]

这些神经元的作用就是输出一些激活值a ,为了表示这是第一个隐藏层的第一个神经元,我们会给它添加下标 a_1,上标[1]

3个神经元会输出a_1,a_2, a_3, 这些组成了激活值a 的向量,然后将这个激活向量a 传递给该神经网络的最终输出层,

通常,我们还会给输出的激活值一个标注[i], a[1],就表示第一层的输出的激活值,

简单的说,当看见神经网络中,符号上表[1],就表示这是与第一层相关联的数量,

第一层的输出,也是第二层的输入,第二层输出结果概率后,我们可以给它一个阈值,比如输出值是否大于0.5
如果是,则输出1,如果不是则输出0

来看看更复杂的神经网络

这是一个神经网络,共有5层,我们通常不算输入层,使用会说这个神经网络有4层。
1,2,3层是隐藏层,4层是输出层,

放大第三层,输入时第二层的激活,输出是第三层的激活,

这里的g 指的就是sigmoid 函数,也叫激活函数,激活函数就是指输出激活值的函数,这里使用的是sigmoid函数,所以sigmoid函数也可以叫做激活函数

如果要计算哪一个隐藏层中的哪个神经元的步骤,可以按上图的公式来。

二、神经网络中的前向传播算法

我们以手写数字为例,输出1或0

神经网络有3层,第一层有25个神经元或25个单元,第二层有15个神经元或15个单元,第三层是输出层

我们首先要计算激活值a[1],再使用a[1] 来计算a[2],最后使用 a[2] 来计算a[3],a[3]作为输出结果
也可以写成f(x) = a[3],在之前我们使用f(x)来表示线性回归和逻辑回归的输出,

所以我们也可以使用f(x)来表示神经网络输出层的结果

因为计算是从左到右,按照顺序进行的,使用也叫做正向传播,

这种类型的神经网络框架,就是一开始有很多的隐藏单元,随着接近输出层,隐藏单元的数量会减少,非常常见。

三、 如何用代码实现推理

1 使用 TensorFlow

TensorFlow 是实现深度学习算法的最常用的框架之一,另一个是PyTorch

下面来看看如何使用TensorFlow 来实现推理代码

以手写数字分类问题为例,在这个问题中,x 是像素强度值的列表,

先进行数据初始化,并执行一步前向传播,第一层有25个单元和sigmoid 激活函数的密集层,

然后计算a_1,再设置第二层,计算a_2,定义第三层也是输出层,计算a_3

最后,可以选择阈值,得出二元预测

2 NumPy 和 TensorFlow中的数据表达形式

NumPy 和 TensorFlow的数据形式有些不同,

NumPy 是如何存储向量和矩阵的?

这是一个2行rows  3列columns 的矩阵, 我们称其为 2✖3 的矩阵matrix,2维矩阵

底下是一个4行rows 2 列columns 的矩阵, 我们称其为 4✖2 的矩阵matrix,2维矩阵,

注意,像 2✖1 的矩阵 , 1✖2 的矩阵都被称为2维数组,使用numpy 表示都是有两个中括号

当只有一个中括号时,像 x = np.array([200, 7])  时,这里的x 就是一个一维数组,它没有行,没有列,只是一个数字列表

我们在线性回归,逻辑回归中,使用一维向量来表示输入特征X,

对于TesorFlow ,惯例是使用矩阵来表示数据,

因为TensorFlow 旨在处理非常大的数据集,通过在矩阵表示数据,可以让其在内部更高效地进行计算 。

深度学习中的数据一般都是tensor (张量)类型的,那么什么是tensor 呢?

tensor(张量) 是TensorFlow 团队创建的一种数据类型,用于有效地存储和执行矩阵计算
张量tensor 比矩阵更加通用一点,我们可以将张量理解为表示矩阵的一种方式。

四、搭建一个神经网络  

1 搭建神经网络的一些基本操作

building a neural network

我们之前是怎么操作的?

首先,初始化数据 x ,创建第一层然后计算第一个激活值 a1
然后创建第二层并计算第二个激活值

然而tensorflow 具有不同的实现前向传播的方式。

首先创建第一层,第二层

然后不用一步步的计算,我们可以直接告诉tensorflow ,我们希望它使用第一层和第二层
并将它们串在一起形成一个神经网络, 这里面使用了sequential() 函数

让我们使用我们搭建的神经网络,

图下面这个是咖啡的例子,
将训练数据作为输入x , 并将它们放入np array 数组中,这是一个4 × 2 的矩阵,
输出目标y ,也写成数组模式,

如果我们想训练这个神经网络,只需要调用模型model.compile() 

然后调用model.fit(x,y) 即可

它将告诉tensorflow 采用这个通过将第一层和第二层串在一起创建的神经网络,在数据x ,y 上对其训练

如果我们有一个新的例子x_new ,我们如何去做预测呢?

只需要调用model.predict(x_new) 即可,我们给定x 的输入值,这将自动输出一个对应的值

一般的,我们不将每一层的代码写出来,可以直接写在sequential() 函数中

2 单个网络层上的前向传播

单个网络层上的前向传播  forward prop(propagation) in a single layer 

以 前面烘培咖啡为例,来看看如何在python 中实现输入数据x,并经过前向传播 forward propagation,获得a2,

这里,我们可以使用一维向量来表示所有的向量和参数,这也是为什么这里只有一个方括号。

a2_1 表示上标是2,下标是1

第一层中有3个神经元,所以要计算3次,输出向量 a1, 这个a1 就是激活

这里,a1 = np.array([a1_1, a1_2, a1_3])

第二层中有1个神经元,所以计算一次即可,最后输出结果a2

前向传播的一般实现,general implementation of forward propagation
编写一个函数来实现一个密集层,那是神经网络的单层,

首先定义密集函数,用上一层的激活来作为下一层的输入,以及参数w,b ,表示给定层中的神经元,

如果一层有3个神经元,将参数w 的值可以写成一个2维矩阵

类似的,如果有参数b ,可以将参数b 写成一个1维数组

密集函数所做的就是将前一层的激活作为输入,

密集函数的定义如图,它的作用就是输入前一层的激活,并给定当前层的参数,它会返回下一层的激活

五、神经网络的矢量化

神经网络的矢量化可以使得其实现算法变得非常高效

神经网络可以矢量化,他们可以使用矩阵乘法,非常有效地实现一些算法,还可以使用GPU并行计算硬件,

矢量化实现代码时非常快的,

神经网络的向量化转化,

在numpy中有个矩阵装置的写法,直接在矩阵后加.z即可


实现向量化,我们会用到np.matmul()函数,这个可以实现两个矩阵相乘
np.matmul(a,b), 这个就是矩阵a 乘以 b ,可以写成 a @ b, 这里的@就是调用matmul 函数的另一种方式

关于矩阵的矢量化,还有一点需要注意,就是矩阵的相加

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓亮.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值