【第十八周】机器学习笔记07

目录

摘要

本周学习了神经网络的基本原理及其在需求预测和图像识别中的应用,阐述了神经元模型如何模仿生物神经元的信号传递机制,并通过多层结构实现复杂的数据学习和推理。并且进一步解释了前向传播算法的工作流程,展示了使用TensorFlow构建和训练神经网络的具体代码实现方法。

Abstract

This week I study the fundamental principles of neural networks and their applications in demand forecasting and image recognition. It explains how artificial neuron models mimic the signal transmission mechanisms of biological neurons and how multi-layer structures enable complex data learning and inference. And I further elaborates on the workflow of the forward propagation algorithm and demonstrates the practical implementation of building and training neural networks using TensorFlow.

一、神经元和大脑

几十年前,神经网络首次被发明的时候,最初的动机是编写能够模仿人脑的软件

让我们先来看看大脑如何运作,以及这与神经网络有什么关系

上图是我们之前生物上学习过的神经元传导示意图,人类的思维都来自于我们大脑中的神经元,传递电脉冲,有时还会与其他神经元形成新的连接,它有许多输入端,可以从其他神经元接受电脉冲,从图中我们可以看出来,上方的神经元与下面的神经元相连,即上面神经元的输出是作为下一个神经元的输入的,而下一个神经元的输出,又作为下下个神经元的输入,依次类推,这就是神经元传递信息的途径

这里有一张简化了的生物神经元图,学过生物应该都不陌生,神经元由细胞核、树突、轴突构成,神经元通过树突接受上方来的信息,又通过轴突把信息传递给下一个神经元

所以人工神经网络使用了一个非常简化的数学模型,来模拟生物神经元的功能

我将在这里用一个圆圈表示一个神经元,神经元会接受一些输入,一个或者多个输入,这些输入只是一些数字,然后进行一些计算,输出另外一个数字,这个数字可以作为下一个神经元的输入,当我们构建一个人工神经网络或者深度学习算法,我们通常会模拟多个神经元,比如这个例子,我们画了3个神经元,这些神经元所作的是集体输入一些数字,进行计算,最后输出0.7

1、需求预测

为了说明神经网络是怎样工作的,让我们从一个例子开始,我们将使用一个需求预测的例子,在这个例子,我们将一起观察某个产品并尝试预测,在这个例子中,我们在销售T恤,我们想要知道这个T恤能否称为一个畅销品,并且我们还收集了不同价格下销售的不同T恤的数据,这种应用程序现在被零售商用来更好地规划库存水平,如果我们知道哪些商品能够成为畅销品,我们可以提前购买更多的库存,这样我们可以赚取更多的利润

所以在这个例子中,输入特征x是T恤的价格,这是学习算法的输入,如果应用逻辑回归来拟合数据的S型函数,结果可能是这样的

为了准备构建一个神经网络,我们用字母a来表示这个逻辑回归的输出,我们称之为激活,它指的是一个神经元向下游的其他神经元发送高输出的程度,事实证明,这个小型的逻辑回归算法,可以被认为是大脑中单个神经元的一个非常简化的模型,这个小型的神经元所作的事情是,用价格x作为输入,然后输出一个数字,作为T恤成为畅销品的概率

在这个例子中,我们将有四个特征来预测T恤是否畅销,这些包括T恤的价格、运费、营销量、材料,所以我要做的是创建一个人工神经元来估计这件T恤的概率,首先我们先来估计这个T恤是否实惠,实惠是由价格和运费来决定的,我们用一个神经元,即一个逻辑回归单元来计算,预测人们是否认为这是实惠的,其次我们还会创建一个神经元来预测这个T恤知名度是否很高,主要是来看T恤的销量,最后我们再创建一个神经元来预测人们是否认为这个T恤是高质量的,主要应用的特征是材料和T恤的价格,这里解释一下为什么要加上价格,因为当一个T恤的价格很昂贵时,人们普遍认为它是高质量的,然后我们将这三个神经元的输出连接到右边的另一个神经元,最终输出为预测概率。

