人工智能基础学习笔记:简单神经网络的构建

2023-10-30


前言

author:Liu Zhao

作为刚入坑机器学习的一名小白,写这篇文章的初衷是想作为自己的一个学习笔记,防止知识遗忘,同时也希望能够跟大家一起交流,共同进步

人工神经网络是近几年人工智能、机器学习领域的热门方向,它是根据人脑神经建立的一种模型,在各种工业领域解决了大量的实际问题,具有广泛的应用前景。本文主要介绍如何构建一个较完整的简单神经网络,包括前向传播、反向传播(梯度下降)等内容

一、神经网络能够做什么

神经网络本质上是一种算法,这种算法能够将m个输入x1,x2,x3…xn映射成n个输出y1,y2,y3…yn。类比到人类的大脑,大脑可以接受各种信息,再对各种信息进行处理后输出合适的信息。但神经网络无法使用人类的思维方式,很难立刻输出我们想要的结果。于是,神经网络每输出一个值,我们就把它与期望的值相比较,用一个误差函数来表示它们之间的差值,再通过反向传播一次次修改算法模型,这个过程称为训练。一个完善的神经网络模型需要大量的训练。

就拿神经网络应用中入门的Mnist手写识别数据集来介绍吧
简单来说,Mnist是一个包含数万张手写图片的数据集,类似如下的图片:
在这里插入图片描述
我们要做的,是经过对程序进行训练后,输入一张类似的图片,程序就能立刻识别出该图片所代表的数字
怎么做到的呢?我们知道,一张图片是由许多个像素组成的,每个像素都有一个值来代表该位置,而代表着同一个数字的图片在相同位置的像素是相似的,我们输入大量类似的图片代表训练集,利用神经网络算法对程序进行训练,机器就能够自己“学会”每个数字图片的“特征”,最终达到识别的效果。

二、简单神经网络结构介绍

在这里插入图片描述

上图是最简单的一种神经网络,甚至并不能称为神经网络,它只有一个神经元,包含两层,x1,x2称为输入层,y1,y2称为输出层,简单来说,我们输入2个数据x1和x2,对x1和x2进行处理,给它们各乘一个独立的权重W,然后再加上一个相同的偏置单元b,得
a1=w1x1+b,
a2=w2x2+b,
然后,我们需要对a1,a2利用一种函数F进行运算,这个F函数称为激活函数,常用的一种激活函数为sigmoid函数:
在这里插入图片描述
于是有
y1=sigmoid(a1)
y2=sigmoid(a2)
经过计算得到的结果y1,y2,我们称为输出层,y1,y2就是估计值。
这样,我们就完成了一次最简单的神经网络算法。这样的一次计算过程我们称为前向传播。
实际应用中简单神经网络往往是三层的,包含输入层、隐藏层和输出层。
事实上,不论多少层的神经网络,它的前向传播都是相同的,即上一层输出经过新的w,b处理后变为下一层的输入。

需要注意的是,每层神经元的每个输入x的权重w都是独立的不相同的,但每个神经元只有一个相同的b
实际应用中的神经网络结构要复杂得多,比如常用的Mnist手写识别模型,要用到3层神经网络结构,它的输入层的每组数据有784个数值,假设它的第二层(隐藏层)有40个神经元,那么它的第一层运算就会有784*40个w和40个b。

下面,我们就利用这个方法去找Mnist对线吧

然而,这样得到的y1,y2往往并不是我们期望的结果,要最终得到想要的数值,怎么做呢?

三、反向传播(梯度下降法)

反向传播是简单神经网络算法的精华,也是比较难以理解的一部分内容。
完成一次训练后,为了使y偏向正确的数值,我们需要跟据y与正确值之间的差距来不断修正每层神经元所有w和b的值,这样的过程,我们称为反向传播。每经过一次训练,我们就更新一次w和b,使整个神经网络逐渐接近正确的模型。因此,一个完善的神经网络模型往往需要大量的训练
一个三层神经网络结构如下:

(这里三层的n是不同的数值)

那么,反向传播是如何实现的呢?这里我们介绍梯度下降的方法。首先,我们引入损失函数:
在这里插入图片描述

