当前位置: 首页 > news >正文

【第十九周】机器学习笔记08

目录

  • 摘要
  • Abstract
  • 一、在一个单层中的前向传播
    • 1、前向传播的一般实现
  • 二、神经网络如何高效实现
  • 三、TensorFlow实现
    • 1、训练细节
      • 1.1、第一步-----指定如何根据输入x和参数w和b计算输出
      • 1.2、第二步----指定损失函数
      • 1.3、第三步----要求TensorFlow最小化成本函数
  • 四、sigmoid函数的替代品
    • 1、ReLu函数
    • 2、各种激活函数的对比
    • 3、如何选择激活函数
      • 3.1、输出层的函数选择
      • 3.2、隐藏层函数的选择
  • 总结

摘要

本周学习了神经网络单层的前向传播实现方法,包括手动计算和通用编程方法。重点掌握了如何用向量化方式高效实现神经网络,以及使用TensorFlow框架搭建和训练模型的完整流程。最后还学习了不同激活函数的特点和选择原则,明白了在实际应用中ReLU通常比sigmoid更适合隐藏层。

Abstract

This week I learned how to implement forward propagation in a single layer of neural networks, including both manual calculation and general programming methods. I focused on efficiently implementing neural networks using vectorization, and the complete process of building and training models with TensorFlow. Finally, I studied the characteristics and selection criteria of different activation functions, understanding why ReLU is generally more suitable for hidden layers than sigmoid in practical applications.

一、在一个单层中的前向传播

我们将继续使用咖啡烘焙模型来讨论在一个单层中的前向传播

在这里插入图片描述
让我们看看如何获取输入特征向量x并实现前向传播以得到输出a2,我将使用一维数组来表示所有这些向量和参数,这是Python中的一维数组而不是二维矩阵,因为括号内只有一对方括号,所以我们需要计算第一个值是a11:
在这里插入图片描述
为了计算a11,我们有参数w11和b11,然后我们计算wx+b这个值,最后应用到sigmoid函数:

在这里插入图片描述
同理,a12,a13也是这个道理

在这里插入图片描述
现在第一层的输出我们已经得到了,我们把其输入到第二层也就是输出层中,我们会有对应的w21和b21,然后我们计算z和输出a:

在这里插入图片描述

1、前向传播的一般实现

在上一节我们知道如何在Python中实现前向传播,但是需要为每个神经元逐行硬编码,现在我们来看在Python中更加通用的前向传播实现,我们需要做的是编写一个函数来实现一个密集层,也是神经网络的单层,所以我们要定义一个密集函数,它接受来自上一层的激活值,以及给这一层神经元的参数w和b

使用上一节的例子,如果第一层有三个神经元,那么如果w1和w2和w3是这些

在这里插入图片描述
那么我们会把所有这些权重向量堆叠成一个矩阵,这将是一个2X3的矩阵
在这里插入图片描述
第一列是w11,第二列是w12,第三列是w13,如果我们知道b,那么我们也可以将三个b堆叠成一个一维数组b,所有密集函数将接受来自上一层的激活值作为输入
在这里插入图片描述
这个dense函数要做的是接受a作为输入,然后输出来自当前层的激活值,这是代码
在这里插入图片描述
首先,是units = w.shape[1],因为w是一个2x3矩阵,w.shape[1]是说明这个矩阵有几列,所以units = 3,接下来我们将a设置为一个全零数组,元素数量与单元数量相同,所以在这个例子中,我们需要输出三个激活值,所以这里只是将a设置为全0 ,接下来我们通过一个for循环来计算第一个, w= W[:,j]这个代码是在Python中取出矩阵第j列的方法,所以第一次循环时,所以它会提取w11,当我们计算第二个单元的激活时,它会提取对应的第二列w12,第三次循环以此类推,然后我们用常用公式计算z即该参数w与我们已有的激活值之间的点积,我们就计算了激活向量a的所有三个值,然后最终返回a,那么dense函数的作用是输入来自上一层的激活值,并给定当前层的参数,它返回下一层的激活值。

因此给定dense函数,下面是如何通过顺序串联几个密集层来实现神经网络中的前向传播

在这里插入图片描述
给定输入特征x,然后我们就能用dense函数计算a1,然后再用a1取计算a3,以此类推,这样我们算到最后,也就是a4,就能得到我们需要的结果,最后返回该结果,也就是f_x,请注意,我们在dense中输入的Wn,是大写的W,也就是说,我们输入的是矩阵。

二、神经网络如何高效实现

深度学习研究人员能够扩展神经网络并构建非常大型网络的原因之一是因为神经网络可以矢量化,它们可以使用矩阵乘法非常高效地实现,事实证明并行计算硬件非常擅长进行非常大的矩阵乘法,在本节中,我们将了解这些矢量化神经网络的实现是如何工作的

