• 关于

    神经网络激活函数

    的搜索结果

回答

激活函数的一些可取的属性包括:非线性:当激活函数是非线性的,然后一个两层神经网络可以证明是一个通用函数近似值.而identity激活函数不满足这个属性.当多层网络使用identity激活函数,整个网络就相当于一个单层模型.连续可微的:这个属性对基于梯度优化方法是必要的.二进制激活函数在0点没有可微性,它在其他值上全部可导为0,基于梯度优化方法对于它毫无进展.范围:当激活函数的范围是有限的,基于梯度的训练方法往往更稳定,因为模式显著影响几个有限权重.当范围是无限的,训练通常更有效率,因为模式显著影响大部分权重.在后一种情况下,较小的学习利率通常是必要的.单调:当激活函数是单调时,与单层模型相关的错误表面是凸的.平滑性:有单调导数的平滑函数已经被证明在某些情况下推广地更好.这些属性表明这些激活函数和Occam's razor更一致.原点附近近似identity:当激活函数有这个属性,对于小的随机值初始化权重,神经网络将有效地学习.当激活函数没有这个属性,在初始化权值必须使用特殊例子.在下面的表中,激活函数,表明有该属性.
aoteman675 2019-12-02 01:32:12 0 浏览量 回答数 0

回答

在神经网络中,激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。比如在下面的这个问题中: 如上图(图片来源),在最简单的情况下,数据是线性可分的,只需要一条直线就已经能够对样本进行很好地分类。 但如果情况变得复杂了一点呢?在上图中(图片来源),数据就变成了线性不可分的情况。在这种情况下,简单的一条直线就已经不能够对样本进行很好地分类了。 于是我们尝试引入非线性的因素,对样本进行分类。 在神经网络中也类似,我们需要引入一些非线性的因素,来更好地解决复杂的问题。而激活函数恰好能够帮助我们引入非线性因素,它使得我们的神经网络能够更好地解决较为复杂的问题。 激活函数的定义及其相关概念在ICML2016的一篇论文Noisy Activation Functions中,作者将激活函数定义为一个几乎处处可微的 h : R → R 。 在实际应用中,我们还会涉及到以下的一些概念:a.饱和当一个激活函数h(x)满足limn→+∞h′(x)=0时我们称之为右饱和。 当一个激活函数h(x)满足limn→−∞h′(x)=0时我们称之为左饱和。当一个激活函数,既满足左饱和又满足又饱和时,我们称之为饱和。 b.硬饱和与软饱和对任意的x,如果存在常数c,当x>c时恒有 h′(x)=0则称其为右硬饱和,当x
浮生递归 2019-12-02 01:32:12 0 浏览量 回答数 0

回答

由于relu函数的激活特点,在反向传播中,在激活值大于0时,梯度为常数,不容易出现梯度消失,从而形成深层网络的训练。 而sigmoid和tanh函数的敏感区域较小,如[-1,1],在敏感区域内,具有较好的激活性,但超过敏感区域时,函数激活处于饱和状态,不利于后向传播中的误差梯度求导,从而影响神经网络的参数更新和神经网络的最终精度。
不语奈何 2020-01-09 16:50:52 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

100+款试用云产品,最长免费试用12个月!拨打95187-1,咨询专业上云建议!

回答

