吴恩达深度学习笔记:神经网络的编程基础2.9-2.14

目录

  • 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)
    • 第二周:神经网络的编程基础 (Basics of Neural Network programming)
      • 2.9 逻辑回归中的梯度下降(Logistic Regression Gradient Descent)

第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)

第二周:神经网络的编程基础 (Basics of Neural Network programming)

2.9 逻辑回归中的梯度下降(Logistic Regression Gradient Descent)

本节我们讨论怎样通过计算偏导数来实现逻辑回归的梯度下降算法。它的关键点是几个重要公式,其作用是用来实现逻辑回归中梯度下降算法。但是在本节视频中,我将使用计算图对梯度下降算法进行计算。我必须要承认的是,使用计算图来计算逻辑回归的梯度下降算法有点大材小用了。但是,我认为以这个例子作为开始来讲解,可以使你更好的理解背后的思想。从而在讨论神经网络时,你可以更深刻而全面地理解神经网络。接下来让我们开始学习逻辑回归的梯度下降算法。

假设样本只有两个特征 x 1 x_1 x1 x 2 x_2 x2,为了计算𝑧,我们需要输入参数 w 1 、 w 2 w_1、w_2 w1w2 和𝑏,除此之外还有特征值 x 1 x_1 x1 x 2 x_2 x2。因此𝑧的计算公式为: z = w 1 x 1 + w 2 x 2 + b z = w_1x_1 + w_2x_2 + b z=w1x1+w2x2+b

回想一下逻辑回归的公式定义如下:

y ^ = a = σ ( z ) 其中 z = w T x + b , σ ( z ) = 1 1 + e − z \hat{y}= a = σ(z) 其中 z= w^Tx + b, σ(z) =\frac{1}{1+e^{-z}} y^=a=σ(z)其中z=wTx+bσ(z)=1+ez1
损失函数: L ( y ^ ( i ) , y ( i ) ) = − y ( i ) log ⁡ ( y ^ ( i ) ) − ( 1 − y ( i ) ) log ⁡ ( 1 − y ^ ( i ) ) L( \hat{y}^{(i)},y^{(i)}) = -y^{(i)} \log(\hat{y}^{(i)}) - (1-y^{(i)}) \log(1-\hat{y}^{(i)}) L(y^(i),y(i))=y(i)log(y^(i))(1y(i))log(1y^(i))
代价函数: J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) J(w,b) = \frac{1}{m} \sum_{i=1}^{m} L( \hat{y}^{(i)},y^{(i)}) J(w,b)=m1i=1mL(y^(i),y(i))

假设现在只考虑单个样本的情况,单个样本的代价函数定义如下:
L ( a , y ) = − ( y log ⁡ ( a ) + ( 1 − y ) log ⁡ ( 1 − a ) ) L( a,y) = -(y \log(a) + (1-y) \log(1-a)) L(a,y)=(ylog(a)+(1y)log(1a))
其中𝑎是逻辑回归的输出,𝑦是样本的标签值。现在让我们画出表示这个计算的计算图。
这里先复习下梯度下降法,𝑤和𝑏的修正量可以表达如下:

在这里插入图片描述
如图:在这个公式的外侧画上长方形。然后计算: 𝑦^ = 𝑎 = 𝜎(𝑧) 也就是计算图的下一步。最后计算损失函数𝐿(𝑎, 𝑦)。 有了计算图,我就不需要再写出公式了。因此,为了使得逻辑回归中最小化代价函数𝐿(𝑎, 𝑦),我们需要做的仅仅是修改参数𝑤和𝑏的值。前面我们已经讲解了如何在单个训练样本上计算代价函数的前向步骤。现在让我们来讨论通过反向计算出导数。 因为我们想要计算出的代价函数𝐿(𝑎, 𝑦)的导数,首先我们需要反向计算出代价函数𝐿(𝑎, 𝑦)关于𝑎的导数,在编写代码时,你只需要用𝑑𝑎 来表示 d L ( a , y ) d a \frac{dL(a,y)}{da} dadL(a,y)

通过微积分得到: d L ( a , y ) d a = − y a + 1 − y 1 − a \frac{dL(a,y)}{da}=\frac{-y}{a}+\frac{1-y}{1-a} dadL(a,y)=ay+1a1y

