草庐IT

什么是神经网络?

风来12 2023-07-26 原文

神经网络,也称为人工神经网络 (ANN) 或模拟神经网络 (SNN),是机器学习的子集,并且是深度学习算法的核心。其名称和结构是受人类大脑的启发,模仿了生物神经元信号相互传递的方式。

一、神经元的组成

每个神经元包含wx+b的运算和一个激活函数组成。

将各个节点想象成其自身的线性回归模型,由输入数据、权重、偏差(或阈值)和输出组成。公式大概是这样的:

∑wixi + bias = w1x1 + w2x2 + w3x3 + bias

一旦确定了输入层,就会分配权重W。 这些权重有助于确定任何给定变量的重要性,与其他输入相比,较大的权重对输出的贡献更大。 将所有输入乘以其各自的权重,然后求和。 之后,输出通过一个激活函数传递,该函数决定了输出结果。

如下:是具有两个神经元的计算过程

二、激活函数

激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。类似于人类大脑中基于神经元的模型,激活函数最终决定了要发射给下一个神经元的内容。

1.Sigmoid 激活函数

Sigmoid 函数的图像看起来像一个 S 形曲线。

函数表达式如下:

在什么情况下适合使用 Sigmoid 激活函数呢?

Sigmoid 函数的输出范围是 0 到 1。由于输出值限定在 0 到 1,因此它对每个神经元的输出进行了归一化;

用于将预测概率作为输出的模型。由于概率的取值范围是 0 到 1,因此 Sigmoid 函数非常合适;

梯度平滑,避免「跳跃」的输出值;

函数是可微的。这意味着可以找到任意两个点的 sigmoid 曲线的斜率;

明确的预测,即非常接近 1 或 0。

Sigmoid 激活函数有哪些缺点?

倾向于梯度消失;

函数输出不是以 0 为中心的,这会降低权重更新的效率;

Sigmoid 函数执行指数运算,计算机运行得较慢。

2. Tanh / 双曲正切激活函数

3. ReLU 激活函数

ReLU 激活函数图像如上图所示,函数表达式如下:

ReLU 函数是深度学习中较为流行的一种激活函数,相比于 sigmoid 函数和 tanh 函数,它具有如下优点:

当输入为正时,不存在梯度饱和问题。

计算速度快得多。ReLU 函数中只存在线性关系,因此它的计算速度比 sigmoid 和 tanh 更快。

4. Leaky ReLU

5. ELU

6. Softmax

三、损失函数

影响神经网络训练的因素有很多,比如Loss函数,网络结构,参数优化,训练时间等,本节我们主要对loss函数进行介绍,损失函数可以表示为 L(y,f(x)) ,用以衡量真实值 y和预测值 f(x)之间不一致的程度,一般越小越好。为了便于不同损失函数的比较,常将其表示为单变量的函数,在回归问题中这个变量为 [y−f(x)] ,残差;在分类问题中为 [yf(x)] 趋势一致。

回归问题

(1)MSE 均方误差

均方误差(MSE)是回归损失函数中最常用的误差,也常被称为L2 loss,它是预测值与目标值之间差值的平方和,其公式如下所示:

优点:各点都连续光滑,方便求导,具有较为稳定的解。

缺点:不是特别的稳健,因为当函数的输入值距离中心值较远的时候,使用梯度下降法求解的时候梯度很大,可能导致梯度爆炸。

(2)平均绝对误差

平均绝对误差(MAE)是另一种常用的回归损失函数,也常被称为L1 loss,它是目标值与预测值之差绝对值的和,表示了预测值的平均误差幅度,而不需要考虑误差的方向,范围是0到∞,其公式如下所示:

分类问题

(1)0-1损失函数

以二分类问题为例,错误率=1-正确率,也就是0-1损失函数,可以定义为

(2) 绝对值损失函数

L(Y,f(X)=|Y−f(X)|

(3) Softmax Loss

对于多分类问题,也可以使用Softmax Loss。

机器学习模型的 Softmax 层,正确类别对于的输出是:

二分类问题用 One Hot Label + Cross Entropy Loss 或者Logistic loss

多分类问题用softmax, 它是sigmoid函数在多分类问题上的推广。

四、根据梯度计算出使损失函数最小的W

梯度是神经网络里绕不开的一个概念。

一句话:梯度是一个向量,用来指明在函数的某一点,沿着哪个方向函数值上升最快,这个向量的模指明函数值上升程度(速度)的大小。

接下来举例

本质上,梯度就是一个向量,如果函数是n元函数,这个向量就是由n个元素组成。如果是二元函数,

这个向量就是:

计算方式为求偏导,然后带入点值。

可以得到在(1,1)这一点,沿着方向(3,1)函数值上升速度最快。

如图,红色是函数C(x,y)的图像,在(1,1)这一点,可以看到沿着(3,1)移动,函数值(Z轴)是上升最快的。

在神经网络中,我们经常要找一个函数的最小值,这个函数即损失(loss)关于网络中各个参数(parameter)的权重的函数。

如果我们算出这个函数的梯度,我们就知道对每一个参数,如何设置能够使损失上升最快。

那么我们减去这个梯度(即参数vector减去梯度vector),就能使损失下降最快了。

再加一个学习率,就能控制这个下降速度了。

有关什么是神经网络?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  6. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  7. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  8. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  9. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  10. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

随机推荐