【吴恩达机器学习笔记】神经网络初探

前言

传统机器学习不足

【例】预测房价,不同的房子有上百个特征

如果要包含所有的二次项(即使只是二次),最终也有很多项, 每个参数都有 n 个变量,那二次项数量将会是 n^2 /2 级别的量级,模型很可能过拟合,运算量也很大。但如果减少了相关变量,模型的拟合效果又不佳。

由此可见,对于很复杂的数据,特征很多,非线性建模非常复杂。

上图假设一张汽车图片是 50x50 的像素,那么就有 2500 个像素点,我们根据每个像素点的亮度来进行汽车图像识别,如果是多项式方程,那将会有三百万(2500x2500/2)的特征,如此大的计算量是完不成的。

神经网络背景

人的大脑天然的计算机,人们就思考能不能模拟大脑的行为来进行学习和处理数据。我们知道人的大脑处理数据都是用的同一种方式,比如将视觉信号接入听觉皮层你的耳朵将学会看,这就意味着我们不需要写成千上万的程序,只需一种程序即可处理所有的数据。

模型表示

神经网络是一种受到人类大脑神经元结构启发而设计的人工智能模型。它是由许多简单的单元(神经元)组成的网络,这些单元相互连接并通过调整连接权重来学习输入数据的特征和模式。

由下图人脑的神经元结构可以知道,树突:输入 轴突:输出

人们根据上述结构仿造了神经元的结构: 

一组神经元连接组合在一起:

  • 输入层:输入特征
  • 隐藏层:函数运算
  • 输出层:输出最终计算结果

【例】具体计算如下图所示,隐藏层的神经元等于输入层的所有神经元乘权重矩阵后的函数运算结果。

【例】下面是一个简化的示意图,展示了一个具有三层的神经网络,并标注了连接相邻两层的权重矩阵的维度:

    o1 o2 o3    # 第 1 层(输入层)有 3 个神经元\ | /o1      # 第 2 层(隐藏层)有 1 个神经元/ | \o1 o2 o3    # 第 3 层(输出层)有 3 个神经元连接第 1 层和第 2 层的权重矩阵维度:1x4
连接第 2 层和第 3 层的权重矩阵维度:3x2

代价函数

【例】下面是一个四分类的例子

如果是一个二分类问题,那么输出层只包含一个神经元,并且神经元的值为 0 or 1

如果是一个多分类问题,那么输出层将包含多个神经元,并且神经元的值是一个多维向量,如下图所示

【问】如何计算上述逻辑回归问题的损失函数呢?

按照之前的逻辑回归的损失函数带正则化的式子是对一个输出进行计算损失,现在我们要对 K 维输出求损失和,并且对所有权重系数进行惩罚求和。

反向传播 

这里结合李宏毅第 14 节课程和吴恩达机器学习的视频一起理解。

【(强推)李宏毅2021/2022春机器学习课程】 (选修)To Learn More - 反向传播(Backpropagation)_哔哩哔哩_bilibili

为了训练我们的模型,需要让代价函数的值减小,从而不断减少损失找出模型的解。
线性回归中我们很轻易的就能更新参数进行梯度下降,但是在神经网络中我们有非常多的参数,vector 是上百万维的,为了有效的计算梯度,我们使用反向传播。

在此之前我们要先了解一下 Chain Rule 链式法则微分

如下图所示:总损失=所有参数的损失和 对左边的式子进行偏微分得到右边的式子

总损失对某一个参数的偏微分= ∑一笔数据对参数的偏微分

我们只需考虑一个 neruo 然后对他们求和即可

接下来让我们看看一个 neruo 中的偏微分怎么求。

如下图所示:乘上权重 w 之后的值 为 z,求 loss 对 w 偏微分使用到链式法则

z 对 w 的微分计算方法如下:

C 对 z 的微分计算方法如下:按照链式法则

a 代表经过激活函数之后的输出,微分结果也就是:

缩略图如下:通过反向传播计算得到最后的 C 对 z 的微分从而进行梯度下降。

反向传播过程如下图所示:建反向的神经网络,要先算出前向传播之后才能算出反向传播(我们要先得到输出才能根据输出进行反向计算,前向传播的输出值是反向传播的输入源)

总览:a 代表上一个 neruo 的输出也就是未经过权重处理的原始值,z 代表经过权重处理之后的值也就是下一个 neruo 的输入值。

下面是吴恩达机器学习的 PPT:

梯度检测

梯度检验,有可能出 bug 的情况下损失函数值比正常情况多一个量级

梯度检测(Gradient Checking)是一种用于验证数值计算梯度(数值梯度)与解析计算梯度(解析梯度)是否一致的方法。在训练神经网络等模型时,梯度检测可以帮助我们确保实现的反向传播算法正确地计算梯度,从而提高模型的稳定性和可靠性。