如果你不熟悉微积分,也不必太担心,我们会列出本课程涉及的所有求导公式。那么如果你非常熟悉微积分,我们鼓励你主动推导前面介绍的代价函数的求导公式,使用微积分直接求出𝐿(𝑎, 𝑦)关于变量𝑎的导数。如果你不太了解微积分,也不用太担心。现在我们已经计算出𝑑𝑎,也就是最终输出结果的导数。 现在可以再反向一步,在编写 Python 代码时,你只需要用𝑑𝑧来表示代价函数𝐿关于𝑧 的导数 d L d z \frac{dL}{dz} dzdL,也可以写成 d L ( a , y ) d z \frac{dL(a,y)}{dz} dzdL(a,y),这两种写法都是正确的。 d L d z = a − y \frac{dL}{dz} = a-y dzdL=ay
因为 d L ( a , y ) d z = d L d z = ( d L d a ) ∗ ( d a d z ) \frac{dL(a,y)}{dz} =\frac{dL}{dz}=(\frac{dL}{da})*(\frac{da}{dz}) dzdL(a,y)=dzdL=(dadL)(dzda),并且 d a d z = a ∗ ( 1 − a ) \frac{da}{dz} =a*(1-a) dzda=a(1a),而 d L d a = ( − y a + 1 − y 1 − a ) \frac{dL}{da}= (\frac{-y}{a}+ \frac{1-y}{1-a}) dadL=(ay+1a1y),因此将这两项相乘,得到:

d z = d L ( a , y ) d z = d L d z = d L d a ∗ d a d z = ( − y a + 1 − y 1 − a ) ∗ a ( 1 − a ) = a − y dz=\frac{dL(a,y)}{dz} =\frac{dL}{dz}=\frac{dL}{da}*\frac{da}{dz}=(\frac{-y}{a}+\frac{1-y}{1-a})*a(1-a) =a-y dz=dzdL(a,y)=dzdL=dadLdzda=(ay+1a1y)a(1a)=ay

视频中为了简化推导过程,假设𝑛𝑥这个推导的过程就是我之前提到过的链式法则。如果你对微积分熟悉,放心地去推导整个求导过程,如果不熟悉微积分,你只需要知道𝑑𝑧 = (𝑎 −𝑦)已经计算好了。

现在进行最后一步反向推导,也就是计算𝑤和𝑏变化对代价函数𝐿的影响,特别地,可以用:
d w 1 = 1 m ∑ n = i m x 1 ( i ) ( a ( i ) − y ( i ) ) dw_1=\frac{1}{m}\sum_{n=i}^mx_1^{(i)}(a^{(i)} -y^{(i)}) dw1=m1n=imx1(i)(a(i)y(i))
d w 2 = 1 m ∑ n = i m x 2 ( i ) ( a ( i ) − y ( i ) ) dw_2=\frac{1}{m}\sum_{n=i}^mx_2^{(i)}(a^{(i)} -y^{(i)}) dw2=m1n=imx2(i)(a(i)y(i))
d b = 1 m ∑ n = i m ( a ( i ) − y ( i ) ) db=\frac{1}{m}\sum_{n=i}^m(a^{(i)} -y^{(i)}) db=m1n=im(a(i)y(i))

视频中, 𝑑𝑤1 表示 ∂ L ∂ w 1 = x 1 ⋅ d z ∂L ∂w_1= x_1 ⋅ dz Lw1=x1dz, 𝑑𝑤2 表示 ∂ L ∂ w 2 = x 2 ⋅ d z ∂L∂w_2= x_2 ⋅ dz Lw2=x2dz d b = d z db = dz db=dz
因此,关于单个样本的梯度下降算法,你所需要做的就是如下的事情:
使用公式 d z = ( a − y ) dz = (a − y) dz=(ay)计算𝑑𝑧,
使用 d w 1 = x 1 ⋅ d z dw_1 = x_1 ⋅ dz dw1=x1dz 计算𝑑𝑤1, d w 2 = x 2 ⋅ d z dw_2 = x_2 ⋅ dz dw2=x2dz计算𝑑𝑤2, d b = d z db= dz db=dz 来计算𝑑𝑏,
然后: 更新 w 1 = w 1 − α d w 1 w_1 = w_1 − αdw_1 w1=w1αdw1, 更新 w 2 = w 2 − α d w 2 w_2 = w_2 − αdw_2 w2=w2αdw2, 更新 b = b − α d b b = b − αdb b=bαdb
这就是关于单个样本实例的梯度下降算法中参数更新一次的步骤。
在这里插入图片描述