我们常常用深度学习这个术语来指训练神经网络的过程。有时它指的是特别大规模的神经网络训练。那么神经网络究竟是什么呢?在这个视频中,我会讲解一些直观的基础知识。 让我们从一个房价预测的例子开始讲起。 假设你有一个数据集,它包含了六栋房子的信息。所以,你知道房屋的面积是多少平方英尺或者平方米,并且知道房屋价格。这时,你想要拟合一个根据房屋面积预测房价的函数。 如果你对线性回归很熟悉,你可能会说:“好吧,让我们用这些数据拟合一条直线。”于是你可能会得到这样一条直线 但有点奇怪的是,你可能也发现了,我们知道价格永远不会是负数的。因此,为了替代一条可能会让价格为负的直线,我们把直线弯曲一点,让它最终在零结束。这条粗的蓝线最终就是你的函数,用于根据房屋面积预测价格。有部分是零,而直线的部分拟合的很好。你也许认为这个函数只拟合房屋价格。 作为一个神经网络,这几乎可能是最简单的神经网络。我们把房屋的面积作为神经网络的输入(我们称之为),通过一个节点(一个小圆圈),最终输出了价格(我们用表示)。其实这个小圆圈就是一个单独的神经元。接着你的网络实现了左边这个函数的功能。 在有关神经网络的文献中,你经常看得到这个函数。从趋近于零开始,然后变成一条直线。这个函数被称作ReLU激活函数,它的全称是Rectified Linear Unit。rectify(修正)可以理解成,这也是你得到一个这种形状的函数的原因。 你现在不用担心不理解ReLU函数,你将会在这门课的后面再次看到它。 如果这是一个单神经元网络,不管规模大小,它正是通过把这些单个神经元叠加在一起来形成。如果你把这些神经元想象成单独的乐高积木,你就通过搭积木来完成一个更大的神经网络。 让我们来看一个例子,我们不仅仅用房屋的面积来预测它的价格,现在你有了一些有关房屋的其它特征,比如卧室的数量,或许有一个很重要的因素,一家人的数量也会影响房屋价格,这个房屋能住下一家人或者是四五个人的家庭吗?而这确实是基于房屋大小,以及真正决定一栋房子是否能适合你们家庭人数的卧室数。 换个话题,你可能知道邮政编码或许能作为一个特征,告诉你步行化程度。比如这附近是不是高度步行化,你是否能步行去杂货店或者是学校,以及你是否需要驾驶汽车。有些人喜欢居住在以步行为主的区域,另外根据邮政编码还和富裕程度相关(在美国是这样的)。但在其它国家也可能体现出附近学校的水平有多好。 在图上每一个画的小圆圈都可以是ReLU的一部分,也就是指修正线性单元,或者其它稍微非线性的函数。基于房屋面积和卧室数量,可以估算家庭人口,基于邮编,可以估测步行化程度或者学校的质量。最后你可能会这样想,这些决定人们乐意花费多少钱。 对于一个房子来说,这些都是与它息息相关的事情。在这个情景里,家庭人口、步行化程度以及学校的质量都能帮助你预测房屋的价格。以此为例, 是所有的这四个输入, 是你尝试预测的价格,把这些单个的神经元叠加在一起,我们就有了一个稍微大一点的神经网络。这显示了神经网络的神奇之处,虽然我已经描述了一个神经网络,它可以需要你得到房屋面积、步行化程度和学校的质量,或者其它影响价格的因素。 在于,当你实现它之后,你要做的只是输入,就能得到输出。因为它可以自己计算你训练集中样本的数目以及所有的中间过程。所以,你实际上要做的就是:这里有四个输入的神经网络,这输入的特征可能是房屋的大小、卧室的数量、邮政编码和区域的富裕程度。给出这些输入的特征之后,神经网络的工作就是预测对应的价格。同时也注意到这些被叫做隐藏单元圆圈,在一个神经网络中,它们每个都从输入的四个特征获得自身输入,比如说,第一个结点代表家庭人口,而家庭人口仅仅取决于和特征,换句话说,在神经网络中,你决定在这个结点中想要得到什么,然后用所有的四个输入来计算想要得到的。因此,我们说输入层和中间层被紧密的连接起来了。 值得注意的是神经网络给予了足够多的关于和的数据,给予了足够的训练样本有关和。神经网络非常擅长计算从到的精准映射函数。 这就是一个基础的神经网络。你可能发现你自己的神经网络在监督学习的环境下是如此的有效和强大,也就是说你只要尝试输入一个,即可把它映射成,就好像我们在刚才房价预测的例子中看到的效果。 在下一个视频中,让我们复习一下更多监督学习的例子,有些例子会让你觉得你的网络会十分有用,并且你实际应用起来也是如此。
因为相信,所以看见。 2020-05-19 20:30:52 0 浏览量 回答数 0

回答

