type
status
date
slug
summary
tags
category
icon
password

什么是神经网络(机器学习概述)

神经元可以理解为一个处理模块,让我的输入可以得到对应的输出(线性规划)
ReLu函数(修正线性函数),就是添加了大于零的部分
一个最简单的神经网络示例
notion image
一个比较大的神经网络示例
notion image
神经网络也可以理解为一种预测器(形象一点就是机器在学习如何计算),用于通过输入来预测输出
notion image

二分分类

notion image
可以理解为通过输入得出两种输出结果(就比如上面的是否有猫猫)
关于相关的符号
notion image
输入最好采用列向量的形式,这样可以让处理更简单,也可以理解为习惯,实现神经网络的时候采用列向量定义形式更简单,这里一个x的列就是一个输入样本

logistic回归

notion image
这里括号里面就可以理解为线性回归(参数为一个行向量和一个实数)了,西格玛函数就是为了保证y(一个条件概率)在0到1之间

logistic回归损失函数

notion image
这应该是对应某一个样本来计算的损失函数,不同的损失函数都是希望函数值越小越好,y是实际值,对于二分分类只能取到0,1(可以理解为不可能事件和必然事件)。这样选取y尖的作为定义的作用就很明显了,在二分分布中只能取到0,1,通过概率也可以将y尖限制在0,1之间。而y尖的极端情况就是不可能事件和必然事件
loss函数就是针对一个样本点进行的误差计算,而cost函数是针对一个样本集的
cost函数如下
notion image
实际上就是loss函数的平均值

梯度下降法(gradient descent)

关于梯度下降法
notion image
通过cost函数的定义可以知道其中变量仅有w和b,而cost函数越小越好,那么就需要找到使cost函数最小的w和b来作为logistic函数的两个参数,这样拟合效果最好(机器学习的目标就是找到这两个数?)
通过机器来做梯度的计算就只能一次次地去逼近极值点
notion image
其中阿拉法是learning rate,决定了每一次更新的步子有多大

logisti回归中的梯度下降法

notion image
z前面有两项跟x有关系是因为x是一个二维的列向量,所以向量乘法导致有两项,这个时候w里面也需要有两维来符合矩阵的乘法。
在logistic回归中使用梯度下降法实际上就是去找w(w可能有多个,因为是一个行向量)和b,并对他们求偏导,然后再一步步取向极值点,这里是单个样本的梯度下降(所以用的是lost),此时只是能很好的拟合当前样本

m个样本的梯度下降

应该没什么区别?就是把loss函数换成cost函数吧)
notion image
还真是,就是把loss函数换成了cost函数,这样就可以较好地拟合所有样本了(隔着教我回归分析呢)
机器学习的过程就是让机器不断计算逼近正确值?
notion image
基本代码如上。为了减少多个跟w有关的循环(比如上面循环中的第一行代码,还有后面的dw累加等),所以选择将其向量化,这样就可以不用循环了

向量化

向量化可以减少循环,进而提升运行速度
关于向量化
notion image
向量化的python代码
notion image

回归中的向量化

广播机制
最终的向量化结果

回归函数的进一步向量化(回归的梯度输出)

这是循环最终输出的矩阵
向量化最后的结果,也就是梯度输出的结果

广播的实例

广播的原则

一维数组和向量的区别

不要使用一维数组,要明确数组的维数才是向量

关于logistic回归的损失函数的解释

回归损失函数是如何得到的

神经网络概览

神经网络的表示

notion image

神经网络的输出

notion image
这里是在解释神经网络的表示是什么来的
notion image
对神经网络的计算结果进行向量化(之前都是针对一个结点的)
notion image
要注意这里的W实际上是w转置后拼成的矩阵,所以是四行三列,输出在前输入在后
notion image
对于m个样本不使用向量化的代码

关于向量化

对每一层w都是一样的,不同的测试用例只是为了让w更精确,但是本质上是要算出来同一个w
分块矩阵只需要保证内可乘外可乘即可

关于向量化的解释

激活函数

西格玛函数实际上就是激活函数
输出由于是二分的所以应该在最后一个节点用西格玛函数,前面的激活函数可以视情况选择,一般来说隐藏层的激活函数选取tanh函数比西格玛函数好
一些激活函数
一些激活函数表达式

为什么需要非线性的激活函数