梯度检测的基本思想是利用数值微分的方式来近似计算解析梯度,然后比较数值梯度和解析梯度之间的差异。如果它们之间的差异很小,则说明反向传播算法实现正确;如果差异较大,则需要检查反向传播算法的实现是否有误。

梯度检测是一种用于调试和验证反向传播算法实现是否正确的重要工具,在实践中通常会在实现模型时使用。值得注意的是,梯度检测会增加计算成本,因此通常在调试阶段才会使用,一旦确认反向传播算法实现正确,就可以关闭梯度检测以提高训练速度。

 随机初始化

对称权重

如果初始化所有参数为零,则每个神经元都将计算出相同的梯度,并且在进行梯度更新时,它们会按照相同的步长朝着相同的方向移动,这就导致了对称性的问题。在这种情况下,即使网络具有多个隐藏层,每个隐藏层中的神经元也会具有相同的权重,这等效于一个更浅层的网络,无法充分利用神经网络的深层结构来学习复杂的特征。

为了避免这种情况,需要对参数进行随机初始化。常见的做法是采用均匀分布或者高斯分布来随机初始化参数,使得每个神经元都拥有不同的初始权重,从而打破对称性,促进网络的有效训练和学习。初始化参数时,通常会根据网络的规模和激活函数的特性选择适当的分布和范围。假设我们有一个简单的神经网络,包含一个输入层、两个隐藏层和一个输出层,每个隐藏层有两个神经元。我们使用线性求和作为激活函数。

神经网络的结构如下:

  • 输入层:x1, x2(输入特征)
  • 第一个隐藏层:h11, h12(隐藏层1的输出)
  • 第二个隐藏层:h21, h22(隐藏层2的输出)
  • 输出层:y(输出)

每个隐藏层和输出层的计算公式为:

h11 = w11x1 + w12x2
h12 = w21x1 + w22x2
h21 = w31h11 + w32h12
h22 = w41h11 + w42h12
y = w51h21 + w52h22

其中,wij 表示连接的权重。

如果所有的权重初始化为相同的值,比如0,那么在进行前向传播计算时,每个隐藏层和输出层的值都将相同,因为权重相同导致的输出值相同。

现在,我们来看看在这种情况下反向传播的梯度变化和输出值。假设损失函数为均方误差(MSE),即:

J = 1/2(ytrue - y)^2

在反向传播过程中,梯度的计算如下:

1. 计算输出层的误差项:

δy = (∂J/∂y) = y - ytrue

2. 计算隐藏层2的误差项:

δh21 = (∂J/∂h21) = δy * (∂y/∂h21)
δh22 = (∂J/∂h22) = δy * (∂y/∂h22)

3. 计算隐藏层1的误差项:

δh11 = (∂J/∂h11) = δh21 (∂h21/∂h11) + δh22 (∂h22/∂h11)
δh12 = (∂J/∂h12) = δh21 (∂h21/∂h12) + δh22 (∂h22/∂h12)

4. 计算输入层的误差项:

δx1 = δh11 (∂h11/∂x1) + δh12 (∂h12/∂x1)
δx2 = δh11 (∂h11/∂x2) + δh12 (∂h12/∂x2)

在这种情况下,所有神经元的误差项都相同,因为它们所计算的梯度都受到相同的误差项影响,并且在反向传播过程中误差会被传播到更浅层的神经元。这导致了网络的权重更新出现问题,无法学习到不同的特征表示。因此,初始化所有参数为相同的值会导致对称权重的问题。

组合

最好一层隐藏层,如果是多层应该有同样的单元数(单元数越多越好,至少大于等于输入层)

步骤

  1. 构建网络,初始化权重
  2. 实现前向传播
  3. 计算代价函数
  4. 反向传播计算偏导数
  5. 梯度检测比较数值梯度和计算梯度
  6. 通过梯度下降或更优方法最小化代价函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/784130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并查集

本文用于个人算法竞赛学习,仅供参考 目录 一.什么是并查集 二.并查集实现 三.路径优化 四.时间复杂度 五.并查集路径压缩 模板 五.题目 一.什么是并查集 并查集(Disjoint Set)是一种数据结构,用于处理一系列不相交的集合的合…

一文了解JAVA的常用API

目录 常用kpimathSystemRuntimeObjectObjectsBigIntegerBigDecima正则表达式包装类 常用kpi 学习目的: 了解类名和类的作用养成查阅api文档的习惯 math 工具类。因为是工具类,因此直接通过类名.方法名(形参)即可直接调用 abs:获取参数绝对…

Linux学习:进程(4)程序地址空间(笔记)

目录 1. Linux下各种资源的内存分布2. 物理地址与虚拟(线性)地址3. 程序地址空间的区域划分4. 地址映射与页表5. 缺页中断 1. Linux下各种资源的内存分布 2. 物理地址与虚拟(线性)地址 在有关进程创建的初步学习中,我们了解了fork函数创建子进程的方式。此种进程的创…

