【吴恩达机器学习笔记】七、神经网络

简介: 【吴恩达机器学习笔记】七、神经网络

七、神经网络


1. 非线性假设

在前面讨论逻辑回归问题时,我们提到了分类问题,而且可以通过对特征进行多项式展开,让逻辑回归支持非线性的分类问题,但是当特征量非常非常大时,这对计算机性能是一个很大的考验。


举个例子,我们想要区分一幅图像是否是汽车图像,假定图像分辨率为50×50,且每个像素的灰度都为一个特征,那么一副图像的特征维度就高达2500维,进行二次多项式扩展后,特征维度更是达到了约三百多万。

954aeb7e08d5489da1144ed4a6348aef.png



因此,就需要考虑用新的机器学习模型来处理高维特征的非线性分类问题,神经网络是典型的不需要增加特征数目就能完成非线性分类问题的模型。


2. 神经网络

背景


神经网络起源于人们想要模拟人类大脑的想法,但是在80s到90s这段时间,神经网络慢慢淡出人们的视野,在早些年神经网络才重新回归到人们的视野。这是因为随着如今计算机越来越发达,可以支持神经网络这种计算量特别大的算法了。


神经网络就是模仿了大脑的神经元或神经网络,就像下面的图中一样,从树突输入信息,然后处理后从轴突输出信息。


33ee2982e2d24982a3281c4c1c9bcdcd.png


下面我们将用一个简单的模型来模仿神经元工作,我们将神经元模仿成逻辑单元。


8b363d0d1e0a4bafa4a7bae8163f18c3.png


我们可以输入x1,x2,x3就像从树突输入一样,然后经过计算处理,从类似于轴突一样输出信息,最后计算出h(θ),这种神经元有时候被称为带有simoid(logistic)激活函数的人工神经元。


而神经网络就是由这些神经元来组成的,如下:


7c2970a4547d4091b86fba0035bff215.png


第一层被称为输入层,最后一层被称为输出层,而其他的层就被称为隐藏层,而隐藏层一般都有很多层。


接下来,我将为你介绍一些常用的表达,就用上面这个简单的神经网络为例:


ai(j)表示第j层的第i个元素。

θ(j)表示第j层到第j+1层的每个相连的权值,就如上面公式中θ10(1)等,通俗讲就是图中的每一条线就有一个权值。

a235e3586c94488c9f6e051979020b19.png


上面a1(2),a2(2),a3(2)就是代表隐藏层神经元的表达式,hθ(x)就是输出层神经元的表达式,而g(z)函数用的是sigmod函数。


如果神经元第j层有sj个神经元,而第j+1层有sj+1个神经元的话,则θ(j)的维数将是sj+1×(sj+1)。


而上面a中的θx我们就可以用z来表示,如下:

9629997e9fa845e4b105f26d3bf33825.png



接下来,我将讲一些例子,让你能够更好的理解神经网络,在此之前我先介绍一下XOR与XNOR。


x1 XOR x2作用是当x1与x2当中只要有一个为1,那么y就为1,反之都为0。


x1 XNOR x2与NOT(x1 XOR x2)意思相同,都是上面那个的对立面即当x1和x2都为1或0时,y为1,反之,y为0。


b2149ad648254dda9ba38d3024ef5b2b.png


AND函数


我们通过在输出层额外加一个偏置单元,通过sigmod函数得到AND的功能。


89ac906403a149b5af8d5a60a0e0e54b.png


OR函数


与上面AND函数实现相似,都是利用sigmod函数,只是将假设函数内部进行改变。


2c50cab2bb584fc2bd1bfb7e1ab83e38.png


NOT函数


同样利用sigmod函数。

0a70b2f8a57d45068d3c0cce4080580f.png



x1 XNOR x2


这个实现实际上就是将前面提到的三个函数进行了一个整合,结合到一个神经元中。


920720751ae048b9b96aa5b0ea21dd4f.png


3. 多元分类

这里我将介绍一个多元分类的例子,输出层有多项。


39cbc1fcecec40ee8910c56399bd44f8.png


这里我们就要通过输入训练集,然后得到不同的y值,如下所示:

cae6f17ca80e4852925192cc013227d2.png



4. 代价函数

我先介绍一下这节课要用到的表达方式,如下:


L表示的是第几层神经网络。

sl表示第l层有多少个神经元。

K表示输出层的类别数量。


493dfecc3519491dbfb4b1b829287000.png

除此之外,我们来谈谈关于神经网络的分类问题,它可以分为二元分类及多元分类两种问题。


二元分类(Binary classification):这种问题输出层只有一个神经元,即直接输出h(θ)的值。