深度学习和大脑有什么关联性吗? 关联不大。 那么人们为什么会说深度学习和大脑相关呢? 当你在实现一个神经网络的时候,那些公式是你在做的东西,你会做前向传播、反向传播、梯度下降法,其实很难表述这些公式具体做了什么,深度学习像大脑这样的类比其实是过度简化了我们的大脑具体在做什么,但因为这种形式很简洁,也能让普通人更愿意公开讨论,也方便新闻报道并且吸引大众眼球,但这个类比是非常不准确的。 一个神经网络的逻辑单元可以看成是对一个生物神经元的过度简化,但迄今为止连神经科学家都很难解释究竟一个神经元能做什么,它可能是极其复杂的;它的一些功能可能真的类似logistic回归的运算,但单个神经元到底在做什么目前还没有人能够真正可以解释。 深度学习的确是个很好的工具来学习各种很灵活很复杂的函数,学习到从到的映射,在监督学习中学到输入到输出的映射。 但这个类比还是很粗略的,这是一个logistic回归单元的sigmoid激活函数,这里是一个大脑中的神经元,图中这个生物神经元,也是你大脑中的一个细胞,它能接受来自其他神经元的电信号,比如,或可能来自于其他神经元 。其中有一个简单的临界计算值,如果这个神经元突然激发了,它会让电脉冲沿着这条长长的轴突,或者说一条导线传到另一个神经元。 所以这是一个过度简化的对比,把一个神经网络的逻辑单元和右边的生物神经元对比。至今为止其实连神经科学家们都很难解释,究竟一个神经元能做什么。一个小小的神经元其实却是极其复杂的,以至于我们无法在神经科学的角度描述清楚,它的一些功能,可能真的是类似logistic回归的运算,但单个神经元到底在做什么,目前还没有人能够真正解释,大脑中的神经元是怎么学习的,至今这仍是一个谜之过程。到底大脑是用类似于后向传播或是梯度下降的算法,或者人类大脑的学习过程用的是完全不同的原理。 所以虽然深度学习的确是个很好的工具,能学习到各种很灵活很复杂的函数来学到从x到y的映射。在监督学习中,学到输入到输出的映射,但这种和人类大脑的类比,在这个领域的早期也许值得一提。但现在这种类比已经逐渐过时了,我自己也在尽量少用这样的说法。 这就是神经网络和大脑的关系,我相信在计算机视觉,或其他的学科都曾受人类大脑启发,还有其他深度学习的领域也曾受人类大脑启发。但是个人来讲我用这个人类大脑类比的次数逐渐减少了。
因为相信,所以看见。 2020-05-20 15:51:28 0 浏览量 回答数 0

回答