使用线性函数的时候会导致中间不论有多少层隐藏层,实际上都是一个线性函数,搞得隐藏层没有存在的意义了,最后一个输出层要调整前面的输入,使最后的输出符合实际意义,然后面的a实际上就是每层y尖,只不过对隐藏层y尖没有像输出层那样的范围限制,所以里面可以用很多激活函数
激活函数实际上就是一种拟合函数,只要让y和y尖尽量接近即可,这样就是个好的激活函数,现在不知道能不能这样说,因为激活函数好像就是一个映射函数,将输入映射到期待的区间上,好像也是拟合?但是不是单纯的单层拟合了,而是经过很多层的处理最终映射出来的预测值,这么看来层数越多,对信号的处理越精细和充分,最后映射的效果越好(并不一定X大的值最后映射的时候就映射在最后一层激活函数的后面,因为中间还会有处理,可能导致x大的跑到后面去了,但是最终应该映射在最接近其概率的地方)。机器学习和拟合的区别应该就是在这,机器学习有很多层,这样导致输入大的不一定在输入小的后面,也可能通过最终函数映射到前面,所以最后一层激活函数的图像应该是y尖关于最后一层z的图像,而不是关于x的。

激活函数的导数

西格玛函数的导数,尽量化成原函数的组合形式
tanh函数的导数
直线型的激活函数的导数

神经网络的梯度下降法

注意这个keepdims,是为了防止生成一维数组而没有生成向量。这里的back propagation应该就是反向传播的意思,这么来看正向传播就是从输入到输出最后求出损失函数,而反向传播就是反过来求出来对每个待定系数的偏导数(链式法则在神经网络上的体现?)

直观理解反向传播

notion image
所以说正向传播就是真的从输入端处理数据一直到最后算出来损失函数,而反向传播就是从后向前来求导数,就是链式法则在神经网络上的一种反应
notion image
一个关于反向传播更复杂的例子。注意这里面每个矩阵的规模,有for循环的时候就要想好去通过向量化,或者去提取共性去消除循环。
notion image
反向传播的最终向量化形式

随机初始化

notion image
b矩阵的初始化其实没什么关系,主要是w矩阵的初始化。要注意W矩阵中每一行都是一个神经元的wT,所以如果初始化的时候每一行都是相同的,那么会导致在同一层中的神经元算的东西都是一样的(因为在每一层中激活函数都是一样的而且b与反向传播时计算的dw无关,因为dz对dw偏导的时候b被消去了),这样导致反向传播时计算出的dw每一行都是一样的,导致最终拟合出来的w每一行都是一样的,这样显然不符合实际情况,因为这样就没有必要设置这么多同层神经元了,因为这些神经元最后拟合出来的东西是一样的。随机初始化就是为了防止同层神经元计算的是同一个函数(完全一样的函数,可能b不同)
notion image
具体的代码如上。一般在W后面乘上一个很小的数,以减小W的值。防止Z过大导致算出来的dz等过小最终导致使用梯度下降法时的学习速度很慢(最终的dw应该是dZ*X,这里dZ很小的话更新速度就很慢)

深层神经网络

notion image
深层神经网络实际上就是层数多了一点)
notion image
关于一些神经网络的记号

前向传播和反向传播

notion image
前项传播实际上就是从输入开始(A0)一直算到最后的输出y尖(AL)
notion image
这里就是反向传播,反向传播的输入是实际输出端的微分,反向传播的输出是实际输入端的微分,也就是我之前想的,反向传播实际上就是通过链式法则从后向前去求损失函数(这里的损失函数是指cost函数,是针对所有样本的,而不是loss函数,仅针对一个样本)的导数。综上前向传播就是从输入开始向后运算算出y尖,这样就有了反向传播的前提条件,可以计算出损失函数,然后反向传播去求各个导数(链式法则),进行梯度下降。最终的目的应该是求出来各层的w和b(待定的系数矩阵),那些a实际上就是中间为了计算wb而算的值
notion image
正向,反向传播的小结
这里说z是cache应该是说反向传播的时候需要用到z的值
notion image
关于传播的一点点向量化

深层网络中的前向传播

notion image
这里就是一个深层网络前向传播的具体例子。这里也进行了向量化。注意这里最外层有一层循环是循环层数的,但是循环次数比较少,所以无所谓了

核对矩阵维数

notion image
notion image
对于多组样本的矩阵维数核对

为什么要有深层神经网络表示

notion image
使用深层神经网络应该就是为了让识别更精准吧。神经网络越来越深的过程实际上就是信息越来越具象、细节的过程
notion image
使用深层神经网络可以让每一层的计算都比较简单并且每一层的神经元数量不会太多。但是如果对同一个问题使用更浅的神经网络,那么就会导致每一层的计算变难并且每一层的神经元数量很多。所以深层网络的时间复杂度应该更小
notion image
这里是深层神经网络的前向传播和反向传播
notion image
注意前向传播里面有一些参数是在反向传播的时候有用的,这些参数需要cache下来

参数与超参数

notion image
一些超参数。超参数就是影响参数最终取值的一些参数,神经网络也需要这些东西
notion image
实际上对这些超参数的选择是需要经验的,就是需要通过一次次的实验来试出来超参数的合适取值

训练开发测试集