多元分类(Multi-class classification):这个问题只有当分的类别大于等于3即k≥3时才会用到一对多的方法。

下面就是神经网络的代价函数:


89570c1a870842a88448e9095461ef7e.png


5. 反向传播算法

接下来要讲的算法是可以用来优化整个神经网络,同时其中所计算的δ也是用来计算上面代价函数中的导数项,首先先来认识一下表达方式:


δj(l)表示第l层的第j个神经元。

75cdab0891fe4eba9051bf81cd7fcf0e.png


反向传播算法就是从最后一层即输出层进行计算,然后依次往前计算,实际上就是将后面层的误差往前面进行传播,而上面这张图中的例子只是拿一个训练样本举例,当训练样本变得特别多时,我们就要像下面一样这么做:


62480869c5d84e4088dcfbab92e50e15.png


上面的△就是δ,这其中其实就是进行了循环计算,最后得到Dij(l)用于导数的计算。


为了更好理解反向传播算法,我们先来回顾一下前馈传播算法。



285b7c24b70e47fe856c288026ee70f6.png

就拿其中一个神经元为例,它就是前面那层的所有神经元加权之后的和。


接下来,再来看看反向传播算法的代价函数,下面给出的是只有一个神经元输出的情况,多个神经元输出的话,前面会考虑到K值。

346de3b098b447c2ab8c35bb19ae5140.png



当我们只考虑一个样例时,就可以令λ等于0,这样就不用考虑正则化了,所以可以删去一些式子。


1f29d218f59742fcb8a12a8822736590.png


为了更方便理解,我们可以将这个代价函数看成是方差函数,用于判断实际值与真实值偏差有多大,从而判断准确度是否精确,实际中我们的代价函数一般是包含对数等复杂函数。



a772f311036a483b8a3c7a86e366260c.png

再更深入的进行理解一下,反向传播算法所算的δj(l)实际上就是第l层第j个神经元的误差,正规点说可以将它当成对zj(l)求偏导数。


我们也可以在前向传播算法图中去理解反向传播算法,这其实就是前向传播的你过程,就如下图中δ2(2)与δ2(3)的公式,实际上就是将后一层的δ乘以一个权重在求和,而在此偏置单元不算近δ中,当然你也可以另外设置算法将它包含进来。


96ebb194c6de48299cdbf2b1e15be43a.png


6. 梯度验证

在进行梯度计算时,尤其是在反向传播中进行梯度计算时,可能会会遇到一些bug,所以我们可以采用一些方法来确保我们的反向传播包括前向传播得出的结果是对的。


首先我们先来看看梯度数值估计的一个例子,如下:


e7fc50961cbd451bac9b303c11e47350.png


我们可以去一个非常小的距离来计算曲线上一点的斜率,就能得到θ的偏导数,而其中ε一般去10-4,而图上的左边式子是双侧差分,右边的是单侧差分,而双侧差分的结果更准确,所以我们一般都用双侧差分。


现在,我们再来考虑一下当θ为向量的时候,可以得到下面这一系列的式子。

2fbfc59fd7154faba721f32019c17747.png



所以这上面算出来的导数值就可以拿去跟反向传播计算出的导数值进行对比,如果数值相等或者十分接近,就说明反向传播算出的导数值是正确的,就可以将反向传播计算得导数值用在别处。


重点:当你已经用梯度检测方法确认了反向传播得出的导数值是正确时,就不要再用梯度检测了,因为相对于非常高效的反向传播算法,梯度检测的计算量非常大,会使你的程序变得非常的慢。


7. 随机初始化

我们先来考虑一个情况,如果我们将所有θ都初始化为零,那么就会出现无论怎样训练神经网络,得到的结果都会是一样,就如下面所示,所算出来的a或者δ再或者偏导都会相同。


454cff59cd814a20974cfe98498e198f.png


而上面这种情况就被称为对称权重问题,而解决这个问题的方法就是随机初始化θ。


a7f62575413d4e6c8700d9c4c8dde38c.png


我们通常会将θ初始化在一个接近于0的范围即[-ε,ε],但这里的ε跟我们上面遇到的ε并不是同一个东西,需要注意。


8. 小结

现在我们先对上面的知识进行一次小结,首先先来回顾一下神经网络框架。


7ed8840e1b574cfda3b0c16e50baf525.png


输入层的神经元个数,代表着特征的维度;输出层的神经元个数,代表着类别的数量。


而一般情况下,默认只有一层隐藏层,如果隐藏层大于1,每一层隐藏层的数量默认相同,并且一般隐藏层越多越好。


接下来,再来回顾一下神经网络训练的步骤:

a2a2f859ef6d4be68e96ed6b22f6f19c.png



1.随机初始化权重值θ。