#coding=utf-8 import numpy as np import matplotlib.pylab as plt import random class NeuralNetwork(object): def __init__(self, sizes, act, act_derivative, cost_derivative): #sizes表示神经网络各层的神经元个数,第一层为输入层,最后一层为输出层 #act为神经元的激活函数 #act_derivative为激活函数的导数 #cost_derivative为损失函数的导数 self.num_layers = len(sizes) self.sizes = sizes self.biases = [np.random.randn(nueron_num, 1) for nueron_num in sizes[1:]] self.weights = [np.random.randn(next_layer_nueron_num, nueron_num) for nueron_num, next_layer_nueron_num in zip(sizes[:-1], sizes[1:])] self.act=act self.act_derivative=act_derivative self.cost_derivative=cost_derivative #前向反馈(正向传播) def feedforward(self, a): #逐层计算神经元的激活值,公式(4) for b, w in zip(self.biases, self.weights): a = self.act(np.dot(w, a)+b) return a #随机梯度下降算法 def SGD(self, training_data, epochs, batch_size, learning_rate): #将训练样本training_data随机分为若干个长度为batch_size的batch #使用各个batch的数据不断调整参数,学习率为learning_rate #迭代epochs次 n = len(training_data) for j in range(epochs): random.shuffle(training_data) batches = [training_data[k:k+batch_size] for k in range(0, n, batch_size)] for batch in batches: self.update_batch(batch, learning_rate) print("Epoch {0} complete".format(j)) def update_batch(self, batch, learning_rate): #根据一个batch中的训练样本,调整各个参数值 nabla_b = [np.zeros(b.shape) for b in self.biases] nabla_w = [np.zeros(w.shape) for w in self.weights] for x, y in batch: delta_nabla_b, delta_nabla_w = self.backprop(x, y) nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)] nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)] #计算梯度,并调整各个参数值 self.weights = [w-(learning_rate/len(batch))*nw for w, nw in zip(self.weights, nabla_w)] self.biases = [b-(learning_rate/len(batch))*nb for b, nb in zip(self.biases, nabla_b)] #反向传播 def backprop(self, x, y): #保存b和w的偏导数值 nabla_b = [np.zeros(b.shape) for b in self.biases] nabla_w = [np.zeros(w.shape) for w in self.weights] #正向传播 activation = x #保存每一层神经元的激活值 activations = [x] #保存每一层神经元的z值 zs = [] for b, w in zip(self.biases, self.weights): z = np.dot(w, activation)+b zs.append(z) activation = self.act(z) activations.append(activation) #反向传播得到各个参数的偏导数值 #公式(13) d = self.cost_derivative(activations[-1], y) * self.act_derivative(zs[-1]) #公式(17) nabla_b[-1] = d #公式(14) nabla_w[-1] = np.dot(d, activations[-2].transpose()) #反向逐层计算 for l in range(2, self.num_layers): z = zs[-l] sp = self.act_derivative(z) #公式(36),反向逐层求参数偏导 d = np.dot(self.weights[-l+1].transpose(), d) * sp #公式(38) nabla_b[-l] = d #公式(37) nabla_w[-l] = np.dot(d, activations[-l-1].transpose()) return (nabla_b, nabla_w) #距离函数的偏导数 def distance_derivative(output_activations, y): #损失函数的偏导数 return 2*(output_activations-y) # sigmoid函数 def sigmoid(z): return 1.0/(1.0+np.exp(-z)) # sigmoid函数的导数 def sigmoid_derivative(z): return sigmoid(z)*(1-sigmoid(z)) if __name__ == "__main__": #创建一个5层的全连接神经网络,每层的神经元个数为1,8,5,3,1 #其中第一层为输入层,最后一层为输出层 network=NeuralNetwork([1,8,5,3,1],sigmoid,sigmoid_derivative,distance_derivative) #训练集样本 x = np.array([np.linspace(-7, 7, 200)]).T #训练集结果,由于使用了sigmoid作为激活函数,需保证其结果落在(0,1)区间内 y = (np.cos(x)+1)/2 #使用随机梯度下降算法(SGD)对模型进行训练 #迭代5000次;每次随机抽取40个样本作为一个batch;学习率设为0.1 training_data=[(np.array([x_value]),np.array([y_value])) for x_value,y_value in zip(x,y)] network.SGD(training_data,5000,40,0.1) #测试集样本 x_test = np.array([np.linspace(-9, 9, 120)]) #测试集结果 y_predict = network.feedforward(x_test) #图示对比训练集和测试集数据 plt.plot(x,y,'r',x_test.T,y_predict.T,'*') plt.show()
珍宝珠 2019-12-02 03:22:25 0 浏览量 回答数 0

回答

所以我想要让一个监督学习算法达到实用,基本上希望或者假设你可以完成两件事情。首先,你的算法对训练集的拟合很好,这可以看成是你能做到可避免偏差很低。还有第二件事你可以做好的是,在训练集中做得很好,然后推广到开发集和测试集也很好,这就是说方差不是太大。 在正交化的精神下,你可以看到这里有第二组旋钮,可以修正可避免偏差问题,比如训练更大的网络或者训练更久。还有一套独立的技巧可以用来处理方差问题,比如正则化或者收集更多训练数据。 总结一下前几段视频我们见到的步骤,如果你想提升机器学习系统的性能,我建议你们看看训练错误率和贝叶斯错误率估计值之间的距离,让你知道可避免偏差有多大。换句话说,就是你觉得还能做多好,你对训练集的优化还有多少空间。然后看看你的开发错误率和训练错误率之间的距离,就知道你的方差问题有多大。换句话说,你应该做多少努力让你的算法表现能够从训练集推广到开发集,算法是没有在开发集上训练的。 如果你想用尽一切办法减少可避免偏差,我建议试试这样的策略:比如使用规模更大的模型,这样算法在训练集上的表现会更好,或者训练更久。使用更好的优化算法,比如说加入momentum或者RMSprop,或者使用更好的算法,比如Adam。你还可以试试寻找更好的新神经网络架构,或者说更好的超参数。这些手段包罗万有,你可以改变激活函数,改变层数或者隐藏单位数,虽然你这么做可能会让模型规模变大。或者试用其他模型,其他架构,如循环神经网络和卷积神经网络。在之后的课程里我们会详细介绍的,新的神经网络架构能否更好地拟合你的训练集,有时也很难预先判断,但有时换架构可能会得到好得多的结果。
因为相信,所以看见。 2020-05-20 17:23:22 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT 阿里云科技驱动中小企业数字化