现在你已经知道了怎样计算导数,并且实现针对单个训练样本的逻辑回归的梯度下降算法。但是,训练逻辑回归模型不仅仅只有一个训练样本,而是有𝑚个训练样本的整个训练集。因此在下一节视频中,我们将这些思想应用到整个训练样本集中,而不仅仅只是单个样本上。

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

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

相关文章

RAID技术知识详解到RAID 10的linux实现过程

1.RAID技术简介 RAID(Redundant Array of Independent Disks)独立磁盘冗余阵列。通俗来说就是将多个硬盘通过软件或硬件结合成虚拟单台大容量的硬盘使用。 RAID技术的特点: 可以自动检测故障硬盘; 可以重建硬盘坏道的资料&…

【Leetcode每日一刷】顺/逆时针旋转矩阵 |48. 旋转图像、矩阵的螺旋遍历 |54. 螺旋矩阵

一、48. 旋转图像 1.1:题目 48. 旋转图像 1.2:解题思路 题型:顺/逆时针旋转矩阵; ❗❗核心思想/ 关键:不可暴力模拟,先镜像,后水平翻转 这题的意思很简单,就是让我们把矩阵顺时…

可视化搭建一个智慧零售订单平台

前言 智慧零售行业是在数字化浪潮中快速发展的一个领域,它利用先进的信息技术和大数据分析来提升零售业务的效率和顾客体验。智慧零售订单平台,具有跨平台、数据智能清洗和建模,以及更加丰富的数据展示形式等优势。智慧零售订单平台可以以文…

mysql数据库备份学习笔记

数据库备份 方法1 物理备份:xtrabackup 方法2 逻辑备份 mysqldump 参考备份与恢复的方法: 【MySql】Mysql之备份与恢复_mysql数据库备份与还原-CSDN博客 可以借鉴的物理备份: 思路是 先做一次全量备份,然后每天做一次增量备份…

让el-input与其他组件能够显示在同一行

让el-input与其他组件能够显示在同一行 说明&#xff1a;由于el-input标签使用会默认占满一行&#xff0c;所以在某些需要多个展示一行的时候不适用&#xff0c;因此需要能够跟其他组件显示在同一行。 效果&#xff1a; 1、el-input标签内使用css属性inline 111<el-inp…

uniapp运行钉钉小程序

因项目原因&#xff0c;公司需要在钉钉里面开发小程序。之前用uniapp开发过app&#xff0c;H5&#xff0c;小程序。还真没尝试过钉钉小程序&#xff0c;今天就简单的记录下uniapp运行钉钉小程序中的过程。 在项目目录新建package.json文件&#xff0c;在文件中添加如下代码&am…

异构计算关键技术之多线程技术(四)

异构计算关键技术之多线程技术&#xff08;四&#xff09; 最近遇到了一个项目&#xff0c;需要写一个用户态的测试程序&#xff08;独立进程&#xff09;&#xff0c;用来测试FPGA PCIe DMA的性能&#xff0c;具体的要求如下&#xff1a; 1. 需要一个主线程&#xff0c;用来…

指针的函数传参的详细讲解(超详细)

如果对指针基础知识已经有可以直接跳到 函数的指针传参与解引用&#xff0c;哪里不明白可以评论&#xff0c;随时解答。 目录 所以就有了一句话&#xff1a;指针就是地址&#xff0c;地址就是指针 对于指针在C语言中&#xff0c;指针类型就是数据类型&#xff0c;是给编译器…

诚意满满之MySQL实现事务隔离的秘诀:锁与MVCC

如果对事务没有太多理解&#xff0c;可以看前面三篇&#xff1a; 诚意满满之讲透事务 诚意满满之讲透事务隔离级别 诚意满满之MySQL如何实现原子性、持久性 不看前两篇也没有关系&#xff0c;知识点是独立的。 MySQL的四个事务隔离级别&#xff1a;读未提交、读已提交、可重…

GoLang:云原生时代致力于构建高性能服务器的后端语言