实际上神经网络不是人为手动设置的输入,比如每个神经元都会访问每个特征,但是它会自动舍弃一些无关紧要的特征,专注于它负责的方面分析,通过上面的这个例子我们可以总结一下人工神经网络的构成,首先是输入层,它负责输入特征x,其次是中间层,中间层负责计算输入特征x然后再输出一个数字,我们也称中间为隐藏层,因为这个计算过程是神经网络自发进行的,然后再把这个数字从输出层输出,就是我们预测的概率,用下图表示:

需要注意的是,有时候很多输入不是我们手动设置的,而是神经网络从茫茫信息中搜寻它认为有用的信息,其实这也是一个学习的过程。

如上图所示,有时候引出层不止有一个,这是根据神经网络的建立需求决定的,有时候需要对数据进行二次计算和整合,一层隐藏层可能不能很好地计算出我们所需要的概率,所以两层或者多层都是有可能的

2、图像识别例子

让我们来看看神经网络在计算机视觉上有什么应用

这是一张照片,输入是一张照片,输出是图片中的人物身份,这张图的像素是1000x1000,因此在计算机中的表示实际上是一个1000x1000的网格,也被认为是像素强度值1000x1000的矩阵,在这个例子中,我们的像素强度的范围是0~255

这里面小方格的数字就是一个方块的亮度,如果我们将包含这些强度的小格子展开,可以得到一个关于像素强度的向量

所以人脸识别问题是,我们能否训练一个神经网络,它的输入是一个包含一百万个像素亮度值的特征向量,输出是图片中人物的身份

所以图片被传入到第一层隐藏层,它提取一些特征,然后传入第二个隐藏层,第二个隐藏层计算后,传入到第三个隐藏层,最后传入给输出层,输出层再穿出一个人的身份

事实上,我们如果了解计算机背后的寻找过程的话,会更好去理解它的工作原理

我们发现,第一隐藏层它再寻找一个特定的斜线,然后传入第二层,第二层在找具有特定部位,再传给第三层,第三层再去整合信息,直到识别出一个相似的人脸,这样就能得到一个人的信息,就知道她是谁了。

3、神经网络中的层

让我们看一个例子

在这个例子中,我们有四个输入特征,它们被传递到这个隐藏层中的三个神经元,然后将其输出发送到下一个层,让我们放大到隐藏层来看看它的计算,这个隐藏层输入四个数字

这四个数字是每个神经元的输入,这三个神经元中的每一个都只在实现一个小的逻辑回归单元或一个小的逻辑回归,那么来看第一个神经元

这里的Z值,是我们在之前的学习中所学习的逻辑回归中的公式,这就是第一个神经元的激活值a,我们假设它输出0.3,同理,让我们看第二个、第三个神经元,假设它们的值都是0.7、0.2

这三个数字的向量成为激活值a的向量,然后传递给最终的输出层,现在当我们构建具有多层的神经网络时,按照图中的编号,我们把它分为第1层、第2层、第3层,输入层有时候被成为第0层

现在,让我们来放大输出层的计算

输出层的输入就是隐藏层的输出,由于输出层只有一个神经元,它所做的就是计算这个神经元唯一的输出,我们假设输出为0.84

在计算整个神经网络的输出以后,还有一个终极选择,我们需要根据输出来判断,比如这个例子的问题是判断是非,即1为是,0为否,根据我们设定的条件,如果整个神经网络的输出值大于等于0.5,我们就认为yhat = 1,反之则为0.

这就是神经网络的工作的原理,每一层输入一个数字向量,然后计算另一个数字向量,然后从一层传递到另一层,这是神经网络的预测,我们可以选择在阈值0.5处进行阈值处理或不进行,以得出最终预测

4、更复杂的神经网络

在本节中,让我们使用该层来构建一个更复杂的神经网络

这个网络有四层,不包括输入层,输入层我们一般称为第0层,其中第1层、2层、3层是隐藏层,第4层是输出层