在这里插入图片描述
这是我们在上面提到的前向传播的代码,事实证明,我们可以开发出一个向量化实现这个函数的方法,如下所示
在这里插入图片描述
将X设置为一个二维数组,W和B跟前面是一样的,np.matmul(A_in, W)是NumPy进行矩阵乘法的方式,两个矩阵相乘然后在加上一个B,等于激活函数,两种方法相比,肯定是向量在密集层的前向传播中更加高效

三、TensorFlow实现

我们将继续之前说到过的手动识别数字的例子,识别这些图像是0还是1
在这里插入图片描述

这是我们之前提到的该模型的神经网络架构,下面是实现代码

import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Densemodel = Sequential([Dense(units = 25, activation = 'sigmoid'), /* 第一部分 */Dense(units = 15, activation = 'sigmoid'),Dense(units = 1, activation = 'sigmoid'),])from tensorflow.keras.losses import
BinaryCrossentopy model.compile(loss = BinaryCrossentopy()) /* 第二部分*/model.fit(X,Y,epoches = 100) /* 第三部分 */

第一部分我们还是比较熟悉的,我们让TensorFlow按顺序连接神经网络的三个层,第一个隐藏层、第二个隐藏层以及输出层。

第二个部分是让TensorFlow编译模型,让TensorFlow编译模型的关键步骤是指定我们要使用的损失函数,在这个例子我们会使用一个名为BinaryCrossentropy的损失函数,称为稀疏分类交叉熵,我们会在下一节详细说明,然后指定好损失函数,它告诉TensorFlow用我们在第一步指定的模型,以及第二部指定的损失函数,来拟合数据集x,y

回到我们之前在学习梯度下降的时候,我们必须决定运行梯度下降多少步或运行多长时间,所以epochs是一个技术术语,用于表示你想运行多少步学习算法如梯度下降。

总而言之,代码第一步是指定模型,告诉TensorFlow如何进行推理计算,第二步是使用特定的损失函数编译模型,第三步是训练模型

1、训练细节

我们来看看训练神经网络的TensorFlow代码实际上在做些什么

在查看训练神经网络的细节之前,让我们来回顾一下我们之前是如何训练逻辑回归模型的

构建逻辑回归模型的第一步是指定如何根据输入x、参数w和b来计算输出,第二步是指定损失函数以及代价函数然后第三步是最小化代价函数,并以此训练逻辑回归函数

这三个步骤同样适用于在TensorFlow中训练神经网络,现在我们来看看这三个步骤如何映射到神经网络训练上

第一步是指定如何根据输入x和参数w和b计算输出,这可以用上面我们说过的dense函数代码来实现,用来指定神经网络,这实际上足以指定前向传播或推理算法中所需的计算

第二步是编译模型,并告知我们想要使用的损失函数,这是用来指定损失函数的代码,这里使用的是二元交叉熵损失函数,对整个训练集取平均值也会给神经网络的成本函数

然后第三步是调用函数尝试将成本函数最小化作为神经网络参数的函数

下面是逻辑回归模型和神经网络模型之间的对比

在这里插入图片描述

在训练神经网络的背景下,让我们更加详细地看看这三步

1.1、第一步-----指定如何根据输入x和参数w和b计算输出

在这里插入图片描述
这段代码指定了神经网络的整体框架,dense函数告诉我们这一层有几个神经单元,用的激活函数是什么,此外我们还知道每层的w和b的值是多少,所以我们说这段代码指定了神经网络的整体架构,因此告诉TensorFlow一切其需要的用于计算输出x的函数

1.2、第二步----指定损失函数

这将定于我们用来训练神经网络的成本函数,所以对于手写数字分类问题,这是一个二分类问题,我们最常用的损失函数是
在这里插入图片描述
它实际上与我们用于逻辑回归的损失函数相同,其中y是真实标签,有时也被称为目标标签,f(x)现在是神经网络的输出

所以在TensorFlow的术语中,这个函数被称为是二元交叉熵,其语法是让TensorFlow使用这个损失函数来编译神经网络

在这里插入图片描述
TensorFlow知道我们想要最小化的成本是平均值,对所有m个训练样本取平均值,所有训练样本的损失平均值,优化这个成本函数使神经网络适应你的二分类数据,如果我们想解决回归而不是分类问题的话,我们可以告诉TensorFlow使用不同的损失函数来编译我们的模型

例如,如果我们有个回归问题,如果我们想最小化平方误差损失,这里是平方误差损失

