1.2)深度学习笔记------神经网络的编程基础

目录

1)Binary Classification

2)Logistic Regression

3)Logistic Regression Cost Function

4)Gradient Descent

5)Logistic Regression Gradient Descent(重点)

6)Gradient Descent on m Examples

7)Vectorization Logistic Regression's Gradient(重点)

8)Broadcasting in Python

9)A note on python or numpy vectors

10)Explanation of logistic regression cost function(选修)


以下笔记是吴恩达老师深度学习课程第一门课第二周的的学习笔记:Basics of Neural Network programming。笔记参考了黄海广博士的内容,在此表示感谢。 


1)Binary Classification

这一小节,我们首先将学习本课程中用到的数学符号:

  • x:是一个n_x维输入数据,维度表示为(n_x,1);
  • y:表示输出结果,取值为(0,1);
  • (x^{(i)},y^{(i)}):表示第 i 组数据;
  • X=[x^{(1)},x^{(2)},...,x^{(m)}]:表示所有训练数据集的输入值,放在一个(n_x,m)的矩阵中;
  • Y=[y^{(1)},y^{(2)},...,y^{(m)}]:对应表示所有的输出值,维度为(1,m)

2)Logistic Regression

在吴恩达老师之前的机器学习课程中已经介绍过逻辑回归,这里简单复习一下逻辑函数。Logistic 回归是一个用于二元分类的算法。Logistic 回归中使用的参数如下:

  • 输入的特征向量:$x \in R^{n_x}$,其中${n_x}$是特征数量;

  • 用于训练的标签:$y \in 0,1$

  • 权重:$w \in R^{n_x}$

  • 偏置:$b \in R$

  • 输出:\hat{y}=\sigma(w^Tx+b)

  • Sigmoid 函数:$$s = \sigma(w^Tx+b) = \sigma(z) = \frac{1}{1+e^{-z}}$$

预测值为表示1的概率,故引入 Sigmoid 函数。从下图可看出,Sigmoid 函数的值域为 [0, 1]。


3)Logistic Regression Cost Function

损失函数(loss function)用于衡量预测结果与真实值之间的误差。 最简单的损失函数定义方式为平方差损失:

$$L(\hat{y},y) = \frac{1}{2}(\hat{y}-y)^2$$

但是,对于 logistic regression 来说,一般不使用平方差来作为 Loss Function,这是因为上面的平方差损失函数对于逻辑回归问题一般是非凸函数(non-convex),其在使用梯度下降算法的时候,容易得到局部最优解,而不是全局最优解。因此要选择凸函数。

逻辑回归的Loss Function:                   

$$L(\hat{y},y) = -(y\log\hat{y})-(1-y)\log(1-\hat{y}))$$

损失函数是在单个训练样本中定义的,它衡量了在单个训练样本上的表现。而代价函数(cost function,或者称作成本函数)衡量的是在全体训练样本上的表现,即衡量参数 w 和 b 的效果。

$$J(w,b) = \frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})


4)Gradient Descent

函数的梯度(gradient)指出了函数的最陡增长方向。即是说,按梯度的方向走,函数增长得就越快。那么按梯度的负方向走,函数值自然就降低得最快了。

模型的训练目标即是寻找合适的 w 与 b 以最小化代价函数值。简单起见我们先假设 w 与 b 都是一维实数,那么可以得到如下的 J 关于 w 与 b 的图:

可以看到,成本函数 J 是一个凸函数,与非凸函数的区别在于其不含有多个局部最低点;选择这样的代价函数就保证了无论我们如何初始化模型参数,都能够寻找到合适的最优解。

每次迭代更新的修正表达式:                    

w:=w-\alpha\frac{\partial{J(w,b)}}{\partial{w}}

b:=b-\alpha\frac{\partial{J(w,b)}}{\partial{b}}

其中,\alpha表示学习速率,即每次更新参数的步伐长度。


5)Logistic Regression Gradient Descent(重点)

本节笔记之前吴恩达老师在课程里介绍了导数,计算图,使用计算图的例子,考虑到这部分内容不是很难,故没有记载,需要的同学可以回看吴恩达老师的课程视频或黄海广博士的笔记。

这一节详细介绍了逻辑回归中梯度的计算和参数的更新,这部分掌握了对后面神经网络的学习很有帮助。

对单个样本而言,逻辑回归Loss function表达式:

z=w^Tx+b

\hat{y}=a=\sigma(z)

L(a,y)=-(ylog(a)+(1-y)log(1-a))

假设输入的特征向量维度为 2,即输入参数共有 x1, w1, x2, w2, b 这五个。可以推导出如下的计算图:

首先反向求出 L 对于 a 和  z 的导数:                       

da=\frac{dL(a,y)}{da}=-\frac{y}{a}+\frac{1-y}{1-a}

dz=\frac{dL}{dz}=\frac{dL}{da}\frac{da}{dz}=a-y

再对w_1,w_2,b进行求导:

dw_1=x_1dz=x_1(a-y)

dw_2=x_2dz=x_2(a-y)

db=dz=(a-y)

梯度下降法更新参数可得:

w_1:=w_1-\alpha{dw_1}

w_2:=w_2-\alpha{dw_2}

b:=b-\alpha{db}


6)Gradient Descent on m Examples

对 m 个样本来说,其 Cost function 表达式如下:

z^{(i)}=w^Tx^{(i)}+b

\hat{y}^{(i)}=a^{(i)}=\sigma(z^{(i)})

$$J(w,b)=\frac{1}{m}\sum^m_{i=1}L(a^{(i)},y^{(i)})$$

Cost function 关于 w 和 b 的偏导数可以写成所有样本点偏导数和的平均形式:

$$dw_1=\frac{\partial J(w,b)}{\partial{w_1}}=\frac{1}{m}\sum^m_{i=1}\frac{\partial L(a^{(i)},y^{(i)})}{\partial{w_1}}=\frac{1}{m}\sum_{i=1}^{m}x_1^{(i)}(a^{(i)}-y^{(i)})$$

$$dw_2=\frac{\partial J(w,b)}{\partial{w_2}}=\frac{1}{m}\sum^m_{i=1}\frac{\partial L(a^{(i)},y^{(i)})}{\partial{w_2}}=\frac{1}{m}\sum_{i=1}^{m}x_2^{(i)}(a^{(i)}-y^{(i)})$$

$$db=\frac{\partial J(w,b)}{\partial{b}}=\frac{1}{m}\sum^m_{i=1}\frac{\partial L(a^{(i)},y^{(i)})}{\partial{b}}=\frac{1}{m}\sum_{i=1}^{m}(a^{(i)}-y^{(i)})$$

完整的 Logistic 回归中某次训练的流程如下,这里仅假设特征向量的维度为 2:

然后对参数进行迭代。

上述过程在计算时有一个缺点:你需要编写两个 for 循环。第一个 for 循环遍历 m 个样本,而第二个 for 循环遍历所有特征。如果有大量特征,在代码中显式使用 for 循环会使算法很低效。向量化可以用于解决显式使用 for 循环的问题。


7)Vectorization Logistic Regression's Gradient(重点)

在深度学习的算法中,我们通常拥有大量的数据,在程序的编写过程中,应该尽最大可能的少使用loop循环语句,利用python可以实现矩阵运算,进而来提高程序的运行速度,避免for循环的使用。

在 Logistic 回归中,需要计算$$z=w^Tx+b$$如果是非向量化的循环方式操作,代码可能如下:

z = 0;
for i in range(n_x):z += w[i] * x[i]
z += b

而如果是向量化的操作,代码则会简洁很多,并带来近百倍的性能提升(并行指令):

z = np.dot(w, x) + b

不用显式 for 循环,实现 Logistic 回归的梯度下降一次迭代(对应之前代码的 for 循环部分。这里公式和 NumPy 的代码混杂,注意分辨):

单次迭代梯度下降算法流程

$$\\Z=w^TX+b=np.dot(w.T, x) + b$$\\ $$A=\sigma(Z)$$\\ $$dZ=A-Y$$\\ $$dw=\frac{1}{m}XdZ^T$$\\ $$db=\frac{1}{m}np.sum(dZ)$$\\ $$w:=w-\sigma dw$$ $$b:=b-\sigma db$$


8)Broadcasting in Python

Numpy 的 Universal functions 中要求输入的数组 shape 是一致的。当数组的 shape 不相等的时候,则会使用广播机制,调整数组使得 shape 一样,满足规则,则可以运算,否则就出错。

四条规则:

  1. 让所有输入数组都向其中 shape 最长的数组看齐;

  2. 输出数组的 shape 是输入数组 shape 的各个轴上的最大值;

  3. 如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错;

  4. 当输入数组的某个轴的长度为 1 时,沿着此轴运算时都用此轴上的第一组值。


9)A note on python or numpy vectors

  • 虽然在Python有广播的机制,但是在Python程序中,为了保证矩阵运算的正确性,可以使用reshape()函数来对矩阵设定所需要进行计算的维度,这是个好的习惯;
  • 如果用下列语句来定义一个向量,则这条语句生成的 a 的维度为(5,),既不是行向量也不是列向量,称为秩(rank)为1的数组,如果对a进行转置,则会得到 a 本身,这在计算中会给我们带来一些问题。
