神经网络概述(四)

b站学习链接:传送门 学习视频第8章
学习目录索引:吴恩达2014课程简介

知识补充

神经网络算是传统的机器学习还是深度学习

神经网络既可以被视为传统的机器学习方法,也可以归类为深度学习方法,具体取决于网络的结构和使用的算法。
在传统机器学习中,神经网络通常指的是较浅的神经网络结构,例如单层感知机或多层感知机(MLP)。这些神经网络通常使用传统的机器学习方法进行训练和优化,例如梯度下降、反向传播等。
然而,随着深度学习的兴起,指涉的神经网络模型变得更加复杂和深层。深度学习使用包含多个隐含层的神经网络,例如卷积神经网络(CNN)、循环神经网络(RNN)和变换器(Transformer)。这些深层神经网络通常使用更复杂的优化算法和训练技术,并通过大规模数据集进行训练。
因此,根据神经网络的结构和所使用的算法,神经网络可以被视为传统的机器学习方法或深度学习方法。
需要注意的是,传统机器学习和深度学习不是严格区分的概念,而是随着时间和发展而演变的。深度学习可以被看作是机器学习的一个子领域,强调使用深层神经网络进行特征提取和模型表示学习。

线性回归和非线性回归

线性回归和逻辑回归都是常用的机器学习算法,但它们解决的问题类型略有不同。
线性回归是一种用于建立变量之间线性关系的回归分析方法。它适用于解决连续型目标变量的预测问题,例如预测房价、销售额等。线性回归假设自变量和因变量之间存在线性关系,并试图找到最佳拟合直线来描述这种关系。
逻辑回归则主要用于分类问题,特别是二分类问题。它使用逻辑函数(如sigmoid函数)将输入特征与概率输出之间建立关系。逻辑回归常用于预测二元变量,如判断一个电子邮件是垃圾邮件还是非垃圾邮件,或者一个患者是否患有某种疾病等。
虽然线性回归和逻辑回归都使用线性模型,但它们解决的问题类型不仅限于线性问题。通过适当的特征工程和转换,线性回归和逻辑回归可以用于解决非线性问题。例如,通过添加多项式特征或应用核函数,可以扩展线性回归和逻辑回归的能力,以适应更复杂的数据模式。


正则化逻辑回归(Regularized Logistic Regression)本身并不能直接解决非线性问题。正则化逻辑回归是逻辑回归的一种变体,主要用于处理特征过多或过拟合的情况,而不是直接解决非线性问题。
正则化逻辑回归通过在损失函数中引入正则化项(通常是L1正则化或L2正则化),对模型参数进行约束,以避免过拟合和提高模型的泛化能力。正则化项有助于限制模型参数的大小,并降低复杂度,使模型更倾向于选择较简单的解。

神经网络之所以是非线性的,是因为它们包含非线性激活函数以及多层连接。
在神经网络中,输入数据通过多个神经元(节点)进行传递和处理。每个神经元接收来自前一层神经元的输入,并通过激活函数对输入进行非线性变换,然后将输出传递给下一层神经元。这种多层连接的结构使得神经网络能够学习和表示复杂的非线性关系。
激活函数在神经网络中起到关键的作用,它引入非线性变换,使得神经网络能够学习非线性模式和特征。常见的激活函数包括Sigmoid函数、ReLU函数、Tanh函数等。这些激活函数在输入范围内引入非线性,使得神经网络可以对非线性数据进行建模和分类。
如果神经网络只包含线性激活函数,如线性函数或恒等函数,整个网络将只是一个线性模型的叠加。线性模型只能学习线性关系,无法处理复杂的非线性模式。因此,引入非线性激活函数是必要的,以增强神经网络的表达能力,使其能够解决更加复杂的问题。
总之,神经网络之所以是非线性的,是因为它们包含非线性激活函数和多层连接结构,这使得它们能够学习和表示复杂的非线性关系和模式。

神经网络是非线性的那么它可以进行预测吗

是的,神经网络作为非线性模型,可以进行预测。实际上,神经网络在许多领域都被广泛应用于预测和分类任务。

通过训练神经网络,它可以学习数据中的模式和特征,然后根据这些学习到的知识对新的未见数据进行预测。神经网络的非线性性质使其能够捕捉数据中复杂的非线性关系,从而提供更准确的预测能力。

在进行预测时,给定输入数据,神经网络会通过前向传播将输入传递到网络的每一层,最终生成预测结果。这个过程涉及到神经元之间的非线性变换和权重调整,以使网络的输出逼近目标值。

当神经网络经过充分的训练,并且在训练数据上表现良好时,它可以用于预测新的未知数据。这意味着它可以在没有事先知识的情况下对新数据进行分类、回归或其他预测任务。

需要注意的是,神经网络的预测性能受到多个因素的影响,包括网络的结构、数据的质量和数量、训练算法的选择等。适当的网络设计、合适的数据处理和训练方法,以及适度的模型复杂度都是保证神经网络预测准确性的重要因素。

神经网络更适合分类还是预测

神经网络既适用于分类问题,也适用于预测问题。它们在这两个方面都有广泛的应用,并且在许多任务中取得了出色的表现。