2.执行向前传播算法得到所有的hθ(x(i))。

3.执行代码去计算代价函数J(θ)。

4.执行反向传播算法求得偏导数的值,这里第一次计算一般用循环去遍历每一个样本。


2b0b502aaef6493abc989eecb62da2b3.png

5.通过梯度检测确保反向传播得到的偏导数与数值算出的偏导数相近,然后停止使用梯度检测。

6.最后,利用梯度下降或者其他高级优化算法和反向传播算出的偏导数一起去找到关于θ的J(θ)的最小值。

另外,神经网络的J(θ)是非凸函数,理论上梯度下降的算法可以找到一个最优解,即使不是全局最优解。


cbd42303ed0b4b51a6540d80881f113f.png


最后,再来看看这张图,我们通过梯度下降来寻找最优解,如果J(θ)处于最低点,我们可以得到hθ(x(i))是十分接近于y(i)的,如果J(θ)处于最高点,那么hθ(x(i))远离y(i)的。


目录
相关文章
|
1月前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
113 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
1月前
|
机器学习/深度学习 数据可视化 计算机视觉
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
这篇文章详细介绍了如何通过可视化深度学习中每层特征层来理解网络的内部运作,并使用ResNet系列网络作为例子,展示了如何在训练过程中加入代码来绘制和保存特征图。
63 1
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
|
1月前
|
机器学习/深度学习 数据可视化 Windows
深度学习笔记(七):如何用Mxnet来将神经网络可视化
这篇文章介绍了如何使用Mxnet框架来实现神经网络的可视化,包括环境依赖的安装、具体的代码实现以及运行结果的展示。
54 0
|
1月前
|
机器学习/深度学习 编解码 算法
轻量级网络论文精度笔记(三):《Searching for MobileNetV3》
MobileNetV3是谷歌为移动设备优化的神经网络模型,通过神经架构搜索和新设计计算块提升效率和精度。它引入了h-swish激活函数和高效的分割解码器LR-ASPP,实现了移动端分类、检测和分割的最新SOTA成果。大模型在ImageNet分类上比MobileNetV2更准确,延迟降低20%;小模型准确度提升,延迟相当。
58 1
轻量级网络论文精度笔记(三):《Searching for MobileNetV3》
|
1月前
|
机器学习/深度学习 网络架构 计算机视觉
目标检测笔记(一):不同模型的网络架构介绍和代码
这篇文章介绍了ShuffleNetV2网络架构及其代码实现,包括模型结构、代码细节和不同版本的模型。ShuffleNetV2是一个高效的卷积神经网络,适用于深度学习中的目标检测任务。
74 1
目标检测笔记(一):不同模型的网络架构介绍和代码
|
1月前
|
XML 开发工具 Android开发
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
ExoPlayer最初是为了解决Android早期MediaPlayer控件对网络视频兼容性差的问题而推出的。现在,Android官方已将其升级并纳入Jetpack的Media3库,使其成为音视频操作的统一引擎。新版ExoPlayer支持多种协议,解决了设备和系统碎片化问题,可在整个Android生态中一致运行。通过修改`build.gradle`文件、布局文件及Activity代码,并添加必要的权限,即可集成并使用ExoPlayer进行网络视频播放。具体步骤包括引入依赖库、配置播放界面、编写播放逻辑以及添加互联网访问权限。
141 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
|
1月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
58 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
1月前
|
机器学习/深度学习 计算机视觉 Python
模型预测笔记(三):通过交叉验证网格搜索机器学习的最优参数
本文介绍了网格搜索(Grid Search)在机器学习中用于优化模型超参数的方法,包括定义超参数范围、创建参数网格、选择评估指标、构建模型和交叉验证策略、执行网格搜索、选择最佳超参数组合,并使用这些参数重新训练模型。文中还讨论了GridSearchCV的参数和不同机器学习问题适用的评分指标。最后提供了使用决策树分类器进行网格搜索的Python代码示例。
66 1
|
1月前
|
机器学习/深度学习 数据采集 算法
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
这篇博客文章介绍了如何使用包含多个网络和多种训练策略的框架来完成多目标分类任务,涵盖了从数据准备到训练、测试和部署的完整流程,并提供了相关代码和配置文件。
56 0
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
|
1月前
|
编解码 人工智能 文件存储
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
YOLOv7是一种新的实时目标检测器,通过引入可训练的免费技术包和优化的网络架构,显著提高了检测精度,同时减少了参数和计算量。该研究还提出了新的模型重参数化和标签分配策略,有效提升了模型性能。实验结果显示,YOLOv7在速度和准确性上超越了其他目标检测器。
48 0
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》

热门文章

最新文章

下一篇
无影云桌面