在这里插入图片描述
损失是指如果我们的学习算法是输出f(x)并有目标或真是标签y,那么这是平方误差的一半,然后我们可以在TensorFlow中使用这个损失函数,也就是说使用可能更直观命名的均方误差损失函数,然后TensorFlow将尝试最小化均方误差

在这里插入图片描述

在这个表达式,我们用J(W,B)来表示成本函数,成本函数是神经网络所有参数的函数,我们可以把W看成W1,W2,W3,B包括B1,B2,B3。所以如果我们在优化关于W和B的成本函数,我们会尝试优化神经网络中所有的参数

1.3、第三步----要求TensorFlow最小化成本函数

这让我们想到之前学过的梯度下降算法,如果我们用梯度下降来训练神经网络中的参数,然后我们会在每一层L和每一个单元J上反复地更新

在这里插入图片描述

100次梯度下降更新后,我们能够得到一个很好的参数值,所以要使用梯度下降,关键是我们需要计算这些偏导数项,而TensorFlow所做的,事实上,这是神经网络训练中的标准做法,是一种叫做反向传播的算法来计算这些偏导数项,TensorFlow可以为我们完成所有这些事情,它在一个叫fit的函数中实现了所有的反向传播,所以我们需要做的就是调用model.fit.(),并告诉它进行100次迭代或者100个epoch。

事实上,我们之后会学习到TensorFlow可以使用一种比梯度下降更快一点的算法,现在我们知道我们严重依赖这个库来实现神经网络

四、sigmoid函数的替代品

到目前为止,我们所有节点都在使用sigmoid激活函数,应用于隐藏层中以及输出层中,我们以这种方式开始是因为我们正在通过使用逻辑回归并创建大量逻辑回归单元,将它们串联起来以构建神经网络,但如果我们使用其他激活函数,我们的神经网络会变得强大得多,让我们来看看如何做到这一点,回想一下上几节我们学习的需求预测示例,在给定价格,运输成本情况下,营销材料,我们会尝试预测某件商品是否很实惠,如果有很好的认知度和材质,并以此试图预测它是否是畅销商品,但假设了认知度可能是二元的,要么人们知道,要么不知道,但在实际情况下,顾客对于我们的衣服的认知度不是二元的,他们可能有一点了解,稍微了解,非常了解,或者已经是如火如荼的畅销品,所以,与其将认知度建模为二元数字,不如我们将认知度建模为0和1之间的一个数字,认知度应该是一个非负数,从0到非常了解,所以,之前我们曾用这个方程计算第二个隐藏单元的激活值

在这里插入图片描述
其中,g是sigmoid函数,因此在0~1之间变化

在这里插入图片描述

如果我们想让一个激活函数能够取更大的正值,我们可以换用不同的激活函数

1、ReLu函数

事实证明,神经网络中一个非常常见的激活函数就是这个函数,它看起来是这样的
在这里插入图片描述
当z在y轴左边时,g(z)就等于0,当z在y轴右边时,g(z)就等于z,这个函数的数学表达式是g(z)等于max(0,z),这个函数有个名字,叫做ReLu

2、各种激活函数的对比

在这里插入图片描述
这里需要说明一下,最左边的是线性激活函数,有时我们使用线性激活函数,人们会说我们没有使用任何激活函数,因为,如果a是g(z),a就等于g(z)=w·x +b/2,所以这个好像根本没有g,所以当我们使用这个线性激活函数时,有些人就会认为我们没有使用任何激活函数

3、如何选择激活函数

3.1、输出层的函数选择

我们来看看如何为神经网络中的不同神经元选择激活函数,我们首先 讨论如何为输出层选择激活函数,事实证明取决于目标标签或真实标签Y是什么,对于输出层的激活函数会有一个非常自然的选择

我们可以为神经网络中的不同神经元选择不同的激活函数,具体来说,如果我们正在处理一个分类问题Y是0还是1,这是一个二分类问题,那么sigmoid函数激活函数几乎总是最自然的选择,因为神经网络在这种情况下学习预测Y等于1的概率,就像我们在逻辑回归中一样,所以我的推荐是,如果我们正在处理一个二元分类问题,我们可以考虑在输出层使用sigmoid函数

如果我们在处理一个回归问题,那么我们可能会选择不同的激活函数,例如,如果我们试图预测明天的股票价格将如何相对于今天的股票价格变化,,它可以上涨和下降,所以在这种情况下Y将是一个可正可负的数字,在这种情况下,我更推荐使用线性激活函数

再如果,我想预测房价,房价是一个非负值,这样的话,最值得选择的是ReLu激活函数,因为ReLu函数只能选择非负值

综上所述,我们如何选择激活函数,通常取决于我们试图预测的标签Y是什么,会有一个相当自然的选择