Spring Boot 一.基础和项目搭建(上)

之前也自学过SSM框架,Spring Boot框架,也动手写过几个项目,但是这是第一次完整的记录。从0开始,把一些细节整理了一下。 大概会分为十几小节,这是一个学习的过程,更是一个思考的过程,废话不多说…

金融汽车科技LLM

汇丰银行 众安保险 1. AIGC重塑保险价值链 小额高频 2.构建智能应用的技术方案演进 增加微服务 长记忆:向量库短记忆:对话历史,思考路径,执行历史 中台架构设计 蔚来汽车在大模型的应用实践 公司介绍 应用架构 应用实践 4.大…

Django框架之DRF(武沛齐全)

一、FBV和CBV FBV,function base views,其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import views urlpatterns [path(users/, views.users), ] from django.http import JsonResp…

快速排序---算法

1、算法概念 快速排序:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的数据均比另一部分的数据小,则可分别对这两部分记录继续进行排序,以达到震哥哥序列有序。 快速排序的最坏运行情况是O(),比如说顺序数…

网络基础二补充——json与http协议

五、市面上常用序列化和反序列化工具 ​ 常用的有:json、protobuf、xml三种方案; 5.1json的使用 1.安装jsoncpp库,是一个第三方的开发库文件; sudo yum install -y jsoncpp-devel2.使用json ​ 经常使用的头文件是json.h&…

【uC/OS-III篇】uC/OS-III 创建第一个任务(For STM32)

uC/OS-III 创建第一个任务(For STM32) 日期:2024-3-30 23:55,结尾总结了今天学习的一些小收获 本博客对应的项目源码工程 源码项目工程 1. 首先定义错误码变量 // 用于使用uC/OS函数时返回错误码 OS_ERR err; 2. 定义任务控制…

Golang | Leetcode Golang题解之第2题两数相加

题目: 题解: func addTwoNumbers(l1, l2 *ListNode) (head *ListNode) {var tail *ListNodecarry : 0for l1 ! nil || l2 ! nil {n1, n2 : 0, 0if l1 ! nil {n1 l1.Vall1 l1.Next}if l2 ! nil {n2 l2.Vall2 l2.Next}sum : n1 n2 carrysum, carry …

Vue ElementPlus Input输入框

Input 输入框 通过鼠标或键盘输入字符 input 为受控组件,它总会显示 Vue 绑定值。 通常情况下,应当处理 input 事件,并更新组件的绑定值(或使用v-model)。否则,输入框内显示的值将不会改变。不支持 v-mode…

【面试经典150 | 动态规划】最小路径和

文章目录 写在前面Tag题目来源解题思路方法一:动态规划方法二:空间优化 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题…

MCGS学习——水位控制

要求 插入一个水罐,液位最大值为37插入一个滑动输入器,用来调节水罐水位,滑动输入器最大调节为液位最大值,并能清楚的显示出液位情况用仪表显示水位变化情况,仪表最大显示设置直观清楚方便读数,主划线为小…

设计模式-结构型-享元模式Flyweight

享元模式的特点: 享元模式可以共享相同的对象,避免创建过多的对象实例,从而节省内存资源 使用场景: 常用于需要创建大量相似的对象的情况 享元接口类 public interface Flyweight { void operate(String extrinsicState); } 享…

如何使用极狐GitLab 自定义 Pages 根域名

本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了极狐GitLab Pages …

普发Pfeiffer 真空TCP120-TCP380-TCP035-TCP600 使用手侧

普发Pfeiffer 真空TCP120-TCP380-TCP035-TCP600 使用手侧

C++进阶:多态(笔记)

目录 1. 多态相关概念1.1 简述:多态1.2 概念汇总与补充 2. 多态重写的底层原理2.1 虚函数存储的结构与位置2.2 重写覆盖 1. 多态相关概念 1.1 简述:多态 1. 什么是多态 不同的对象去做同一个行为时,得到的结果不同。反应到编程语言中&#…

Go语言HTTP服务实现GET和POST请求的同时支持

引言 在现代的Web开发中,HTTP服务是构建网络应用程序的基础。而支持GET和POST请求是其中最基本、最常见的功能之一。GET请求用于从服务器获取数据,而POST请求则用于向服务器提交数据。在Go语言中,通过标准库中的net/http包,我们可…

实景三维技术:开启自然资源管理的新篇章

随着科技的不断进步,实景三维技术已经在多个领域得到了广泛的应用。而在自然资源管理领域,实景三维技术更是发挥着越来越重要的作用。本文将介绍实景三维在自然资源管理领域的应用,探讨其带来的优势和变革。一、什么是实景三维技术&#xff1…

开源一款剪贴板跨设备共享工具

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen 昨天遇到了一个很棘手的问题:我的手机剪贴板需要同步到另外的两台设…