精华内容
下载资源
问答
  • 指数函数设置权重

    千次阅读 2016-02-22 11:45:23
    今天读paper的时候突然受到了一点小小的启发,之前没怎么注意到,也算是一个小技巧吧!比如说一个矩阵由若干个列向量...如果距离用欧式距离来定义的话,我自己的第一直觉是直接通过一个倒数函数就解决了。但出于做论

    今天读paper的时候突然受到了一点小小的启发,之前没怎么注意到,也算是一个小技巧吧!比如说一个矩阵由若干个列向量组成,为了考虑列向量之间的结构信息,我需要定义一个权重,如果两个列向量a,b距离比较近,那我希望赋予这两个列向量一个较大的权重Wab;如果这两个列向量a,b距离比较远,那我希望给它们一个较小的权重。如果距离用欧式距离来定义的话,我自己的第一直觉是直接通过一个倒数函数就解决了。但出于做论文等两方面的考虑,我看到的论文采用的是指数函数的形式来定义的,形如:


    我认为采用指数函数来定义权重主要有两方面的原因:

    1.普通的倒数函数过于简单。奥卡姆剃刀定律认为”若无必要,勿增实体“,即认为简单的才是美丽的。但从做paper的角度有时候太简单的模型反而显得模型没有技术含量,哪怕这样做很好,的确有些荒唐啊!

    2.我看论文的时候提到了指数函数的”平滑“作用,现在我还不怎么理解这里的”平滑“是怎么一个含义,以后就能明白了吧!


    展开全文
  • 常用激活函数(激励函数)理解总结

    万次阅读 多人点赞 2018-05-13 23:07:19
    学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用的激活函数,比如Sigmoid函数、tanh函数、Relu函数。那么我们就来详细了解下激活函数方方面面的知识。本文的内容包括几个部分: 什么是...

    引言

    学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用的激活函数,比如Sigmoid函数、tanh函数、Relu函数。那么我们就来详细了解下激活函数方方面面的知识。本文的内容包括几个部分:

    1. 什么是激活函数?
    2. 激活函数的用途(为什么需要激活函数)?
    3. 有哪些激活函数,都有什么性质和特点?
    4. 应用中如何选择合适的激活函数?

    如果你对以上几个问题不是很清楚,下面的内容对你是有价值的。

    什么是激活函数?

    首先要了解神经网络的基本模型。(不熟悉的同学请去看本人另外一篇介绍:人工神经网络基本原理
    单一神经元模型如下图所示。
    这里写图片描述
    神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

    激活函数的用途(为什么需要激活函数)?

    如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。

    有哪些激活函数,都有什么性质和特点?

    早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。
    近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多层神经网络中应用比较多。下面我们来总结下这些激活函数:

    Sigmoid函数

    Sigmoid 是常用的非线性的激活函数,它的数学形式如下:
    f(z)=11+e−z f(z)=\frac{1}{1+e^{-z}}f(z)=1+ez1
    Sigmoid的几何图像如下:
    这里写图片描述
    特点:
    它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
    缺点:
    sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些 缺点。
    缺点1:在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。首先来看Sigmoid函数的导数,如下图所示:
    这里写图片描述
    如果我们初始化神经网络的权值为 [0,1][0,1][0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+∞)(1,+∞)(1,+) 区间内的值,则会出现梯度爆炸情况。
    详细数学分析见文章:http://neuralnetworksanddeeplearning.com/chap5.html 中文译文:深度神经网络为何很难训练
    缺点2:Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x>0, f=wTx+bx>0, \ f= w^Tx+bx>0, f=wTx+b,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。
    缺点3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

    tanh函数

    tanh函数解析式:
    tanh(x)=ex−e−xex+e−xtanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}tanh(x)=ex+exexex
    tanh函数及其导数的几何图像如下图:
    tanh(x)及其导数的几何图像
    tanh读作Hyperbolic Tangent,它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

    Relu函数

    Relu函数的解析式:
    Relu=max(0,x)Relu=max(0,x)Relu=max(0,x)
    Relu函数及其导数的图像如下图所示:
    这里写图片描述
    ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:
    1) 解决了gradient vanishing问题 (在正区间)
    2)计算速度非常快,只需要判断输入是否大于0
    3)收敛速度远快于sigmoid和tanh

    ReLU也有几个需要特别注意的问题:
    1)ReLU的输出不是zero-centered
    2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

    尽管存在这两个问题,ReLU目前仍是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试!

    Leaky ReLU函数(PReLU)

    函数表达式:f(x)=max(αx,x)f(x)=max(\alpha x,x)f(x)=max(αx,x)
    Leaky Relu函数及其导数的图像如下图所示:
    (有同学在评论中反映下图有误,其实没有错误,左半边直线斜率非常接近0,所以看起来像是平的。就不改了,α=0.01\alpha=0.01α=0.01看起来就是这样的。感谢大家提意见 ^ _ ^)
    这里写图片描述
    人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为αx\alpha xαx而非0,通常α=0.01\alpha=0.01α=0.01。另外一种直观的想法是基于参数的方法,即ParametricReLU:f(x)=max⁡(αx,x)Parametric ReLU:f(x) = \max(\alpha x, x)ParametricReLU:f(x)=max(αx,x),其中α\alphaα
    可由方向传播算法学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

    ELU (Exponential Linear Units) 函数

    函数表达式:
    f(x)={x,if x>0α(ex−1),otherwisef(x)= \begin{cases}x,& \text{if } x > 0\\ \alpha(e^x - 1), & \text{otherwise} \end{cases}f(x)={x,α(ex1),if x>0otherwise
    函数及其导数的图像如下图所示:
    这里写图片描述

    ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:

    不会有Dead ReLU问题
    输出的均值接近0,zero-centered
    

    它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。

    MaxOut函数

    这个函数可以参考论文《maxout networks》,Maxout是深度学习网络中的一层网络,就像池化层、卷积层一样等,我们可以把maxout 看成是网络的激活函数层,我们假设网络某一层的输入特征向量为:X=(x1,x2,……xd),也就是我们输入是d个神经元。Maxout隐藏层每个神经元的计算公式如下:
    这里写图片描述

    上面的公式就是maxout隐藏层神经元i的计算公式。其中,k就是maxout层所需要的参数了,由我们人为设定大小。就像dropout一样,也有自己的参数p(每个神经元dropout概率),maxout的参数是k。公式中Z的计算公式为:

    这里写图片描述

    权重w是一个大小为(d,m,k)三维矩阵,b是一个大小为(m,k)的二维矩阵,这两个就是我们需要学习的参数。如果我们设定参数k=1,那么这个时候,网络就类似于以前我们所学普通的MLP网络。
    我们可以这么理解,本来传统的MLP算法在第i层到第i+1层,参数只有一组,然而现在我们不这么干了,我们在这一层同时训练n组的w、b参数,然后选择激活值Z最大的作为下一层神经元的激活值,这个max(z)函数即充当了激活函数。

    应用中如何选择合适的激活函数?

    这个问题目前没有确定的方法,凭一些经验吧。
    1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
    2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
    3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.

    参考资料

    1.聊一聊深度学习的activation function—夏飞
    2.http://blog.csdn.net/cyh_24/article/details/50593400
    3.http://www.cnblogs.com/tornadomeet/p/3428843.html
    4.《maxout networks》

    展开全文
  • 惩罚因子(penalty term)损失函数(loss function) penalty term和loss function看起来很相似,但其实二者完全不同。 惩罚因子: penalty term的作用就是把约束优化问题转化为非受限优化问题。 罚函数的基本...

    正则项(惩罚项)

    正则项(惩罚项)的本质

    惩罚因子(penalty term)与损失函数(loss function)

    penalty term和loss function看起来很相似,但其实二者完全不同。
    惩罚因子:
    penalty term的作用就是把约束优化问题转化为非受限优化问题。
    罚函数的基本思想是构造辅助函数,把原来的约束问题转化为求辅助函数极小化的无约束问题。

    在这里插入图片描述

    机器学习为什么需要正则项

    我们经常看到,标准损失函数通常由两项组成,数据损失项和惩罚项,并将惩罚项乘以超参数λ,用来平衡这两项。
    这是为什么呢?

    如果我们只告诉分类器需要拟合训练集的话,可能会导致分类器的行为反常——过拟合,它会尝试完美分类所有的训练数据点。
    在这里插入图片描述
    事实上,如果出现了新的数据点,过拟合的分类器表现就会非常糟糕,我们更倾向于以下这条绿色直线所表示的分类器。
    在这里插入图片描述
    这里涉及到的就是机器学习中一个非常重要的基础问题——正则化。

    为了得到这条绿色直线代表的分类器,我们需要为损失函数增加一个附加的项(正则项),鼓励模型以某种方式选择更简单的W,此处的“简单”取决于任务的规模和模型的种类。

    常见惩罚项:参数范数惩罚、稀疏表征、噪声、早停、dropout等

    深度学习 — 优化入门六(正则化、参数范数惩罚L0、L1、L2、Dropout)

    正则化与矩阵范数:L0范数,L1范数,核范数(很好地解释了采用某种范数作为正则项的好处,以及各种范数的本质区别)

    参数范数惩罚

    机器学习中常使用的正则化措施是去限制模型的能力,最常用的方法就是L0,L1和L2范数惩罚。深度学习优化器中所用的权重衰减,通常就是L2范数惩罚。

    L0范数惩罚

    从不为零的参数出发进行限制,即将不等于0的个数限制在一定的范围内以此达到限制模型的目的,而这种方法就称为L0范数惩罚。
    在这里插入图片描述
    在这里插入图片描述

    L1范数惩罚(参数稀疏性惩罚)

    上面我们是使用参数不为零的个数做约束条件,这里改变的是要求参数数值的总和限制在某个范围内即参数的总和要小于某个值,这种对参数总和的限制就被称为L1范数惩罚,也称为参数稀疏性惩罚
    在这里插入图片描述

    既然L0可以实现稀疏,为什么不用L0,而要用L1呢?
    个人理解一是因为L0范数很难优化求解(NP难问题),二是L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。

    为什么要稀疏?让我们的参数稀疏有什么好处呢?这里扯两点:
    1)特征选择(Feature Selection)(并且特征选择能带来更好的泛化能力):
    大家对稀疏规则化趋之若鹜的一个关键原因在于它能实现特征的自动选择。一般来说,xi的大部分元素(也就是特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。
    2)可解释性(Interpretability):
    另一个青睐于稀疏的理由是,模型更容易解释。例如患某种病的概率是y,然后我们收集到的数据x是1000维的,也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。假设我们这个是个回归模型:y=w1x1+w2x2+…+w1000x1000+b(当然了,为了让y限定在[0,1]的范围,一般还得加个Logistic函数)。通过学习,如果最后学习到的w就只有很少的非零元素,例如只有5个非零的wi,那么我们就有理由相信,这些对应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了。但如果1000个wi都非0,医生面对这1000种因素,累觉不爱。

    L2范数惩罚:

    L1范数惩罚虽然可以应用,同时把问题变为求极值的问题,但是还是不完美,因为约束条件带有绝对值,这在数学中不好处理,最简单的方法和损失函数一样就是加入平方项就避免正负抵消问题,这就是L2范数惩罚,也是我们非常熟悉的权重衰减惩罚:
    在这里插入图片描述

    为什么L1-regularization 能产生稀疏性,而L2-regularization 不能稀疏性,只能正则化。
    我们让L2范数的规则项||W||2最小,可以使得W的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0,这里是有很大的区别的哦。
    因此,一句话总结就是:L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。
    L1在特征选择时候非常有用,而L2就只是一种规则化而已。

    L2的好处:
    1)学习理论的角度:
    从学习理论的角度来说,L2范数可以防止过拟合,提升模型的泛化能力。(越小的参数说明模 型越简单,越简单的模型则越不容易产生过拟合现象。为什么越小的参数说明模型越简单?我也不懂,我的理解是:限制了参数很小,实际上就限制了多项式某些分量的影响很小)
    2)优化计算的角度:
    从优化或者数值计算的角度来说,L2范数有助于处理 condition number不好的情况下矩阵求逆很困难的问题。

    l1正则与l2正则的特点是什么,各有什么优势?

    l1正则与l2正则的特点是什么,各有什么优势?

    大家一般用 L2 损失函数而不用 L1 损失函数的原因就是:因为计算方便!可以直接求导获得取最小值时各个参数的取值。
    此外还有一点,用 L2 一定只有一条最好的预测线,L1 则因为其性质可能存在多个最优解。(更多关于L1 L2 损失函数参考索引5)
    当然 L1 损失函数难道就没有什么好处了吗,也是有的,那就是鲁棒性 (Robust) 更强,对异常值更不敏感。

    如果数据损失项使用L1 Norm,很明显,L1 Norm对outlier没有L2 Norm那么敏感;如果正则化损失项使用L1的话,那么使学习到的参数倾向于稀疏,使用L2 Norm则没有这种倾向。
    实践中,根据Quaro的data scientist Xavier Amatriain 的经验,实际应用过程中,L1 nrom几乎没有比L2 norm表现好的时候,优先使用L2 norm是比较好的选择。
    链接:https://www.zhihu.com/question/26485586/answer/89215997

    核范数(奇异值系数化)

    核范数||W||*是指矩阵奇异值的和,英文称呼叫Nuclear Norm。这个相对于上面火热的L1和L2来说,可能大家就会陌生点。那它是干嘛用的呢?霸气登场:约束Low-Rank(低秩)
    我们先来回忆下线性代数里面"秩"到底是啥?举个简单的例子吧:
    在这里插入图片描述
    对上面的线性方程组,第一个方程和第二个方程有不同的解,而第2个方程和第3个方程的解完全相同。从这个意义上说,第3个方程是"多余"的,因为它没有带来任何的信息量,把它去掉,所得的方程组与原来的方程组同解。为了从方程组中去掉多余的方程,自然就导出了"矩阵的秩"这一概念。

    还记得我们怎么手工求矩阵的秩吗?为了求矩阵A的秩,我们是通过矩阵初等变换把A化为阶梯型矩阵,若该阶梯型矩阵有r个非零行,那A的秩rank(A)就等于r。回到上面线性方程组来说吧,因为线性方程组可以用矩阵描述嘛。秩就表示了有多少个有用的方程了。上面的方程组有3个方程,实际上只有2个是有用的,一个是多余的,所以对应的矩阵的秩就是2了。
    从物理意义上讲,矩阵的秩度量的就是矩阵的行列之间的相关性。如果矩阵的各行或列是线性无关的,矩阵就是满秩的,也就是秩等于行数。

    约束低秩只是约束rank(w)呀,和我们这节的核范数有什么关系呢?
    他们的关系和L0与L1的关系一样。因为rank()是非凸的,在优化问题里面很难求解,那么就需要寻找它的凸近似来近似它了。对,你没猜错,rank(w)的凸近似就是核范数||W||*

    核范数的用途:

    (1)低秩矩阵,特征降维,鲁棒性PCA:
    既然秩可以度量相关性,而矩阵的相关性实际上有带有了矩阵的结构信息。如果矩阵之间各行的相关性很强,那么就表示这个矩阵实际可以投影到更低维的线性子空间,也就是用几个向量就可以完全表达了,它就是低秩的。所以我们总结的一点就是:如果矩阵表达的是结构性信息,例如图像、用户-推荐表等等,那么这个矩阵各行之间存在这一定的相关性,那这个矩阵一般就是低秩的。
    如果X是一个m行n列的数值矩阵,rank(X)是X的秩,假如rank (X)远小于m和n,则我们称X是低秩矩阵。低秩矩阵每行或每列都可以用其他的行或列线性表出,可见它包含大量的冗余信息。利用这种冗余信息,可以对缺失数据进行恢复,也可以对数据进行特征提取。
    另外的见解:将系数的稀疏性,拓展到矩阵奇异值的稀疏性上,就从L1范数变成了核范数。

    Candes等人提出了Robust PCA,通过对矩阵施加奇异值的稀疏性(从l1变成了nuclear norm)来自动学得降维的维数,同时还能对原始矩阵去噪(可以看我写的另一个答案如何理解矩阵的「秩」? - 过拟合的回答)。这也引出了另一个新思路:一般来说数据矩阵可能存在野点,即少部分行被污染了,因此可以求取某个行稀疏的野点矩阵,来“净化”原始矩阵。这里稀疏性就是施加在待求解的野点矩阵上。
    链接:https://www.zhihu.com/question/26602796/answer/36470745

    与经典PCA一样,Robust PCA(鲁棒主成分分析)本质上也是寻找数据在低维空间上的最佳投影问题。当观测数据较大时,PCA无法给出理想的结果,而Robust PCA能够从较大的且稀疏噪声污染的观测数据中恢复出本质上低秩的数据。Robust PCA考虑的是这样一个问题:一般的数据矩阵D包含结构信息,也包含噪声。那么可以将这个矩阵分解为两个矩阵相加:D = A + E,A是低秩的(由于内部有一定的结构信息造成各行或列间是线性相关的),E是稀疏的(含有噪声,则是稀疏的),则Robust PCA可以写成以下的优化问题:
    在这里插入图片描述
    摘自:正则化与矩阵范数:L0范数,L1范数,核范数
    此外,可以参考和学习的网文:(1)PCA 与 Robust PCA区别 (2)张量(三):张量鲁棒主成分分析(TRPCA)(3)https://github.com/nwbirnie/rpca/blob/master/rpca.py(RPCA代码)

    (2)秩最大化与多样性:
    核范数是矩阵秩的凸逼近
    矩阵秩越大,则多样性越好
    神经网络的输出是一个矩阵[B x C](其中,B是batchsize,C是类别数,采用了one-hot编码),输出矩阵的秩越大,则表示样本之间是独立的(矩阵的行之间独立,不能归于同一类),独立则说明有好的多样性。
    详见:2020-CVPR oral Towards Discriminability and Diversity: Batch Nuclear-norm Maximization under Label Insufficient Situations
    (3)Frobenius范数最大化与判别性
    核范数是Frobenius范数的上界
    Frobenius范数越大,则判别性越好(即预测出来的样本越接近one-hot编码,也即信息熵越小)。
    详见:2020-CVPR oral Towards Discriminability and Diversity: Batch Nuclear-norm Maximization under Label Insufficient Situations

    参数共享与参数绑定

    目前为止,我们讨论的正则化措施都是通过限制模型参数的方法来限制模型的能力,但这种通用的限制太过宽泛。
    卷积操作,其实就是参数共享。参数共享使得卷积网络极大地降低了参数的规模,是另一种形式的参数惩罚项。

    在神经网络的隐藏层或参数中注入噪声

    对于某些模型,注入噪声也相当于对参数进行范数惩罚。通常而言,注入噪声要比简单地收缩参数更有效,尤其是将噪声注入到隐藏层中。而隐藏层注入噪声是一个重要的主题,我们将在差算法中重点介绍,该方法也可以看作是通过加入噪声重构新输入的一种正则化策略。
    除了在隐藏层输入中注入噪声,在权重(参数)中注入噪声也是一种有效的正则化措施。这种方法在某种程度上可以等价地解释为传统的范数惩罚,该方法鼓励参数找到一个参数空间,而该空间对于微小的参数变化所引起的输出变化的影响很小。换而言之,就是将模型送进了一个对于微小变化不敏感的区域,我们不仅找到了最小值,我们还找到了一个宽扁的最小值区域

    稀疏表征(表征稀疏性惩罚)

    参考:
    (1)深度学习 — 优化入门六(正则化、参数范数惩罚L0、L1、L2、Dropout)
    (2)稀疏表达的意义在于?为什么稀疏表达得到广泛的应用?
    (3)稀疏表示去噪的理解

    在上面参数范数惩罚中,我们通过直接限制可用参数规模,如L1,L2参数惩罚,来限制模型的能力,从而降低过拟合风险。
    接下来,我们介绍一种通过作用在神经网络激活单元的惩罚策略,来提高隐藏层的稀疏性,该方法可算作是一种间接的模型参数惩罚。

    生物进化的一个重要趋势就是尽可能地节约能源,而我们的大脑也符合节能的原则大脑。中每个神经元都连接着成千上万的神经元,但其实大部分神经元都是处于抑制状态,只有少部分的神经元接受刺激会处于激活状态,因此我们需要将特定的信息交给特定的神经元进行处理。受此启发,我们就期望使用某种惩罚措施来抑制大部分神经元。当信息输入进神经网络时,只有关键部分神经元才能够处于激活状态,这就是稀疏表征(稀疏表示)
    我们已经讨论过凵范数如何致使参数稀疏化,这就意着大多 数都为零或接近于零,而表征稀疏化描述的其实就是隐藏层的输出大多数为零或接近零
    为了简明地阐述这些区别我们以一个线性回归为例,如下图所示,是一个参数稀疏化的线性回归模型:一个是使用稀疏表征的线性回归。
    在这里插入图片描述

    虽然表征正则化与参数正则化(一个使得输出稀疏,一个使得参数稀疏)有些区别,但幸运的是它们都使用相同的机理来实现。如下式所示,表征范数惩罚也是通过在代价函数中一项添加惩罚表征项 来实现表征稀疏化
    在这里插入图片描述
    表征惩罚的具体计算方法:

    • 方法一:使用和L1惩罚相同的方式:Ω\Omega (h)= h=hi\left\| h \right\| =\sum\left| h_i \right|
    • 方法二:KL散度(KLdivergence),又称相对熵(RelativeEntropy)也是一种十分常用的方法(稀疏自编码器就是用的KL散度)。

    稀疏自编码器 & 表征稀疏惩罚项

    自编码器基本原理

    自动编码器的作用之稀疏编码
    在这里插入图片描述
    如上图,我们将input输入一个encoder编码器,就会得到一个code,这个code也就是输入的一个表示,那么我们怎么知道这个code表示的就是input呢?
    我们加一个decoder解码器,这时候decoder就会输出一个信息,那么如果输出的这个信息和一开始的输入信号input是很像的(理想情况下就是一样的),那很明显,我们就有理由相信这个code是靠谱的。所以,我们就通过调整encoder和decoder的参数,使得重构误差最小,这时候我们就得到了输入input信号的第一个表示了,也就是编码code了。
    因为是无标签数据,所以误差的来源就是直接重构后与原输入相比得到

    (1)逐层训练
    自编码器的训练方法:通过编码器产生特征,然后训练下一层,这样逐层训练。

    首选训练一个只有一层的编码器。
    在这里插入图片描述

    那上面我们就得到第一层的code,我们的重构误差最小让我们相信这个code就是原输入信号的良好表达了,或者牵强点说,它和原信号是一模一样的(表达不一样,反映的是一个东西)。

    那第二层和第一层的训练方式就没有差别了,我们将第一层输出的code当成第二层的输入信号,同样最小化重构误差,就会得到第二层的参数,并且得到第二层输入的code,也就是原输入信息的第二个表达了。
    在这里插入图片描述

    其他层就同样的方法炮制就行了(训练这一层,前面层的参数都是固定的,并且他们的decoder已经没用了,都不需要了)。
    (2)有监督微调:

    经过上面的方法,我们就可以得到很多层了。至于需要多少层(或者深度需要多少,这个目前本身就没有一个科学的评价方法)需要自己试验调了。每一层都会得到原始输入的不同的表达。当然了,我们觉得它是越抽象越好了,就像人的视觉系统一样。

    到这里,这个AutoEncoder还不能用来分类数据,因为它还没有学习如何去连结一个输入和一个类。它只是学会了如何去重构或者复现它的输入而已。或者说,它只是学习获得了一个可以良好代表输入的特征,这个特征可以最大程度上代表原输入信号。

    那么,为了实现分类,我们就可以在AutoEncoder的最顶的编码层添加一个分类器(例如罗杰斯特回归、SVM等),然后通过标准的多层神经网络的监督训练方法(梯度下降法)去训练

    也就是说,这时候,我们需要将最后层的特征code输入到最后的分类器,通过有标签样本,通过监督学习进行微调,这也分两种:

    • 只调整分类器
    • 微调整个编码器+分类器
    稀疏自编码器

    当然,我们还可以继续加上一些约束条件得到新的Deep Learning方法,如:如果在AutoEncoder的基础上加上 L1 的正则限制(L1主要是约束每一层中的节点中大部分都要为0,只有少数不为0,这就是Sparse名字的来源),我们就可以得到Sparse AutoEncoder法。
    在这里插入图片描述
    上面公式中:h是编码

    如上图,其实就是限制每次得到的表达code尽量稀疏。因为稀疏的表达往往比其他的表达要有效(人脑好像也是这样的,某个输入只是刺激某些神经元,其他的大部分的神经元是受到抑制的)。

    KL散度诱导稀疏—稀疏自编码器的损失函数中的稀疏惩罚项

    先来看一下稀疏自编码器的完整损失函数:
    在这里插入图片描述
    损失函数分为三项:

    • 第一项是普通的损失函数,用来指示输入输出的相似度,使得重构误差小;
    • 第二项是表征稀疏惩罚项,诱导隐层中的激活值向量稀疏。可以用L1范数,也可以用KL散度(大多用KL散度);
    • 第三项是防止过拟合而添加的正则化项是权重衰减项!

    为什么稀疏自编码器的正则项选用了相对熵(KL散度)的函数?
    在这里插入图片描述

    如果事先设定某个较小的值 ρ\rho^*,那么稀疏性度量就可以采用两个概率分布 ρj\rho_jρ\rho^* 之间的差异来表示。

    下面看一个github上的实例:Sparse Autoencoders (Sparsity constraint is imposed here by using a KL-Divergence penalty. The FashionMNIST dataset was used for this implementation.)
    在这里插入图片描述
    在这里插入图片描述
    github项目:Semi Supervised Learning Using Sparse Autoencoder(稀疏自编码器与半监督)
    github项目:Crosswise Sparse Autoencoder(稀疏自编码器与医疗图像,相关paper:Sparse autoencoder for unsupervised nucleus detection and representation in histopathology images

    噪声与数据扩充

    数据扩充

    在机器学习中,想要降低泛化错误率最好的方法是训练更多的数据,但在现实中,数据总是有限的,并且还需要大量的成本。那么问题就来了,更多的数据使得模型性能更好,但我们又没有更多的数据,那该怎么办呢?其中一个有用而高效的方法就是生成伪造数据(fakedata),然后将这些数据添加到训练集中进行数据扩充(DataAugmentation)。虽然听上去似乎在教大家“造假”,但对于某些机器学习任务而言,创造新的伪造数据是非常合理的。
    在分类任务中,分类器需要使用复杂高维的输入数据X以及数据所对应的类标进行关联学习。这也意味着,分类器面临的主要任务是从各种变化的数据中获得某种稳定分布的不变性。既然平移,旋转后的图像都是同一个对象,那么在训练数据中扭曲一定程度的输入数据X,分类器也应该将该数据 进关联,但这一方法的应用范围还比较窄。例如在密度估计任务中,要生成新的伪造数据是非常困难的,因为生成新数据的前提是我们己经解决了密度估计问题。
    生成伪造数据最佳的应用场景是一类特定的分类任务。 - 对象识别图片是一种高维复杂的数据“并且有着平移,旋转不变性等特点在上面,介绍了如果一幅图片全部向右平移一个像素,那对于机器学习算法来说,便彻底成了一幅新冬像,因此我们需要先验地加入参数共享等措施来学习网络。那我们不妨换个角度,我们将这些先验知识加入到数据中去,即平移,旋转,拉伸之后的图像数据依然是原数据对象。我们将这些生成的“新图像数据”加入训练集中训练,那训练数据就可能增加十余倍的数据量,这样训练出来的模型同样也可以其备这种空间不变性能力,但我们必须谨慎地去变换这些 。例如在字符识别中,将b,和d,水平翻转,旋转180°,那就都成了同一个数据。此时的伪造数据,就真的变成了错误数据。

    注入噪声

    在输入中注入噪声

    数据扩充也可以看作是在输入数据中注入噪声,从而迫使算法拥有更强的健壮性(也可以将注入噪声看作是一种数据扩充)。神经网络容易过拟合的原因之一就是对于噪声没有太好的抗噪能力。正所谓“你怕什么,就应该勇敢地去面对什么。”最简单的提高网络抗噪声能力方法,就是在训练时加入随机噪声一起训练。比如在非监督学习算法降噪自动编码器(Denoising Autoencoder)中,在输入层进行噪声注入然后学习无噪声的冬片,便是一种很好的提高网络健壮性的方式。

    在神经网络的隐藏层或参数中注入噪声

    对于某些模型,注入噪声也相当于对参数进行范数惩罚。通常而言,注入噪声要比简单地收缩参数更有效,尤其是将噪声注入到隐藏层中。而隐藏层注入噪声是一个重要的主题,我们将在差算法中重点介绍,该方法也可以看作是通过加入噪声重构新输入的一种正则化策略。
    除了在隐藏层输入中注入噪声,在权重(参数)中注入噪声也是一种有效的正则化措施。这种方法在某种程度上可以等价地解释为传统的范数惩罚,该方法鼓励参数找到一个参数空间,而该空间对于微小的参数变化所引起的输出变化的影响很小。换而言之,就是将模型送进了一个对于微小变化不敏感的区域,我们不仅找到了最小值,我们还找到了一个宽扁的最小值区域

    在标签中注入噪声

    数据集中或多或少都带有错误的类标签,如果我们使用这些数据进行训练,那这就好比一个专心听讲且对老师十分尊敬的好学生,认真学习老师教给他的所有知识,但老师教给他的却是错误的知识。最不幸的是,学生还对老师深信不疑,即使发现了错误,也只会认为是自己愚钝,不断地否定自己,不断地在痛苦中挣扎。虽然我们竭尽全力地避免错误标记数据,但这并不如我们想象得那么美好,人为地添加错误在所难免。与其小心翼翼地标记数据做个完美的“老师”,还不如直接就告诉学生“老师”并不完美,“老师”也会犯错。
    解决这种问题的具体措施就是在标签中加入一定的噪声,例如可以设置一个很小的常数λ\lambda,我们将训练数据的标签Y错误的概率设置为λ\lambda.

    早停

    目前为止,我们针对过拟合现象所做的正则化措施总结起来有两点:

    • 一是限制模型或表征的能力,包括(参数惩罚,表征惩罚),就如同“孤已天下无敌(训练错误率很低),让你双手又如何”。
    • 二是不断地加入噪声,给自己增加麻烦,就如同’放一碗水在头顶扎马步,穿着加沙的背心去奔跑,最终目的是使自己更强壮’。

    而下面,我们介绍的这种正则化方法就非常简单了。
    基于梯度下降的深度学习算法都存在一个训练周期的问题,训练的次数越多,训练错误率就越低。由于我们真正目的是降低测试错误率,因此我们期望验证错误率也与训练错误率有相似的曲线。但期望总是事与愿违,真实环境中的验证错误率并没有随着训练次数的增多而减少,而是形成了一种“U型“曲线,验证错误率先减小后上升。那很自然地,我们就期望能在验证错误率的最低点(或最低点附近)停止训练算法,这就是所谓的早停(EarlyStopping)

    dropput

    Dropout可以看作是多个模型的集成,即通过结合几个模型降低泛化误差的技术。分别训练几个不同的模型,然后让所有模型表决测试样例的输出,也被称为模型平均。模型平均奏效的原因是不同的模型通常不会再测试集上产生完全相同的误差。

    多任务学习中各loss权重应该如何设计呢?

    多任务学习中各loss权重应该如何设计呢?
    Multi-task中的多任务loss平衡问题
    多任务学习权重的动态调整

    展开全文
  • 如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就...

    一. 激活函数

    如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

    1. Sigmoid

    Sigmoid非线性函数的数学表达式是σ(x)=11+ex\sigma (x)=\frac{1}{1+e^{-x}},其图形如下图所示:
    在这里插入图片描述
    我们知道Sigmoid函数是将一个实数输入转化到0-1之间的输出,具体来说越小的负数转化到越靠近0,越大的正数越靠近1。

    历史上Sigmoid函数频繁的使用,因为其具有良好的可解释性。但最近这些年,Sigmoid函数已经很少被人使用了,主要是因为Sigmoid函数有以下两大缺点。
    (1)Sigmoid函数会造成梯度损失。一个非常不好的地方在于Sigmoid在靠近1和0的两端时梯度几乎为0,而反向传播算法的梯度向下传播时,每过一层就会增加一个g(z)g^{'}(z)项(Sigmoid关于每一层线性组合值的导数),且Sigmoid函数的导数满足f(x)=f(x)(1f(x))f^{'}(x)=f(x)(1-f(x)),又f(x)的值在(0, 1)之间,故f(x)f^{'}(x)的值在(0, 0.25]之间,因此当神经网络层数非常深的时候,较深层的梯度值由于乘了很多值很小的数更变得很小,导致较深层的参数更新不动,这就是“梯度消失”现象。另外,如果使用Sigmoid函数,那么需要在权重初始化的时候非常小心,如果初始化的权重过大,经过线性激活函数也会导致大多数神经元变得饱和,没有办法更新参数。
    (2)Sigmoid输出并非以0为均值,这就会导致经过Sigmoid激活函数之后的输出,作为后面一层的输入的时候是非0均值的,这个时候如果输入进入下一层神经元的时候全是正的,那么在更新参数时永远都是正梯度。怎么理解呢?比如下一层神经元的输入是x,参数是w和b,那么输出为f=wx+b,这个时候f(w)=x\bigtriangledown f(w)=x,所以如果x是0均值的数据,那么梯度就会有正有负,但是这个问题并不是很严重,因为一般神经网络在训练的时候都是按batch进行训练的,这个时候一定程度上可以缓解这个问题。

    2. tanh

    tanh激活函数是上面Sigmoid函数的变形,其数学表达式为tanh(x)=2σ(2x)1tanh(x)=2\sigma(2x)-1,图形如下所示:
    在这里插入图片描述
    它将输入数据转化到-1到1之间,可以通过图像看出它将输出变成了0均值,在一定程度上解决了Sigmoid函数的第二个问题,但是它仍然存在梯度消失的问题。

    3. ReLU

    ReLU激活函数近一些年来越来越流行,它的数学表达式为f(x)=max(0, x),换句话说,这个激活函数只是简单地将大于0的部分保留,将小于0的部分变成0,图形如下:
    在这里插入图片描述
    ReLU的优点:
    (1)相比于Sigmoid激活函数和Tanh激活函数,ReLU能够极大地加速随机梯度下降法的收敛速度,这因为它是线性的,且不存在梯度消失的问题。
    (2)相比于Sigmoid激活函数和tanh激活函数的复杂计算,ReLU的计算方法更加简单,只需要一个阈值过滤就可以得到结果。

    **ReLU的缺点:**训练的时候很脆弱,我们回忆一下反向传播的梯度公式里面有一项w,如果权重初始化的时候不是很好,很多个大的w乘起来会得到一个很大的梯度——梯度爆炸现象,从而导致更新的w很小,进而得到的输出值进入了负半轴,神经元失活。如果发生这种情况之后,经过ReLU的梯度永远都会是0,也就意味着参数无法更新了,因为ReLU激活函数本质上是一个不可逆的过程。不过这个问题可以通过一些比较好的权重初始化方法解决,因此ReLU现在仍然是用的最多的激活函数。

    4. Leaky ReLU

    Leaky ReLU激活函数是ReLU激活函数的变形,主要是为了解决它在负半轴上梯度一直为0的问题,给它在负半轴上设置了一个很小的斜率,比如0.01,它的数学形式可以表现为:f(x)=I(x<0)(αx)+I(x0)xf(x)=I(x<0)(\alpha x)+I(x\geq 0)x

    二. 权重初始化

    1. 全0初始化

    乍一看这种方法貌似可行,然而这种策略不能采用。因为如果神经网络中每个权重都被初始化为相同的值,那么每个神经元的计算结果就相同,在反向传播时也会计算出相同的值,最后导致所有权重都会有相同的更新,那么这样一个具有很多隐藏单元的网络结构就是完全多余的表达,最终该网络只能学到一种特征。换句话说,如果每个权重都被初始化成相同的值,那么权重之间失去了不对称性。

    2. 随机初始化

    目前知道我们希望权重初始化的时候能够接近0,但是不能全是0,所以可以初始化权重为一些靠近0的随机数,通过这个方式可以打破对称性。这里面的核心想法就是神经元最开始都是随机的、唯一的,所以在更新的时候也是作为独立的部分,最后一起合成在神经网络当中。

    一般的随机初始化策略有高斯随机化、均匀随机化等,需注意的是并不是越小的随机化产生的效果越好,因为权重初始化越小,反向传播中关于权重的梯度也越小,因为梯度与参数的大小是成比例的,所以这会极大地减弱梯度流的信号,成为神经网络训练中的隐患。

    这个初始化策略还存在一个问题就是网络输出分布的方差会随着输入维度的增加而增大,可以用下面的数学式子来说明(n代表上一层神经元的数量):
    在这里插入图片描述

    其中假设输入和权重都是0均值的,也就是说E(wi)E(w_{i})=E(xi)E(x_{i})=0,但这并不是一般的情况比如经过了ReLU激活函数之后输出就会是一个正的均值,这里做这样的假设是为了计算方便。我们可以看到输出的结果S比输入x的方差增大了nVar(w)nVar(w)倍,如果网络越来越深,就会导致方差越来越大,所以希望nVar(w)nVar(w)尽可能接近1,也就是说nVar(w)=1nVar(w)=1,这可以得到Var(w)=1nVar(w)=\frac{1}{n},也就是w初始化之后需要除以n\sqrt{n}

    至于为什么要让输入输出的方差尽可能一样?可以这样考虑,整个大型前馈神经网络无非就是一个超级大映射,将原始样本稳定的映射成它的类别。也就是将样本空间映射到类别空间。试想,如果样本空间与类别空间的分布差异很大,比如说类别空间特别稠密,样本空间特别稀疏辽阔,那么在类别空间得到的用于反向传播的误差丢给样本空间后简直变得微不足道,也就是会导致模型的训练非常缓慢。同样,如果类别空间特别稀疏,样本空间特别稠密,那么在类别空间算出来的误差丢给样本空间后简直是爆炸般的存在,即导致模型发散震荡,无法收敛。因此,我们要让样本空间与类别空间的分布差异(密度差别)不要太大,也就是要让它们的方差尽可能相等。

    参考文章:https://zhuanlan.zhihu.com/p/27919794

    三. 防止过拟合

    1. 正则化

    L2正则化是正则化(regularization)中比较常用的形式,它的想法是对于权重过大的部分进行惩罚,也就是直接在损失函数中增加权重的二范数量级,也就是12λw2\frac{1}{2}\lambda w^{2},其中λ\lambda是正则化强度,常使用0.5,因为对于w2w^{2}的梯度是2w,使用12\frac{1}{2}就能使得梯度是λw\lambda w而不是2λw2\lambda w。所以使用L2正则化可以看成是权重更新在原来的基础上再减去λw\lambda w,这样可以让参数更新后更加靠近0.

    L1正则化是另外一种正则化方法,其在损失函数中增加权重的1范数,也就是λw\lambda \left | w \right |,我们也可以将L1正则化和L2正则化结合起来,如λ1w+λ2w2\lambda_{1} \left | w \right |+\lambda_{2}w^{2}。L1正则化相对于L2正则化的优势是优化的过程中可以让权重变得更加稀疏,换句话说,也就是在优化结束的时候,权重只会取一些与最重要的输入有关的权重,这就使得与噪声相关的权重被尽可能降为0。L2正则化的优势在于最终的效果会比L1正则化更加发散,权重也会被限制得更小。

    https://zhuanlan.zhihu.com/p/35356992

    2. Dropout

    现在介绍一种非常有效、简单、同时也是现在深度学习使用最为广泛的防止过拟合的方法——Dropout。其核心方法就是在训练的时候依概率P保留每个神经元,也就是说每次训练的时候有些神经元会被设置为0,其简单的示意图如下:
    在这里插入图片描述
    通过上图可以看出来每次训练都有神经元并没有参与到网络中,但是在预测的时候不再这样处理,这也很好理解,如果预测应用Dropout,由于随机性,每次预测出来的结果都不一样,这样预测的时候完全靠运气,这显然是不行的。所以会保留网络全部的权重,取代应用Dropout,在每层网络的输出上应用上P的缩放。这个想法是很重要的,因为我们不做任何处理,那么网络的行为在预测时和训练时就会不同,这不是所希望的,所以需要应用缩放。

    那么为什么在网络的输出部分应用P缩放可以达到相同的效果呢?考虑一个神经元在应用Dropout之前的输出为x,那么应用Dropout之后的输出期望值就是 Px+(1-p)0,所以在预测的时候,如果保留所有的权重,就必须调整xPxx\rightarrow Px来保证其输出期望相同。

    其具体实现可以参考:https://blog.csdn.net/hjimce/article/details/50413257
    关于Dropout的两种理解:https://blog.csdn.net/dod_jdi/article/details/78379781

    3. 批量归一化(Batch Normalization)

    前向传播:卷积层的每一个输出通道对应一组γ\gammaμ\mu,全连接层的每一个神经元对应一组γ\gammaμ\mu
    在这里插入图片描述反向传播:
    在这里插入图片描述
    代码实现:https://blog.csdn.net/stesha_chen/article/details/84999511#commentBox

    以上内容皆为廖星宇编著的《深度学习入门之PyTorch》这本书上的内容,代码部分略有改动。

    展开全文
  • pytorch自定义权重初始化函数

    千次阅读 2019-04-18 21:50:45
    pytorch.nn.init提供了很多初始化权重函数,但是我有时候想直接修改某个module的weight怎么办呢? 目前这种方式是有效的 new_weight = torch.empty_like(the_module.weight) new_weight=my_weight_method(new...
  • 深度学习:Sigmoid函数与损失函数求导

    万次阅读 多人点赞 2017-07-18 14:22:22
    2 对数函数与sigmoid 2sigmoid函数求导 3神经网络损失函数求导 1、sigmoid函数​ sigmoid函数,也就是s型曲线函数,如下: 函数:f(z)=11+e−z 函数:f(z)=\frac{1}{1+e^{-z}} 导数:f′(z)=f(z)(1−f(z)) 导数:f'...
  • 本文详细介绍了OpenCV-Python相同大小和通道数的两副图像融合的cv2.addWeighted权重加法函数的语法,并在此基础上实现了一个小图像和大图像融合的函数addWeightedSmallImgToLargeImg,并通过...需要注意的是两幅图像...
  • 代价函数L对权重W求导

    千次阅读 2017-11-08 16:20:46
    运用的是元素对矩阵的求导法则
  • 关于交叉熵函数torch.nn.Cross...那么如何在交叉熵函数中添加自定义的各类别的权重呢?定义参数weight即可,其中参数的内容要为tensor类型,而且要把dtype类型定义为float。用法为: ### 我的类别数为12 criterion ...
  • 一种三角函数权重的图像拼接算法

    千次阅读 热门讨论 2017-03-05 14:45:02
    根据《一种三角权重的图像拼接算法》,其实我觉得应该叫《一种三角权重的图像融合算法》更合适,侧重融合。 A=imread('F:\fisheye\others1.jpg'); B=imread('F:\fisheye\others2.jpg'); [H,W,k]=size(A); rdata1=-...
  • sigmoid Sigmoid函数,即f(x)=1/(1+e-x)。是神经元的非线性作用函数。 2. 函数:1.1 从指数函数到sigmoid​ 首先我们来画出指数函数的基本图形:​ 从上图,...​ 如果直接把e−x放到分母上,就ex图像一样了,所以
  • 下面添加的图片中被划红线圈住的代码是添加上去的,最终运行出错了,请问怎么修改,或者重新帮我写一个权重损失代码代码,跪谢 def custom_loss_4(y_true, y_pred, weights): return K.mean(K.abs(y_true - y_...
  • 函数与函数空间

    千次阅读 2018-09-05 16:10:57
    引言 在学习线性回归模型的时候就会遇到基函数,可能我们会遇到多项式基函数、高斯基函数、sigmoid基函数,当然在高等数学和信号...不过还是对基函数与函数空间的关系、基函数的深层认识模棱两可。我希望能通过这...
  • 激活函数、损失函数与超参数

    千次阅读 2017-08-31 14:10:11
    激活函数: 激活函数的特点: 输入:标量, 输出;标量 很多激活函数如果画图,都是S形的,称为Sigmoid函数。 常见的有6种: 1.线性变换Linear:f(x) = Wx,用于输入层。直线。 2.Sigmoid函数:可以减少极端...
  • 损失函数,神经网络调权重

    千次阅读 2019-09-04 16:04:03
    因为在神经网络中被正确分类的数量n和权重参数w及偏置b之间的关系,很难用一个平滑的函数(方便梯度下降) ,也就是说在大多数情况下,对权重和偏置做出的微小改变,正确分类的数量可能岿然不动。 换句话说正确分类...
  • # 带权重的随机 def __in_which_part(n, w): for i, v in enumerate(w): if n return i return len(w) - 1 def weighting_choice(data, weightings): s = sum(weightings) w = [float(x)/s for x in ...
  • Relu函数与Leaky Relu函数

    万次阅读 2018-09-20 16:18:54
    ReLu函数   修正线性单元(Rectified linear unit,ReLU)是神经网络中最常用的激活函数。它保留了 step 函数的生物学启发(只有输入超出阈值时神经元才激活),不过当输入为正的时候,导数不为零,从而允许...
  • 在计算完最近邻居之后,在进行推荐的时候,需要对最近邻居进行权重赋值,一避免选择了距离比较远的邻居。  如果采取邻居的倒数,如果距离是0的话,则权重就会无限大,对程序造成干扰。这时候,根据正态函数的...
  • 得分函数与损失函数

    千次阅读 2020-03-17 16:28:43
    得分函数就是对于给定的一个输入,通过计算,得到这个输入属于每种类别的得分。比如我们现在有三个类别:小猫、小狗和青蛙,对于一张给定的图片,计算出这个图片是小猫的得分,是小狗的得分以及是青蛙的得分。 对于...
  • 【Pytorch】模型权重的初始化函数

    千次阅读 2020-02-04 22:34:43
    在神经网络模型中,参数权重的初始设置非常重要,其合理设置能够保证模型的收敛以及数值运算的速度。 pytorch中常用的初始化函数封装在torch.nn.init下,常见策略主要包括: 1. 均匀分布初始化 """ a: 均匀分布...
  • 首先辨析一下概念: 1. loss是整体网络进行优化的目标, 是需要参与到优化运算,更新权值W的...一、keras自定义损失函数 在keras中实现自定义loss, 可以有两种方式,一种自定义 loss function, 例如: # 方式...
  • 深度学习以及机器学习中都会用到SoftMax函数,交叉熵损失函数与熵,对数似然函数等一些数学方面的知识,此文作为个人学习笔记。 1.softmax函数 (1)定义 多分类问题中,我们可以使用SoftMax函数,对输出的值归一...
  • js实现一个按照权重抽奖函数

    千次阅读 2019-05-31 01:41:28
    配置好奖品后就可以初始化抽奖函数,执行抽奖 var draw = new Draw(model); var drawResult = draw.getResult(); 复制代码 实现原理 拿到奖品数组,重新遍历,生成按照权重分解后的数组,如上面的例子,生成的...
  • 常用激活函数的总结比较

    千次阅读 2017-08-11 14:07:46
    本文为 CS231n 中关于激活函数部分的笔记。 激活函数(Activation Function)能够把输入的特征保留并映射下来。 Sigmoid Sigmoid 非线性函数将输入映射到 (0,1)(0,1) 之间。它的数学公式为:σ(x)=11+e...
  • B(x,y)=Γ(x)Γ(y)Γ(x+y).\mathrm{B}(x,y)=\frac{\Gamma(x)\Gamma(y)}{\Gamma(x+y)}. 其中 Γ(x)=∫+∞0e−ttx−1dt,B(x,y)=∫10tx−1(1−t)y−1dt.\Gamma(x)=\int_0^{+\infty} e^{-t} t^{x-1} \mathrm{d}t,\quad...
  • Relu函数与Leaky Relu函数的理解

    千次阅读 2019-08-01 08:55:30
    它保留了 step 函数的生物学启发(只有输入超出阈值时神经元才激活),不过当输入为正的时候,导数不为零,从而允许基于梯度的学习(尽管在 x=0 的时候,导数是未定义的)。使用这个函数能使计算变得很快...
  • SVM函数

    万次阅读 2018-12-17 23:28:34
    文章目录核函数本质核技巧 核函数函数函数本质 1.在实际数据上经常遇到线性不可分的情况 而解决方法是将特征映射到更高维的空间去(为什么低维度线性不可分的情况映射到高维度就可以分了?). 2.凡是遇到线性不...
  • 神经网络激活函数与损失函数

    千次阅读 2016-08-11 11:42:23
    sigmoid输出层使用的损失函数为cross-entropysoftmax 输出层使用的损失函数为log-likelihood
  • sigmiodsoftmax   sigmiod就是逻辑回归(解决二分类问题);softmax是多分类问题的逻辑回归   虽然逻辑回归能够用于分类,不过其本质还是线性回归。它仅在线性回归的基础上,在特征到结果的映射中加入了一层...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 205,970
精华内容 82,388
关键字:

价值函数与权重函数