让我们放大一下第3层的计算过程,其实和我们上一节所说的计算没有什么区别,我们看到第3层的输入是第2层的输出,在经过第3层中的3个神经元计算,输出3个激活值,最后再传给输出层。

这里我们可以给出每个层中每个神经元的激活值通式,即

a指的是激活值

j指的是第j个神经元

g为sigmoi函数,也称激活函数

二、前向传播

让我们把所学的知识结合起来,形成一个算法,让我们的神经网络进行推理或进行预测,这将是一个称为前向传播的算法,我们将使用手写数字识别作为一个多示例,为简单起见,我们只区分手写数字0和1,所以这只是一个二分类问题,我们将输入一个图片,并分类判断这是数字0还是1

我们将使用8x8的图像,所以这个数字1的图像是一个8x8或64个像素强度值的网格或矩阵,其中255表示亮白色,像素0表示黑色像素

我们将使用一个具有两层隐藏层的神经网络,其中第1层隐藏层里面有25个神经元或25个单元,第2层有15个,最后输出层输出是1还是0的概率

那么,让我们一步步来看神经网络从输入x到计算输出的过程

这是第一层所计算出来的激活值,x是由第0层传过来的

让我们看第2层

其中a【1】是第1层计算出来的激活值

最后一步是计算输出层,我们可以看到,输出层不仅要计算最终的激活值,还需要做出判断,判断是1还是0的概率,最后给出预测

还记得我们学习线性回归和逻辑回归的时候吗,我们用f(x)表示线性回归或逻辑回归的输出,所以我们可以用f(x)来表示神经网络根据x计算出来的函数,因为这个过程是从左往右进行的,先是a1然后a2,然后a3,这个算法我们叫做是前向传播,因为我们在转播这些激活值是,我们是从左往右的前向方向进行这些计算,与另外一种算法成对比就是反向传播,这是我们之后需要学习的算法

1、代码中的推理

在本节中,我们会主要学习TensorFlow中的代码推理

我们来看一个咖啡豆烘焙的例子

我们可以控制的两个参数是加热生咖啡豆的温度以及烘焙时长,这两个因素决定你是否能烘焙出良好的咖啡豆,在这个简单的例子中,我们创建了一个不同温度和不同时长的数据集,以及标签显示你烘焙的咖啡是否好喝,红叉代表的是好的咖啡,圆圈代表的是欠佳的咖啡

如果是在过低的温度下烘焙咖啡豆的话结果是生的

如果我们烘焙的时间较短的话,也会得到欠佳的咖啡

此外,如果我们烘焙时间过长或者烘焙的温度过高的话,我们会也会得到一个欠佳的咖啡口感

有图可知,只有在这个小三角之内的咖啡才能被称之为是好的咖啡

所以我们的任务要求我们给定一个包含温度和时长的特征向量x,比如说200摄氏度烘焙17分钟,我们如何在神经网络中进行推理,让它告诉我们这个温度和时间设置是否合理,看起来是这样的

我们将x设置为一个包含两个数字的数组,输入特征为200摄氏度和17分钟,然后设置layer1 等于 dense unit3,创建一个有三个隐藏单元的隐藏层神经元,并且使用sigmoid函数为激活函数,最后为了计算激活值a1,我们会写a1等于layer1应用于输入特征x,然后我们创建了layer1作为神经网络的第一个隐藏层,代码如下图所示

假设a1的输出为0.2 0.7 0.3

同理,输出层也可以这么做,唯一区别就是输出层只有一个神经单元,并且下标会变

最后我们只需检测a2是否大于或等于0.5,如果大于或等于0.5,则判断为1,即是会烘焙出好咖啡,反之,则会烘焙出欠佳的咖啡

这就是如何使用TensorFlow在神经网络中进行推理

2、TensorFlow中的数据

本节中,我们一起探讨如何在Numpy和TensorFlow中表示数据,这样当我们实现新的神经网络,可以有一个一致的框架来思考如何表示数据。

让我们首先看看TensorFlow如何表示数据

假设我们有一个像这种咖啡示例中的数据集