对于分类问题,神经网络可以通过学习从输入到输出之间的复杂映射关系,将输入数据划分到不同的类别中。这包括二分类和多分类任务。神经网络在处理图像分类、语音识别、自然语言处理等领域的分类问题方面表现出色。

对于预测问题,神经网络可以根据输入数据的特征,预测连续值的输出。这包括回归问题,如房价预测、股票价格预测等。神经网络可以学习输入特征与输出之间的非线性关系,并进行准确的预测。

需要根据具体的问题类型和任务需求来确定神经网络的使用。如果任务是将数据分为不同的类别,则分类问题更适合。如果任务是预测连续值的输出,则预测问题更适合。

需要注意的是,神经网络的性能与问题的特点、数据的质量、网络的架构和参数设置等因素密切相关。在实际应用中,合理选择网络结构、适当处理数据、进行有效的训练和调优等步骤是确保神经网络在分类和预测问题中取得良好性能的关键。

神经网络属于监督学习吗

是的,神经网络通常属于监督学习方法。监督学习是一种机器学习方法,其中算法从标记的训练数据集中学习,并使用这些数据来进行预测或分类。

在监督学习中,训练数据集由输入样本和对应的目标标签组成。神经网络通过对这些输入样本进行学习,学习样本的特征和目标标签之间的关系。它通过调整网络的权重和参数,以最小化预测输出与真实目标之间的误差。

一旦神经网络训练完成,它就可以用于对新的未知样本进行预测或分类。通过输入新样本,神经网络将根据之前学习到的模式和关系,生成预测结果。

虽然神经网络通常用于监督学习问题,但也可以应用于无监督学习和强化学习等其他学习范式。在无监督学习中,神经网络可以通过学习数据中的隐藏结构和模式,进行聚类、降维等任务。在强化学习中,神经网络可以作为值函数近似器或策略模型,用于学习在与环境进行交互的过程中,如何采取行动以最大化奖励。

但总的来说,神经网络最常见和广泛应用的是作为监督学习的方法,用于分类和预测问题。

课堂笔记

表述(Neural Networks: Representation)

非线性假设

参考视频: 8 - 1 - Non-linear Hypotheses (10 min).mkv
我们之前学的,无论是线性回归还是逻辑回归都有这样一个缺点,即:当特征太多时,计算的负荷会非常大。
下面是一个例子:
image.png
当我们使用 x 1 x_1 x1, x 2 x_2 x2 的多次项式进行预测时,我们可以应用的很好。
之前我们已经看到过,使用非线性的多项式项,能够帮助我们建立更好的分类模型。假设我们有非常多的特征,例如大于100个变量,我们希望用这100个特征来构建一个非线性的多项式模型,结果将是数量非常惊人的特征组合,即便我们只采用两两特征的组合 ( x 1 x 2 + x 1 x 3 + x 1 x 4 + . . . + x 2 x 3 + x 2 x 4 + . . . + x 99 x 100 ) (x_1x_2+x_1x_3+x_1x_4+...+x_2x_3+x_2x_4+...+x_{99}x_{100}) (x1x2+x1x3+x1x4+...+x2x3+x2x4+...+x99x100),我们也会有接近5000个组合而成的特征。这对于一般的逻辑回归来说需要计算的特征太多了。

假设我们希望训练一个模型来识别视觉对象(例如识别一张图片上是否是一辆汽车),我们怎样才能这么做呢?一种方法是我们利用很多汽车的图片和很多非汽车的图片,然后利用这些图片上一个个像素的值(饱和度或亮度)来作为特征。

假如我们只选用灰度图片,每个像素则只有一个值(而非 RGB值),我们可以选取图片上的两个不同位置上的两个像素,然后训练一个逻辑回归算法利用这两个像素的值来判断图片上是否是汽车:
image.png
假使我们采用的都是50x50像素的小图片,并且我们将所有的像素视为特征,则会有 2500个特征,如果我们要进一步将两两特征组合构成一个多项式模型,则会有约 2500 2 / 2 {{2500}^{2}}/2 25002/2个(接近3百万个)特征。普通的逻辑回归模型,不能有效地处理这么多的特征,这时候我们需要神经网络。

神经元和大脑

参考视频: 8 - 2 - Neurons and the Brain (8 min).mkv
神经网络是一种很古老的算法,它最初产生的目的是制造能模拟大脑的机器。

在这门课中,我将向你们介绍神经网络。因为它能很好地解决不同的机器学习问题。而不只因为它们在逻辑上行得通,在这段视频中,我想告诉你们一些神经网络的背景知识,由此我们能知道可以用它们来做什么。不管是将其应用到现代的机器学习问题上,还是应用到那些你可能会感兴趣的问题中。也许,这一伟大的人工智能梦想在未来能制造出真正的智能机器。另外,我们还将讲解神经网络是怎么涉及这些问题的神经网络产生的原因是人们想尝试设计出模仿大脑的算法,从某种意义上说如果我们想要建立学习系统,那为什么不去模仿我们所认识的最神奇的学习机器——人类的大脑呢?

