人工智能交流群~小白零基础学习群Q711703402
目录
第一周:深度学习概论
1.1 深度学习与机器学习的关系
1.2什么是神经网络?
1.3用神经网络进行监督学习
1.神经网络创造应用案例
2.机器学习对结构化与非结构化数据的应用
1.4为什么神经网络会兴起?(1遍过)
1.5关于这门课可以学到什么?深度学习最重要的基础
第二周:神经网络的编程基础
2.1二分类
1.什么是二分类
2.补充:图片在计算机中如何表示
3.本文的一些符号表示
4.训练样本=特征矩阵X=输出lableY的构造
5.补充向量知识
6.补充矩阵知识
7.补充计算知识
2.2逻辑回归 logistic 二元分类问题
1.本节内容
2.函数构建过程
3.sigmoid原理
2.3 logistic 回归损失函数 (Logistic Regression Cost Function)
1.内容
2.为什么需要代价函数
3.逻辑回归的函数运算过程
4.损失函数
5.代价函数
2.4梯度下降法(Gradient Descent)
1.梯度下降法的作用
2.什么是梯度
3.梯度下降的过程
4.梯度下降法的细节化说明(仅有一个参数时)
5.梯度下降法的细节化说明(两个参数)
6.梯度下降下山法理解
2.5导数知识(Derivatives)(略)
1.内容
2.6 更多导数知识(略)
2.7 计算图(Computation Graph)(略看)
1.内容
2.前向传播与反向传播的计算过程
3.数学求导-求偏导数-梯度
2.9 logistic回归中的梯度下降
1.单个样本的梯度下降算法
2.举例
2.单样本时的计算过程
2.10 非向量化版本m个样本的梯度下降
1.内容
2.原理
3.利用具体算法来展示m样本梯度下降过程(非向量化版本)
4.缺点
2.11向量化版本的梯度下降法
1.为什么使用向量化
2.什么是向量化计算
3.实例对比
4.GPU与CPU计算的区别
2.12部分的向量化(略看)
2.13 向量化logistic回归(Vectorizing Logistic Regression)
1.内容
2.回顾一下逻辑回归的前向传播步骤
2.14 向量化logistic回归的梯度输出(重点)
1.内容
2.实现过程
3.非向量化与向量化对比
2.15 python中的广播机制
1.内容
2.举例
2.16 关于python/numpy 向量说明
2.17 jupyter/Ipython 笔记本快速指南
2.18 证明logistic回归成本函数为什么是这种形式
第三周 浅层神经网络
3.1神经网络概览 (Neural Network Overview)
1.内容
2.神经网络计算原理
3.大致计算过程
3.2神经网络的表示
1.内容
2.什么是输入层、隐藏层、输出层
3.3 计算神经网络的输出
1.内容
2.神经网络的计算
3.向量化计算(一个样本的神经网络的输出计算)
4.手写详细单个样本向量化正向传播计算过程
5.总结
3.4 多个样本中的向量化(Vectorizing across multiple examples): 需要反复理解
1.内容
2.原理
3.过程
4.非向量化的实现
5.向量化的实现
6.手写m个样本横向堆砌向量化计算
3.5向量化实现的解释(视频) 这里讲解的更清楚***
1.内容
2.实现原理(过程)
3.6激活函数 Activation functions
1.内容
2. 激活函数的作用
3.几种常见的激活函数
3.7 为什么神经网络需要非线性激活函数呢?
1.内容
2.原因
3.什么地方用线性激活函数
3.8 激活函数的导数(梯度下降的基础)
1.几种常见激活函数的导数
3.9 神经网络的梯度下降法
1.内容
2.参数维度
3.梯度下降
4.总结
3.10 选修:直观理解反向传播:
3.11 随机初始化Random+Initialization
1.为什么要随机初始化
2.如何随机初始化
3.随机化时常数的选择
第四周:
4.1深层神经网络
1.内容
2.选择模型层数的流程
3.深度学习的符号定义
4.2 深层网络的中都前向传播
1.内容
2.正向传播
3.反向传播 参考3.9节(单隐藏层上的梯度下降)
4.3 深层网络中的前向传播和反向传播(Forward propagation in a Deep Network)
1.内容
2.一个样本前向传播过程
3.深度网络中的反向传播
4.神经网络的前向和反向传播的计算过程(详细)
4.3 核对矩阵的维数
1.内容
4.4 为什么使用深层网络(略看)
4.6 一些参数和超参数
4.8 这和大脑有什么关系?
1.1 深度学习与机器学习的关系
传统的机器学习算法中的神经网络包含现在主流的深度学习算法,都是深度神经网络。准确率都要比传统的机器学习算法要高。
1.2什么是神经网络?
1.什么是深度学习
①传统的机器学习:
主要目的是得到一个预测模型,依靠人工经验或特征转换的方法来抽取将数据表示成一组特征,然后将特征输入到预测模型,并输出预测结果。是一种浅层学习。不存在特征学习。模型的准确率主要依靠人为的特征处理。因此机器学习问题变成了特征工程问题,工作量用在了预处理、特征提取与转换上。(一次性学习)
传统机器学习的数据处理流程:
②基于深度的机器学习(神经网络):
是机器学习的一个子问题,也是基于深度学习的机器学习(含有特征学习),主要目的是搭建并训练一个深层的大规模的神经网络,通过多层的特征转换把原始数据特征变成更高层次、更抽象的表示,让模型从数据中自动学习到更有效的特征表示(更能准确表示猫狗),代替人工设计特征。避免特征工程。
2.什么是神经网络
模拟人脑神经网络的一种计算模型,由多个节点(神经元)互相链接而成,对数据间的复杂关系进行建模,不同节点之间的链接赋予了不同的权重,每个权重代表一个节点对另一个节点的影响,每个节点代表一种特定函数,对来自其他节点的权重进行综合计算(权重分配),最后输入到一个激活函数中得到一个新的活性值,是一个非线性结构系统预测模型。早期的神经网络是一个传统的机器学习,不具备特征学习,导入人工特征进行计算预测,直到反向传播算法有效的解决了网络特征学习的问题,自动学习有效特征提高模型准确率(特征学习)。这样就能更好的做预测(深度学习,多层次、多次学习)
单个神经元的内部构造:一方面进行权重分配,一方面通过激活函数,将多个特征权重分配后生成一个新的活性特征。
(图1 一个神经元的内部结构)
举个例子:假设有一个六间房屋的数据集,已知房屋面积、价格,想要根据面积预测房屋价格。就要找到一个函数根据房屋面积预测房价的函数作为神经元,我们可能用线性回归拟合一条直线,但是价格是不会为负的,所以利用下面的图像代替为负的图像。我们可以将这个利用房屋面积数据预测价格的函数模型,看成一个非常简单的神经网络。
将房屋的面积作为神经网络的输入值x:通过了一个神经元(neuron)节点输出了y,这个网络就实现了上面的函数的功能,神经元所做的就是输入面积完成线性运算,取不小于0的值,最后得到输出预测价格。
这个函数就是ReLU(修正性单元)修正是指取不小于0的值。包含在神经元中
图 一个简单的神经元网络结构图
稍微大一点的神经网络是把这些单个的神经元堆叠形成,如下图:
不只用面积来预测价格,还有一些房屋的其他特征,可以知道别的信息,卧室的数量和面积这两特征可能会得到一个影响价格的特征(隐藏的特征 模型自动推出):家庭人口信息。邮编可以得到步行化程度,邮编和富裕度可以得到学校的质量,每一个节点都可能是一个ReLU或其他非线性函数,得到的这些信息都能帮助我们预测房屋价格。x是所有的输入。y是预测价格,把神经元叠加起来就有了一个稍微大点的神经网络。网络成型后我们要做的只是输入x就能得到输出y,不管训练集有多大,所有的中间过程他会自己完成(黑盒)
图1:在图上每一个画的小圆圈都可以是 ReLU 的一部分,也就是指修正线性单元,或者其它 稍微非线性的函数。类似与将一些相关性特征通过权重分配给不同的神经元后计算生成多个或少个的新特征
如图2:这有四个输入特征x的神经网络,第二层为隐藏单元,包含三个神经元,每个的输入都同时来自四个特征(全连接),我们不会具体说第一个节点(神经元)隐藏输出特征表示家庭人口,特征仅取决于x1、x2,让神经网络自己决定这个节点是什么,我们是无法看到的。我们只给四个输入特征,这输入的特征可能是房屋的大小、卧室的数量、邮政编码 和区域的富裕程度。给出这些输入的特征之后,神经网络的工作就是预测对应的价格。随便神经网络怎么计算,输入层-隐藏层连接数是很高的。另外需注意神经网络只有你喂给她足够多的关于x、y的数据训练样本,神经网络非常擅长计算从x到y的精准映射函数(监督学习),因为给定了分类的结果,会进行特征学习,再带入新样本的时候,会按照特征的占比给出合理的分类结果)
图2:
1.3用神经网络进行监督学习
一般做的都是监督学习。
房地产、广告、用的相对标准的神经网络,图像领域:卷积神经网络,序列数据(音频)RNN循环神经网络,语言、英语、字母或单词 语言也是序列数据更复杂的RNN, 无人驾驶更复杂的混合神经网络结构。
①结构化数据:
结构化数据意味着数据的基本数据库。例如在房价预测中,你可能有一个数据库,有专门的几列数据告诉你卧室的大小和数量,这就是结构化数据。或预测用户是否会点击广告,你可能会得到关于用户的 信息,比如年龄以及关于广告的一些信息,然后对你的预测分类标注,这就是结构化数据, 意思是每个特征,比如说房屋大小卧室数量,或者是一个用户的年龄,都有一个很好的定义。
②非结构化数据:
非结构化数据是指比如音频,原始音频或者你想要识别的图像或文本中的内容。这 里的特征可能是图像中的像素值或文本中的单个单词。
常见领域:语音识别、图像识别、自然语言文字处理
总之:神经网络算法对于结构化和非结构化数据都有用处。
1.4为什么神经网络会兴起?(1遍过)
在数据量较大的情况下,神经网络的准确率要比其他的准确率高很多
1.5关于这门课可以学到什么?深度学习最重要的基础
第一周:深度学习入门介绍
第二周:神经网络的编程基础、了解神经网络的正向传播与反向传播结构,算法的过程以及如何高效实现神经网络。编程练习
第三周:编写单隐层神经网络,和关键的概念
学习目标:当学习到第一门课末尾,你将学到如何建立 一个深度神经网络并且使之奏效。
第二周:神经网络的编程基础
逻辑回归是一个用于二分类(binary classification)的算法,这里有一个二分类问题的例子.
假如你有一张图片作为输入,比如这只猫,如果识别这张图 片为猫,则输出标签 1 作为结果;如果识别出不是猫,那么输出标签 0 作为结果。现在我们可以用字母来表示输出的结果标签,如下图所示:
彩图保存在三个独立矩阵分别对应红、绿、蓝、三通道的灰度值,如果你的图片大小为 64x64 像素,那么你 就有三个规模为 64x64 的矩阵,分别对应图片中红、绿、蓝三种像素的灰度值。
如下图所示
为了把这些像素值放到一个特征向量中,我们需要把这些像素值提取出来,然后放入一 个特征向量x如下:依次列出,如果图片的大小为 64x64 像素,那么向量 的总维度, 将是 64 乘以 64 乘以 3,这是三个像素矩阵中像素的总量。在这个例子中结果为 12288。现在我们用 = 12,288来表示输入特征向量的维度,所以在二分类问题中,我们的目标就是构建一个分类器,它 以图片的特征向量作为输入,然后预测输出结果为 1 还是 0,也就是预测图片中是否有猫。
(每个像素点都是一个特征,图片数据也是转化成特征向量的形式)
在二分类问题中 目标是训练出一个分类器,输入x 输出预测标签
:表示一个维数据,为输入数据,维度为(, 1)
:表示输出结果,取值为(0,1);
( () , () ):表示第组数据,可能是训练数据,也可能是测试数据,此处默认为训练数 据;
= [ (1) , (2) , . . . , () ]:表示所有的训练数据集的输入值,放在一个 × 的矩阵中, 其中表示样本数目;
= [ (1) , (2) , . . . , () ]:对应表示所有训练数据集的输出值,维度为1 × 。
最后为了能把训练集表示得更紧凑一点,我们会定义一个矩阵用大写的表示,它由输入向量 (1)、 (2)等组成,如下图放在矩阵的列中,所以现在我们把 (1)作为第一列放在矩阵 中, (2)作为第二列, ()放到第列,然后我们就得到了训练集矩阵。所以这个矩阵有 列,是训练集的样本数量,然后这个矩阵的高度记为,注意有时候可能因为其他某些原 因,矩阵会由训练样本按照行堆叠起来而不是列,如下图所示: (1)的转置直到 ()的转 置,但是在实现神经网络的时候,使用左边的这种形式,会让整个实现的过程变得更加简单:
m个样本 每个样本nx个特征数。不然计算的时候还要转置,现在的结构化框架已经不需要手动转置了,带入xy样本计算即可。 有的特征矩阵X每一行是样本,每一列是特征(常用),ng这里和李沐的对比下,ng这里还要转置。一般用样本按行堆砌。
为什么这里一个是y=wTx+b,一个是y=Xw+b(样本按行排列)或(y=wTX+b 样本按照列排列的时候)
因为一个是单个样本的向量积,wTx x是一个样本的特征向量
一个是矩阵化后的,矩阵-向量积 Xw X是一个m个样本的特征矩阵
李沐的构建以及运算过程:
输出矩阵:
我们可以使用下标来引用向量的任一元素。 例如,我们可以通过xi来引用第i个元素。 注意,元素xi是一个标量,所以我们在引用它时不会加粗。 大量文献认为列向量是向量的默认方向,在本书中也是如此。 在数学中,向量x可以写为:
正如向量将标量从零阶推广到一阶,矩阵将向量从一阶推广到二阶。 矩阵,我们通常用粗体、大写字母来表示 (例如,X、Y和Z) 。在数学表示法中,我们使用A∈Rm×n来表示矩阵A,其由m行和nn列的实值标量组成。 我们可以将任意矩阵A∈Rm×n视为一个表格, 其中每个元素aijaij属于第i行第j列:
①点积(Dot Product)
给定两个向量x,y∈Rdx,y∈Rd, 它们的点积(dot product)x⊤y(或〈x,y〉) 是相同位置的按元素乘积的和:x⊤y=∑di=xiyi。因此,是一个样本向量和权重向量进行的点积操作。
两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的点积定义为: 默认为列向量
a·b=a1b1+a2b2+……+anbn。
使用矩阵乘法并把(列)向量当作nx1 矩阵,点积还可以写为:
a·b=(a^T)*b,这里的a^T指示矩阵a的转置
②矩阵-向量积(matrix-vector product)
回顾分别在 (2.3.2)和 (2.3.1)中定义的矩阵A∈Rm×n和向量x∈Rn。 让我们将矩阵A用它的行向量表示:因为向量默认是列向量,所以要转置。
其中每个a⊤i∈Rn都是行向量,表示矩阵的第i行,矩阵向量积Ax(Xw)是一个长度为m的列向量(), 其第i个元素是点积,我们可以把一个矩阵A∈Rm×n乘法看作是一个从Rn到Rm向量的转换。 这些转换是非常有用的。例如,我们可以用方阵的乘法来表示旋转。 我们将在后续章节中讲到,我们也可以使用矩阵-向量积来描述在给定前一层的值时, 求解神经网络每一层所需的复杂计算。
2.2逻辑回归 logistic 二元分类问题
重温逻辑回归学习算法,该算法适用于二分类问题,本节将主要 介绍逻辑回归的 Hypothesis Function(假设函数)
这是一个学习算法用在监督学习问题中,输出标签为0、1时,这是一个二元分类问题。
对于二元分类问题来讲,给定一个输入特征向量,它可能对应一张图片,想识别这张图片识别看它是否是一只猫图。已知输入特征向量x可能是一张图 判断是不是猫 ,你想要一个算法能够输出预测,你只 能称之为^,也就是你对实际值 的估计。当输入特征满足条件时y就是1,也是一个y=1概率问题。
已知参数w(实际上是特征权重,维度与特征向量相同)是一个n维向量,b是一个实数(表示偏差),w已知输入x和参数,b,我们如何计算输出预测y?
我们可以用一个线性函数,若做线性回归确实是这样算,但是这不是一个很好的二元分类算法。因为我们希望是y=1的概率,因此应该介于0-1之间。但是这个线性函数很难实现,因为函数的值可能要比1大的多或者为负值,这样的概率没有意义,因此 在逻辑回归中,我们的输出应该是^等于由上面得到的线性函数式子作为自变量的 sigmoid 函数中,将线性函数转换为非线性函数。函数图形与公式如下图:那么当z很大的时候sigmoid(z)就很接近1.相反很小的时候就会接近于0,所以当我们实现logictic回归时,我们要做的就是学习参数w和b。
z应该是表示感知机中的一个超平面,本来是一个线性的超平面,所以要加上一个非线性激活函数,就可以处理非线性数据了。详情再看看神经网络的前身,感知机、支持向量机svm前身。
(比较适合0-1的二分类问题)
一些符号的约定:不再用之前课程里讲的一些符号规定,之前w和b是写在一起的,现在分开。
现在我们已经了解了logictic回归模型的模样,下一步要做的是训练参数和参数,你需要定义一个代价函数,让 我们在下节课里对其进行解释
2.3 logistic 回归损失函数 (Logistic Regression Cost Function)
讲逻辑回归的代价函数(也翻译作成本函数)
为了训练logistic回归模型的参数w和b,通过训练代价函数来得到参数和参数b的最优参数,需要定义一个代价函数(成本函数)。
补充:代价函数、成本函数、损失函数三个概念
损失函数(Loss function)是定义在单个训练样本上的,也就是就算一个样本的误差,比如我们想要分类,就是预测的类别和实际类别的区别,是一个样本的哦,用L表示
代价函数(Cost function)是定义在整个训练集上面的,也就是所有样本的误差的总和的平均,也就是损失函数的总和的平均,有没有这个平均其实不会影响最后的参数的求解结果。代价函数和成本函数同一个概念。(注意是平均值而非总的损失值)
深度学习-Loss函数 - 知乎 (zhihu.com)
待补充:什么是逻辑回归。
若想要训练参数就要给一个m个样本的训练集,这会让你在训练集上找到参数和参数,然后来得到想要的输出(预测值接近实际值的输出),对训练集的预测值,我们将它写成^,我们更希望它会接近于训练集中的值(实际值)。训练样本所对应 的预测值是 () ,是用训练样本的 () + ()然后通过激活函数sigmoid()来得到,也可以把定义为 () = () + ,我们将使用这个符号()注解,上标()来指明数据表示或者或者或者其 他数据的第个训练样本,这就是上标()的含义。
(1)作用:损失函数也叫误差函数,可以衡量算法的运行情况,衡量预测值与实际值有多接近。不同的算法对应不同的损失函数,凸优化问题。Loss function:(^ , ).一般我们用预测值和实际值的平方差或者它们平方差的一半,但是通常在逻辑回归中我们不这么做,因为当我们在学习逻辑回归参数的时候,会发现我们的优化目标不是凸优化,只能找到多个局部 最优值,梯度下降法很可能找不到全局最优值,虽然平方差是一个不错的损失函数,但是我们在逻辑回归模型中会定义另外一个损失函数。
①常用损失函数
②logistics回归的损失函数
(^ , ) = −log(^) − (1 − )log(1 − ^) 损失函数值越小越好
(2)原理:
①当 = 1时损失函数 = −log(^),如果想要损失函数尽可能得小,那么^就要尽可能大(更新求^公式中的参数), 因为 sigmoid 函数取值[0,1],所以^会无限接近于 1。
②当 = 0时损失函数 = −log(1 − ^),如果想要损失函数尽可能得小,那么^就要尽可能小(更新求^公式中的参数),因为 sigmoid函数取值[0,1],所以^会无限接近于 0。
这块损失函数公式写错了,应该是减
(1)定义:损失函数是在单个训练样本中定义的,它衡量的是算法在单个训练样本中表现如何,为了衡量算法在全部训练样本上的表现如何,我们需要定义一个算法的代价函数,算法的代价函数是对个样本的损失函数求和然后除以,实际上是 1 到项各个损失的平均。它衡量的是在全体训练样本上w和b的表现效果。基于参数的总成本。
(2)目的:损失函数只适用于像这样的单个训练样本,而代价函数是参数的总代价,所以在训练逻辑回归模型时候,我们需要找到合适的和,来让代价函数 的总代价降到最低。
2.4梯度下降法(Gradient Descent)
使用梯度下降法来训练或学习训练集上的参数w和b,找到使得成本函数J(w,b)尽可能小的参数w和b。
代价函数是一个凸函数如下:
为了找到更好的参数值,我们要做的的就是用某初始值初始化w和b,对于logistic来说,任意初始化方法都有效。通常用0进行初始化。但这里
【深度学习之美18】到底什么是梯度? - 知乎 很详细!!!!就是多维变量函数求导
目标:横轴表示你的空间参数和,在实践中,可以是更高的维度,但是为了 更好地绘图,我们定义和,都是单一实数,代价函数(成本函数)(, )是在水平轴和 上的曲面,因此曲面的高度就是(, )在某一点的函数值。我们所做的就是找到使得代价函数(成本函数)(, )函数值是最小值,对应的参数和。
①初始化参数:由于 逻辑回归的代价函数(成本函数)(, )特性,我们必须定义代价函数(成本函数)(, ) 为凸函数。 初始化和,可以用如图那个小红点来初始化参数和,也可以采用随机初始化的方法,对于逻辑 回归几乎所有的初始化方法都有效,因为函数是凸函数,无论在哪里初始化,应该达到同一 点或大致相同的点。
②朝最陡的下坡方向走一步,不断地迭代,如图,经过两次迭代走到 第三个小红点处。
③直到直到走到全局最优解或者接近全局最优解的地方,通过以上的三个步骤我们可以找到全局最优解,也就是代价函数(成本函数)(, )这 个凸函数的最小值点。
假定代价函数(成本函数)() 只有一个参数,即用一维曲线代替多维曲线,这样可 以更好画出图像
样表示函数变化的方向,从几何意义来讲,梯度的方向表示的是函数增加最快的方向,这正是我们下山要找的“最陡峭的方向”的反方向!因此后面要讲到的迭代公式中,梯度前面的符号为“-”,代表梯度方向的反方向,山代表了需要优化的函数表达式;山的最低点就是该函数的最优值,也就是我们的目标;每次下山的距离代表后面要解释的学习率,因此需要我们找到最佳的学习率,在不偏离方向的同时耗时最短。
机器学习算法:梯度下降法——原理篇 - 简书 dj/dw貌似就是梯度的值。参数下降的方向?
2.5导数知识(Derivatives)(略)
帮你获得对微积分和导数直观的理解。或许你认为自从大学毕以后 你再也没有接触微积分。为了高效应用神经网络和深度学习,你并不需要非常深入理解微积分。你只需要直观地认识微积分,用来构建和成功的应用这些算法
导数的理解:斜率 、变化量(略)
2.6 更多导数知识(略)
导数就是斜率、各类函数求导公式
2.7 计算图(Computation Graph)(略看)
流程图解释了为什么一个神经网络的计算都是按照前向或反向传播的过程实现的,首先计算出神经网络的输出紧接着进行一个反向传播的过程计算出对应的梯度或者导数
尝试计算函数,是由三个变量, , 组成的函数3(a + bc) 。例如本例中的就是逻辑回归中你想优化的代价函数,因此计算图用来处理这 些计算会很方便,通过一个从左向右的过程,你可以计算出 的值,从右到左的导数计算目的就是为了参数优化。
利用流程图,从右向左的导数计算,反向传播就是链式求导法反向求代价函数的参数的导,各个参数的导数,然后根据梯度下降公式更新参数? 再利用更新后的参数带入计算,重复过程,直到到达代价函数值最小时候停止参数更新。
一个流程图就是从左到右计算成本函数J,为了优化函数达到最小,然后从右向左计算导数
①复合函数求导:
②求偏导 :
梯度就是多维变量的函数中每个变量的局部导数,在一个三维直角坐标系,该函数的梯度就可以表示为公式(9-2):
2.9 logistic回归中的梯度下降
学会怎样通过计算偏导数来实现逻辑回归的梯度下降算法
使用导数流程图计算梯度 w是参数,一个特征对应一个参数,偏差b是一个数
z应该是一种权重分配后的特征映射()。
①多样本时的计算公式:
假设现在只考虑单个样本的情况,单个样本的代价函数定义如下:其中是逻辑回归的输出(预测值),是样本的标签值。
(, ) = −(log() + (1 − )log(1 − ))
假设样本只有两个特征1和2,为了计算,我们需要输入参数1、2 和,除此之外 还有特征值1和2。因此的计算公式为: = 11 + 22 + b(每个样本特征前都有权重)。偏导数计算图如下(可以直观的展示函数的包含关系,便于求偏导):
先复习下梯度下降法,和的修正量可以表达如下:
目标:我们想要计算出的代价函数(, )对参数w1、w2、b的导数(基础变量)
过程:
①先向前反向计算出代价函数(, )关于(函数输出值,在最后一层表示的是预测值)的导数(复合函数求偏导)(因为a是包含z、z是包含各种参数的函数),用 来表示(,) /,由微积分计算得=dl/da
的导数为,所以对求导得-y/a,同理对求导得(1-y)/(1-a)
得da如下:
③最后一步反向推导,也就是计算和变化对代价函数的影响
则每个样本参数反向求导如下:
因此,关于单个样本的梯度下降算法,你所需要做的就是如下的事情:
使用公式 = ( − )计算(函数输出值-实际值), 使用1 = 1 ⋅ 计算1, 2 = 2 ⋅ 计算2, = 来计算
最后: 更新参数1 = 1 − 1, 更新2 = 2 − 2, 更新 = − 。
这就是关于单个样本实例的梯度下降算法中参数更新一次的步骤
2.10 非向量化版本m个样本的梯度下降
训练逻辑回归模型不仅仅只有一个训练样本,而是有个训练样本的整个训练集。 因此在下一节视频中,我们将这些思想应用到整个训练样本集中,而不仅仅只是单个样本上 。
①时刻记住(全局)成本函数J的定义:
由1个样本到m个样本损失函数和的平均。一个样本计算一次损失函数,最后求和求平均
当你的算法输出关于样本的,是训练样本的预测值,即:=( () ) = ( () + ) ,这些是已知的可求条件
②反向传播参数求导:
是由1个样本到m个样本损失函数对参数求导后求和的平均
2.19展示的是对于任意单个训练样本,只使用了一个训练样本(, ),如何计算微分,因此1,2和 添上上标表示具体某个样本求得的相应的值()
因此:全局成本函数对w1的导数,是各项样本损失函数对w1导数和的平均(dwi)。(还有w2..3...4...n)个等等
m个样本时参数求梯度(导数)如下:
①初始化 = 0, 1 = 0, 2 = 0, = 0
②for循环遍历训练集同时计算每个训练样本的导数、求和、和的均值 运用了累加器求m个样本导数的和,m个代价函数的求导
③非向量化梯度下降
①初始化
J=0;dw1=0;dw2=0;db=0;
②循环遍历求m个样本的梯度
for i = 1 to m
z(i) = wx(i)+b;(计算z)
a(i) = sigmoid(z(i));(计算预测值a)
J += -[y(i)log(a(i))+(1-y(i))log(1-a(i));(计算每个样本的代价函数)
dz(i) = a(i)-y(i); (分别求导求和,公式已在前面推出)
dw1 += x1(i)dz(i);
dw2 += x2(i)dz(i);(这里只是假设两个特征,多少个特征就有多少个参数)
db += dz(i);
(计算各个和的平均值,就代表了最后的参数的梯度值)
J/= m; (最终成本函数的正确值)
dw1/= m;
dw2/= m;
db/= m;
③梯度下降法:跟新参数
w1=w1-alpha*dw1
w2=w2-alpha*dw2
b=b-alpha*db
这里只应用了一次梯度下降,因此需要做很多次循环和梯度下降,才能更好的学习
显示的for循环过程过于复杂,浪费时间。下一节学习如何利用向量化来摆脱显示for寻欢,从而进行加速运算。
学会了如何使用逻辑回归以及梯度下降法。
2.11向量化版本的梯度下降法
在深度学习安全领域、深度学习实践 中,你会经常发现自己训练大数据集,因为深度学习算法处理大数据集效果很棒,所以你的 代码运行速度非常重要,否则如果在大数据集上,你的代码可能花费很长时间去运行,你将要等待非常长的时间去得到结果。所以在深度学习领域,运行向量化是一个关键的技巧。(效果更好,速度更快)
在逻辑回归中你需要去计算 = + ,、都是列向量。如果你有很多的特征那么 就会有一个非常大的向量,所以 ∈ ℝ , ∈ ℝ,都是nx维的向量。
什么是向量化计算vectorization?|simd|寄存器_网易订阅,什么是向量化计算?(备忘) - QZ-CMD - 博客园
所以如果你想使用非向量化方法去计算,你需要用如下方式(python)
①非向量化版本:
z=0
for i in range(n_x)
z+=w[i]*x[i] (循环计算每个特征的权重分配)
z+=b
②向量化版本计算:
z=np.dot(w,x)+b (同时计算多条数据)
运行向量化版本将比非向量化版本快300倍,只要有可能就不要使用显性的,总之能用内置函数或者其他办法去计算循环
大规模的深度学习使用了 GPU 或者图像处理单元实 现”,但是我做的所有的案例都是在 jupyter notebook 上面实现,这里只有 CPU,CPU 和 GPU 都有并行化的指令,他们有时候会叫做 SIMD 指令,这个代表了一个单独指令多维数据,这 个的基础意义是,如果你使用了 built-in 函数,像 np.function 或者并不要求你实现循环的函数,它可以让 python 的充分利用并行化计算,这是事实在 GPU 和 CPU 上面计算,GPU 更 加擅长 SIMD 计算,但是 CPU 事实上也不是太差,可能没有 GPU 那么擅长吧。
①在数据量较小的情况下,cpu的计算速度和gpu相差不大
②随着计算量的增加,cpu的计算时间逐步增加,而gpu的计算时间相对平缓,在计算量达到一定程度之后,gpu的优势就出来了。
2.12部分的向量化(略看)
运用到logistic回归中:这是用来计算回归导数的程序。有两个for循环
我们不会显示的将dw1,dw2等初始化为0,我们要去掉这个循环把dw变成一个向量,dw=np.zeros((n_x,1)),向量化初始化
2.13 向量化logistic回归(Vectorizing Logistic Regression)
在本次视频中我们将讨论如何实现逻辑回归的向量化计算
(1)条件: 个训练样本
(2)目标: 计算 , = + ,计算激活函数 (1) = ( (1) )样本的预测值
(3)过程:对第一个样本进行预测,则需要计算 , (1) = (1) + 。然后计算激活函数 (1) = ( (1) ) ,计算第一个样本的预测值 。
对第二个样本进行预测,你需要计算 (2) = (2) + , (2) = ( (2) ) 。
对第三个样本进行预测,你需要计算 (3) = (3) + , (3) = ( (3) )。
依次类推。 个训练样本,你可能需要这样做 次,可以看出为了完成前向传播步骤, 即对我们的 个样本都计算出预测值a。
但是我们可以利用向量化的方式一起计算而不用显示的循环。有一个办法可以并且不需要任何一个明确的 for 循 环。让我们来看一下你该怎样做。
(1)向量化计算z
回忆一下我们曾经定义了一个矩阵 作为你的训练输入
训练集可以堆叠一起用一个矩阵表示:(李沐是按行堆叠的mxnx矩阵)
nump指令(不同框架运算规则不同):这里 是一个实数,或者你可以说是一个 1 × 1 矩阵,只是一个普通的实数。但是当你将这个向量加上这个实数时,Python 自动把这个实数 扩展成一个 1 × 的行向量(对应前面)。这个操作在pyhon中就叫广播(broadcasting)
= . (. ,) + b
(2)向量化计算a
预测结果a的表示:对一个向量Z进行sigmoid函数操作。用小写的sigma同时计算所有小写a
= [ (1) (2) . . . () ] = ()
这就是正向传播一步迭代的向量化实现。同时处理所有m个训练样本。利用向量化在同一时间内高效地计算所有的激活函数的所有 值。接下来你也可以利用向量化高效地计算反向传播并以此来计算梯度。
2.14 向量化logistic回归的梯度输出(重点)
将学习如何向量化地计算个训练数据的梯度,本次视频的重点是如何同时计算 个数据的梯度,并且实现一个非常高效的逻辑回归算法(Logistic Regression)。
①单个样本的梯度计算:之前我们在讲梯度计算的时候,列举过几个例子, (1) = (1) − (1), (2) = (2) − (2) ……等等一系列类似公式。
②m个样本的向量化计算:现在,对 个训练数据做同样的运算,我们可以定义一个新的变量 = [ (1) , (2) . . . () ] ,所有的 变量横向排列,因此, 是一个 1 × 的矩阵,或者说,一个 维行向量。
我们已经知道如何计算,即 [ (1) , (2) . . . () ],我们需要找到这样的一个行向量 = [ (1) (2) . . . () ]
由此,我们可以这样计算向量化z:第一个元素就是 (1),第二个元素就是 (2) ……所以我们现在仅需一行代码,就可以同时完成这所有对dz的计算。
= − = [ (1) − (1) (2) − (2) . . . () − () ]
在之前的实现中(2.12),我们已经去掉了一个 for 循环,但计算 仍然需要一个循环遍历训练集,我们现在要做的就是将其向量化!
首先我们来看 ,不难发现 , 之前的讲解中,我们知道所有的dz(i)已经组成一个行向量 了,所以在 Python 中,我们很容易地想到; 接下来看,我们先写出它的公式 其中, 是一个行向量。因此展开后 。因此我们可以仅用两行代码进行计算: = 1 ∗ . (), = 1 ∗ ∗ 。这样,变成了矩阵向量乘法、我们就避免了在训练集上使用 for 循环。
来看看如何实现向量化逻辑回归:正向传播-》L代价值 反向传播求导-》更新权值
①非向量化版本
②向量化版本
如上:我们利用前五个公式完成了前向和后向传播,也实现了对所有训练样本进行预测和求导,再利用后两个公式,梯度下降更新参数。我们就实现了logistic回归的梯度下降一次迭代 。我们的目的是不使用 for 循环,所以我们就通过一次迭代实现一次梯度下降,但如果你希望多次迭代进行梯度下降,那么仍然需要 for循环,放在最外层。不过我们还是觉得一次迭代就进行一次梯度下降,避免使用任何循环比 较舒服一些。
2.15 python中的广播机制
广播是一种手段可以让你的代码进行的更快,研究下python中的广播是如何运作的。
在这个例子中我们列出了来自100克碳水化合物 蛋白质和脂肪的卡路里数量
目标:计算四种食物中 卡路里有多少百分比来自碳水化合物、蛋白质、脂肪
要做的是对矩阵的四列求和得到卡路里的总量,然后让整个矩阵各列元素除以总量得到四种食物中来自碳水化合物 蛋白质 和脂肪热量的卡路里占的百分比,
假设上图的表格是一个 3 行 4 列的矩阵,记为 3×4,接下来我们要使用 Python 的 numpy 库完成这样的计算。我们打算使用两行代码完成,第一行代码对每一列进行求和,第 二行代码分别计算每种食物每种营养成分的百分比。
1.矩阵化
2.竖直相加求和,可以看到输出是每种食物(100g)的卡路里总和(这既不是行向量也不是列向量)
3.分别处以总和的到百分比矩阵:reshape(1,4)表示1x4的矩阵(重塑)这条指令将 3 × 4的矩阵除以一个1 × 4的矩阵,得到了一个 3 × 4的结果矩阵,这个结果矩阵就是我们要求的百分比含量。
下面再来解释一下 A.sum(axis = 0)中的参数 axis。axis 用来指明将要进行的运算 是沿着哪个轴执行,在 numpy 中,0 轴是垂直的,也就是列,而 1 轴是水平的,也就是行。
而第二个 A/cal.reshape(1,4)指令则调用了 numpy 中的广播机制。这里使用 3 × 4 的矩阵除以 1 × 4的矩阵。技术上来讲,其实并不需要再将矩阵 reshape(重塑)成 1 × 4,因为矩阵本身已经是 1 × 4了。但是当我们写代码时不确定矩阵维度的时候,通 常会对矩阵进行重塑来确保得到我们想要的列向量或行向量。重塑操作 reshape 是一个常量时间的操作,时间复杂度是(1),它的调用代价极低。
这里3x4与1x4的矩阵怎么运算的呢?无论是加列向量还是行向量都一样。原理如下 复制m(n)次变成mxn 这是神经网络里主要的广播。
2.16 关于python/numpy 向量说明
python让你使用广播运算 python numpy给程序提供了很大的灵活性,一些技巧 更容易写没有bug的代码。
1.不要使用秩为1的数组,而是使用矩阵
首先设置 = . . (5),这样会生成存储在 数组 中的 5 个高斯随机数变量。之后输出 ,从屏幕上可以得知,此时 的 shape(形 状)是一个(5, )的结构。这在 Python 中被称作一个一维数组。它既不是一个行向量也不是 一个列向量,这也导致它有一些不是很直观的效果。举个例子,如果我输出一个转置阵,最 终结果它会和看起来一样,所以和的转置阵最终结果看起来一样。而如果我输出和的 转置阵的内积,你可能会想:乘以的转置返回给你的可能会是一个矩阵。但是如果我这样 做,你只会得到一个数。
注意一维数组和向量(矩阵)的区别。(5,)与(5,1)
2.不确定维度的时候,可以加一个判断声明,你也能够重新改变数组维数 = ℎ,表明一个(5,1)数组或者一个(1,5) 数组,以致于它表现更像列向量或行向量
我 从来不使用一维数组。因此,要去简化你的代码,而且不要使用一维数组。总是使用 × 1 维矩阵(基本上是列向量),或者 1 × 维矩阵(基本上是行向量),这样你可以减少很多 assert 语句来节省核矩阵和数组的维数的时间。另外,为了确保你的矩阵或向量所需要的维 数时,不要羞于 reshape 操作。 总之,我希望这些建议能帮助你解决一个 Python 中的 bug,从而使你更容易地完成练
2.17 jupyter/Ipython 笔记本快速指南
2.18 证明logistic回归成本函数为什么是这种形式
(待完善)
第三周 浅层神经网络
3.1神经网络概览 (Neural Network Overview)
将学会实现如何实现一个神经网络,现在我们开始快速浏览一下如何实现神经网络。
如上所示,首先你需要输入特征,参数和,通过这些你就可以计算出,接下来使用就可以计算出。我们将的符号换为表示输出^ ⟹ = (),然后可以计算 出 loss function (, )
神经网络看起来是如下这个样子,你可以把许多 sigmoid 单元堆叠起来形成一个神经网络。对于图中的节点,它包含了之前讲的计算的 两个步骤:首先通过公式 计算出值,然后通过()计算值。
符号说明:我们会使用符号 []表示第层网络中 节点相关的数,这些节点的集合被称为第层网络。不会和我们之前用来 表示单个的训练样本的 () (即我们使用表示第 i 个训练样本)混淆
①首先计算第一层layer1网络(3 个节点)中的各个节点的相关的数 [1],接着计算 [1],
②计算第二层layer2网络(1个节点)中的各个节点的相关的数,,
③然后输出^ ⟹ = (),然可以计算出 loss function (, )
④反向传播梯度下降优化参数,计算 [2] 、 [2],计算出来之后, 然后计算计算[2]、 [2].....
公式1:前向传播
公式2 :后向传播
公式3:
计算图如下:
上括号表示不同的层[i] 下面是一个双层的神经网络
下节:来的视频中我们会仔细讨论具体细节,下一个视频讲述神经网络的具体表示
3.2神经网络的表示
在这次课中我们将讨论上节课图片的具体含义,也就是我们画的这些神经网络到底代表什么。
如下本例中的神经网络只包含一个隐藏层
①输入层:我们有输入特征1、2、3,它们被竖直地堆叠起来,这叫做神经网络的输入层。它包 含了神经网络的输入的特征向量x,向量表示输入特征。这里有个可代替的记号可以用来表示输入特征,表示激活的意思,它意味着网络中不同层的值会传递到它们 后面的层中,输入层将传递给隐藏层,所以我们将输入层的激活值称为;下一层即隐藏 层也同样会产生一些激活值,那么我将其记作,所以具体地,这里的第一个单元或结点 我们将其表示为,第二个结点的值我们记为以此类推...如果写成 Python 代码,那么它是一个规模为 4x1 的矩阵或一个大小为 4 的列向量,如下公 式,它是四维的,因为在本例中,我们有四个结点或者单元,或者称为四个隐藏层单元;
公式:
②隐藏层:本例由四个神经元节点,堆叠而成。"隐藏"的意义,如下有四个隐藏层单元。
在一个神经网络中, 当你使用监督学习训练它的时候,训练集包含了输入也包含了目标输出,所以术语隐藏层 的含义是在训练集中,这些中间结点的准确值我们是不知道到的,也就是说你看不见它们在 训练集中应具有的值。你能看见输入的值,你也能看见输出的值,但是隐藏层中的东西,在训练集中你是无法看到的。所以这也解释了词语隐藏层,只是表示你无法在训练集中看到他们。
注意:这里的隐藏层将拥有两个 参数和,我将给它们加上上标 [1] ([1] , [1] ),表示这些参数是和第一层这个隐藏层有关 系的。之后在这个例子中我们会看到是一个 4x3 的矩阵,而是一个 4x1 的向量(广播机制),第一个 数字 4 源自于我们有四个结点或隐藏层单元,然后数字 3 源自于这里有三个输入特征(权重数对应)。我们 之后会更加详细地讨论这些矩阵的维数,到那时你可能就更加清楚了。相似的输出层也有一 些与之关联的参数[2]以及 [2]。从维数上来看,它们的规模分别是 1x4 以及 1x1。1x4 是因为隐藏层有四个隐藏层单元(输入特征数)而输出层(函数计算)只有一个单元(只需要计算一次WX+b)。
公式:
③输出层:本例中最后一层只由一个结点构成,而这个只 有一个结点的层被称为输出层,它负责产生预测值。最后输出层将产生某个数值,它只是一个单独的实数,所以的^值将取为,在逻辑回归中,我们有^直接等于,在逻辑回归中我们只有一个输出层(无隐藏层),所以我们没有用带方括号的上标。但是在神经网络中,我们将使用这种带上标的形式来明确地指出这些值来自于哪一层。
一个两层的神经网络(输入层是不算入总层数内)
④层数计算:计算网络的层数时,输入层是不算 入总层数内,所以隐藏层是第一层,输出层是第二层。第二个惯例是我们将输入层称为第零层 。
一个隐藏层的神经网络的结构与符号表示
总结:所以现在你已经知道一个两层的神经网络什么样的了,即它是一个只有 一个隐藏层的神经网络。 在下一个视频中。我们将更深入地了解这个神经网络是如何进行计算的,也就是这个神 经网络是怎么输入,然后又是怎么得到^。
3.3 计算神经网络的输出
了解神经网络到底在计算什么,一个详细的计算过程,神经网络怎么输入x,又是怎么一直计算下去的到y^的
首先,回顾下只有一个隐藏层的简单两层神经网络结构: 其中,表示输入特征,表示每个神经元的输出,表示特征的权重,上标表示神经网 络的层数(隐藏层为 1),下标表示该层的第几个神经元。这是神经网络的符号惯例,下同
①.每个节点(神经元)的计算内容:逻辑回归的计算有两个步骤,首先你按步骤计算出,然后在第二 步中你以 sigmoid 函数为激活函数计算(得出),一个神经网络只是这样子做了好多次重复计算。
②多个节点的计算
从隐藏层的第一个神经元开始计算 第一步,计算1 [1] , 1 [1] = 1 [1] + 1 [1]。 第二步,通过激活函数计算1 [1] , 1 [1] = (1 [1] )。第二个以及后面两个神经元的计算过程一样,只是注意符号表示不同,最终分 别得到2 [1]、3 [1]、4 [1],详细结果见下图(x特征映射到了a):
用 for 循环来做这些看起来真的很低效。所 以接下来我们要做的就是把这四个等式向量化。向量化的过程是将神经网络中的一层神经元 参数纵向堆积起来 ,例如隐藏层中的纵向堆积起来变成一个(4,3)的矩阵,用符号[1]表示。
另一个看待这个的方法是我们有四个逻辑回归单元,且每一个逻辑回归单元都有相对应的参 数——向量,把这四个向量堆积在一起,你会得出这 4×3 的矩阵。因此,公式 3.8: [] = [] + [] 公式 3.9: [] = ( [] ), [] = ( [] )
如下图左半部分所示为神经网络,把网络左边部分盖住先忽略,那么最后的输出单元就相当于一个逻辑回归的计算单元。当你有一个包含一层隐藏层的神经网络,你需要去实现以 计算得到输出的是右边的四个等式,并且可以看成是一个向量化的计算过程,计算出隐藏层 的四个逻辑回归单元和整个隐藏层的输出结果,如果编程实现需要的也只是这四行代码。
待补充:一个样本的反向传播向量化过程
通过本视频,你能够根据给出的一个单独的输入特征向量,运用四行代码计算出 一个简单神经网络的输出。接下来你将了解的是如何一次能够计算出不止一个样本的神经网络输出,而是能一次性计算整个训练集的输出。
注意:每层节点都对应一个不同的权重向量w,共同构成这一层的权重W.若是权值相同且激活函数一样那么网络的堆砌就是在进行同样的计算,没有意义。
3.4 多个样本中的向量化(Vectorizing across multiple examples): 需要反复理解
在上节,了解到如何针对于单一的训练样本,在神经网络上计算出预测值。本节将会了解到如何向量化多个训练样本,并计算出结果。该过程与你在逻辑回归中所做类似。
逻辑回归是将各个训练样本组合成矩阵,对矩阵的各列进行计算。神经网络是通过对逻辑回归中的等式简单的变形,让神经网络计算出输出值。这种计算是所有的训练样本同时进行的,以下是实现它具体的步骤:
①上一节视频中得到的四个等式。它们给出如何计算出 [1], [1], [2], [2]。①
②对于一个给定的输入特征向量,这四个等式可以计算出[2]等于^。这是针对于单一的 训练样本。如果有个训练样本,那么就需要重复这个过程
用第一个训练样本 [1]来计算出预测值^ [1],,用 [2]来计算出预测值^ [2],循环往复,直至用 []计算出^ []。用激活函数表示法,如上图左下所示,它写成 [2](1)、 [2](2)和 [2]()。【注】: [2](),()是指第个训练样本而[2]是指第二层。
对于所有训练样本,需要 让从 1 到实现这四个等式(因为是两层)
for i = 1 to m:
[1]() = [1]() () + [1]()
[1]() = ( [1]() )
[2]() = [2]() [1]() + [2]()
[2]() = ( [2]() )
对于上面的这个方程中的 (),是所有依赖于训练样本的变量,即将()添加到,和。 如果想计算个训练样本上的所有输出,就应该向量化整个计算,以简化这列。
这里一些样本什么都是按列堆砌的,自己按行再整理一下过程。
符号表示:网络层数 i表示 第i个训练样本
非向量化计算m个训练样本的输出,一个for循环遍历所有的m训练样本:
如何向量化上面的计算:m个训练样本的矩阵化
下一集给出理由说明这为什么是向量化的正确实现。
3.5向量化实现的解释(视频) 这里讲解的更清楚***
在上一个视频中,我们学习到如何将多个训练样本按列堆叠成一个矩阵(具体的看模型需要怎么样输入,转置后都一样),然后就可以推导出神经网络中前向传播(forward propagation)部分的向量化实现。 在这个视频中,我们将会继续了解到,为什么上一节中写下的公式就是将多个样本向量化的正确实现。
1.先对几个样本算算正向传播
这里,为了描述的简便,我们先忽略掉 [1]后面你将会看到利用 Python 的广播机制, 可以很容易的将 [1] 加进来。
现在 [1] 是一个矩阵,里面有一定数目的行(每一行代表一个节点的权重分配), (1) , (2) , (3)都是列向量,矩阵乘以列向量w得到一个列向量z[1](1),然后将所有的样本堆叠成矩阵,进行矩阵运算。
随着神经网络层数的加深,不过是重复这两个过程罢了
到目前为止,我们仅使用 sigmoid 函 数作为激活函数,事实上这并非最好的选择,在下一个视频中,将会继续深入的讲解如何使用更多不同种类的激活函数。后面再学习反向传播梯度下降的向量化过程(多层多样本)
3.6激活函数 Activation functions
使用一个神经网络时,需要决定使用哪种激活函数用隐藏层上,哪种用在输出节点上。 到目前为止,之前的视频只用过 sigmoid 激活函数,但是,有时其他的激活函数效果会更好。
激活函数是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题
为什么要使用激活函数,激活函数的作用_贾世林jiashilin的博客-CSDN博客_激活函数的作用
搭建神经网络,你可以选择隐藏层里用那一个激活函数,还有神经网络输出单元用什么激活函数
几种常见的激活函数 - 简书
神经网络中常用的几种激活函数的理解 - EEEEEcho - 博客园
tanh函数:介于-1-1是s函数的平移版本,效果总比s函数要好,函数的输出介于-1-1之间,激活函数的平均值就更接近0,而不是0.5,让下一层的学习更方便。
在这里记住一点,几乎不用sigmoid激活函数了,tanh函数在所有的场合都更优越,
注意:一个例外就是在做二分类的时候,只有0与1,那么可以在隐藏层用tanh函数,用sigmoid函数作为输出层,不同层的激活函数可以不一样。用上标来表示激活层的不一样
这两个都有一个问题就是:若z的值非常大,那么导数的梯度(就是da)或者说这个函数的斜率可能就很小。所以z很大或者很小的时候,函数的斜率很接近0,这样会拖慢梯度下降算法。
在机器学习里最受欢迎的一个就是:
线性修正单元(ReLU):,z为正的时候 斜率为1.z为负的时候斜率为0,z为 0的时候是没有意义的,但z为0的概率很低,所以不用担心这一点。可以在z=0时候给导数赋值为0/1
如果在做二分类s函数很适合作为输出层的激活函数。然后其他所有单元都用RELU .如果不确定隐藏层单元要用哪个就选relu作为激活函数这也是今天大多数人都在用的。
他的缺点就是当z为负的时候导数等于0,没啥问题。
一个进阶:带泄露的ReLU:
选一个的话 通常只用ReLU 好处就是激活函数的斜率(梯度)和0差的很远,可以大大提高学习的速度,没有函数斜率接近0时减慢学习效率的效应。
总结利弊:
sigmoid:除非用在二分类的输出层 否则不要用
接下来将 各种参数的选择 神经网络为什么需要激活函数呢
3.7 为什么神经网络需要非线性激活函数呢?
为什么神经网络需要非线性激活函数?事实证明:要让你的神经网络能够计算出有趣的 函数,你必须使用非线性激活函数,证明如下:
事实证明,如果你使用线性激活函数或者没有使用一个激活函数,那么无论你的神经网络有多少层一直在做的只是 计算线性函数,所以不如直接去掉全部隐藏层。
证明:这是神经网络正向传播的方程,现在我们去掉函数,然后令 [1] = [1],或者我们也可 以令() = ,这个有时被叫做线性激活函数(更学术点的名字是恒等激励函数,因为它们就是把输入值输出)。为了说明问题我们把 [2] = [2],那么这个模型的输出或仅仅只是输 入特征的线性组合。
如果你是用线性激活函数或者叫恒等激励函数,那么神经网络只是把输入线性组合再输出,相当于什么也没有做。在这里线性隐层一点用也没有,因为这两个线性函数的组合本身就是线性函数,所以除 非你引入非线性,否则你无法计算更有趣的函数,永远拟合的是一个线性分类器函数。不能更好的适应样本数据,即使你的网络层数再多也不行;
只有一个地方(唯一可以用线性激活函数的通常就是输出层,隐藏层永远不要用)可以使用线性激活函数------() = ,就是你在做机器学习中的回归问题。 是一个实数,举个例子,比如你想预测房地产价格, 就不是二分类任务 0 或 1,而是一个实数,从 0 到正无穷。如果 是个实数,那么在输出层用线性激活函数也许可行,你的输出也是一个 实数,从负无穷到正无穷。因为房价都是非负数,所以我们也可以在输出层使用 ReLU 函数这样你的^都大于等于 0。
下节内容:理解为什么使用非线性激活函数对于神经网络十分关键,接下来我们讨论梯度下降,并 在下一个视频中开始讨论梯度下降的基础——激活函数的导数
3.8 激活函数的导数(梯度下降的基础)
当你对你的神经网络使用反向传播的时候你真的需要计算激活函数的斜率或者导数 ,来看看激活函数的选择以及如何及计算这些函数的斜率
①sigmoid函数:
求导过程:
②.tanh函数
在神经网络中, a=g(Z),
③.ReLU函数
④Leaky linear unit (Leaky ReLU)
3.9 神经网络的梯度下降法
实现反向传播或者说梯度下降算法的方程组,梯度下降算法的具体实现、如何处理单隐层神经网络、所需的方程来实现反向传播(梯度下降算法)
在单隐层神经网络中有[1], [1],[2], [2]这些参数,还有个表示输入特征的个数,n[0]表示样本输入特征数, [1]表示隐藏单元个数, [2]表示输出单元个数。
矩阵[1]的维度就是( [1] , [0] ), [1]就是 [1]维向量,可以写成( [1] , 1),就是一个的列向量。 矩阵[2]的维度就是( [2] , [1] ), [2]的维度就是( [2] , 1)维度。
要训练参数,你的算法就需要做梯度下降,在训练神经网络的时候 随机初始化参数很重要,而不是初始化为0,初始化参数后每个梯度下降循环都会计算预测值。然后需要计算导数dw、db,然后梯度下降会更新参数w、b...
假设是做二分类任务,那么你的成本函数等于:
①每次梯度下降计算的内容:
当你参数初始化成某些值后,每次梯度下降都会循环计算以下预测值:
w1和w2是同时更新的?还是先更新的w2再更新w1?应该是求出dw1、dw2之后 再同时进行梯度下降更新参数。
①正向传播过程方程
②反向传播过程方程
再总结一下正向传播的方程:
以上就是正向传播的 4 个方程和反向传播的 6 个方程,这里我是直接给出的,在下个视 频中,我会讲如何导出反向传播的这 6 个式子的。如果你要实现这些算法,你必须正确执行 正向和反向传播运算,你必须能计算所有需要的导数,用梯度下降来学习神经网络的参数; 你也可以许多成功的深度学习从业者一样直接实现这个算法,不去了解其中的知识。
3.10 选修:直观理解反向传播:
这个视频主要是公式推导反向传播。
3.11 随机初始化Random+Initialization
当你训练神经网络时,权重随机初始化是很重要的。对于逻辑回归,把权重初始化为 0 当然也是可以的。但是对于一个神经网络,如果你把权重或者参数都初始化为 0,那么梯度下降将不会起作用。由于所有的隐含单元都是对称的,无论你运行梯度下降多久,他 们一直计算同样的函数。这没有任何帮助,因为你想要两个不同的隐含单元计算不同的函数,
举例说明:
假设有两个输入特征:x1、x2,所以n^[0]=2,然后有两个隐藏单元n^[1]=2,所以和隐藏层相关的矩阵 W^[1]是2x2的。假设w全部初始化为0(不可行),b也初始化为0(是可行的)。
就会导致你给网络输入的任何样本,a^[1]_1和a^[1]_2的值是一样的,两个激活函数一样,就导致两个隐藏单元都在做完全一样的计算,在进行反向传播的时候处于对称性,dz^[1]_1和dz^[1]_2也是相同的,归纳法证明每次训练迭代之后两个隐藏单元仍然在计算完全相同的函数,
解决方案就是随机初始化所有参数:
你 应 该 这 么 做 : 把 [1] 设 为 np.random.randn(2,2)(生成高斯分布),通常再乘上一个小的数,比如 0.01,这样把它初 始化为很小的随机数。然后没有这个对称的问题(叫做 symmetry breaking problem),所 以可以把 初始化为 0,因为只要随机初始化你就有不同的隐含单元计算不同的东西, 因此不会有 symmetry breaking 问题了。相似的,对于[2]你可以随机初始化, [2]可以初始化为 0。
事实上有时有比 0.01 更好的常数,当你训练一个只有一层隐藏层的网络时(这是相对 浅的神经网络,没有太多的隐藏层),设为 0.01 可能也可以。但当你训练一个非常非常深的神经网络,你可能会选择一个不同于的常数而不是 0.01。下一节课我们会讨论怎么并且何 时去选择一个不同于 0.01 的常数,但是无论如何它通常都会是个相对小的数。
总结:你现在已经知道如何建立一个一层的神经网络了,初始化参 数,用前向传播预测,还有计算导数,结合反向传播用在梯度下降中
第四周:
4.1深层神经网络
目前为止我们学习了只有一个单独隐藏层的神经网络的正向传播和反向传播,还有逻辑 回归,并且你还学到了向量化,这在随机初始化权重时是很重要。 本周所要做的是把这些理念集合起来,就可以执行你自己的深度神经网络。
2.神经网络结构图
神经网络的隐藏层数的定义:从左到右,由 0 开始定义,比如上边右图,1、 2、3,这层是第 0 层,这层左边的隐藏层是第 1 层,由此类推。如下图 ,记住以下要点: 有一个隐藏层的神经网络,就是一个两层神经网络。记住当我们算神经网络的层数时, 我们不算输入层,我们只算隐藏层和输出层。
2层神经网络 5层神经网络
有一些函 数,只有非常深的神经网络能学会,而更浅的模型则办不到。尽管对于任何给定的问题很难去提前预测到底需要多深的神经网络,所以先去尝试逻辑回归,尝试一层然后两层隐含层, 然后把隐含层的数量看做是另一个可以自由选择大小的超参数(网格搜索最优参数?),然后再保留交叉验证数据上评估,或者用你的开发集来评估。
我们用 L 表示层数:下图: = 4
第一个隐藏层 [1] = 5,表示有 5 个隐藏神经元,同理 [2] = 5, [3] = 3, [4]= [] = 1(输出单元为 1)而输入层, [0] = = 3。
对于每层 l 都用 []来记作 l 层激活后(输出值)结果。通过用激活函数 计算 [],激活函数也被索引为层数,然后我们用[]来记作在 l 层 计算 []值的权重。类似的, []里的方程 []也一样。
输入的特征记作,但是同样也是 0 层的激活函数,所以 = [0]。 最后一层的激活函数,所以 []是等于这个神经网络所预测的输出结果。
4.2 深层网络的中都前向传播
思考:每一层的权重是相同的吗?
每一层都有一个权重矩阵,在求出预测值y猫后,才根据对代价函数反向求导,反向推每一层的,在同时更新每一层里更新参数。
之前我们学习了构成深度神经网络的基本模块,比如每一层都有前向传播步骤以及一个 相反的反向传播步骤,这次视频我们讲讲如何实现这些步骤。
公式
[] = [] ⋅ [−1] + []
[] = [] ( [] )
向量化代码实现:
[] = [] ⋅ [−1] + [ ]
A[] = [] ( [] )
过程:前向传播需要喂入 [0]也就是(特征矩阵),来初始化。初始化的是第一层的输入值。 [0]对应于一 个训练样本的输入特征,而 [0]对应于一整个训练样本的输入特征,所以这就是这条链的第 一个前向函数的输入,重复这个步骤就可以从左到右计算前向传播。
原理是一个样本一个样本的计算,只不过向量化实现了并行计算。
视频讲解:深层神经网络正向传播过程(一次讲清楚!)_哔哩哔哩_bilibili
深层神经网络正向传播过程(一次讲清楚!)
原理:输入为[],输出为[−1],[] , []
步骤:
(1) [] = [] ∗ [] ′( [] )
(2)[] = [] ⋅ [−1]
(3) [] = []
(4) [−1] = [] ⋅ []
(5) [] = [+1] [+1] ⋅ [] ′( [] )
向量化实现过程可以写成:
视频讲解: 神经网络前向传播和反向传播的过程_哔哩哔哩_bilibili
神经网络前向传播和反向传播的过程
4.3 深层网络中的前向传播和反向传播(Forward propagation in a Deep Network)
这块视频没讲,在4.6节讲的。
先来看对其中一个训练样本 x 如何应用前向传播,之后讨论向量化的版本。
①第一层:需要计算 [1] = [1] + [1], [1] = [1] ( [1] )(可以看做 [0])
②第二层:需要计算 [2] = [2] [1] + [2], [2] = [2] ( [2] )
..........
④第四层:第四层为 [4] = [4] [3] + [4], [4] = [4] ( [4] )=Y
前向传播可以归纳为多次迭代 [] = [] [−1] + [], [] = [] ( [] )。
向量化m样本实现代码:这里只能用一个显式 for 循环,从 1 到,然后一层接着一层去计算。
对反向传播的步骤而言,我们需要算一系列的反向迭代,就是这样反向计算梯度,你需要把 []的值放在这里,然后这个方块会给我们[−1]的值,以此类推,直到我们得到[2] 和[1],你还可以计算多一个输出值,就是[0],但这其实是你的输入特征的导数,并不重要,起码对于训练监督学习的权重不算重要,你可以止步于此。反向传播步骤中也会输出 []和 [],这会输出[3]和 [3]等等。
神经网络的一步训练包含了,从 [0]开始,也就是 然后经过一系列正向传播计算得到 ^,之后再用输出值计算这个(第二行最后方块),再实现反向传播。现在你就有所有的导数项了,也会在每一层被更新为 = − ,也一样, = − ,反向传播就都 计算完毕,我们有所有的导数值,那么这是神经网络一个梯度下降循环。
视频:
4.3 核对矩阵的维数
当实现深度神经网络的时候,其中一个我常用的检查代码是否有错的方法就是拿出一张 纸过一遍算法中矩阵的维数。
的维度是(下一层的维数,前一层的维数),即[] : ( [] , [−1] );
的维度是(下一层的维数,1),即: [] : ( [] , 1);
[] , [] : ( [] , 1);
[]和[]维度相同,
[]和 []维度相同,且和向量化维度不变,但,以及的维 度会向量化后发生变化。
向量化后: []可以看成由每一个单独的 []叠加而得到, [] = ( [][1], [][2], [][3],…, [][] ), 为训练集大小,所以 []的维度不再是( [] , 1),而是( [] , )。 []:( [] , ), [0] = = ( [] , )
注意:前后矩阵维数的一致
next:解释为何深层要比浅层的神经网络要好
4.4 为什么使用深层网络(略看)
1.内容:我们都知道深度神经网络能解决好多问题,其实并不需要很大的神经网络,但是得有深 度,得有比较多的隐藏层,这是为什么呢?
明白深度神经网络在计算什么:
举个例子:
人脸识别,第一层的隐藏单元去提取图片的某些特征如:边缘、眼睛、鼻子等。然后把这些检测到的特征放在一起,就可以开始检测人脸的不同部分。最后再把这些部分放在一起就可以识别或探测不同的人脸,可以把每一层看做时探测函数,从小区域到大区域的检测
2.语音识别(语音数据声波?应用到光谱?): 第一层识别低层次音频波形的一些特征、组合在一起就可以探测音位,有了基本的声音单元之后组合起来就可以识别音频中的词。单词再组合起来就能识别词组,最后到完整的句子。
前几层学习基本的特征,后面去探测更复杂的特征
3.关于神经网络为何有效的理论 来源于电路理论(没看懂)
深层网络还可以计算复杂的函数。
深度学习就是有很多隐层的神经网络~~~ 的一个包装 没必要设置很多层 ng通常会从logistic回归开始、再试试一到两个隐藏层,把隐藏层当作参数、超参数一样去调试 ,找一个比较合适的深度。某些特定的问题可以需要某种模型才能达到更好的效果
4.6 一些参数和超参数
想要你的神经网络模型起到很好的效果,你还需要规划好你的参数,以及超参数
如:学习率:来决定参数的进化
iteration:梯度下降法循环的数量
hidden layers:隐藏层数L
hidden units 隐藏单元数
选择隐藏层的激活函数
这些参数控制了最后参数w和b的值,所以他们被称为超参数(控制参数的参)
还有其他的一些超参数:momentum mini batch size,几种不同的正则化参数。。。
最开始可能无法确定最合适的超参数所以通常选择不同的值,来观察模型
深度学习领域的应用:图像识别、语言识别、自然语言处理、再到结构化的应用 网页搜索、产品推荐等
下一节:用系统性的尝式各种超参数的取值
一个经验规律:如果你所要解决的问题 需要很多年时间、只要经常尝试不同的超参数 勤于检验结果看看有没有更好的超参值,会慢慢找到设置最好参数的感觉。
尝试保留交叉检验或者类似的检验方法,然后挑一个对你问题效果比较好的数值
课程2更多的建议关于如何系统化的探索超参数的可能空间
4.8 这和大脑有什么关系?