L表示估计值和真实值之间的距离,我们要找的就是使L最小的那个点
在这里插入图片描述
根据梯度的定义,我们知道函数f(x)沿它的导数f’(x)<0的方向不断下降,于是,我们对损失函数L不断地求其关于各个w和b的偏导数,再乘上一个较小的学习率以防止其下降得过快而越过了最小值,用w,b与其相减来更新w,b。但是,L本身是关于y和y_true的一个函数,不含有w与b,因此这里我们需要利用链式求导来得到w与b。下面,我们来推导反向传播的公式
假设有一个这样的三层神经网络

在这里插入图片描述

设:
x:输入层
h:隐藏层
y:输出层
h_in=w1x+b1
h=sigmoid(h_in)
y_in=w2h+b2
y=sigmoid(y_in)
L:损失函数
η:学习率(设为0.1)

有:
新w2=w2-η* ∂L/∂w2
新 b2=b2-η* ∂L/∂b2
新w1=w1-η* ∂L/∂w1
新b1=b1-η* ∂L/∂b1

∂L/∂w2=∂L/∂y * ∂y/∂y_in * ∂y_in/∂w2

∂L/∂b2=∂L/∂y * ∂y/∂y_in * ∂y_in/∂b2

∂L/∂w1=∂L/∂y * ∂y/∂y * ∂y_in/∂y_in * ∂h/∂h_in * ∂h_in/∂w1

∂L/∂b1=∂L/∂y * ∂y/∂y * ∂y_in/∂y_in * ∂h/∂h_in * ∂h_in/∂b

下面来分别计算每个式子的值
L=(y-y_true)^2

∂L/∂y=2(y-y_true)