神经网络逐渐兴起于二十世纪八九十年代,应用得非常广泛。但由于各种原因,在90年代的后期应用减少了。但是最近,神经网络又东山再起了。其中一个原因是:神经网络是计算量有些偏大的算法。然而大概由于近些年计算机的运行速度变快,才足以真正运行起大规模的神经网络。正是由于这个原因和其他一些我们后面会讨论到的技术因素,如今的神经网络对于许多应用来说是最先进的技术。当你想模拟大脑时,是指想制造出与人类大脑作用效果相同的机器。大脑可以学会去以看而不是听的方式处理图像,学会处理我们的触觉。

我们能学习数学,学着做微积分,而且大脑能处理各种不同的令人惊奇的事情。似乎如果你想要模仿它,你得写很多不同的软件来模拟所有这些五花八门的奇妙的事情。不过能不能假设大脑做所有这些,不同事情的方法,不需要用上千个不同的程序去实现。相反的,大脑处理的方法,只需要一个单一的学习算法就可以了?尽管这只是一个假设,不过让我和你分享,一些这方面的证据。

image.png

大脑的这一部分这一小片红色区域是你的听觉皮层,你现在正在理解我的话,这靠的是耳朵。耳朵接收到声音信号,并把声音信号传递给你的听觉皮层,正因如此,你才能明白我的话。

神经系统科学家做了下面这个有趣的实验,把耳朵到听觉皮层的神经切断。在这种情况下,将其重新接到一个动物的大脑上,这样从眼睛到视神经的信号最终将传到听觉皮层。如果这样做了。那么结果表明听觉皮层将会学会“看”。这里的“看”代表了我们所知道的每层含义。所以,如果你对动物这样做,那么动物就可以完成视觉辨别任务,它们可以看图像,并根据图像做出适当的决定。它们正是通过脑组织中的这个部分完成的。下面再举另一个例子,这块红色的脑组织是你的躯体感觉皮层,这是你用来处理触觉的,如果你做一个和刚才类似的重接实验,那么躯体感觉皮层也能学会“看”。这个实验和其它一些类似的实验,被称为神经重接实验,从这个意义上说,如果人体有同一块脑组织可以处理光、声或触觉信号,那么也许存在一种学习算法,可以同时处理视觉、听觉和触觉,而不是需要运行上千个不同的程序,或者上千个不同的算法来做这些大脑所完成的成千上万的美好事情。也许我们需要做的就是找出一些近似的或实际的大脑学习算法,然后实现它大脑通过自学掌握如何处理这些不同类型的数据。在很大的程度上,可以猜想如果我们把几乎任何一种传感器接入到大脑的几乎任何一个部位的话,大脑就会学会处理它。

下面再举几个例子:
image.png

这张图是用舌头学会“看”的一个例子。它的原理是:这实际上是一个名为BrainPort的系统,它现在正在FDA
(美国食品和药物管理局)的临床试验阶段,它能帮助失明人士看见事物。它的原理是,你在前额上带一个灰度摄像头,面朝前,它就能获取你面前事物的低分辨率的灰度图像。你连一根线到舌头上安装的电极阵列上,那么每个像素都被映射到你舌头的某个位置上,可能电压值高的点对应一个暗像素电压值低的点。对应于亮像素,即使依靠它现在的功能,使用这种系统就能让你我在几十分钟里就学会用我们的舌头“看”东西。
image.png
这是第二个例子,关于人体回声定位或者说人体声纳。你有两种方法可以实现:你可以弹响指,或者咂舌头。不过现在有失明人士,确实在学校里接受这样的培训,并学会解读从环境反弹回来的声波模式—这就是声纳。如果你搜索YouTube之后,就会发现有些视频讲述了一个令人称奇的孩子,他因为癌症眼球惨遭移除,虽然失去了眼球,但是通过打响指,他可以四处走动而不撞到任何东西,他能滑滑板,他可以将篮球投入篮框中。注意这是一个没有眼球的孩子。
image.png
第三个例子是触觉皮带,如果你把它戴在腰上,蜂鸣器会响,而且总是朝向北时发出嗡嗡声。它可以使人拥有方向感,用类似于鸟类感知方向的方式。

还有一些离奇的例子:
image.png
如果你在青蛙身上插入第三只眼,青蛙也能学会使用那只眼睛。因此,这将会非常令人惊奇。如果你能把几乎任何传感器接入到大脑中,大脑的学习算法就能找出学习数据的方法,并处理这些数据。从某种意义上来说,如果我们能找出大脑的学习算法,然后在计算机上执行大脑学习算法或与之相似的算法,也许这将是我们向人工智能迈进做出的最好的尝试。人工智能的梦想就是:有一天能制造出真正的智能机器。

神经网络可能为我们打开一扇进入遥远的人工智能梦的窗户,但我在这节课中讲授神经网络的原因,主要是对于现代机器学习应用。它是最有效的技术方法。因此在接下来的一些课程中,我们将开始深入到神经网络的技术细节。

模型表示1