notion image
一般来说在大数据时代数据比较好获取,这样就可以让训练集大一点,剩下两个小一点(test集最少)。dev集是为了判断当前的超参数是否合适而设置的一些数据。
notion image
一般要让训练集和测试开发集保持同一分布,这样学习的速度会更快一点。因为如果训练集选用分布1,那么在进行开发的时候,如果开发集选择的分布是分布2,那么就会导致最终的结果不精准,因为源代码是可以判断分布1,的。但是开发的时候需要能判断分布2,这时候就不是代码的问题了,而是训练集的问题。

偏差和方差

notion image
图中最左边是欠拟合,而最右边是过拟合,中间是拟合成功。
notion image
说白了就是训练集决定偏差,而测试集决定方差。这里要理解训练集和测集无非都是一些数据集,还有就是机器学习的最终目的是为了找到真实模型(可以处理一个问题的所有数据),但是真实模型一般没办法直接得到,所以只能用一定数据训练出来的模型去泛化得到近似的真实模型。上图的error应该都是指相对于真实值的误差。如果训练集的error较大,就说明当前模型对训练集的预测结果不好,就说明当前模型在训练集的数据下的预测结果与真实值差距较大,所以就是偏差较大,而一般训练集差距大那么测试集差距也会很大,就是上面的第二种情况,这种情况说明当前模型训练程度不够,无法正确判断,就是对训练集欠拟合;而当训练集误差很小的时候,说明当前模型对训练集的预测结果已经很正确了,就是偏差较小,但是如果此时测试集的误差较大,就说明当前模型只是对训练集的拟合效果较好,或者说已经学习过多了导致对训练集一些数据的特性敏感,导致当换一组数据(测试集)进行测试时就会导致误差较大,就说明当前的模型对不同数据的轻微变化反应是较大的,也就是仅适用于训练集,就是对训练集过拟合,此时偏差较小,但是方差较大。总而言之,要让偏差小,就要让模型多训练,去更好地预测真实结果。要让方差小,就要让模型具有当前问题的共性,就是不对特定数据敏感,也就是要少训练。所以引入了一个dev集不同于训练集的目的就是为了测试当前模型的泛化程度。通过训练集测试说明偏差小(可以处理当前问题);通过dev集测试说明方差小(可以处理当前问题的所有数据)。所以通过dev集的测试要去修改超参数如学习率等来控制对训练集的学习程度,不能太低(造成偏差高),也不能太高(造成方差高)
notion image
高偏差高方差的情况,就是拟合的时候部分过拟合,部分欠拟合,说白了就是识别了训练集的某些数据的特殊属性(导致高方差),但是此时训练程度还不够(导致高偏差)

关于机器学习的原则

notion image
实际上就是期待一个低偏差,低方差的模型,先检测偏差,在检测方差。上面这张图还提供了一些解决方法

正则化

notion image
这里面是对logistic回归进行的正则化,有L2和L1两种,常用L2。对回归而言,就是只有一个神经元的神经网络,这里面的w就是一个列向量。所以正则化就是在最后乘上w的模。前面的lambda是正则系数,需要通过dev集确定。而通常来说拟合效果起主要作用的是w(就像之前随机初始化的时候讲的那样),所以在这里省略了b。另一种理解是w是个向量,而b只是一个数,这样许多变量都在w里面,所以w起主要影响作用
notion image
正则化之后的梯度下降如上,要在dw的计算后边补上正则的那一部分。现在表现出来的就是w每次更新的时候都会乘上一个小于1的系数。
notion image
这里面的lambda是通过dev集确定出来的。在前向传播算出来的损失函数中如果加上了正则化的表达式,如果lambda很大,就会导致用梯度下降的时候会让后面的范数一直减小,最终减小到约等于0,这就变成了随机初始化的时候的那个问题,如果w等于零,那么同层的神经元计算的函数都是一样的,这样就把一个复杂的神经网络简化成了每一层都只有一个神经元的网络,这样就会导致神经网络对训练集的数据分析减少,对训练集数据的特性识别减少,也就使得神经网络的泛化性更强了,对一些特性的变化不大,进而使得模型的方差变小。但是使用正则化可能会使得神经网络由高方差转向高偏差。要注意这里加上的是w的平方,所以最终w应该是接近于0,而不会变成负数。
notion image
这里又是另一种解释,通过正则化导致w约等于0,这样让z在激活函数计算的时候在远点附近,这样就近似为激活函数都是线性的,最终导致神经网络变了一个线性的神经网络。就变成了一个高偏差的图。而只有当激活函数非线性的时候才会出现很复杂的拟合函数。所以这么来看的话最终目的就是调整w的范围让激活函数像线性函数又不像线性函数,防止出现高偏差(线性神经网络)和高方差(拟合函数过于复杂)的情况
print(f"a的值为:{a}")
Paper1编译原理
Loading...
Noah
Noah
永远年轻,永远热泪盈眶
公告
❗❗复习笔记问题❗❗
由于兼容性问题
导入md文件可能导致了一些格式错误
🌹如发现格式错误,请联系我~🌹
🌹如博客内容有误也欢迎指出~🌹