a = np.random.randn(5)
  • 如果需要定义(5,1)或者(1,5)向量,要使用下面标准的语句:
a = np.random.randn(5,1)
b = np.random.randn(1,5)

可以使用assert语句对向量或数组的维度进行判断。assert会对内嵌语句进行判断,即判断a的维度是不是(5,1),如果不是,则程序在此处停止。使用assert语句也是一种很好的习惯,能够帮助我们及时检查、发现语句是否正确。

assert(a.shape == (5,1))

可以使用reshape函数对数组设定所需的维度

a.reshape((5,1))

10)Explanation of logistic regression cost function(选修)

在前面的逻辑回归中,我们可以把预测值\hat{y}可以看作预测输出为正类(+1)的概率:

\hat{y}=P(y=1|x)

y=1,P(y|x)=\hat{y}y=0,P(y|x)=1-\hat{y}

将两种情况整合到一个式子中,可得:

P(y|x)=\hat{y}^y(1-\hat{y})^{(1-y)}

对上式进行log处理(这里是因为log函数是单调函数,不会改变原函数的单调性);

logP(y|x)=ylog(\hat{y})+(1-y)log(1-\hat{y})

概率P(y|x)越大越好,即判断正确的概率越大越好。这里对上式加上负号,则转化成了单个样本的Loss function,我们期望其值越小越好:

L(\hat{y},y)=-(ylog(\hat{y})+(1-y)log(1-\hat{y}))

对于m个训练样本来说,假设样本之间是独立同分布的,我们总是希望训练样本判断正确的概率越大越好,则有:

max\prod_{i=1}^{m}P(y^{(i)}|x^{(i)})

同样引入log函数,加负号,则可以得到Cost function:

$$J(w,b) = \frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})=-\sum_{i=1}^{m}(y^{(i)}log\hat{y}^{(i)}+(1-y^{(i)})log(1-\hat{y}^{(i)})]


下面,我们要开始本周的编程作业了。

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

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

相关文章

IP、TCP、UDP、HTTP头部信息

IP头部信息 ip报文段格式 版本: 占4位,表明IP协议实现的版本号,当前一般为IPv4,即0100。报头长度 : 占4位,因为头部长度不固定(Option可选部分不固定),所以需要标识…

ROS技术点滴 —— MoveIt!中的运动学插件

MoveIt!是ROS中一个重要的集成化开发平台,由一系列移动操作的功能包组成,提供运动规划、操作控制、3D感知、运动学等功能模块,是ROS社区中使用度排名前三的功能包,目前已经支持众多机器人硬件平台。 MoveIt!中的众多功能都使用插件…

1)机器学习基石笔记Lecture1:The Learning Problem

网上关于机器学习的课程有很多,其中最著名的是吴恩达老师的课程,最近又发现了NTU林轩田老师的《机器学习基石》课程,这门课也很好。课程总共分为4部分,总共分为16节课,今天来记录第一节课。 When Can Machines Learn?…

Apollo进阶课程 ③ | 开源模块讲解(中)

目录 1)ISO-26262概述 2)ISO-26262认证流程 3)ISO-26262优点与缺陷 原文链接:Apollo进阶课程 ③ | 开源模块讲解(中) Apollo自动驾驶进阶课程是由百度Apollo联合北京大学共同开设的课程,邀请…

【CodeForces - 1047C】Enlarge GCD(数学,枚举,预处理打表,思维)

题干: F先生有n个正整数,a1,a2,...,an 他认为这些整数的最大公约数太小了,所以他想通过删除一些整数来扩大它 您的任务是计算需要删除的最小整数数,以便剩余整数的最大公约数大于所有整数的公约数. Input 3 1 2 4…

TS解析文档

TS格式解析 简介: ts文件为传输流文件,视频编码主要格式h264/mpeg4,音频为acc/MP3。 ts的包是一个一个188字节的包组成,这188字节里面由一个0x47开头的包作为同步。 也就是说,如果你找到了0x47,如果与它相…

2)机器学习基石笔记Lecture2:Learning to Answer Yes/No

目录 0.上节回顾 1. Perceptron Hypothesis Set 2. Perceptron Learning Algorithm(PLA)(重点) 3. Guarantee of PLA(难点) 4. Non-Separable Data 0.上节回顾 第一节课主要讲述了机器学习的定义及机器学习的过程&#xff0…