参考视频: 8 - 3 - Model Representation I (12 min).mkv
为了构建神经网络模型,我们需要首先思考大脑中的神经网络是怎样的?每一个神经元都可以被认为是一个处理单元/神经核(processing unit/Nucleus),它含有许多输入/树突(input/Dendrite),并且有一个输出/轴突(output/Axon)。神经网络是大量神经元相互链接并通过电脉冲来交流的一个网络。

image.png
下面是一组神经元的示意图,神经元利用微弱的电流进行沟通。这些弱电流也称作动作电位,其实就是一些微弱的电流。所以如果神经元想要传递一个消息,它就会就通过它的轴突,发送一段微弱电流给其他神经元,这就是轴突。

这里是一条连接到输入神经,或者连接另一个神经元树突的神经,接下来这个神经元接收这条消息,做一些计算,它有可能会反过来将在轴突上的自己的消息传给其他神经元。这就是所有人类思考的模型:我们的神经元把自己的收到的消息进行计算,并向其他神经元传递消息。这也是我们的感觉和肌肉运转的原理。如果你想活动一块肌肉,就会触发一个神经元给你的肌肉发送脉冲,并引起你的肌肉收缩。如果一些感官:比如说眼睛想要给大脑传递一个消息,那么它就像这样发送电脉冲给大脑的。
image.png
神经网络模型建立在很多神经元之上,每一个神经元又是一个个学习模型。这些神经元(也叫激活单元,activation unit)采纳一些特征作为输出,并且根据本身的模型提供一个输出。下图是一个以逻辑回归模型作为自身学习模型的神经元示例,在神经网络中,参数又可被成为权重(weight)。
image.png
我们设计出了类似于神经元的神经网络,效果如下:
image.png
其中 x 1 x_1 x1, x 2 x_2 x2, x 3 x_3 x3是输入单元(input units),我们将原始数据输入给它们。
a 1 a_1 a1, a 2 a_2 a2, a 3 a_3 a3是中间单元,它们负责将数据进行处理,然后呈递到下一层。
最后是输出单元,它负责计算 h θ ( x ) {h_\theta}\left( x \right) hθ(x)

神经网络模型是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。下图为一个3层的神经网络,第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)。我们为每一层都增加一个偏差单位(bias unit):
image.png
下面引入一些标记法来帮助描述模型:
a i ( j ) a_{i}^{\left( j \right)} ai(j) 代表第 j j j 层的第 i i i 个激活单元。 θ ( j ) {{\theta }^{\left( j \right)}} θ(j)代表从第 j j j 层映射到第$ j+1$ 层时的权重的矩阵,例如 θ ( 1 ) {{\theta }^{\left( 1 \right)}} θ(1)代表从第一层映射到第二层的权重的矩阵。其尺寸为:以第 j + 1 j+1 j+1层的激活单元数量为行数,以第 j j j 层的激活单元数加一为列数的矩阵。例如:上图所示的神经网络中 θ ( 1 ) {{\theta }^{\left( 1 \right)}} θ(1)的尺寸为 3*4。

对于上图所示的模型,激活单元和输出分别表达为:

a 1 ( 2 ) = g ( Θ 10 ( 1 ) x 0 + Θ 11 ( 1 ) x 1 + Θ 12 ( 1 ) x 2 + Θ 13 ( 1 ) x 3 ) a_{1}^{(2)}=g(\Theta _{10}^{(1)}{{x}_{0}}+\Theta _{11}^{(1)}{{x}_{1}}+\Theta _{12}^{(1)}{{x}_{2}}+\Theta _{13}^{(1)}{{x}_{3}}) a1(2)=g(Θ10(1)x0+Θ11(1)x1+Θ12(1)x2+Θ13(1)x3)
a 2 ( 2 ) = g ( Θ 20 ( 1 ) x 0 + Θ 21 ( 1 ) x 1 + Θ 22 ( 1 ) x 2 + Θ 23 ( 1 ) x 3 ) a_{2}^{(2)}=g(\Theta _{20}^{(1)}{{x}_{0}}+\Theta _{21}^{(1)}{{x}_{1}}+\Theta _{22}^{(1)}{{x}_{2}}+\Theta _{23}^{(1)}{{x}_{3}}) a2(2)=g(Θ20(1)x0+Θ21(1)x1+Θ22(1)x2+Θ23(1)x3)
a 3 ( 2 ) = g ( Θ 30 ( 1 ) x 0 + Θ 31 ( 1 ) x 1 + Θ 32 ( 1 ) x 2 + Θ 33 ( 1 ) x 3 ) a_{3}^{(2)}=g(\Theta _{30}^{(1)}{{x}_{0}}+\Theta _{31}^{(1)}{{x}_{1}}+\Theta _{32}^{(1)}{{x}_{2}}+\Theta _{33}^{(1)}{{x}_{3}}) a3(2)=g(Θ30(1)x0+Θ31(1)x1+Θ32(1)x2+Θ33(1)x3)
h Θ ( x ) = g ( Θ 10 ( 2 ) a 0 ( 2 ) + Θ 11 ( 2 ) a 1 ( 2 ) + Θ 12 ( 2 ) a 2 ( 2 ) + Θ 13 ( 2 ) a 3 ( 2 ) ) {{h}_{\Theta }}(x)=g(\Theta _{10}^{(2)}a_{0}^{(2)}+\Theta _{11}^{(2)}a_{1}^{(2)}+\Theta _{12}^{(2)}a_{2}^{(2)}+\Theta _{13}^{(2)}a_{3}^{(2)}) hΘ(x)=g(Θ10(2)a0(2)+Θ11(2)a1(2)+Θ12(2)a2(2)+Θ13(2)a3(2))

