- 博主简介:努力学习的22级计算机科学与技术本科生一枚🌸
- 博主主页: @Yaoyao2024
- 每日一言🌼: 勇敢的人,不是不落泪的人,而是愿意含着泪继续奔跑的人。
------《朗读者》
0、声明
本系列博客文章是博主本人根据吴恩达老师2022年的机器学习课程所学而写,主要包括老师的核心讲义和自己的理解。在上完课后对课程内容进行回顾和整合,从而加深自己对知识的理解,也方便自己以及后续的同学们复习和回顾。
- 课程地址👉🏻2022吴恩达机器学习Deeplearning.ai课程
- 课程资料和代码(jupyter notebook)👉🏻2022-Machine-Learning-Specialization
由于课程使用英文授课,所以博客中的表达也会用到英文,会用到中文辅助理解。
🌸Machine learning specialization课程共分为三部分
- 第一部分:Supervised Machine Learning: Regression and Classification
- 第二部分:Advanced Learning Algorithms(Neural networks、Decision Trees)
- 第三部分:Unsupervised Learning: Recommenders, Reinforcement Learning
💐最后,感谢吴恩达老师Andrew Ng的无私奉献,和视频搬运同学以及课程资料整合同学的无私付出。Cheers!🍻
前言
🪧在前面几章,我们学习了一些传统的机器学习算法:线性回归和逻辑回归。接下来我们将学习更高级更有效的的机器学习算法:神经网络(Neural Networks; 深度学习,deep learning)、决策树(Decision Trees)。这一章主要介绍卷积神经网络,从它的起源、发展、原理、预测和训练等方面进行讲解。也是一个简单的介绍,对神经网络这种算法有初步的认识和较为全面的理解。因为我们知道,深度学习是机器学习的一个大分支,里面的学问还有很多。
💁🏻♀️接下来让我们开始吧!💐🚂🚂🚂
一、神经网络的起源与发展
1.1.神经元和大脑
神经网络最初是设计用来**模仿人类大脑进行工作的一种算法(Origins: Algorithms that try to mimic the brain)。**这是它形成的起源。
我们在下图中可以看到,人脑中的神经元通过接收多个输入的神经信号,在神经元内进行"计算"后,并用突触进行释放神经信号,将神经信号传递给下一个神经元;下一个神经元将接受的神经信号作为输入信号,并以相同的方式进行进行传递给其他神经元。人脑中的思想就是这样通过神经元与神经元之间的连接和输送神经信号形成的,
当时人们就是按照神经元和大脑中神经信号的传递的这种理解,设计出如下的神经网络。
可以看到,人工设计的神经网络,实际上对神经元是十分简化后的一个数学模型。它们都有输入和输出,并且神经元和神经元之间进行联系和信号的计算与传递。
1.2: Why now?
神经网络这种想法的提出很早,但是真正开始应用是2005年之后。为什么呢?
主要有两个原因
- 数据:随着手机等电子设备和互联网的兴起,数据量急剧增大。面对大数据,传统的机器学习算法的性能并不理想。
- 硬件:随着硬件水平的提高,计算能力增强,大的神经网络可以实现。
1.3:对神经网络的理解
神经网络起源的是想模仿人类大脑的工作原理,但是实际上现在的神经网络和人类大脑并没有很大关系!!!(人类对大脑具体是如何进行运作的原理目前也没有完全弄懂)。和传统算法一样,它的本质还是一个数学模型。
人工神经网络之所以有效,主要有以下几个原因:
- 通用逼近定理:这个定理表明,一个具有足够大数量的神经元的神经网络,可以逼近任何复杂的函数。这意味着只要我们有足够的神经元和合适的权重,我们的网络就可以理论上模拟出任何复杂的情况。
- 分层的知识抽象:在深层神经网络中,每个层次的神经元可以学到数据的一种抽象,从而识别出相当复杂的模式。这些层从输入数据中提取特征,并将这些特征传递给下一层以进行更复杂的分析。这一层级结构可以捕获数据中的复杂性和多样性。
- 数据驱动:神经网络是从数据中学习的,这意味着它们可以自动适应新的输入并在不断的学习中改进。与需要明确编程规则的传统算法相比,神经网络可以通过训练从大规模数据中学习规则。
B站的UP主王木头也对机器学习的理论基础进行了详细的讲解:如果大数定律失效,机器学习还能学吗?幂律分布可以告诉你答案。说白了,只要数据量够大,模型够复杂,总能"暴力出奇迹"。
所以为什么行呢?说白了还是因为有数学理论做基础。
之前听到一个很有意思的看法是。人类最初造飞机,是为了模仿鸟类的飞行,尽管现在的飞机的飞行的方式和鸟类的飞行方式并不相同,但不妨碍飞机可以飞行,且飞的比鸟类还要好。机器学习感觉也是如此。尽管初衷是想模拟人类大脑的运作方式进行预测,但是最终设计的神经网络这种数学模型也可以达到很好的效果。所以,也许我们没有必要像生物神经方面的科学家一样把人脑的运作方式了解的清清楚楚才能实现像人一样进行思考和预测。
1.4:工作原理浅析
下面展示的是,其实一个单变量的逻辑回归模型,就可以看作是一个单输入的神经元 。那么在这里,Sigmoid
函数就不再称为逻辑函数,而是称为激活函数。
激活函数在神经网络中起到一个"门控"制的作用,它们决定了某个神经元是否应该被激活。这意味着它们可用于创建和控制复杂的非线性关系。
我们再看看一个普通的神经网络的结构如下:
- 输入层:输入的原始数据
- 隐藏层:有多个神经元组成,对原始数据进行计算、激活和传递(可以有多层)
- 输出层:输出目标值
🙎🏻♀️在下面这个例子中,对原始数据特征进行对应的逻辑回归运算,得到affordability
、awareness
、perceived
3个高层次的抽象特征。
上述的过程与第二章中在多变量线性回归模型中学习到的特征工程 的十分类似。如下图,都是对原有的特征进行组合计算得到新的特征。但是实际还是有区别的,我们在下面详解。
当我们只看右侧一部分的时候,其实就是一个普通的三输入逻辑回归 :
1.5:神经网络vs传统机器学习
上面整个结构感觉很简单,因为拆开来看,与我们前面学习到的特征工程、逻辑回归基本差不多。
但是我们再把注意力集中到隐藏层。
- 隐藏层可以访问前一层所有神经元的输出值
- 隐藏层每一个神经元代表的特征是通过训练神经网络自己学习得到的,而不是像传统的机器学习算法中的特征工程一样人工对原有基础特征进行组合。
第二点就是神经网络之所以比传统机器算法更为强大的原因,因为它可以自己学习特征,并对特征进行抽象。隐藏层使得神经网络模型具有强大的学习和表达能力,是神经网络成功的关键。
例如在前面的博客中介绍的卷积神经网络(【计算机视觉】万字长文详解:卷积神经网络),其前几层隐藏层会学习到一些基础的特征(如线条、曲线),后几层学习一些更为抽象和高级的特征(眼睛、耳朵、鼻子)。而输出层对这些神经网络自己学习到的高级特征进行逻辑回归,从而完成整个模型预测的任务。整个过程中,隐藏层的特征(参数w和b)都是神经网络通过训练自己学习得到的,而非手工设计的。这是神经网络之所以强大以及区别于传统机器学习算法的方面!
🪧Tips: 当然,学习只能学习到参数,什么是参数?你可以在2.1小节中看到,和逻辑回归一样。至于模型有多少个神经元、多少层,这是属于模型架构的问题,由人工确定。
接下来,让我们更为具体从神经网络的预测和训练两个方面,深入学习神经网络。
二、神经网络的推理
2.1:神经网络的层的计算
上面只是对神经网络进行了一个直觉上的介绍和讲解,那么网络中每个神经元在进行着具体的运算是什么呢?我们下面来看看。
最基本的神经网络只有一层隐藏层。接下来我们看看只有一层隐藏层的神经网络是如何工作的,当弄清楚一层隐藏层的神经网络是如何工作时,更复杂的隐藏层不过大同小异了,因为更复杂的神经网络不过是这些层的组合和构建。
下图所示。从左往右看,对于第一层(layer 1):每一个神经元都是一个对前一层输出量 x
(向量)的逻辑回归(逻辑函数) 。每一个神经元进行相应逻辑回归的计算后得到输出值 a
(向量),并将其传递给下一层。
💁🏻♀️这里我们可以看到,下标用来表示这一层的第几个神经元,右上标表示当前属于第几层。
最后一层,同样进行类似的运算。
通常,根据输出层的结果,可以决定输出的形式。(如下)
最后,我们将计算推广到具有多层隐藏层的神经网络:
2.2:向前传播(forward propogation)
向前传播,其实说白了就是当模型训练好之后(参数确定了),给定数据从输入层,通过计算,从左向右流出输入层,后一层的输入是前一层的输出,一层一层进行计算,最后得到预测结果 。这个过程就是数据的向前传播。下面以手写数字的识别为例,进行向前传播的讲解。
三、线性代数
3.1:神经网络为何高效
简而言之,因为神经网络计算过程可以矢量化 ,将数据进行矢量化后,进行矩阵运算,可以更高效的得到运算结果。背后的核心还是GPU等硬件进行并行运算从而加速 ,这在之前章节中也讲到过。
3.2:矩阵乘法
3.3:代码实现
四、模型的训练
🪧这一块,我们的模型训练的框架的是TensorFlow
4.1:TensorFlow的实现
我们可以看到,使用TensorFlow训练模型主要有以下3个步骤
- 首先,确定模型架构(有几层、每层有多少个神经元)、激活函数------Create the model
- 编译模型 ,并且指定损失函数
- 输入数据 ,给定梯度下降次数(epoch )
如下图,这和之前讲到的逻辑回归模型的训练步骤完全一致,它们都是监督学习算法。
4.2:激活函数
4.2.1: 其他激活函数
总的来说,激活函数有以下4个(后3个均为非线性)
g(z) = z
:线性激活函数;和也没有使用没区别g(z) = sigmoid(z)
:sigmoid激活函数g(z) = ReLU(z) = max(0, z)
:ReLU激活函数g(z) = softmax(z)
:多分类问题中的softmax激活函数
4.2.2:激活函数的选择
-
一、输出层(Output layer)的激活函数:取决于你想预测的
y
是什么- 二分类问题(Binary Classification):Sigmoid函数
- 线性回归问题(Linear Regression)且预测值有正有负:线性激活函数
- 回归问题且预测值只能为正:ReLU函数
- 多分类问题:softmax激活函数
-
二、隐藏层(Hidden layer):一般使用
ReLU
激活函数(更快、性质使然)
4.2.3:为什么使用激活函数
这个问题一般是针对隐藏层;对于输出层,因为结果形式的需求,暂且不讨论。
- 在隐藏层使用激活函数的目的,最主要还是为了引入非线性元素,即增加模型的复杂性,这对于多层神经网络是必须的,否则的话就是普通的传统回归模型。
- 梯度提供了优化的方向:激活函数的选择也是基于梯度的原因。例如,激活函数ReLU在负值区域内的梯度为零,可以让某些神经元的输出为0,这使模型成为非完全线性模型,有利于模型在训练过程中的稀疏表示。此外,ReLU和其他非饱和性的激活函数的背后基础是梯度下降法,梯度下降法是一种优化策略,它需要梯度信息来更新参数,以此最小化损失函数。
4.3:多分类问题(Multiclass classfication)
4.3.1:多分类问题的定义
其实和二分类问题(使用逻辑回归模型)类似,多分类问题的核心目的也就是预测每个类别的概率 。多分类问题采用的softmax回归算法(softmax regression alogorithm)也是逻辑回归算法的推广!
4.3.2:softmax回归算法
softmax的本质是逻辑回归算法的推广:
损失函数的对比:
4.3.3:神经网络的softmax输出
下图可以看到,softmax函数作用于输出层,以作为激活函数时,和其他激活函数不同的是:当前神经元的值不仅取决于前一层的输出值,还取决于当前这一层其他神经元的计算值。
4.4:反向传播(back propogation)------求导
4.4.1:计算图
计算图(computing graph)的定义:把向前传播和反向传播求导的过程以类似于流程图的形式展示出来。
如下图所示,向前传播(从左往右),从而计算代价函数J
:
计算到代价函数后,反向传播(从右往左),计算J
对w
的导数:(很简单,其实就是链式求导法则)
4.4.2:大神经网络中的反向传播
就是计算出代价函数后,从右往左进行链式求导:
4.5:Adam算法:比梯度下降更好
在前几章介绍梯度下降算法来训练模型时,我们知道 学习率α
的确定是值得尝试的,不能太大,否则震荡而难以收敛;不能太小,否则达到收敛时间过长。
在前面用到的梯度下降算法中, 学习率α
是全局的、确定的、所有参数共享的;
也没有一种算法,能够在梯度下降较慢(参数更新的步伐较小)时,自动增大α
;且在梯度来回震荡无法收敛时,自动减小α
呢?Adam算法就是这样一个能自动调节学习率α
的优化算法。
在Adam算法中,**每个参数都有自己的学习率:
**关于Adam算法背后具体如何实现的,不在这里讨论;感兴趣的同学可以自行搜索。
它的主要思想就是如下:自动调节学习率α
:
4.6:其他网络层类型介绍
前面讲的神经网络中的网络层,都是全连接层Dense layer
:即每个神经元的输出都是由前一层所有神经元的输出计算和激活得来:
4.6.1:卷积层
对于"卷积层",你可以设计单个神经元可以查看前一层的输出的窗口有多大,以及每层有多少个神经元:
卷积的本质是:加窗傅里叶变换
卷积有一维卷积和二维:
二维我们卷积我们熟知,用于卷积神经网络,应用于计算机视觉领域(捕捉局部特征而非全局):
在卷积神经网络那篇博客中我们也讲到为什么不用全连接神经网络,因为计算量和参赛量太大!