Go语言的介绍 概念 Golang&#xff08;也被称为Go&#xff09;是一种编程语言&#xff0c;由Google于2007年开始设计和开发&#xff0c;并于2009年首次公开发布。Golang是一种静态类型、编译型的语言&#xff0c;旨在提供高效和可靠的软件开发体验。它具有简洁的语法、高效的编…

JS-12-关键字this、apply()、call()

一、对象的方法 在一个对象中绑定函数&#xff0c;称为这个对象的方法。 示例&#xff1a; 1、对象&#xff1a; var xiaoming {name: 小明,birth: 1990 }; 2、给xiaoming绑定一个函数。比如&#xff0c;写个age()方法&#xff0c;返回xiaoming的年龄&#xff1a; var x…

SwiftUI的context Menu

SwiftUI的 context Menu 现在来演示一下如何使用 SwiftUI 的 Context Menu 。 代码&#xff1a; import SwiftUIstruct ContextMenuBootCamp: View {State var bgColor: Color .purplevar body: some View {VStack(alignment: .leading, spacing: 10.0) {Image(systemName: …

LLVM-3.5 —— 01记,编译 LLVM 3.5.0 clang and clang-query

包括编译&#xff1a;clang clang-tools-extra 0, prepare env sudo apt install llvm sudo apt install clang 使用最新的g 会出错。 1, source code $ git clone --recursive $ cd llvm-project $ git checkout llvmorg-3.5.0 $ cp -r ./clang ./llvm/tools/ $ mkdir llv…

冥想与AI:打造定制的放松体验

如今&#xff0c;在浏览网页或社交网络时&#xff0c;您似乎很难对一条条心理健康信息无动于衷。遇到这种情况的可不只是您。当今不断变化的时代给人们平添压力&#xff0c;企业纷纷利用智能技术满足人们的减压需求&#xff0c;让人们的生活多一些平和从容。 冥想就是一种练习呼…

高效Go编程: encoding/csv标准库深度解析

高效Go编程: encoding/csv标准库深度解析 引言了解encoding/csv库CSV文件的基本结构encoding/csv库的核心功能应用场景 读取CSV文件基本步骤代码示例处理不同的分隔符错误处理 处理CSV数据数据解析代码示例处理不规则数据代码示例 写入CSV文件基本步骤代码示例自定义设置错误处…

Vue组件之间的通信方式

文章目录 组件间通信的概念组件间通信的分类组件间通信的方案父组件将方法传递给子组件&#xff08;props&#xff09;子组件向父组件传值(emit)通过 ref 属性获取DOM元素EventBus p a r e n t 或 parent 或 parent或 root a t t r s 与 attrs 与 attrs与 listeners provide 与…

Kotlin编程权威指南学习知识点预览

一、变量、常量和类型&#xff1a; 变量、常量以及 Kotlin 基本数据类型。变量和常量在 应用程序中可用来储值和传递数据。类型则用来描述常量或变量中保存的是什么样的数据。 1、声明变量: // 变量定义关键字 —— 变量名 —— 类型定义 —— 赋值运算符 —— 赋值var na…

cesium wall 扩散墙(动态立体墙效果 Primitive 方法)

cesium wall 扩散墙(动态立体墙效果)以下为源码直接复制可用 1、实现思路 1、此效果运用cesium 中 Primitive 方法,通过传入中心点、半径、顶点数、颜色来进行加载。 2、运用 Math 方法 对传进来的中心点、半径、定点数,来计算个顶点经纬度。 3、通过Primitive 方法中upda…

643.子数组最大平均数

题目&#xff1a;给你一个由 n 个元素组成的整数数组 nums 和一个整数k。 找出平均数最大且长度为 k 的连续子数组&#xff0c;并输出该最大平均数。 任何误差小于10^-5 的答案都将被视为正确答案。 解题思路&#xff1a;规定了子数组的长度为k&#xff0c;因此可以通过寻找子…

洛谷——P1352 没有上司的舞会

题目描述 某大学有 n 个职员&#xff0c;编号为1…n。 他们之间有从属关系&#xff0c;也就是说他们的关系就像一棵以校长为根的树&#xff0c;父结点就是子结点的直接上司。 现在有个周年庆宴会&#xff0c;宴会每邀请来一个职员都会增加一定的快乐指数 ri​&#xff0c;但…