上面进行的讨论中只是将特征矩阵中的一行(一个训练实例)喂给了神经网络,我们需要将整个训练集都喂给我们的神经网络算法来学习模型。

我们可以知道:每一个 a a a都是由上一层所有的 x x x和每一个 x x x所对应的决定的。

(我们把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION ))

x x x, θ \theta θ, a a a 分别用矩阵表示:

image.png

我们可以得到 θ ⋅ X = a \theta \cdot X=a θX=a

模型表示2

参考视频: 8 - 4 - Model Representation II (12 min).mkv
( FORWARD PROPAGATION )
相对于使用循环来编码,利用向量化的方法会使得计算更为简便。以上面的神经网络为例,试着计算第二层的值:
image.png
我们令 z ( 2 ) = θ ( 1 ) x {{z}^{\left( 2 \right)}}={{\theta }^{\left( 1 \right)}}x z(2)=θ(1)x,则 a ( 2 ) = g ( z ( 2 ) ) {{a}^{\left( 2 \right)}}=g({{z}^{\left( 2 \right)}}) a(2)=g(z(2)) ,计算后添加 a 0 ( 2 ) = 1 a_{0}^{\left( 2 \right)}=1 a0(2)=1。 计算输出的值为:
image.png
我们令 z ( 3 ) = θ ( 2 ) a ( 2 ) {{z}^{\left( 3 \right)}}={{\theta }^{\left( 2 \right)}}{{a}^{\left( 2 \right)}} z(3)=θ(2)a(2),则 h θ ( x ) = a ( 3 ) = g ( z ( 3 ) ) h_\theta(x)={{a}^{\left( 3 \right)}}=g({{z}^{\left( 3 \right)}}) hθ(x)=a(3)=g(z(3))
这只是针对训练集中一个训练实例所进行的计算。如果我们要对整个训练集进行计算,我们需要将训练集特征矩阵进行转置,使得同一个实例的特征都在同一列里。即:
${{z}^{\left( 2 \right)}}={{\Theta }^{\left( 1 \right)}}\times {{X}^{T}} $

a ( 2 ) = g ( z ( 2 ) ) {{a}^{\left( 2 \right)}}=g({{z}^{\left( 2 \right)}}) a(2)=g(z(2))

为了更好了了解Neuron Networks的工作原理,我们先把左半部分遮住:
image.png

右半部分其实就是以 a 0 , a 1 , a 2 , a 3 a_0, a_1, a_2, a_3 a0,a1,a2,a3, 按照Logistic Regression的方式输出 h θ ( x ) h_\theta(x) hθ(x)

image.png
其实神经网络就像是logistic regression,只不过我们把logistic regression中的输入向量 [ x 1 ∼ x 3 ] \left[ x_1\sim {x_3} \right] [x1x3] 变成了中间层的 [ a 1 ( 2 ) ∼ a 3 ( 2 ) ] \left[ a_1^{(2)}\sim a_3^{(2)} \right] [a1(2)a3(2)], 即: h θ ( x ) = g ( Θ 0 ( 2 ) a 0 ( 2 ) + Θ 1 ( 2 ) a 1 ( 2 ) + Θ 2 ( 2 ) a 2 ( 2 ) + Θ 3 ( 2 ) a 3 ( 2 ) ) h_\theta(x)=g\left( \Theta_0^{\left( 2 \right)}a_0^{\left( 2 \right)}+\Theta_1^{\left( 2 \right)}a_1^{\left( 2 \right)}+\Theta_{2}^{\left( 2 \right)}a_{2}^{\left( 2 \right)}+\Theta_{3}^{\left( 2 \right)}a_{3}^{\left( 2 \right)} \right) hθ(x)=g(Θ0(2)a0(2)+Θ1(2)a1(2)+Θ2(2)a2(2)+Θ3(2)a3(2))
我们可以把 a 0 , a 1 , a 2 , a 3 a_0, a_1, a_2, a_3 a0,a1,a2,a3看成更为高级的特征值,也就是 x 0 , x 1 , x 2 , x 3 x_0, x_1, x_2, x_3 x0,x1,x2,x3的进化体,并且它们是由 x x x θ \theta θ决定的,因为是梯度下降的,所以 a a a是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将 x x x次方厉害,也能更好的预测新数据。
这就是神经网络相比于逻辑回归和线性回归的优势。

这里理解就是通过初始特征,经过逐层向后找到更多特征,最后通过逻辑回归进行了分类。

特征和直观理解1

