【机器学习】神经网络代价函数和反向传播算法

news2024/10/6 20:03:31

神经网络的代价函数

接下来我会再规定若干符号代表的含义:
L L L表示神经网络的总层数
s i s_i si表示的是第i层的神经元数量

如果神经网络处理的是一个二元分类问题,那么他的第L层就只会有一个节点;如果处理的是一个多元分类问题,那么需要分为K类则在第L层会有K个节点

神经网络中使用的代价函数我们之前学过Logistics回归的代价函数的一般形式,其中Logistics回归的代价函数如下:(带有正则化项)
J ( θ ) = − 1 m [ ∑ i = 1 m y ( i ) l o g h θ ( x ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2 J(\theta)=-\frac{1}{m} \left [ \sum_{i=1}^{m}y^{(i)}logh_\theta (x^{(i)} )+(1-y^{(i)})log(1-h_\theta (x^{(i)}))\right ]+\frac{\lambda }{2m} \sum_{j=1}^{n}\theta _j^2 J(θ)=m1[i=1my(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]+2mλj=1nθj2

那么神经网络的代价函数为
J ( θ ) = − 1 m [ ∑ i = 1 m ∑ k = 1 K y k ( i ) l o g ( h θ ( x ( i ) ) ) k + ( 1 − y k ( i ) ) l o g ( 1 − ( h θ ( x ( i ) ) ) k ) ] + λ 2 m ∑ l = 1 L − 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( θ j i ( l ) ) 2 J(\theta)=-\frac{1}{m} \left [ \sum_{i=1}^{m}\sum_{k=1}^{K} y_k^{(i)}log(h_\theta (x^{(i)} ))_k+(1-y_k^{(i)})log(1-(h_\theta (x^{(i)}))_k)\right ] +\frac{\lambda }{2m} \sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}} (\theta_{ji}^{(l)})^2 J(θ)=m1[i=1mk=1Kyk(i)log(hθ(x(i)))k+(1yk(i))log(1(hθ(x(i)))k)]+2mλl=1L1i=1slj=1sl+1(θji(l))2

我们来分析下神经网络的代价函数,在代价函数中,一般假设函数 h ( x ) h(x) h(x)表示的是神经网络经过拟合后的输出值,而y是样本实际的结果,因为多分类的神经网络中,式子中的y不只是只有一种输出结果,而是有k种输出结果,因此需要计算K个输出单元的和,这就是为什么需要 ∑ k = 1 K \sum_{k=1}^{K} k=1K的原因。

老实说,代价函数这方面我也不太整的明白,我跟的教程并没有给出足够严谨的说明,但是好在实际使用时是直接有函数接口调用的,另外我还会找额外的书籍去补一补这一方面,等着更新吧(挖坑

反向传播算法

单个实例的反向传播

上面我们知道了神经网络的代价函数:这为我们衡量一个神经网络的假设结果是否准确提供了方法。那么如何通过调整参数 θ \theta θ使得代价函数 J ( Θ ) J(\Theta) J(Θ)最小化呢?在神经网络中,我们使用反向传播算法来实现。

这需要计算 J ( Θ ) J(\Theta) J(Θ) ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta) Θij(l)J(Θ),其中 J ( Θ ) J(\Theta) J(Θ)的计算方法已经在上一节给出了,接下来的内容大部分精力都在讨论如何计算 ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta) Θij(l)J(Θ)

先假设只有一个训练实例 ( x , y ) (x,y) (x,y),试着针对这个实例进行训练,首先我们需要使用之前学的前向传播算法,获得其最终假设函数的结果。
在这里插入图片描述
其前向传播的过程如下:
a ( 1 ) = x z ( 2 ) = Θ ( 1 ) a ( 1 ) a ( 2 ) = g ( z ( 2 ) )   ( a d d   a 0 ( 2 ) ) z ( 3 ) = Θ ( 2 ) a ( 2 ) a ( 3 ) = g ( z ( 3 ) )   ( a d d   a 0 ( 3 ) ) z ( 4 ) = Θ ( 3 ) a ( 3 ) a ( 4 ) = h Θ ( x ) = g ( z ( 4 ) ) a^{(1)}=x\\z^{(2)}=\Theta^{(1)}a^{(1)}\\a^{(2)}=g(z^{(2)})\:(add \:a_0^{(2)})\\z^{(3)}=\Theta^{(2)}a^{(2)}\\a^{(3)}=g(z^{(3)})\:(add \:a_0^{(3)})\\z^{(4)}=\Theta^{(3)}a^{(3)}\\a^{(4)}=h_\Theta(x)=g(z^{(4)}) a(1)=xz(2)=Θ(1)a(1)a(2)=g(z(2))(adda0(2))z(3)=Θ(2)a(2)a(3)=g(z(3))(adda0(3))z(4)=Θ(3)a(3)a(4)=hΘ(x)=g(z(4))
注意:其中 a ( 1 ) a^{(1)} a(1)是一个向量,其他的亦是,这是一个向量化的前向传播过程