∂y/∂y_in=y(1-y) (这里利用了sigmoid求导公式,即s’(x)=s(x)*(1-s(x))

∂y_in/∂w2=h

可得
∂L/∂w2=2(y-y_true)*(y(1-y))h
因此更新后的的w2=w2-0.1 * 2(y-y_true)
(y(1-y))*h

类似地,我们能够求出每一个更新后的值。
当网络中所有w和b全部完成更新,一次反向传播就完成了,一次完整的训练应当包含正向传播和反向传播的内容。当然,实际编程的过程中还会有各种各样的问题,在以后的博客中我会贴上代码展示。

总结

这就是构建一个简单神经网络的过程。它的核心思想就是通过反复的训练最终得到理想的w和b的值,而η则需要人为地调整达到最优。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

人工智能基础学习笔记:简单神经网络的构建 的相关文章

随机推荐

  • 如何解决“Error: xxx.js 已被代码依赖分析忽略,无法被其他模块引用”报错?

    今天在用uniapp框架写小程序 遇到报错 错误原因 微信开发者工具从 1 05 2201210 版本开始 对小程序项目新增了无依赖文件过滤能力 如果某个 js 文件被静态分析显示是无依赖文件 在实际运行时又被其他 js 文件 requir
  • java 文件读取和写入

    1 文件名 1 InputStream 字节流 和Reader 字符流 2 OutputStream 字节流 和 Writer 字符流 1 文件名 Java提供了File类 来表示一个文件 通过构造方法来指定路径 绝对路径 目录与目录之间用
  • BUCK电路-TL494方案 持续更新大概2周更新完成

    目录 一 电磁感应现象 这个现象是如何产生的 磁生电的变换的条件 二 电感的伏安特性 计算磁场大小可以用上面这个公式 磁感应强度B来表示 u0是真空磁导率 N是线圈的匝数 I是通过这个线圈的的电流大小 电生磁的过程就是由I来生成这个B 可以
  • SpringBoot 整合 ChatGPT API 项目实战,挣了3K!

    大家好 我是老赵 体验到了ChatGPT的强大之后 那么我们会想 如果我们想基于ChatGPT开发一个自己的聊天机器人 这个能搞定吗 ChatGPT平台已经为技术提供了一个入口了 很简单的就是实现了 一 准备工作 1 已成功注册 OpenA
  • Jmeter多接口测试之参数传递

    接口测试包含单接口测试和多接口测试 通过组合多个接口实现一组功能的验证称为多接口测试 单接口重在单个接口多种请求组合的响应断言 多接口重在组合不同接口 实现流程的串联和验证 多接口测试涉及到接口之间参数的传递 比如AB两个接口协同完成一个功
  • DDOS高防ip是什么?有什么用?

    ddos高防ip是网络安全公司针对服务器在遭受大流量的ddos攻击导致服务不可用的情况 推出的付费增值服务 ddos攻击是通过用大量的无效流量数据对该IP的服务器进行请求 导致服务器的资源被大量占用 无法对正确的请求作出响应通过配置ddos
  • shell变量的设定规则

    内容摘自鸟哥的Linux 私房菜 1 变量与变量内容以一个等号 来连结 如下所示 myname VBird 2 等号两边不能直接接空格符 如下所示为错误 myname VBird 或 myname VBird Tsai 3 变量名称只能是英
  • Django基础之Admin后台数据管理

    Admin后台数据管理 一个站点或者网站 除了给用户浏览及操作外 还需要对后台数据进行管理 比如添加商品 修改商品等等 Django提供了一个可插拔的后台管理系统 Admin 应用 该系统可以从模型中读取元数据 并提供以模型为中心的界面 A
  • C语言文件通讯录制作说明

    文件通讯 前言 很多计算机专业大学生第一个课设就是校园出入管理系统或者文件版通讯录 这些软件工程不仅可以锻炼我们的编程能力 也可以让我们更为深刻的理解C语言知识 为将来的学习打下基础 但是同学们肯定会有所疑问 下面是我的一个范例 提示 以下
  • 高德地图 – 1.问题集锦

    1 自动加载文本框的坐标 并在地图标注点 2 点击地图时 并且 逆地理编码 解析出地址方在文本框 js var lnglatXY var marker 初始化地图对象 加载地图 var map new AMap Map mapContain
  • 【PB】动态添加数据窗口列中下拉列表的内容

    1 设置数据窗口某个列 dept id 的style type为DropDownListBox dw 1 Modify dept id ddlb case any 2 为下拉列表框添加数据 boolean lb flag false str
  • 剖析C++标准库智能指针(std::auto_ptr)

    1 Do you Smart Pointer Smart Pointer 中文名 智能指针 舶来品 不可否认 资源泄露 resource leak 曾经是C 程序的一大噩梦 垃圾回收 机制 Garbage Collection 一时颇受注目
  • 测开笔记九:线程&TestNG

    1 线程 1 1 线程概念 线程 程序执行流的最小执行单位 是行程中的实际运作单位 经常容易和进程这个概念混淆 那么 线程和进程究竟有什么区别呢 首先 进程是一个动态的过程 是一个活动的实体 简单来说 一个应用程序的运行就可以被看做是一个进
  • 机器学习——核函数

    问 已知三维空间中的两个样本点分别为 2 4 5 和 1 2 3 定义核函数表达式为 试计算这两个样本点映射到十维空间后的 答 首先计算两个样本点的平方内积 2 1 4 2 5 3 25 然后代入核函数表达式 25 5 6 131 1 核函
  • 如何修改element.style的样式

    我们通常在用组件库或者调试web样式时 发现有 element style这样的类名 这种样式其实是行内样式导致的 但是像element这种框架 没法修改行内样式
  • Cookie和Session的区别与联系

    1 前言 http的无状态和无连接 无连接 限制每次连接只处理一个请求 服务端处理完客户端的请求 并收到客户端的响应后 就断开连接 无状态 没有记录用户的登录状态 在淘宝上点击添加购物车 点击收藏 点击我的订单每一步就必须得重新登录 非常麻
  • 零相位,线性相位与非线性相位

    零相位 如图所示 如果一个信号关于第0个抽样点左右对称 则称这个信号具有零相位 线性相位 如果一个信号左右对称 但对称轴所在位置不是第0个采样点 则称这个信号具有线性相位 这就意味着 一个线性相位信号通过简单的左右平移变换便可转换为零相位信
  • unity(界面操作)如何打开模型网格

    就一个简单的操作 想不到网上的文章写的这么不清楚 找了半天才找到 误人子弟 我干脆自己写一个 如何在unity看到下面这个模型网格 如图点击
  • 【设计经验】5、Verilog对数据进行四舍五入(round)与饱和(saturation)截位

    一 软件平台与硬件平台 软件平台 操作系统 Windows 8 1 64 bit 开发套件 Vivado2015 4 2 Matlab2016a 仿真工具 Vivado自带仿真器 二 引言 在利用Verilog写数字信号处理相关算法的过程中
  • 人工智能基础学习笔记:简单神经网络的构建

    文章目录 前言 一 神经网络能够做什么 二 简单神经网络结构介绍 三 反向传播 梯度下降法 总结 前言 author Liu Zhao 作为刚入坑机器学习的一名小白 写这篇文章的初衷是想作为自己的一个学习笔记 防止知识遗忘 同时也希望能够跟