函数 订阅
函数(function)的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。函数的近代定义是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示,函数概念含有三个要素:定义域A、值域B和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。 [1]  函数,最早由中国清朝数学家李善兰翻译,出于其著作《代数学》。之所以这么翻译,他给出的原因是“凡此变数中函彼变数者,则此为彼之函数”,也即函数指一个量随着另一个量的变化而变化,或者说一个量中包含另一个量。 展开全文
函数(function)的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。函数的近代定义是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示,函数概念含有三个要素:定义域A、值域B和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。 [1]  函数,最早由中国清朝数学家李善兰翻译,出于其著作《代数学》。之所以这么翻译,他给出的原因是“凡此变数中函彼变数者,则此为彼之函数”,也即函数指一个量随着另一个量的变化而变化,或者说一个量中包含另一个量。
信息
提出者
莱布尼茨(G.W.Leibniz)
表示法
列表法、图像法、解析法
三要素
自变量、因变量、对应法则
应用学科
数学、计算机科学等
中文名
函数
外文名
function
提出时间
17世纪
表达式
y=f(x)
函数详细介绍
首先要理解,函数是发生在集合之间的一种对应关系。然后,要理解发生在A、B之间的函数关系不止且不止一个。最后,要重点理解函数的三要素。函数的对应法则通常用解析式表示,但大量的函数关系是无法用解析式表示的,可以用图像、表格及其他形式表示 [2]  。在一个变化过程中,发生变化的量叫变量(数学中,常量为x,而y则随x值的变化而变化),有些数值是不随变量而改变的,我们称它们为常量。自变量(函数):一个与它量有关联的变量,这一量中的任何一值都能在它量中找到对应的固定值。因变量(函数):随着自变量的变化而变化,且自变量取唯一值时,因变量(函数)有且只有唯一值与其相对应。函数值:在y是x的函数中,x确定一个值,y就随之确定一个值,当x取a时,y就随之确定为b,b就叫做a的函数值 [2]  。设A和B是两个非空集合,如果按照某种对应关系 ,对于集合A中的任何一个元素a,在集合B中都存在唯一的一个元素b与之对应,那么,这样的对应(包括集合A,B,以及集合A到集合B的对应关系f)叫做集合A到集合B的映射(Mapping),记作 。其中,b称为a在映射f下的象,记作: ; a称为b关于映射f的原象。集合A中所有元素的象的集合记作f(A)。则有:定义在非空数集之间的映射称为函数。(函数的自变量是一种特殊的原象,因变量是特殊的象) [2]  函数与不等式和方程存在联系(初等函数)。令函数值等于零,从几何角度看,对应的自变量的值就是图像与X轴的交点的横坐标;从代数角度看,对应的自变量是方程的解。另外,把函数的表达式(无表达式的函数除外)中的“=”换成“<”或“>”,再把“Y”换成其它代数式,函数就变成了不等式,可以求自变量的范围 [2]  。如果X到Y的二元关系 ,对于每个 ,都有唯一的 ,使得 ,则称f为X到Y的函数,记做: 。当 时,称f为n元函数 [2]  。输入值的集合X被称为f的定义域;可能的输出值的集合Y被称为f的值域。函数的值域是指定义域中全部元素通过映射f得到的实际输出值的集合。注意,把对应域称作值域是不正确的,函数的值域是函数的对应域的子集。计算机科学中,参数和返回值的数据类型分别确定了子程序的定义域和对应域。因此定义域和对应域是函数一开始就确定的强制进行约束。另一方面,值域是和实际的实现有关 [2]  。 单射函数,将不同的变量映射到不同的值。即:对于所有 和 ,当 时有 。满射函数,其值域即为其对应域。即:对映射f的对应域中之任意y,都存在至少一个x满足 y=f(x)。双射函数,既是单射的又是满射的。也叫一一对应。双射函数经常被用于表明集合X和Y是等势的,即有一样的基数。如果在两个集合之间可以建立一个一一对应,则说这两个集合等势 [2]  。 元素在的象就是f(x),他们所取的值为0 [2]  。函数f的图象是平面上点对 的集合,其中x取定义域上所有成员的。函数图象可以帮助理解证明一些定理。如果X和Y都是连续的线,则函数的图象有很直观表示注意两个集合X和Y的二元关系有两个定义:一是三元组(X,Y,G),其中G是关系的图;二是索性以关系的图定义。用第二个定义则函数f等于其图象 [2]  。
收起全文
精华内容
下载资源
问答
  • 函数指针和指针函数用法和区别

    万次阅读 多人点赞 2018-05-24 08:11:10
    函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,...

    前言

    函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,特别是刚开始学习这门语言的童鞋,估计碰到这些东西就已经要崩溃了,然后好不容易死记硬背下来应付考试或者面试,然后过了几天发现,又是根本不会用,也不知道该在哪些地方用,这就尴尬了。
    今天这里只讲两个相对简单的,其实上面说那些太复杂的东西也真的很少用,即便是用了理解起来很麻烦,所以莫不如先深刻理解这两个比较容易的,并且项目中比较常用到。

    正文

    先来看看两者的定义以及说明。

    指针函数

    定义

    指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
    声明格式为:*类型标识符 函数名(参数表)

    这似乎并不难理解,再进一步描述一下。
    看看下面这个函数声明:

    int fun(int x,int y);
    

    这种函数应该都很熟悉,其实就是一个函数,然后返回值是一个 int 类型,是一个数值。
    接着看下面这个函数声明:

    int *fun(int x,int y);
    

    这和上面那个函数唯一的区别就是在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。

    这样描述应该很容易理解了,所谓的指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针(即地址值)而已。

    指针函数的写法

    int *fun(int x,int y);
    int * fun(int x,int y);
    int* fun(int x,int y);
    

    这个写法看个人习惯,其实如果*靠近返回值类型的话可能更容易理解其定义。

    示例

    (由于本人习惯于 Qt 中进行开发,所以这里为了方便,示例是在 Qt 工程中写的,其语法是一样的,只是输出方式不同)
    来看一个非常简单的示例:

    typedef struct _Data{
        int a;
        int b;
    }Data;
    
    //指针函数
    Data* f(int a,int b){
        Data * data = new Data;
        data->a = a;
        data->b = b;
        return data;
    }
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        //调用指针函数
        Data * myData = f(4,5);
        qDebug() << "f(4,5) = " << myData->a << myData->b;
    
        return a.exec();
    }
    
    

    输出如下:

    f(4,5) =  4 5
    

    注意:在调用指针函数时,需要一个同类型的指针来接收其函数的返回值。
    不过也可以将其返回值定义为 void*类型,在调用的时候强制转换返回值为自己想要的类型,如下:

    //指针函数
    void* f(int a,int b){
        Data * data = new Data;
        data->a = a;
        data->b = b;
        return data;
    }
    
    调用:
    Data * myData = static_cast<Data*>(f(4,5));
    

    其输出结果是一样的,不过不建议这么使用,因为强制转换可能会带来风险。

    函数指针

    定义

    函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
    声明格式:类型说明符 (*函数名) (参数)
    如下:

    int (*fun)(int x,int y);
    

    函数指针是需要把一个函数的地址赋值给它,有两种写法:

    fun = &Function;
    fun = Function;
    

    取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。

    调用函数指针的方式也有两种:

    x = (*fun)();
    x = fun();
    

    两种方式均可,其中第二种看上去和普通的函数调用没啥区别,如果可以的话,建议使用第一种,因为可以清楚的指明这是通过指针的方式来调用函数。当然,也要看个人习惯,如果理解其定义,随便怎么用都行啦。

    示例

    int add(int x,int y){
        return x+y;
    }
    int sub(int x,int y){
        return x-y;
    }
    //函数指针
    int (*fun)(int x,int y);
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        //第一种写法
        fun = add;
        qDebug() << "(*fun)(1,2) = " << (*fun)(1,2) ;
    	//第二种写法
        fun = &sub;
        qDebug() << "(*fun)(5,3) = " << (*fun)(5,3)  << fun(5,3);
    
        return a.exec();
    }
    
    

    输出如下:

    (*fun)(1,2) =  3
    (*fun)(5,2) =  2 2
    

    上面说到的几种赋值和调用方式我都分别使用了,其输出结果是一样的。

    二者区别

    通过以上的介绍,应该都能清楚的理解其二者的定义。那么简单的总结下二者的区别:

    定义不同

    指针函数本质是一个函数,其返回值为指针。
    函数指针本质是一个指针,其指向一个函数。

    写法不同

    指针函数:int* fun(int x,int y);
    函数指针:int (*fun)(int x,int y);
    可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。
    再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。

    用法不同

    上面已经写了详细示例,这里就不在啰嗦了。

    总而言之,这两个东西很容易搞混淆,一定要深入理解其两者定义和区别,避免犯错。

    另外,本文都是针对普通函数指针进行介绍,如果是C++非静态成员函数指针,其用法会有一些区别,在另外一篇博客中单独介绍,文章在这里

    展开全文
  • 之前好好的能远程桌面连接到...要求的函数不受支持。猜想可能是Windows又更新了什么鬼,后面查询资料知道是由于CredSSP加密Oracle修正的原因,这里我整理了下解决方案,希望能帮到你。 微软给出解决方案: ...

    作为技术人,如何突破自己的技术瓶颈,从而提高自己的核心竞争力


    之前好好的能远程桌面连接到服务器,但是今天来就不能连接上了,并提示:身份验证错误。要求的函数不受支持。猜想可能是Windows又更新了什么鬼,后面查询资料知道是由于CredSSP加密Oracle修正的原因,这里我整理了下解决方案,希望能帮到你。

     

    微软给出解决方案:

    https://support.microsoft.com/zh-cn/help/4093492/credssp-updates-for-cve-2018-0886-march-13-2018

    2018 年 5 月 8 日

    罪魁祸首:是由于Windows将默认设置,从“易受攻击”更改为“缓解”的更新引起的。

     

    通用解决方案:

    方案一 :安装补丁强烈推荐)

    本地电脑和服务器端都同时安装更新补丁,更新以后重启服务器。

    补丁单独下载地址:

    win 7、win2008 R2:KB4103718 

    win 8、win2012:KB4103730

    win10、win2016 :KB4103721

    注意下载对应版本补丁进行安装,该方案博主没有亲测,请谨慎操作,如有探索的同学,可以试试,欢迎和博主一起交流学习。

     

    方案二:修改组策略设置(适用于windows专业版以上

    打开运行:gpedit.msc

    打开组策略编辑器

    应用确定完之后就可以进行远程连接

     

    方案三:删除卸载更新(适用于windows10家庭版

    Windows10家庭版,卸载KB4103727和KB4131372两个补丁包即可。

    选择查看已安装的更新

    选择你要卸载的卸载即可

     

    补丁包需要逐个卸载,等第一个卸载完再卸载第二个,两个都卸载完毕后,重启电脑。你又可以进行远程桌面连接了。

     

    方案四:windows10家庭版找回组策略(适用于windows10家庭版

     

    以为windows 10 家庭版也可以通过组策略配置就可以了,就把组策略搞了出来,进入组策略发现没有那一项,,最后还是卸载了最后的那个更新补丁

    新建一个TXT文档,在里面写入

    @echo off
    pushd "%~dp0"
    dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt
    dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>List.txt
    for /f %%i in ('findstr /i . List.txt 2^>nul') do dism /online /norestart /add-package:"C:\Windows\servicing\Packages\%%i"
    pause

    最后将后缀改为.cmd结尾即可

    双机运行,等待他执行完,任意键退出即可

    重启PC,运行中再输入gpedit.msc即可调出组策略编辑器,再进行方案二的操作。

     

    方案五:直接改服务器配置(简单)

    依次打开:我的电脑 - 属性 - 远程桌面设置 - 远程。去掉下面截图的这个勾选。

    展开全文
  • Pandas的Apply函数——Pandas中最好用的函数

    万次阅读 多人点赞 2018-02-22 18:22:04
    Pandas最好用的函数 Pandas是Python语言中非常好用的一种数据结构包, 包含了许多有用的数据操作方法。而且很多算法相关的库函数的输入数据结构都要求是pandas数据,或者有该数据的接口。 仔细看pandas的API...

    Pandas最好用的函数

    PandasPython语言中非常好用的一种数据结构包,包含了许多有用的数据操作方法。而且很多算法相关的库函数的输入数据结构都要求是pandas数据,或者有该数据的接口。

    仔细看pandas的API说明文档,就会发现有好多有用的函数,比如非常常用的文件的读写函数就包括如下函数:

    Format Type Data Description Reader Writer
    text CSV read_csv to_csv
    text JSON read_json to_json
    text HTML read_html to_html
    text Local clipboard read_clipboard to_clipboard
    binary MS Excel read_excel to_excel
    binary HDF5 Format read_hdf to_hdf
    binary Feather Format read_feather to_feather
    binary Parquet Format read_parquet to_parquet
    binary Msgpack read_msgpack to_msgpack
    binary Stata read_stata to_stata
    binary SAS read_sas  
    binary Python Pickle Format read_pickle to_pickle
    SQL SQL read_sql to_sql
    SQL Google Big Query read_gbq to_gbq

    读取数据后,对于数据处理来说,有好多有用的相关操作的函数,但是我认为其中最好用的函数是下面这个函数:

    apply函数

    apply函数是`pandas`里面所有函数中自由度最高的函数。该函数如下:

    DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)

    该函数最有用的是第一个参数,这个参数是函数,相当于C/C++的函数指针。

    这个函数需要自己实现,函数的传入参数根据axis来定,比如axis = 1,就会把一行数据作为Series的数据结构传入给自己实现的函数中,我们在函数中实现对Series不同属性之间的计算,返回一个结果,则apply函数会自动遍历每一行DataFrame的数据,最后将所有结果组合成一个Series数据结构并返回。

    比如读取一个表格:
    在这里插入图片描述
    假如我们想要得到表格中的PublishedTimeReceivedTime属性之间的时间差数据,就可以使用下面的函数来实现:

    import pandas as pd
    import datetime   #用来计算日期差的包
    
    def dataInterval(data1,data2):
        d1 = datetime.datetime.strptime(data1, '%Y-%m-%d')
        d2 = datetime.datetime.strptime(data2, '%Y-%m-%d')
        delta = d1 - d2
        return delta.days
    
    def getInterval(arrLike):  #用来计算日期间隔天数的调用的函数
        PublishedTime = arrLike['PublishedTime']
        ReceivedTime = arrLike['ReceivedTime']
    #    print(PublishedTime.strip(),ReceivedTime.strip())
        days = dataInterval(PublishedTime.strip(),ReceivedTime.strip())  #注意去掉两端空白
        return days
    
    if __name__ == '__main__':    
        fileName = "NS_new.xls";
        df = pd.read_excel(fileName) 
        df['TimeInterval'] = df.apply(getInterval , axis = 1)
    

    有时候,我们想给自己实现的函数传递参数,就可以用的apply函数的*args**kwds参数,比如同样的时间差函数,我希望自己传递时间差的标签,这样没次标签更改就不用修改自己实现的函数了,实现代码如下:

    import pandas as pd
    import datetime   #用来计算日期差的包
    
    def dataInterval(data1,data2):
        d1 = datetime.datetime.strptime(data1, '%Y-%m-%d')
        d2 = datetime.datetime.strptime(data2, '%Y-%m-%d')
        delta = d1 - d2
        return delta.days
    
    def getInterval_new(arrLike,before,after):  #用来计算日期间隔天数的调用的函数
        before = arrLike[before]
        after = arrLike[after]
    #    print(PublishedTime.strip(),ReceivedTime.strip())
        days = dataInterval(after.strip(),before.strip())  #注意去掉两端空白
        return days
    
    
    if __name__ == '__main__':    
        fileName = "NS_new.xls";
        df = pd.read_excel(fileName) 
        df['TimeInterval'] = df.apply(getInterval_new , 
          axis = 1, args = ('ReceivedTime','PublishedTime'))    #调用方式一
        #下面的调用方式等价于上面的调用方式
        df['TimeInterval'] = df.apply(getInterval_new , 
          axis = 1, **{'before':'ReceivedTime','after':'PublishedTime'})  #调用方式二
        #下面的调用方式等价于上面的调用方式
        df['TimeInterval'] = df.apply(getInterval_new , 
          axis = 1, before='ReceivedTime',after='PublishedTime')  #调用方式三
    

    修改后的getInterval_new函数多了两个参数,这样我们在使用apply函数的时候要自己传递参数,代码中显示的三种传递方式都行。

    最后,本篇的全部代码在下面这个网页可以下载:

    https://github.com/Dongzhixiao/Python_Exercise/tree/master/pandas_apply

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

    万次阅读 多人点赞 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&gt;0, f=wTx+bx&gt;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&gt;0α(ex−1),otherwisef(x)= \begin{cases}x,&amp; \text{if } x &gt; 0\\ \alpha(e^x - 1), &amp; \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》

    展开全文
  • Matlab subs函数的用法

    万次阅读 多人点赞 2017-01-03 20:16:17
    Matlab subs函数的用法 matlab中subs()是符号计算函数,详细用法可以在Matlab的Command Windows输入:help subs。subs()函数表示将符号表达式中的某些符号变量替换为指定的新的变量,常用调用方式为: R = subs(S,...
  • Kotlin系列之let、with、run、apply、also函数的使用

    万次阅读 多人点赞 2017-12-12 21:59:53
    一、回调函数的Kotin的lambda的简化 二、内联扩展函数之let 三、内联函数之with 四、内联扩展函数之run 五、内联扩展函数之apply 六、内联扩展函数之also 七、let,with,run,apply,also函数区别 简述: 相比Java, ...
  • 如何简单理解概率分布函数和概率密度函数

    万次阅读 多人点赞 2018-09-11 16:56:19
    本篇文章是在《应该如何理解概率分布函数和概率密度函数?》的基础上整理来的。非常感谢原作者。 目录 1先从离散型随机变量和连续性随机变量说起 2离散型随机变量的概率函数,概率分布和分布函数 2.1概率函数和...
  • JAVA构造函数(方法)

    万次阅读 多人点赞 2019-06-03 21:56:24
    一、什么是构造函数 java构造函数,也叫构造方法,是java中一种特殊的函数函数名与相同,无返回值。 作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。 在现实生活中,...
  • C++中strcpy()函数和strcpy_s()函数的使用及注意事项

    万次阅读 多人点赞 2018-09-04 12:55:18
    在编写C++程序时,不可避免会遇到strcpy()函数和其安全版本strcpy_s()函数,其实之所以会推出_s版本的函数,就是为了使编程更加安全,然而为了保证安全,也就会更容易使我们编写的代码“被报错”。所以这里来简略说...
  • COUNT()函数详解

    万次阅读 多人点赞 2017-11-24 13:12:33
    COUNT 顾名思义,就是计数的意思,此函数用处就是对表中记录数进行计数。 MySQL COUNT()函数介绍 COUNT()函数返回表中的行数。COUNT()函数允许您对表中符合特定条件的所有行进行计数。 COUNT()函数的语法如下 - ...
  • 伽马函数的总结

    万次阅读 多人点赞 2016-11-04 10:08:37
    伽马函数的总结@(概率论)Γ(x)=∫+∞0tx−1e−tdt\Gamma(x) = \int_0^{+\infty}t^{x-1}e^{-t}dt性质: Γ(x+1)=xΓ(x)\Gamma(x+1) = x\Gamma(x) Γ(x)>0,任意x∈(0,+∞)\Gamma(x) > 0, 任意x\in(0,+\infty) Γ(1)=...
  • accept函数详解

    万次阅读 多人点赞 2013-10-29 00:08:47
    既然服务端已经很虔诚了,很真诚了,处于倾听状态,...接纳客户端请求的函数是accept, 我们先来看看函数的原型: WINSOCK_API_LINKAGE SOCKET WSAAPI accept( SOCKET s, struct sockaddr FAR * addr, int FAR * ad
  • 一分钟理解softmax函数(超简单)

    万次阅读 多人点赞 2018-11-28 16:39:09
    做过多分类任务的同学一定都知道softmax函数。softmax函数,又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。下图展示了softmax的计算方法: 下面为大家...
  • 终于搞懂了vue 的 render 函数(一) -_-|||

    万次阅读 多人点赞 2018-10-11 20:32:18
    文章目录render 函数作用render 函数讲解render 函数的返回值(VNode)render 函数的参数(createElement)createElement 函数的返回值(VNode)createElement 函数的参数(三个)结合代码 vue渲染函数文档第一遍看...
  • C语言函数

    万次阅读 多人点赞 2019-08-03 19:54:19
    每个C程序都至少有一个函数,即主函数main(),如果程序的任务比较简单,全部的代码都写在main()函数中,但是,在实际开发中,程序的任务往往比较复杂,如果全部的代码都写在main()函数中,main()函数将非常庞大臃肿...
  • 指针函数函数指针

    万次阅读 多人点赞 2019-03-30 16:21:36
    很多人因为搞不清这两个概念,干脆就避而远之,我刚接触C语言的时候对这两个概念也比较模糊,特别是当指针函数函数指针、函数指针变量、函数指针数组放在一块的时候,能把强迫症的人活活逼疯。 其实如果理解了这些...
  • R语言常用函数总结大全

    万次阅读 多人点赞 2017-03-12 09:01:58
    今天把R常用函数大体汇总了一下,其中包括一般数学函数,统计函数,概率函数,字符处理函数,以及一些其他函数; 1.数学函数 函数 作用 abs() 绝对值 sqrt() ...
  • C++虚函数表剖析

    万次阅读 多人点赞 2016-02-18 20:28:23
    关键词:虚函数,虚表,虚表指针,动态绑定,多态一、概述为了实现C++的多态,C++使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。二、类的虚表每个...
  • sigmod函数tanh函数ReLU函数

    万次阅读 2016-10-30 21:43:44
    sigmod(x)函数sigmod函数的数学公式为: Θ(x)=11+e−x \Theta(x)=\frac {1}{1+e^{-x} } 函数取值范围(0,1),函数图像下图所示:二. tanh(x) 函数tanh(x)函数的数学公式为:tanh(x)=sinh(x)cosh(x)tanh(x) = \frac{...
  • 函数和纯虚函数的区别

    万次阅读 多人点赞 2012-05-11 22:35:51
    定义一个函数为虚函数,不代表函数为不被实现的函数。 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个...
  • MATLAB:运行出现 “ 未定义函数或变量 ”

    万次阅读 多人点赞 2019-05-17 22:18:13
    第一次接触MATLAB,出现错误还以为函数写错了,检查之后发现不是,上网找了找方法 如果编写的文件没有放在当前运行目录下,也会出现这个错误,具体可点击参考 检查目录后,发现路径没有错 最后,发现,编写的M文件,...
  • 激活函数Sigmoid

    万次阅读 2020-03-18 19:53:54
    本文直接讨论SIgmoid激活函数,这是比较早的激活函数了,使用也非常广泛,这个函数又叫Logistic函数,因为这个激活函数和逻辑回归的关系式非常之密切的。   函数的形式是f(x)=11−e−xf(x)=\frac{1}{1-e^{-x}}f(x)...
  • 激活函数Tanh

    万次阅读 2020-03-18 19:54:46
    激活函数Tanh系列文章:   Tanh的诞生比Sigmoid晚一些,sigmoid函数我们提到过有一个缺点就是输出不以0为中心,使得收敛变慢的问题。而Tanh则就是解决了这个问题。Tanh就是双曲正切函数。等于双曲余弦除双曲正弦。...
  • 激活函数ReLU

    万次阅读 2020-03-18 19:55:16
    激活函数ReLUReLUPReLU(Parametric)E(Exponential)LU系列文章: ReLU   Relu(Rectified Linear Unit)函数也可谓是一个里程碑式的激活函数。我们之前已经谈到过sigmoid函数和tanh函数的缺点,我们接下来就看relu...
  • 考研数学-三角函数与反三角函数图像

    万次阅读 多人点赞 2018-08-12 17:42:57
    在三角函数的前面加上arc,表示它们的反函数f–1(x)。即由一个三角函数值得出当时的角度。 1. 正弦函数 sin x, 反正弦函数 arcsin x y = sin x, x∈R, y∈[–1,1],周期为2π,函数图像以 x = (π/2) + k...
  • matlab中求均值的mean()函数的使用

    万次阅读 多人点赞 2016-06-08 10:17:05
    matlab中mean函数
  • C++(笔记)容器(vector)作为函数参数如何传参

    万次阅读 多人点赞 2017-05-17 17:51:54
    一、大致以下类型 void 函数名( vector< int> obj ); void 函数名( vector* pobj );... // 在函数内不能改变 pobj 指向的对象 ,//调用时不会调用拷贝构造函数 void 函数名( vector< int>& obj ); void
  • c++虚函数详解(你肯定懂了)

    万次阅读 多人点赞 2018-08-01 11:02:13
    转自:c++虚函数 大牛的文章,就是通俗易懂,言简意赅。 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数...
  • 之前提到的激活函数是以阈值0(界限值)为界的,小于等于0,输出0,否则,输出1。类似于这样的切换输出函数被称之为“阶跃函数”。因此,可以说感知机的激活函数为阶跃函数。那么,如果感知机使用其他函数作为激活...
  • Matlab sim函数的用法

    万次阅读 多人点赞 2016-11-26 20:50:37
    最近用Simulink做仿真的时候,需要在m文件里运行Simulink模型,而且需要传递一些参数,所以要用到sim函数。查看了help文档,并百度到了一些关于sim的用法的答案,但并没能达到我要的效果,大多数答案都是描述sim函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,812,556
精华内容 1,125,022
关键字:

函数