接下来就是采用反向传播的时候了,反向传播实际上是在逐层计算神经网络的各层的假设结果和实际结果的误差。规定 δ j ( l ) \delta_j^{(l)} δj(l)为第l层第j个节点的神经节点的激活值的误差,那么对于上述的例子有: δ j ( 4 ) = a j ( 4 ) − y j \delta_j^{(4)}=a_j^{(4)}-y_j δj(4)=aj(4)yj,也就是将算法的输出值减去该样例的答案yj

当然,你也可以使用向量化表达,比如: δ ( 4 ) = a ( 4 ) − y \delta^{(4)}=a^{(4)}-y δ(4)=a(4)y,这个式子里的每一个元素都是一个向量,我们可以按照这种逻辑写出网络中前面几层的误差项 δ \delta δ,如下:
δ ( 4 ) = a ( 4 ) − y δ ( 3 ) = ( Θ ( 3 ) ) T δ ( 4 ) . ∗ g ′ ( z ( 3 ) ) δ ( 2 ) = ( Θ ( 2 ) ) T δ ( 3 ) . ∗ g ′ ( z ( 2 ) ) \delta^{(4)}=a^{(4)}-y\\\delta^{(3)}=(\Theta^{(3)})^T\delta^{(4)}.*g'(z^{(3)})\\\delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)}.*g'(z^{(2)}) δ(4)=a(4)yδ(3)=(Θ(3))Tδ(4).g(z(3))δ(2)=(Θ(2))Tδ(3).g(z(2))其中 g ′ ( z ( i ) ) = a ( i ) . ∗ ( 1 − a ( i ) ) g'(z^{(i)})=a^{(i)}.*(1-a^{(i)}) g(z(i))=a(i).(1a(i)),这是Logistics激活函数的导数。另外误差项 δ 1 \delta_1 δ1是不存在的,因为第一层是输入层,没有误差可言。而通过式子 ∂ ∂ Θ i j ( l ) J ( Θ ) = a j ( l ) δ i ( l + 1 ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)=a_j^{(l)}\delta_i^{(l+1)} Θij(l)J(Θ)=aj(l)δi(l+1)我们就可以通过式子和 a a a计算出其导数项。(注意的是,现在模型尚未引入正则化的 λ \lambda λ项,因为此时考虑正则化会比较复杂,我们后面再完成正则化工作)

多实例反向传播

现在我们试着训练一个拥有多个实例的 ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , . . . , ( x ( m ) , y ( m ) ) {(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})} (x(1),y(1)),(x(2),y(2)),...,(x(m),y(m)),定义一个变量 Δ i j ( l ) = 0   ( f o r   a l l   l , i , j ) \Delta_{ij}^{(l)}=0\:(for\:all\: l,i,j) Δij(l)=0(foralll,i,j)这个 Δ \Delta Δ表示的是误差,它的用处是用于计算导数 ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta) Θij(l)J(Θ),上面单实例中,对于第l层的节点j,只会有一个实例产生误差项目 δ \delta δ,因此 Δ = δ \Delta=\delta Δ=δ,但是在有m个实例的多实例反向传播中,一个节点会经过m个实例的验证,因此 Δ \Delta Δ等于m个单实例误差 δ \delta δ的和。

令i从1遍历到m,依次执行以下操作:

  • a ( 1 ) = x ( i ) a^{(1)}=x^{(i)} a(1)=x(i)
  • 使用正向传播j计算每一层的激活值 a ( l ) a^{(l)} a(l)
  • 使用 y ( i ) y^{(i)} y(i)计算 δ ( L ) = a ( L ) − y ( i ) \delta^{(L)}=a^{(L)}-y^{(i)} δ(L)=a(L)y(i),计算输出层的误差
  • 并且使用该法计算各层的误差 δ ( L − 1 ) , δ ( L − 2 ) , . . . , δ ( 2 ) \delta^{(L-1)},\delta^{(L-2)},...,\delta^{(2)} δ(L1),δ(L2),...,δ(2)
  • 接着 Δ i j ( l ) : = Δ i j ( l ) + a j ( l ) δ i ( l + 1 ) \Delta_{ij}^{(l)}:=\Delta_{ij}^{(l)}+a_j^{(l)}\delta_i^{(l+1)} Δij(l):=Δij(l)+aj(l)δi(l+1)