参考视频: 8 - 5 - Examples and Intuitions I (7 min).mkv
从本质上讲,神经网络能够通过学习得出其自身的一系列特征。在普通的逻辑回归中,我们被限制为使用数据中的原始特征 x 1 , x 2 , . . . , x n x_1,x_2,...,{{x}_{n}} x1,x2,...,xn,我们虽然可以使用一些二项式项来组合这些特征,但是我们仍然受到这些原始特征的限制。在神经网络中,原始特征只是输入层,在我们上面三层的神经网络例子中,第三层也就是输出层做出的预测利用的是第二层的特征,而非输入层中的原始特征,我们可以认为第二层中的特征是神经网络通过学习后自己得出的一系列用于预测输出变量的新特征。

神经网络中,单层神经元(无中间层)的计算可用来表示逻辑运算,比如逻辑与(AND)、逻辑或(OR)。

举例说明:逻辑与(AND);下图中左半部分是神经网络的设计与output层表达式,右边上部分是sigmod函数,下半部分是真值表。

我们可以用这样的一个神经网络表示AND 函数:
image.png
其中 θ 0 = − 30 , θ 1 = 20 , θ 2 = 20 \theta_0 = -30, \theta_1 = 20, \theta_2 = 20 θ0=30,θ1=20,θ2=20我们的输出函数 h θ ( x ) h_\theta(x) hθ(x)即为: h Θ ( x ) = g ( − 30 + 20 x 1 + 20 x 2 ) h_\Theta(x)=g\left( -30+20x_1+20x_2 \right) hΘ(x)=g(30+20x1+20x2)
我们知道 g ( x ) g(x) g(x)的图像是:

image.png
所以我们有: h Θ ( x ) ≈ x 1 AND   x 2 h_\Theta(x) \approx \text{x}_1 \text{AND} \, \text{x}_2 hΘ(x)x1ANDx2

所以我们的:$h_\Theta(x) $

这就是AND函数。

接下来再介绍一个OR函数:
image.png
ORAND整体一样,区别只在于的取值不同。

通过这节课可以发现,模型参数(权重)的不同可以实现or或and的功能

样本和直观理解II

参考视频: 8 - 6 - Examples and Intuitions II (10 min).mkv
二元逻辑运算符(BINARY LOGICAL OPERATORS)当输入特征为布尔值(0或1)时,我们可以用一个单一的激活层可以作为二元逻辑运算符,为了表示不同的运算符,我们只需要选择不同的权重即可。

下图的神经元(三个权重分别为-30,20,20)可以被视为作用同于逻辑与(AND):

image.png

下图的神经元(三个权重分别为-10,20,20)可以被视为作用等同于逻辑或(OR):
image.png

下图的神经元(两个权重分别为 10,-20)可以被视为作用等同于逻辑非(NOT):
image.png
我们可以利用神经元来组合成更为复杂的神经网络以实现更复杂的运算。例如我们要实现XNOR 功能(输入的两个值必须一样,均为1或均为0),即 XNOR = ( x 1   AND   x 2 )   OR ( ( NOT   x 1 ) AND ( NOT   x 2 ) ) ​ \text{XNOR}=( \text{x}_1\, \text{AND}\, \text{x}_2 )\, \text{OR} \left( \left( \text{NOT}\, \text{x}_1 \right) \text{AND} \left( \text{NOT}\, \text{x}_2 \right) \right)​ XNOR=(x1ANDx2)OR((NOTx1)AND(NOTx2))
首先构造一个能表达 ( NOT   x 1 ) AND ( NOT   x 2 ) ​ \left( \text{NOT}\, \text{x}_1 \right) \text{AND} \left( \text{NOT}\, \text{x}_2 \right)​ (NOTx1)AND(NOTx2)部分的神经元:
image.png
然后将表示 AND 的神经元和表示 ( NOT   x 1 ) AND ( NOT   x 2 ) ​ \left( \text{NOT}\, \text{x}_1 \right) \text{AND} \left( \text{NOT}\, \text{x}_2 \right)​ (NOTx1)AND(NOTx2)的神经元以及表示 OR 的神经元进行组合:
image.png
我们就得到了一个能实现 XNOR \text{XNOR} XNOR 运算符功能的神经网络。

按这种方法我们可以逐渐构造出越来越复杂的函数,也能得到更加厉害的特征值。

这就是神经网络的厉害之处。

多类分类

参考视频: 8 - 7 - Multiclass Classification (4 min).mkv
当我们有不止两种分类时(也就是 y = 1 , 2 , 3 … . y=1,2,3…. y=1,2,3.),比如以下这种情况,该怎么办?如果我们要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有4个值。例如,第一个值为1或0用于预测是否是行人,第二个值用于判断是否为汽车。

输入向量 x x x有三个维度,两个中间层,输出层4个神经元分别用来表示4类,也就是每一个数据在输出层都会出现 [ a   b   c   d ] T {{\left[ a\text{ }b\text{ }c\text{ }d \right]}^{T}} [a b c d]T,且 a , b , c , d a,b,c,d a,b,c,d中仅有一个为1,表示当前类。下面是该神经网络的可能结构示例:
image.png
神经网络算法的输出结果为四种可能情形之一:
image.png

作业练习

知识补充

作业描述