对于这个数据集中的第一个训练样本,它的特征是17分钟内达到200摄氏度,这是一个1x2矩阵,恰好有一行两列,代码就像右边那样输入

当我们计算A1等于第一层应用于X,A1是一个1x3的矩阵,shape(1,3)就说明是1x3的矩阵

dtype = float32 意味着这是一个数字,可以用计算机中32位内存表示的小数点

Tensor我们一般称为张量,这是由一种由TensorFlow团队创建的数据类型,用于存储和执行计算,当我们需要处理A1,那么我们就要调用这个方法,这样才能对它进行操作。

现在让我们看看第二层的激活输出会是什么样子

我们可以看到,A2是由A1得来的,第二层中只有一个神经元,那么A2就是一个1X1的矩阵,由上图我们可以看出,A2是[0.8],最后返回一个数组,储存起来

3、构建一个神经网络

我们现在对TensorFlow代码有了一定了解,以及如何在TensorFlow中构建一个层,如何在TensorFlow中通过单层进行向前传播,那么现在我们把这些东西结合在一起,来讨论如何在Tensor中构建一个神经网络

我们之前看到的是,如果我们想进行前向传播,像这样创建一个层1然后计算A1,然后在创建层2,再计算A2,这是通过逐层计算进行前向传播的一种显示方式,事实证明,TensorFlow还有另外一种实现前向传播以及学习的方法

与之前一样,但现在不再是手动将数据传递给层1,再从层1获取激活值然后传递给层2,我们可以告诉TensorFlow,我们希望它将层1和层2串联起来形成一个神经网络,这就是TensorFlow中顺序函数的作用,然后我们看到x的定义,是一个4x2的矩阵,y的话只是一个四维数组,事实证明如果将数据x和y存储在矩阵x和数组y中,如果我们要训练这个模型,我们需要调用model.compile并传入一些参数,然后调用model.fit(x,y),这告诉TensorFlow取这个神经网络,它通过顺序串联层1和层2创建的,并在数据x和y上训练它,然后我们调用model.predict(x_new),它就会输出相应的值,由输入的x决定

我们还能简化这段代码,如下图所示

我们可以直接指定层1、层2、层3并告诉TensorFlow为我们串联这些层形成神经网络,和之前一样,我们可以将数据存储在矩阵中,并运行编译函数并拟合模型,最后进行推测。

总结

本周从神经元与大脑的类比出发,逐步讲解了神经网络在需求预测和图像识别中的实际应用。通过具体案例,说明了神经网络如何通过隐藏层自动提取特征并进行多层级计算,最终完成分类或预测任务,还详细介绍了前向传播的过程,并结合TensorFlow代码示例,展示了从数据输入到模型推理的完整流程,理解神经网络的基本机制和实现方法。

相关推荐
摇滚侠3 小时前
Spring Boot 3零基础教程,yml文件中配置和类的属性绑定,笔记15
spring boot·redis·笔记
摇滚侠4 小时前
Spring Boot 3零基础教程,WEB 开发 HTTP 缓存机制 笔记29
spring boot·笔记·缓存
大白的编程日记.4 小时前
【Linux学习笔记】线程同步与互斥之生产者消费者模型
linux·笔记·学习
新子y4 小时前
【小白笔记】strip的含义
笔记·python
音视频牛哥4 小时前
从“小而美”到“大而强”:音视频直播SDK的技术进化逻辑
机器学习·计算机视觉·音视频·大牛直播sdk·人工智能+·rtsp播放器rtmp播放器·rtmp同屏推流
luoganttcc4 小时前
是凯恩斯主义主导 西方的经济决策吗
大数据·人工智能·金融·哲学
好奇龙猫4 小时前
AI学习:SPIN -win-安装SPIN-工具过程 SPIN win 电脑安装=accoda 环境-第五篇:代码修复]
人工智能·学习
摇滚侠4 小时前
Spring Boot 3零基础教程,WEB 开发 内容协商 接口返回 YAML 格式的数据 笔记35
spring boot·笔记·后端
远山枫谷4 小时前
如何通过nodean安装n8n以及可能遇到的问题
人工智能