完成了这些工作之后,利用上面的结果计算如下的式子
D i j ( l ) : = 1 m Δ i j ( l ) + λ Θ i j ( l )    i f   j ≠ 0 D i j ( l ) : = 1 m Δ i j ( l )    i f   j = 0 D_{ij}^{(l)}:=\frac{1}{m}\Delta_{ij}^{(l)}+\lambda\Theta_{ij}^{(l)}\:\:if\:j\neq0\\D_{ij}^{(l)}:=\frac{1}{m}\Delta_{ij}^{(l)}\:\:if\:j=0 Dij(l):=m1Δij(l)+λΘij(l)ifj=0Dij(l):=m1Δij(l)ifj=0可以看到,这里我们引入了正则化的 λ \lambda λ项,也就是这里的作用是正则化,通过这些我们又可以计算出代价函数 J ( Θ ) J(\Theta) J(Θ)的导数 ∂ ∂ Θ i j ( l ) J ( Θ ) = D i j ( l ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)=D_{ij}^{(l)} Θij(l)J(Θ)=Dij(l)。这就是反向传播算法计算代价函数的过程

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

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

相关文章

不知不觉创作一年了,谈谈我的创作经历

前言 大家好,我是小刘在C站,不知不觉创作1年啦,本次文章呢分享一下我这一路走来的经历吧 目录 前言 1.为什么写博客 2.第一篇文章 3.怎么坚持创作的? 4.自我介绍 5.收获 6.认识了哪些大佬呢? 7.未来规划 8.分…

【C++】STL的string容器介绍

目录 1、string容器 1.1声明一个c字符串 1.2string和c字符数组的比较 1.3string类操作函数介绍 1.3.1赋值操作 1.3.2字符串拼接 1.3.3字符串查找 1.3.4字符串替换 1.3.5字符串比较 1.3.6字符存取 1.3.7字符串插入 1.3.8字符串删除 1.3.9子串获取 1、string容器 在…

测试4年外包已上岸 , 我只能说这类公司能不去尽量别去···

我大学学的是计算机专业,毕业的时候,对于找工作比较迷茫,也不知道当时怎么想的,一头就扎进了一家外包公司,一干就是4年。现在终于跳槽到了互联网公司了,我想说的是,但凡有点机会,千万…

从零开始Vue项目中使用MapboxGL开发三维地图教程(五)实现框选要素功能、可拖动点展示坐标以及地图上实时更新要素

文章目录 1、实现框选要素功能1.1、添加点数据的图层:1.2、增加绘图插件(mapbox-draw)1.3、实现框选并让选择的目标数据高亮 2、实现地图上可拖动点2.1、实现功能:2.2、实现思路:2.3、代码示例: 3、实时更新…

已安装过PageOfiice,谷歌浏览器反复提示PageOffice安装

原因:Chrome开发团队以网络安全为由,强推ssl证书,希望所有部署在公网的网站,全部改用https访问,所以最新的谷歌和edge升级到94版本后对公网上的http请求下的非同域的http请求进行了拦截,于是就出现了目前遇…

火灾发生时如何实时地选择逃生路线

安科瑞虞佳豪 南京大学无菌动物房改造项目,位于位于南京江北新区学府路 12 号。改造面积约为 1100m2,均在原有建筑底层。其中,动物房区域含饲养室 6 间,层高 4.9m。功能实验区域含实验室 4间、手术室 1 间、暂养室 2 间、内外准备…

Linux进程信号 | 信号产生

前面的文章中我们讲述了进程间通信的部分内容,在本文中我们继续来学习进程信号相关的知识点。 信号入门 生活角度的信号 在我们的日常生活中,就有着各种各样的信号,它会给我们传递各种各样的信息,可以知道的是一个信号例如&…

webpack提升开发体验SourceMap

一、开发场景介绍 开发中我们不可避免的会写一些bug出来,这时候要调试,快速定位到bug到底出现在哪尤为关键。 例如我故意在sum函数中写一个错误代码如下: 这时我们用前面章节已经写好的开发模式的webpack.dev.js运行,控制台会出…