在本练习中,您将实现one-vs-all逻辑回归和神经网络来识别手写数字。在开始编程练习之前,我们强烈建议您观看视频讲座并完成相关主题的复习问题。
ex3data1.mat-手写数字训练集
ex3weights.mat-神经网络练习的初始权重

多类别分类

在本练习中,您将使用逻辑回归和神经网络识别手写数字(从0到9)。如今自动手写数字识别被广泛使用&从识别邮政编码开始,在邮件信封上识别写在银行支票上的金额。这练习将向您展示如何将所学的方法用于此分类任务。
在练习的第一部分中,您将扩展先前实现的逻辑回归,并将其应用于one-vs-all 分类。

数据集

您将获得ex3data1.mat中的一个数据集,其中包含5000个手写数字的训练示例。mat格式意味着数据具有保存为本机Octave/MATLAB矩阵格式,而不是文本(ASCII)格式,如csv文件。这些矩阵可以直接读取到您的程序。加载后,正确的矩阵维度和值将出现在程序的内存中。矩阵将已命名,因此不需要为其指定名称。
ex3data1.mat中有5000个训练示例,其中每个训练示例是数字的20像素乘20像素的灰度图像。每个像素由指示该位置处的灰度强度的浮点数表示。像素的20乘20网格被展开为400维向量。这些训练示例中的每一个都成为数据矩阵X中的一行。这给了我们一个5000乘400的矩阵X,其中每一行都是手写数字图像的训练示例。
image.png
训练集的第二部分是5000维向量y包含训练集的标签。为了使其与Octave/MATLAB索引更加兼容,在没有零索引的情况下,我们将数字0映射为值10。因此,数字0被标记为10,而数字“1”至“9”按其自然顺序被标记为“1”到“9”

可视化数据

您将首先可视化训练集的一个子集。在ex3.m的第1部分中,代码从X中随机选择100行,并将这些行传递给displayData函数。此函数将每行映射到20像素乘20像素的灰度图像,并将这些图像一起显示。我们已提供显示函数,运行此步骤后,您应该会看到如图:
image.png

向量化逻辑回归

您将使用多个one-vs-all 逻辑回归模型来构建多类分类器。由于有10个分类,你需要训练10个独立的逻辑回归分类器。为了提高训练效率重要的是要确保代码被很好地向量化。在本节中,您将实现逻辑回归的矢量化版本,该版本不使用任何for循环。您可以使用上一个练习中的代码作为起点完成这个练习。

向量化损失函数