Google Colab——谷歌免费GPU使用教程

Google Colab简介 Google Colaboratory是谷歌开放的一款研究工具,主要用于机器学习的开发和研究。这款工具现在可以免费使用。Google Colab最大的好处是给广大的AI开发者提供了免费的GPU使用!GPU型号是Tesla K80!你可以在上面轻松地跑例如&am…

pyecharts简单使用

pyecharts 是一个用于生成 Echarts 图表的类库。 Echarts 是百度开源的一个数据可视化 JS 库。可以生成很多效果很棒的图表。 pycharts文档 |分割| echarts官网 本文主要介绍pycharts的简单使用 安装 # 安装 1.0.x 以上版本 (需要python3.6及以上) $ …

Ubuntu16.4(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境安装

1. 下载压缩包 文件分享 2. 新建目录并解压 3. 配置环境变量 sudo gedit /etc/bash.bashrc 添加路径并更新路径:(PATH$PATH之间无空格) PATH$PATH://linaro-arm/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/binexport P…

Apollo进阶课程 ④ | 开源模块讲解(下)

目录 1)Apollo平台技术框架 2)Apollo版本迭代 原文链接:​Apollo进阶课程 ④ | 开源模块讲解(下) 上周,阿波君与大家讨论了自动驾驶的核心问题——安全性。本期,我们将为大家具体介绍百度Apo…

SM4 简介

SM4 我国国家密码管理局在20012年公布了无线局域网产品使用的SM4密码算法——商用密码算法。它是分组算法当中的一种,算法特点是设计简沽,结构有特点,安全高效。数据分组长度为128比特,密钥长度为128 比特。加密算法与密钥扩展算法…

九大内置对象

指在JSP的<%%> 和<% %>中可以直接使用的对象&#xff1a;没有特别说明可以开关的默认是开启的 一servlet理论上可以处理多种形式的请求响应形式http只是其中之一所以HttpServletRequest HttpServletResponse分别是ServletRequest和ServletResponse的之类 二 Http…

3)机器学习基石笔记 Lecture3:Types of Learning

目录 1&#xff09;Learning with Different Output Space Y 2&#xff09;Learning with Different Data Label 3&#xff09;Learning with Different Protocol 4&#xff09;Learning with Different Input Space X 在上一节课中&#xff0c;我们学到了第一个机器学习…

【BZOJ - 3436】小K的农场(差分约束)

题干&#xff1a; 背景 小K是个特么喜欢玩MC的孩纸。。。 描述 小K在MC里面建立很多很多的农场&#xff0c;总共n个&#xff0c;以至于他自己都忘记了每个农场中种植作物的具体数量了&#xff0c;他只记得 一些含糊的信息&#xff08;共m个&#xff09;&#xff0c;以下列…

分组密码简介和五大分组模式

分组密码 分组密码&#xff08;blockcipher&#xff09;是每次只能处理特定长度的一块数据的一类密码算法&#xff0c;这里的一块"就称为分组&#xff08;block&#xff09;。此外&#xff0c;一个分组的比特数就称为分组长度&#xff08;blocklength&#xff09;。例如&…

Java Web(五) JSP详解(四大作用域九大内置对象等)

前面讲解了Servlet&#xff0c;了解了Servlet的继承结构&#xff0c;生命周期等&#xff0c;并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解&#xff0c;但是我们会发现在Servlet中编写一些HTML代码&#xff0c;是很不方便的一件事情&#xff0c;每次都…

Apollo进阶课程 ⑤ | Apollo硬件开发平台介绍

目录 1&#xff09;Uber事故原因分析 2&#xff09;自动驾驶的第一天条-----安全 3&#xff09;自动驾驶汽车的硬件系统 4&#xff09;自动驾驶汽车感知类传感器介绍 5&#xff09;自动驾驶汽车的传感器 6&#xff09;自动驾驶的计算单元 7&#xff09;自动驾驶的线控系…

使用tcpdump,adb进行手机抓包

准备 手机 root PC安装ADB 下载压缩包&#xff0c;解压即可 链接&#xff1a;https://pan.baidu.com/s/1Hv-IqpQutBVTHuriakQUTg 提取码&#xff1a;q57q 配置环境变量 在系统环境Path中添加 adb.exe 的地址 验证安装 adb version 出现版本&#xff0c;即为成功 开启adb服…

依赖注入和控制反转的理解,写的太好了。

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念&#xff0c;对于初学Spring的人来说&#xff0c;总觉得IoC 、DI这两个概念是模糊不清的&#xff0c;是很难理解的&#xff0c;今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及…