此外,本节我们讨论的方面都是输出层的激活函数的选择,那么隐藏层的函数我们该如何选择呢?

3.2、隐藏层函数的选择

事实证明,ReLu激活函数是训练神经网络时最常见的选择,尽管最初我们用sigmoid激活函数描述了神经网络,因为在神经网络发展的早期,历史中,人们都在许多地方使用sigmoid激活函数,现在这个领域已经发展到更常使用ReLu而几乎不再使用sigmoid函数,唯一的例外是如果输出层的输出是一个二进制,我们会倾向使用sigmoid函数来处理分类问题,这里有几个原因,首先如果我们比较ReLu和sigmoid函数,ReLu的计算会稍微快一点,它只需要零和Z那个值更大一点,而sigmoid的函数则需要取指数运算然后逆运算;第二个原因,更重要的是ReLu函数只要一个方向变平,而sigmoid函数却在两个方向变平,在图像左侧变平,在图像右侧也变平,如果我们用梯度下降算法来训练神经网络,当函数在平坦的时候,梯度下降会变得很慢,虽然我们知道梯度下降算法优化的是成本函数J而不是优化激活函数,,但激活函数是计算的一部分,这样也会影响成本函数J在很多地方变得平坦,并且梯度较小,这回减缓学习速度。在经过研究人员发现,使用ReLu函数可以使神经网络学习地更快,这就是为什么对于大部分从业者,如果想使用什么激活函数用于隐藏层的话,ReLu激活函数已经成为最常用的选择

在这里插入图片描述
总的来说,我们在选择神经网络的激活函数时,如果使二进制的分类问题的话,使用sigmoid函数,如果y是一个可以取正值或者负值,则使用线性函数,如果y只能取正值或零,或非负值,则使用ReLu,然后对于隐藏层,我们默认使用ReLu函数,在TensorFlow,我们可以这样实现

from tf.keras.layers import Dense
model = Sequential([Dense(units = 25, activation = 'relu'),Dense(units = 15,activation = 'relu'),Dense(units = 1,activation = 'sigmoid')
])

当我们要自定义激活函数,我们可以将activation里面的值改成需要的激活函数

总结

本周的学习让我对神经网络的前向传播和实现有了更完整的认识。从理解单层神经网络中每个神经元的计算过程开始,我学会了如何用通用的dense函数来实现这一过程,而不需要为每个神经元单独编写代码。更重要的是,我明白了向量化实现的价值——通过矩阵运算让神经网络的计算更加高效,这也解释了为什么深度学习能够处理大规模数据。在TensorFlow实践部分,我掌握了搭建模型的完整流程,从定义网络结构、选择损失函数到训练模型,三个步骤清晰明了。最后关于激活函数的学习让我豁然开朗,原来选择不同的激活函数会对模型效果产生这么大影响,特别是理解了为什么ReLU在隐藏层中比sigmoid更受青睐。今天的内容从理论到实践层层递进,让我对神经网络的实现机制有了更扎实的理解。

http://www.dtcms.com/a/533247.html

相关文章:

  • 文件管理百度seo学院
  • 成都网站建设 龙兵做网站应该注意什么
  • CDC(Communication Device Class)是什么?
  • 东台建设网站的公司成都纯手工seo
  • fopen 函数实现追踪(glibc 2.9)(了解和选学)
  • 国产数据库之XuguDB:虚怀若谷
  • 湖南移动官网网站建设微信营销的优缺点
  • 自建网站推广的最新发展河北网络建站
  • 精品课程网站建设意义最近免费韩国电影hd无
  • 怎么建设小说网站中国企业500强排行榜
  • 建设银行企业网站首页wordpress图像缩放插件
  • 奇偶分家:破解n^4+4^n的合数身份
  • js微任务输出
  • Linux小课堂: 守护进程与初始化进程服务详解
  • synchronized 和 Lock
  • 2.2.1.2 大数据方法论与实践指南-基于飞书项目的项目管理规范
  • 做防腐木网站优秀网站设计流程
  • LangChain最详细教程之Model I/O(二)Prompt Template
  • STM32F103C8T6_UART串口通信完整教程
  • Gorm(一)查询方法
  • 网站管理工具wordpress中文版和英文版区别
  • 新网网站空间到期停了 咋续费北海哪里做网站建设
  • 百日挑战-单词篇(第四天)
  • 6.1 操作系统的启动流程
  • 英语学习 第四天
  • Compose笔记(五十四)--Card
  • 西宁电商网站制作公司北京广告设计招聘
  • 阿里巴巴网站建设销售软件商店下载最新版
  • 交流耦合和直流耦合
  • 印刷厂网站建设方案利用网上菜谱做网站