我们将从编写代价函数的矢量化版本开始。回忆起在(非规则的)逻辑回归中,代价函数是
image.png
为了计算求和中的每个元素,对于每个示例i,我们必须计算 h θ ( x i ) h_θ(x^i) hθ(xi h θ ( x i ) = g ( θ T x i ) h_\theta(x^i)=g(\theta^Tx^i) hθ(xi)=g(θTxi) g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+ez1是sigmoid函数。事实证明,通过使用矩阵乘法,我们可以对所有的例子快速计算出这一点。让我们将X和θ定义为:
image.png
然后,通过计算矩阵乘积Xθ,我们得到:
image.png
在最后一个等式中,我们使用了这样一个事实,即如果a和b是向量,则 a T b = b T a a^Tb=b^Ta aTb=bTa。这使我们能够在一行代码中计算所有示例i的乘积 θ T x ( i ) θ^Tx^{(i)} θTx(i)
您的工作是在lrCostFunction.m文件中编写未规则化的成本函数,您的实现应该使用我们上面提出的策略来计算 θ T x ( i ) θ^Tx^{(i)} θTx(i)。您还应该对成本函数的其余部分使用矢量化方法。lrCostFunction.m的完全矢量化版本不应包含任何循环。

提示:您可能需要使用元素乘法运算(.*)和写此函数时的和运算和

向量化梯度

回想一下,(非规则化)逻辑回归成本的梯度是一个向量,其中第j个元素定义为
∂ J ∂ θ j = 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial{J}}{\partial{θ_j}} =\frac{1}{m}\sum\limits_{i=1}^{m}((h_θ(x^{(i)}) − y^{(i)})x_j^{(i)} θjJ=m1i=1m((hθ(x(i))y(i))xj(i)
为了在数据集上对该操作进行矢量化,我们首先明确地写出所有θj的所有偏导数,
image.png
这里:
image.png
注意, x ( i ) x^{(i)} xi是一个向量,而 ( h θ ( x ( i ) ) − y ( i ) ) (h_θ(x^{(i)})−y^{(i)}) (hθ(x(i))y(i))是标量(单个数)。为了理解推导的最后一步,设 β i = ( h θ ( x ( i ) ) − y ( i ) β_i=(h_θ(x^{(i)})−y^{(i)} βi=(hθ(x(i))y(i)注意:
image.png
上面的表达式允许我们不使用循环计算所有的偏导数。如果你对线性代数很熟悉,我们鼓励你通过上面的矩阵乘法来说服自己,矢量化版本可以进行同样的计算。现在应该实现等式1来计算正确的矢量化梯度。完成后,通过实现渐变来完成函数lrCostFunction.m。
:::info
调试提示:矢量化代码有时可能很棘手。一种常见的调试策略是使用size函数打印出正在处理的矩阵的大小。例如,给定大小为100×20的数据矩阵X(100个例子,20个特征)和维度为20×1的向量θ,你可以观察到Xθ是有效的乘法运算,而θX不是。此外,如果您有一个非矢量化版本的代码,您可以比较矢量化代码和非矢量化代码的输出,以确保它们产生相同的输出
:::

向量化正则化逻辑回归

在您实现了逻辑回归的矢量化之后,现在将正则化添加到成本函数中。回想一下,对于正则化逻辑回归,成本函数定义为:
image.png
注意,你不应该正则化θ0,它用于偏差项
相应地,正则化逻辑回归的偏导数θj的成本定义为:
image.png
再一次强调,您不应该在代码中放入任何循环。

One vs all 分类

在练习的这一部分中,您将通过训练多个正则化逻辑回归分类器来实现一对一全类分类,每个分类器用于我们数据集中的K个类(图1)。在手写数字数据集中,K=10,但您的代码应该适用于K的任何值。
现在您应该在oneVsAll.m中完成代码,为每个类训练一个分类器。特别是,你的代码应该返回矩阵 Θ ∈ R K × ( N + 1 ) Θ\in \reals^{K×(N+1)} ΘRK×(N+1)中的所有分类器参数,其中Θ的每一行对应于一个类的学习逻辑回归参数。您可以使用for从1到K的循环来完成此操作,独立训练每个分类器。
请注意,此函数的y参数是从1到的标签向量10,其中我们已将数字0映射到标签10(以避免混淆带索引)。
当训练类 K ∈ { 1 , . . . K } K\in\{1,...K\} K{1,...K}的分类器时,你会想要一个标签为y的m维向量,其中 y i ∈ { 0 , 1 } y_i\in\{0,1\} yi{0,1};指示第j个训练实例是否属于类 K ( y j = 1 ) K(y_j=1) K(yj=1),或者是否属于不同的类 ( y i = 0 ) (y_i=0) (yi=0)。您可能会发现逻辑阵列对此任务很有帮助。
此外,您将在本练习中使用fmincg(而不是fminunc)。fmincg的工作原理与fminunc类似,但在处理大量参数时效率更高。
在您正确完成oneVsAll.m的代码后,脚本ex3.m将继续使用oneVsAll函数来训练多类分类器。

One-vs-all Prediction

在训练了one-vs-all 分类器之后,您现在可以使用它来预测给定图像中包含的数字。对于每个输入,您应该使用经过训练的逻辑回归分类器计算它属于每个类别的“概率”。您的one-vs-all 预测函数将选择相应逻辑回归分类器输出最高概率的类别,并返回类别标签(1、2、…或K)作为输入示例的预测。
完成后,ex3.m将使用θ的学习值。您应该看到,训练集的准确率约为94.9%(即,它对训练集中94.9%的示例进行了正确分类)。

神经网络

在本练习的前一部分中,您实现了多类逻辑回归来识别手写数字。然而,逻辑回归不能形成更复杂的假设,因为它只是一个线性分类器。您可以在逻辑回归中添加更多的特征(如多项式特征),但这可能非常昂贵。
在练习的这一部分中,您将使用与以前相同的训练集实现一个神经网络来识别手写数字。神经网络将能够表示形成非线性假设的复杂模型。本周,您将使用我们已经训练过的神经网络的参数。您的目标是实现前馈传播算法,以使用我们的权重进行预测。在下周的练习中,您将编写用于学习神经网络参数的反向传播算法。

模型表示

我们的神经网络如图2所示。它有3层{一个输入层,一个隐藏层和一个输出层。回想一下,我们的输入是数字图像的像素值。由于图像的大小为20×20,这给了我们400个输入层单元(不包括总是输出+1的额外偏置单元)。和以前一样,训练数据将加载到变量X和y中。
您已获得一组网络参数(Θ(1);θ(2))已经由我们训练。这些存储在ex3weights.mat中,并将由ex3nn.m加载到Theta1和Theta2中。参数的尺寸为神经网络的尺寸,该神经网络在第二层中具有25个单元和10个输出单元(对应于10个数字类)
image.png

Feedforward Propagation and Prediction

现在,您将实现神经网络的前馈传播。您需要完成predict.m中的代码才能返回神经网络的预测
您应该实现前馈计算,为每个示例i计算 h θ ( x ( i ) ) h_θ{(x^{(i)}}) hθ(x(i))并返回相关的预测。类似于一对所有分类策略,来自神经网络的预测将是具有最大输出 h θ ( x ( i ) ) k h_θ{(x^{(i)}})_k hθ(x(i))k的标签。
完成后,ex3nn.m将使用
为Theta1和Theta2加载的一组参数。你应该看到,准确率约为97.5%。之后,一个交互式序列将启动显示训练集中的图像,每次一个,而控制台将打印出显示图像的预测标签。要停止图像序列,请按Ctrl-C

作业提交路径

3.neuralNetwork

相关内容

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值