【Spring】— MyBatis与Spring的整合

目录 1.整合环境1.1准备所需的JAR包1.所需Spring框架的JAR包2.所需MyBatis框架的JAR包3.MyBatis与Spring整合所需的中间JAR包4.数据库驱动JAR包5.数据源所需JAR包 1.2 编写配置文件 2.整合2.1 传统DAO方式的开发整合1&…

龙蜥社区第 17 次运营委员会会议顺利召开

5 月 26 日,龙蜥社区走进 Arm 北京办公室召开了第 17 次运营委员会会议。本次会议由龙蜥社区运营委员会副主席金美琴主持。来自 Arm、阿里云、电信、红旗软件、飞腾、海光、Intel、浪潮信息、联通软研院、龙芯、凝思软件、麒麟软件、普华基础软件、申泰、统信软件、…

Vue-Element-Admin项目学习笔记(7)用Node.js写一个简单后端接口

前情回顾: vue-element-admin项目学习笔记(1)安装、配置、启动项目 vue-element-admin项目学习笔记(2)main.js 文件分析 vue-element-admin项目学习笔记(3)路由分析一:静态路由 vue-element-adm…

Opencv-C++笔记 (3) : opencv的库介绍以及和C++对接转换

文章目录 一、Opencv库的介绍calib3dcontribcoreimgprocfeatures2dflannhighguilegacymlnonfreeobjdetectoclphotostitchingsuperrestsvideoVideostab 二、C和MAT 转换方式2.1、一维Vector2.2、二维vector2.3 数组2.4、类型转换 ——一维转 数组2.5、类型转换 -------- 一维MAT…

抖音同城榜相关介绍来啦,这篇文不若与众带你去详细了解它

一、抖音同城榜是什么? 抖音同城榜是抖音平台上的一个功能,它可以根据用户所在的地理位置,推荐附近热门的视频和达人。用户可以通过同城榜来了解当地的热门话题、美食、景点等信息,也可以通过同城榜认识志同道合的朋友和达人&…

DTD怎样进行元素类型定义?【语法格式】

Bootstrap常用组件包括按钮、导航、菜单和表单等。使用Bootstrap不需要编写复杂的样式代码,只需要使用Bootstrap组件就可以实现复杂的页面架构。下面将对Boolstrap按钮组件进行详细讲解。 Bootstrap提供了多种样式的按钮,每个样式的按钮都有自己的语义用…

动态规划:最长公共子序列

动态规划:最长公共子序列 前言一、动态规划 前言 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在…

练习1:线性回归

练习1:线性回归 介绍 在本练习中,您将 实现线性回归并了解其在数据上的工作原理。 在开始练习前,需要下载如下的文件进行数据上传: ex1data1.txt -单变量的线性回归数据集ex1data2.txt -多变量的线性回归数据集 在整个练习中&…

【IMX6ULL驱动开发学习】09.Linux驱动之GPIO中断(附SR501人体红外感应驱动代码)

Linux驱动的GPIO中断编程主要有以下几个步骤: 1、 通过GPIO号获取软件中断号 (中断编程不需要设置GPIO输入输出,当然申请GPIO,设置输入也没问题) int gpio_to_irq(unsigned int gpio)参数含义gpioGPIO引脚编号 2、 注册中断处理函数&#…

k8s中docker0默认ip修改

原因: 由于ip冲突,必须要修改docker0的默认ip 过程: (1)修改文件 /etc/docker/daemon.json 添加内容 “bip”: “ip/netmask” [ 切勿与宿主机同网段 ] (2) (3)重启docke…

视觉SLAM十四讲——ch9实践(后端1)

视觉SLAM十四讲——ch9的实践操作及避坑 0.实践前小知识介绍0.1 数据集的使用 1. 实践操作前的准备工作2. 实践过程2.1 Ceres BA2.2 g2o求解BA 3. 遇到的问题及解决办法3.1 查看.ply文件时报警告 0.实践前小知识介绍 0.1 数据集的使用 Ceres BA使用的是BAL数据集。在本例中&a…

为什么说2023年最难招聘的岗位是高性能计算工程师?

随着毕业季的临近,高校毕业生将进入就业关键阶段。据统计,2023届全国高校毕业生预计达到1158万人,同比增加82万人,再创新高。尽管有千万的大学毕业生,但是企业反馈依然很难招聘到合适的高性能计算工程师。 这主要归因于…