精华内容
下载资源
问答
  • react中的无状态函数式组件

    千次阅读 2018-05-17 22:20:48
    其实无状态函数式组件也是官方比较推荐的一种方式,尽量让底层的组件变成无状态函数式组件,也即组件尽量只用来显示数据,把数据操作的逻辑都放在顶层,然后从顶层把数据传到底层嗯,看个例子,使用类组件和无状态...

    无状态函数式组件,顾名思义,无状态,也就是你无法使用State,也无法使用组件的生命周期方法,这就决定了函数组件都是展示性组件,接收Props,渲染DOM,而不关注其他逻辑。

    其实无状态函数式组件也是官方比较推荐的一种方式,尽量让底层的组件变成无状态函数式组件,也即组件尽量只用来显示数据,把数据操作的逻辑都放在顶层,然后从顶层把数据传到底层

    嗯,看个例子,使用类组件和无状态函数式组件两种方法进行对比

    顶层关键代码:

    import React,{Component} from 'react';
    import ReactDOM from 'react-dom';
    import Bottom from './component/props'
    
    ReactDOM.render(
        <div>
            <Bottom name="donna"/>
        </div>
        ,
    document.getElementById('root')
    )
    底层代码,使用无状态函数式组件实现
    import React,{Component} from 'react';
    export default  function Bottom(props){
        let{name} = props
        const sayHi = () => {
            console.log(`Hi ${name}`);
        }
        return (
            <div>
                <h1>Hello, {name}</h1>
                <button onClick ={sayHi}>Say Hi</button>
            </div>
        )
    }
    然后看类式组件的实现方法
    import React,{Component} from 'react';
    
    export default  class Bottom extends Component{
        constructor(props){
            super(props);
            this.sayHi = this.sayHi.bind(this)//记得绑定this,否则this指向可能会出错
        }
    
        sayHi(){
            let {name} = this.props
        console.log(`Hi ${name}`);
        }
        render(){
            let {name} = this.props
            let{sayHi} =this;
            return(
                <div>
                    <h1>{`Hello, ${name}`}</h1>
                    <button onClick ={sayHi}>Say Hi</button>
                </div>
            )
        }
    
    }

    对比下来,确实无状态函数组件代码量少(轻量),最重要的是,函数式组件简单啊,类式组件一不小心就出错了。

    函数式组件更容易理解。当你看到一个函数组件时,你就知道它的功能只是接收属性,渲染页面,它不执行与UI无关的逻辑处理,它只是一个纯函数。而不用在意它返回的DOM结构有多复杂。

    不需要声明类,可以避免大量的譬如extends或者constructor这样的代码

    不需要显示声明this关键字,在ES6的类声明中往往需要将函数的this关键字绑定到当前作用域,而因为函数式声明的特性,我们不需要再强制绑定

    无状态组件不支持 "ref"
    有一点遗憾的是无状态组件不支持 "ref"。原理很简单,因为在 React 调用到无状态组件的方法之前,是没有一个实例化的过程的,因此也就没有所谓的 "ref"。



    展开全文
  • 传递函数状态空间

    千次阅读 2019-09-21 23:31:37
       传递函数状态空间之间可相互转换,可以使用的matlab函数有 [A,B,C,D] = tf2ss(NUM,DEN) [NUM,DEN] = ss2tf(A,B,C,D,iu)    传递函数的形式唯一,但状态空间的形式不唯一,可以多种。 1、一阶惯性...

       传递函数与状态空间之间可相互转换,可以使用的matlab函数有

    [A,B,C,D] = tf2ss(NUM,DEN)
    [NUM,DEN] = ss2tf(A,B,C,D,iu)
    

       传递函数的形式唯一,但状态空间的形式不唯一,可以有多种。

    1、一阶惯性环节

     
    在这里插入图片描述
    时间常数为T,本身为低通滤波器,截止频率wc为1/T,通过伯德图可查看,如设置T=0.1,则

    T = 0.1;
    sys = tf(1,[T 1]);
    bode(sys);
    

    在这里插入图片描述

    a. 离散形式

       设u为输入,x为输出,h为步长,则:

    在这里插入图片描述
    simulink为:
    在这里插入图片描述

    b.状态空间形式

    在这里插入图片描述

    形式1:
    		A = -1/T;
    		B = 1/T;
    		C = 1;
    		D = 0;
    

    即:
    在这里插入图片描述

    形式2:
    		A = -1/T;
    		B = 1;
    		C = 1/T;
    		D = 0;
    

    即:
    在这里插入图片描述

    c.仿真

    在这里插入图片描述
    仿真结果:
    在这里插入图片描述
       传递函数、离散形式及状态空间形式所仿真的结果是一致的。

    2、二阶震荡环节

     
    在这里插入图片描述
       低通滤波器,当阻尼等于0.707时,传递函数的截止频率wc是wn,如wn等于10,bode图如下:
    在这里插入图片描述

    a. 离散形式

       设u为输入,x为输出,h为步长,则:
    在这里插入图片描述
    simulink为:
    在这里插入图片描述

    b. 状态空间

    形式1:
    		A = [0 1;-wn^2 -2*ksi*wn];
    		B = [0;wn^2];
    		C = [1 0];
    		D = 0;
    

    即:
    在这里插入图片描述

    形式2:
    		A = [0 1;-wn^2 -2*ksi*wn];
    		B = [0;1];
    		C = [wn^2 0];
    		D = 0;
    

    即:
    在这里插入图片描述

    c.仿真

    在这里插入图片描述
    仿真结果:
    在这里插入图片描述
       传递函数、离散形式及状态空间形式所仿真的结果是一致的。


    上面两个仿真的simulink模型在此:

    https://download.csdn.net/download/niu_88/11799584


    3、传递函数离散化以及状态空间转换

    可参考此资料:

    https://download.csdn.net/download/niu_88/11799588

    展开全文
  • 在本文中,我们将学习贝尔曼方程和价值函数。 回报和返还(return) 正如前面所讨论的,强化学习agent如何最大化累积未来的回报。用于描述累积未来回报的词是返还,通常用R表示。我们还使用一个下标t来表示某个时间...

    在本文中,我们将学习贝尔曼方程和价值函数。

    回报和返还(return)
    正如前面所讨论的,强化学习agent如何最大化累积未来的回报。用于描述累积未来回报的词是返还,通常用R表示。我们还使用一个下标t来表示某个时间步长的返还。在数学符号中,它是这样的:

    强化学习系列(下):贝尔曼方程

    如果我们让这个级数趋于无穷,那么我们最终会得到无限的返还,这对于问题的定义并没有太大意义。因此,只有在我们期望返还的级数终止时,这个方程才有意义。我们将这种总是终止的任务称为“插曲式”(episodic)。纸牌游戏是解释“插曲式”问题的好例子。“插曲”开始于对每个人发牌,并且不可避免地会随着游戏规则的不同而结束。然后,下一“插曲”又开始了另一回合的游戏。

    相比使用未来的累积回报作为返还,更常见的是使用未来的累积折现回报(cumulative discounted reward):

    强化学习系列(下):贝尔曼方程

    其中0<γ<1。以这种方式定义返还的两个好处是,返还在无穷级数中得到了很好的定义,而且它把更大的权重给了更早的回报,这意味着我们更关心即将得到的回报,而不是将来会得到更多的回报。我们为γ选择的值越小就越正确。这种情况在我们让γ等于0或1时就可以看到。如果γ等于1,这个方程就变成了对所有的回报都同样的关心,无论在什么时候。另一方面,当γ等于0时,我们只关心眼前的回报,而不关心以后的回报。这将导致我们的算法极其短视。它将学会采取目前最好的行动,但不会考虑行动对未来的影响。

    策略
    一个策略,写成π(s, a),描述了一种行动方式。它是一个函数,能够采取一个状态和一个行动,并返回在那个状态下采取这个行动的概率。因此,对于一个给定的状态,即

    强化学习系列(下):贝尔曼方程

    必须是真实的。在下面的例子中,当我们“饥饿”的时候,我们可以在两种行为之间做出选择,要么“吃”,要么“不吃”。

    强化学习系列(下):贝尔曼方程

    我们的策略应该描述如何在每个状态中采取行动,所以一个等概率的随机策略看起来就像

    强化学习系列(下):贝尔曼方程

    ,在这里

    强化学习系列(下):贝尔曼方程

    (Eat)是行为“吃”,而

    强化学习系列(下):贝尔曼方程

    (Don’t Eat)是“不吃”。这意味着,如果你处于“饥饿”状态,选择“吃”和“不吃”的概率是相等的。

    我们在强化学习中的目标是学习一种最优策略,定义为

    强化学习系列(下):贝尔曼方程

    。最优策略告诉我们如何采取行动来最大化每个状态的返还。因为这是一个很简单的例子,所以很容易看出,在这种情况下,最优策略是在“饥饿”时总是“吃”,那么就是

    强化学习系列(下):贝尔曼方程

    。在这个实例中,对于许多马尔可夫决策来说,最优策略是确定的。每个状态都有一个最优的行动。有时这被写成

    强化学习系列(下):贝尔曼方程

    ,它是从状态到这些状态中的最优行动的映射。

    价值函数
    为了学习最优策略,我们利用了价值函数。在强化学习中有两种类型的价值函数:状态值函数(state value function),用V(s)表示,和行动值函数,用Q(s,a)表示。

    状态值函数在遵循策略时描述一个状态的值。当从状态的行为以我们的策略π开始时,这就是预期的返还。

    强化学习系列(下):贝尔曼方程

    需要注意的是,即使在相同的环境中,价值函数也会根据策略发生变化。这是因为状态的价值取决于你的行动,因为你在那个特定的状态下的行动会影响你期望看到的回报。同时还要注意期望的重要性。期望(expectation)就像一个平均值;它就是你期望看到的返还。我们使用期望的原因是当你到达一个状态后会发生一些随机事件。你可能有一个随机的策略,这意味着我们需要把我们采取的所有不同行动的结果结合起来。此外,转换函数(transition function)可以是随机的,也就是说,我们可能不会以100%的概率结束任何状态。请记住上面的例子:当你选择一个行动时,环境将返回下一个状态。即使给出一个行动,也可能会有多个状态返还。当我们看贝尔曼方程时,会看到更多这样的情况。期望将所有这些随机因素考虑在内。

    我们将使用的另一个价值函数是行动值函数。行动值函数告诉我们当跟随某个策略时,在某些状态下执行某个行动的值。给出状态和在π下的行动,这是期望的返还:

    强化学习系列(下):贝尔曼方程

    对状态值函数的注释同样适用于行动值函数。根据该策略,期望将考虑未来行动的随机性,以及来自环境的返还状态的随机性。

    贝尔曼方程
    理查德·贝尔曼推导出了以下公式,让我们可以开始解决这些马尔可夫决策问题。贝尔曼方程在强化学习中无处不在,对于理解强化算法的工作原理是非常必要的。但在我们了解贝尔曼方程之前,我们需要一个更有用的符号,定义为

    强化学习系列(下):贝尔曼方程

    强化学习系列(下):贝尔曼方程

    ,如下所示:

    强化学习系列(下):贝尔曼方程

    强化学习系列(下):贝尔曼方程

    是过渡概率。如果我们从状态s开始,然后采取行动a,我们就会得到状态

    强化学习系列(下):贝尔曼方程

    和概率

    强化学习系列(下):贝尔曼方程

    强化学习系列(下):贝尔曼方程

    强化学习系列(下):贝尔曼方程

    是另一种写为期望(或平均)回报的方式,我们从状态s开始,采取行动a,然后移动到状态

    强化学习系列(下):贝尔曼方程

    最后,有了这些条件,我们就可以推导出贝尔曼方程了。我们将考虑贝尔曼方程的状态值函数。根据返还的定义,我们可以重写方程(1),如下所示:

    强化学习系列(下):贝尔曼方程

    如果我们从求和中得到第一个回报,我们可以这样重写它:

    强化学习系列(下):贝尔曼方程

    这里的期望描述的是,如果我们继续遵循策略π的状态s,我们期望返还的是什么。通过对所有可能的行动和所有可能的返还状态的求和,可以明确地编写为期望。下面的两个方程可以帮助我们完成下一个步骤。

    强化学习系列(下):贝尔曼方程

    通过在这两个部分之间分配期望,我们就可以把我们的方程转化成:

    强化学习系列(下):贝尔曼方程

    注意,方程(1)与这个方程的末尾形式相同。我们可以替换它,得到:

    强化学习系列(下):贝尔曼方程

    贝尔曼方程的行动值函数可以以类似的方式进行推导。本文结尾有具体过程,其结果如下:

    强化学习系列(下):贝尔曼方程

    贝尔曼方程的重要性在于,它们让我们表达了其它状态的价值。这意味着,如果我们知道

    强化学习系列(下):贝尔曼方程

    的值,我们可以很容易地计算出

    强化学习系列(下):贝尔曼方程

    的值。这为计算每个状态值的迭代方法打开了大门,因为如果我们知道下一个状态的值,我们就可以知道当前状态的值。最重要的事情是我们需要记住一些编号方程。最后,在贝尔曼方程中,我们可以开始研究如何计算最优策略,并编码我们的第一个强化学习agent。

    在我们推导出贝尔曼方程的过程中,我们得到了这一系列的方程,从方程(2)开始:

    强化学习系列(下):贝尔曼方程

    展开全文
  • 几种常见的激活函数

    万次阅读 多人点赞 2016-09-30 13:16:21
    这个非线性函数我们多种选择(后面会讲),不过这一个是比较常用的,简单地通过0阈值来激活元素值。最后,W2则应该是一个[10*100]的矩阵,这样我们最后还是得到了10个类别得分。其中W1,W2就是通过之前所说的随机...

     

    你要的答案或许都在这里:小鹏的博客目录

    MachineLP的Github(欢迎follow):https://github.com/MachineLP

     

    本课程笔记是基于今年斯坦福大学Feifei Li, Andrej Karpathy & Justin Johnson联合开设的Convolutional Neural Networks for Visual Recognition课程的学习笔记。目前课程还在更新中,此学习笔记也会尽量根据课程的进度来更新。

    今天终于可以开始讲神经网络啦~~

    1.一个简单的介绍

    我们先把那些关于人脑、神经什么的东西抛到一边,来简单地理解下神经网络。在linear classification那一章,我们是通过计算输入图片属于不同类别的score来判断它到底属于哪个类的,即s=Wx,其中W是参数矩阵,x是由输入图像的所有pixel组成的一个特征列向量。比如以CIFAR-10为例的话x就是[3072*1]的列向量,W是[10*3072]的矩阵,因此输出是10个类别得分。 
    那么在神经网络中,计算score的方法有所不同:s=W2max(0,W1x)。其中W1也是一个参数矩阵,他可以把原始图像特征x转变成比如说100维的中间层向量特征 (则此时W1应为[100*3072]维)。函数max(0,~)是一个非线性函数,对矩阵中小于0的元素置零而保留大于0的元素值不变。这个非线性函数我们有多种选择(后面会讲),不过这一个是比较常用的,简单地通过0阈值来激活元素值。最后,W2则应该是一个[10*100]的矩阵,这样我们最后还是得到了10个类别得分。其中W1,W2就是通过之前所说的随机梯度下降法学习到的,其中用到反向传播算法来计算每一步更新的梯度哦(不了解这部分内容要去戳一下我前面的课程笔记了啊)。注意非线性函数部分(也称为激活函数),是神经网络中很重要的一个部分,但是即使我们把非线性函数部分去掉,把W1x直接和W2相乘我们也可以得到10个类别得分,但是这样就少了一些扰动(wiggle),影响泛化性能等。 
    同样的,3层的神经网络会长这个样子:s=W3max(0,W2max(0,W1x)),就是这么简单!其中W1,W2,W3都是学习得到的参数。中间层特征向量的维度是hyperparameter,我们在后面会讲怎么设置他们。 
    接下来让我们再用人脑神经元之类的东西来解释上面所说的神经网络吧。

    2. 建模神经元

    神经网络这一领域最早来源于对生物神经系统的建模,而后慢慢演变成一种工程的方法,并且在机器学习中取得了很好的效果。我们这边只简短地介绍和我们相关的生物学系统的知识。

    2.1 神经元的激活和连接

    人脑中基本的计算单元叫做神经元(neuron).人的神经系统中大约包含860亿个这样的神经元,并且他们之间通过大约10^14~10^15这么多的突触(synapses)连接。下图就显示了一个神经元和它抽象出的数学模型。每个神经元会从它们的树突(dendrites)获得输入信号,然后再将输出信号传给它唯一的轴突(axon)。轴突再通过突触和其他神经元的树突相连。 
    在神经元的数学模型中,轴突所携带的信号(例如:x0)通过突触进行传递,由于突触的强弱不一,假设我们以w0表示,那么我们传到下一个神经元的树突处的信号就变成了w0x0。其中突触强弱(参数w)是可学的,它控制了一个神经元对另一个神经元影响的大小和方向(正负)。然后树突接收到信号后传递到神经元内部(cell body),与其他树突传递过来的信号一起进行加和,如果这个和的值大于某一个固定的阈值的话,神经元就会被激活,然后传递冲激信号给树突。在数学模型中我们假设传递冲激信号的时间长短并不重要,只有神经元被激活的频率用于传递信息。我们将是否激活神经元的函数称为激活函数(activation function f),它代表了轴突接收到冲激信号的频率。以前我们比较常用的一个激活信号是sigmoid function σ,因为它接收一个实值的信号(即上面所说的加和的值)然后将它压缩到0-1的范围内。我们在后面会介绍更多的激活函数。 
    这里写图片描述 
    关于上述传播过程(前向传播),代码如下:

    <code class="language-python hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Neuron</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(object)</span>:</span>
      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># ... </span>
      <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">forward</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(inputs)</span>:</span>
        <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""" assume inputs and weights are 1-D numpy arrays and bias is a number """</span>
        cell_body_sum = np.sum(inputs * self.weights) + self.bias
        firing_rate = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.0</span> / (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.0</span> + math.exp(-cell_body_sum)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># sigmoid activation function</span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> firing_rate</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

    2.2 一个神经元就是一个线性分类器

    神经元的上述前向传播过程从形式上看着很熟悉。我们之前在线性分类器中看到,分类器具有判断score好坏的能力,在神经元中也是一样,我们通过激活与否来得到神经元的输出,再通过一个恰当的损失函数就能将一个神经元转化成线性分类器了。 
    Binary Softmax classifier. 比如说,我们可以把σ(∑iwixi+b)看成是某类的概率P(yi=1|xi;w),那么另一类的概率则是P(yi=0|xi;w)=1−P(yi=1|xi;w),因为对于二值分类器而言两类的概率相加应为1。然后我们再通过在线性分类器那一章见过的交叉熵loss对score的好坏进行量化,这就是一个二值softmax分类器了(也叫逻辑回归)。因为sigmoid function会把只限定于0-1之间,分类器可以通过判断上述概率是否大于0.5来进行分类。 
    Binary SVM classifier. 我们还可以选择边界最大化的hinge loss来衡量神经元输出的好坏,那么此时就变成了一个二值SVM分类器了。 
    Regularization.不管是在SoftmaxLoss还是在SVM中,loss的正则项regularization loss在生物学角度上都可以理解成是渐进遗忘(gradual forgetting),因为它的作用在于使得所有突触的权重w在权重更新的过程中都趋向于0。

    2.3 几种常见的激活函数

    这里写图片描述 
    Sigmoid. Sigmoid 非线性激活函数的形式是σ(x)=1/(1+e−x),其图形如上图左所示。之前我们说过,sigmoid函数输入一个实值的数,然后将其压缩到0~1的范围内。特别地,大的负数被映射成0,大的正数被映射成1。sigmoid function在历史上流行过一段时间因为它能够很好的表达“激活”的意思,未激活就是0,完全饱和的激活则是1。而现在sigmoid已经不怎么常用了,主要是因为它有两个缺点:

    • Sigmoids saturate and kill gradients. Sigmoid容易饱和,并且当输入非常大或者非常小的时候,神经元的梯度就接近于0了,从图中可以看出梯度的趋势。这就使得我们在反向传播算法中反向传播接近于0的梯度,导致最终权重基本没什么更新,我们就无法递归地学习到输入数据了。另外,你需要尤其注意参数的初始值来尽量避免saturation的情况。如果你的初始值很大的话,大部分神经元可能都会处在saturation的状态而把gradient kill掉,这会导致网络变的很难学习。
    • Sigmoid outputs are not zero-centered. Sigmoid 的输出不是0均值的,这是我们不希望的,因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in f=wTx+b),那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 
      当然了,如果你是按batch去训练,那么每个batch可能得到不同的符号(正或负),那么相加一下这个问题还是可以缓解。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。

    Tanh. Tanh和Sigmoid是有异曲同工之妙的,它的图形如上图右所示,不同的是它把实值得输入压缩到-1~1的范围,因此它基本是0均值的,也就解决了上述Sigmoid缺点中的第二个,所以实际中tanh会比sigmoid更常用。但是它还是存在梯度饱和的问题。Tanh是sigmoid的变形:tanh(x)=2σ(2x)−1。

    这里写图片描述 
    ReLU. 近年来,ReLU 变的越来越受欢迎。它的数学表达式是: f(x)=max(0,x)。很显然,从上图左可以看出,输入信号 
    <0时,输出为0,>0时,输出等于输入。ReLU的优缺点如下:

    • 优点1:Krizhevsky et al. 发现使用 ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多(如上图右)。有人说这是因为它是linear,而且梯度不会饱和
    • 优点2:相比于 sigmoid/tanh需要计算指数等,计算复杂度高,ReLU 只需要一个阈值就可以得到激活值。
    • 缺点1: ReLU在训练的时候很”脆弱”,一不小心有可能导致神经元”坏死”。举个例子:由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活。如果这个情况发生了,那么这个神经元之后的梯度就永远是0了,也就是ReLU神经元坏死了,不再对任何数据有所响应。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都坏死了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。

    Leaky ReLU. Leaky ReLUs 就是用来解决ReLU坏死的问题的。和ReLU不同,当x<0时,它的值不再是0,而是一个较小斜率(如0.01等)的函数。也就是说f(x)=1(x<0)(ax)+1(x>=0)(x),其中a是一个很小的常数。这样,既修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。关于Leaky ReLU 的效果,众说纷纭,没有清晰的定论。有些人做了实验发现 Leaky ReLU 表现的很好;有些实验则证明并不是这样。 
    - PReLU. 对于 Leaky ReLU 中的a,通常都是通过先验知识人工赋值的。然而可以观察到,损失函数对a的导数我们是可以求得的,可不可以将它作为一个参数进行训练呢? Kaiming He 2015的论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不仅可以训练,而且效果更好。原文说使用了Parametric ReLU后,最终效果比不用提高了1.03%. 
    -Randomized Leaky ReLU. Randomized Leaky ReLU 是 leaky ReLU 的random 版本, 其核心思想就是,在训练过程中,a是从一个高斯分布中随机出来的,然后再在测试过程中进行修正。 
    这里写图片描述

    Maxout. Maxout的形式是f(x)=max(w_1^Tx+b_1,w_2^Tx+b_2),它最早出现在ICML2013上,作者Goodfellow将maxout和dropout结合后,号称在MNIST, CIFAR-10, CIFAR-100, SVHN这4个数据上都取得了start-of-art的识别率。可以看出ReLU 和 Leaky ReLU 都是Maxout的一个变形,所以Maxout 具有 ReLU 的优点(如:计算简单,不会 saturation),同时又没有 ReLU 的一些缺点 (如:容易饱和)。不过呢Maxout相当于把每个神经元的参数都double了,造成参数增多。 
    Maxout的拟合能力非常强,它可以拟合任意的的凸函数。作者从数学的角度上也证明了这个结论,即只需2个maxout节点就可以拟合任意的凸函数了(相减),前提是”隐含层”节点的个数可以任意多。 
    这里写图片描述

    How to choose a activation function? 怎么选择激活函数呢? 
      我觉得这种问题不可能有定论的吧,只能说是个人建议。 
      如果你使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让你的网络出现很多坏死的 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout. 
      友情提醒:最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout. 
      还有,通常来说,很少会把各种激活函数串起来在一个网络中使用的。  

    3. 神经网络结构

    3.1 逐层构建

    神经网络是神经元构成的图(此图是指graph,而不是指image)。神经网络是神经元互相连接构成的一个非循环的图,也就是说一些神经元的输出会作为其他神经元的输入,另外环路是不允许的因为这会使得神经网络的前向传播陷入无止尽的循环中。当然,神经元之间的排列是有规律的,通常情况下被构建成层层连接的形式,每一层中又有多个神经元。比如说常见的一种层叫做全连接层(fully-connected layer),表示的是相邻两层之间的神经元两两连接,同层的神经元则互不连接。下图是两个全连接的例子: 
    这里写图片描述 
    命名习惯。注意我们平时说N层神经网络,是不把输入层计算在内的。也就是说一个单层神经网络表示的是输入层接输出层,没有隐含层的网络结构。所以有时候你可能会注意到逻辑回归或SVM被看成是单层神经网络,或者叫人工神经网络(Artificial Neural Networks,ANN)或多层感知机(Multi-Layer Perceptrons,MLP)。还有许多人并不喜欢“神经网络”这个称呼,容易联想成生物学的神经元什么的,所以倾向于把neurons称为units。 
    输出层。和神经网络其他的层不同,最后的输出层通常情况下没有activation function,这是因为最后一层的输出通常用来表示类别的score(特别是分类),score嘛通常是实值的数。 
    神经网络的大小。衡量某个神经网络有多大,通常有两种方法,1是神经元的数目,2是参数的数目,相比之下第二种更常用。比如说以上图为例: 
    - 上图左的网络共包含(4+2=6)个神经元(不包括输入层),参数则有[3*4]+[4*2]=20个weights还有[4+2=6]个bias,也就是总共26个可学习的参数。
    - 上图右的网络共包含(4+4+1=9)个神经元,参数则有[3*4]+[4*4]+[4*1]=12+16+4=32个weights还有[4+4+1=9]个bias,也就是总共41个可学习的参数。 
    实际上,现在所有的卷积网络通常都包含亿级的参数,并且由10-20层网络组成(因此说是deep learning)。

    3.2 例子:前向传播的计算

    在神经网路中,矩阵运算是非常常用和有效的。神经网络之所以被构建成层层连接的形式,一个重要的原因就是通过矩阵运算可以很方便快捷地计算不同层的输入输出。比如以上图3层的神经网络为例,输入就是一个[3*1]维的向量,每一层的所有权重也同样是矩阵形式,例如第一个隐层的weights W1就是一个[4*3]维的矩阵,同时该层所有units的bias b1维度则是[4*1]。也就是说每个神经元的weights在W1中都是一列,那么简单的矩阵乘法np.dot(W1,x)就可以计算出这一层所有神经元的激活值。同样的,W2是[4*4]维的矩阵,存储着第二个隐含层的所有连接参数,W3则是输出层的weights,是[1*4]维的矩阵。那么这整个3层神经网络的前向传播过程就是3个简单的矩阵乘法,然后再接激活函数:

    <code class="language-python hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># forward-pass of a 3-layer neural network:</span>
    f = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">lambda</span> x: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.0</span>/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.0</span> + np.exp(-x)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># activation function (use sigmoid)</span>
    x = np.random.randn(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># random input vector of three numbers (3x1)</span>
    h1 = f(np.dot(W1, x) + b1) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># calculate first hidden layer activations (4x1)</span>
    h2 = f(np.dot(W2, h1) + b2) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># calculate second hidden layer activations (4x1)</span>
    out = np.dot(W3, h2) + b3 <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># output neuron (1x1)</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

    在上述代码中,W1,W2,W3,b1,b2,b3是网络的可学习参数。注意最后一层输出层是不用加激活函数的。其实,输入数据x也可以不是一个列向量,而是包含整个训练数据batch的一个矩阵,矩阵中的每一列还是代表一个训练数据样本。这样所有的样本就可以同时进行计算了,非常高效。

    The forward pass of a fully-connected layer corresponds to one matrix multiplication followed by a bias offset and an activation function.

    3.3 神经网络对数据的表达力

    我们常常会把包含全连接层的神经网络看成是一系列由网络参数构成的函数的组合。那么问题来了,这些函数的组合对数据的表达力怎么样?是不是任何函数都能通过神经网络进行建模? 
    有人证明过包含一层隐含层的神经网络是一个万能逼近器(见Michael Nielsen的证明),也就是说它可以估计任何连续的f(x)。那么既然两层的神经网络就可以估计任何函数了,为什么我们还需要更多的层,需要Go deeper?这是因为虽然两层神经网络从数学上来看是能逼近任何连续函数,但是从实际来看,更深的网络通常都比两层网络效果好,也就是说这是一种经验论,虽然它们从数学上来看对数据的表达力是一样的。 
    顺便说一下,在实际中3层的神经网络通常比2层的效果更好,但是4,5,6层却不一定能提升更多,这和卷积网络有着鲜明的对比,在卷积网络中通常深度是一个好的识别系统的非常关键的因素。有人说这是因为图像本身就是一个分层的结构(比如人脸是由眼睛构成的,眼睛由由边缘构成等),因此分多层来学习数据能够使网络获得更加语义化的理解。当然了,这整个领域还在不断的研究中,下面是一些可参考的读物:

    3.4 如何设置神经网络的层数和神经元数

    面对一个实际问题,我们到底该使用什么样的网络呢?我们是应该用没有隐含层的呢,还是1个,2个隐含层呢?每一层所包含的神经元数目又该怎么设置? 
    首先我们需要注意到当我们增加层数和神经元数目的时候,神经网络的性能也会有所提升。因为神经元可以协同作用表达出不同的函数来对数据进行表示。比如说假设我们在二维空间中有一个二值的分类问题,我们可以训练3个不同的神经网络,每个神经网络都包含一个隐含层,但是隐含层中包含的神经元数目不一样,我们来看一下分类器的分类效果: 
    这里写图片描述 
    在上图中,我们看到包含更多神经元的神经网络能够表达更加复杂的函数。但是这既好又不好,好是因为可以对更复杂的数据进行分类,不好是因为它容易对训练数据过拟合(overfitting)。比如说隐层包含20个神经元的那个图,它虽然把所有的数据都分对了但是把整个平面分成了红绿相间、相互脱节的小区域,看上去很不平滑;而3个神经元的图,它能够从大方向上去分类数据,而把一些被绿色点包围的红色点看成是异常值、噪声(outliers)。实际中这能够使得模型在测试数据上有更好的泛化能力。 
    基于上述讨论,貌似当数据不太复杂的时候,我们可以选用小一点的神经网络来预防overfitting?不不不,这是不对滴,我们可以选择其他更好的方法来避免过拟合(比如L2正则化,dropout,增加噪声等,我们后面再讨论)。实际中用这些方法避免过拟合比减少神经元的个数要更好。比如说我们可以看看不同的正则强度是如何控制20个隐含神经元的过拟合的: 
    这里写图片描述 
    总的来说就是你不能因为害怕过拟合就使用小一点的神经网络,相反如果你的计算机性能允许,你应该用大的神经网络,丙炔通过一些正则的方法来控制overfitting.

    4. 总结

    在这章中,我们介绍了如下内容: 
    - 我们粗略地介绍了生物的神经元。 
    - 我们讨论了几种实际使用的激活函数,其中ReLU是最常用的选择 
    - 我们介绍了神经网络,其中神经元是通过全连接层来组织的,全连接层中相邻层的神经元两两连接,同一层的神经元互相不连接 
    - 我们发现这种层级的结构使得神经网络只要进行矩阵乘法和激活函数就可以计算了 
    - 我们发现神经网络是万能逼急器,但是我们也说了这种特性并不能表示我们不需要go deeper。 
    - 我们讨论了大型的神经网络总是会比小型神经网络效果要好,但是这也导致它们有可能会过拟合,因此我们需要选用恰当的正则方法来弥补这一缺点,在后面我们会见到更多形式的正则(如dropout等)。

    如果帮到你了,请赞赏支持:

    展开全文
  • 状态转移概率函数(时间连续状态离散) 定义:称为马氏过程在t时刻经s时间的状态转移概率函数。若与t无关,称{X(t),t∈[0,+∞]}为时齐马氏过程。其转移概率函数仅与起始状态i,经过时间段s和转移到达的状态j有关,...
  • 一.linux系统进程类型 :交互进程 ;批处理进程 ;监控进程(守护进程); 交互进程:由一个shell启动的进程。交互进程既可以在前台运行,也...linux上进程5种状态: 1. 运行(正在运行或在运行队列中等待) ...
  • 状态反馈_matlab自带函数place

    千次阅读 2020-04-07 19:18:35
    其实matlab自带状态反馈设计的函数place,不同的是直接用期望的极点进行计算,在不同的情形下可能需求不同,可以用不同的函数进行状态反馈设计来配置零极点。place函数的用法如下: p1=-10+10i;p2=-10-10i...
  • 1、VUE生命周期是VUE实例化或者组件创建到消亡的过程。 2、 beforeCreate 创建前的状态,...4、beforeMount 挂载前状态, 是否元素el,是否模板,是否渲染到了函数内,是否作为模板进行了outerHTML渲染到了页 ...
  • 几种常见激活函数(笔记整理)

    万次阅读 2019-02-26 19:15:17
    函数是神经网络中非线性的来源,因为如果去掉这些函数,那么整个网络就只剩下线性运算,线性运算的复合还是线性运算的,最终的效果只相当于单层的线性模型. (1)Sigmoid函数 左端趋近于0,右端趋近于1,且两端...
  • 状态函数+动作值函数

    千次阅读 2019-11-17 13:27:29
  • 事件触发调用函数 利用好插值符号,因为插值符号里就是给你写js的地方; &amp;lt;script type=&quot;text/babel&quot;&amp;gt; function alertThis() { alert(&quot;C...
  • 在创建状态条的代码后,用状态条的成员函数SetPaneInfo来设置每个窗格的ID、风格和宽度(单位似对话框,为1/4英文字母), 其函数原型为  void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int ...
  • 常见的激活函数总结

    千次阅读 2018-01-25 19:45:45
    目前主流的卷积神经网络框架都会遵循类似卷积—》池化—》卷积—》池化…—》全连接—》softmax 这样的网络结构,其中在卷积层后都会跟随着一层激活层。平时在跑基于tensorflow的深度学习实验室时,也都是直接仿照...
  • JavaScript常见变量和函数命名示例

    万次阅读 2020-07-21 15:16:17
    JavaScript作为前端开发从业人员必须掌握的3大基础知识中最重要的一环,也是平是接触时间最长、写得最多的。在开发过程中必然会遇到命名的问题,你会词穷...JavaScript常见变量和函数命名示例思维导图 需要注意的是由
  • 常用激活函数(激励函数)理解与总结

    万次阅读 多人点赞 2018-05-13 23:07:19
    引言 学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用...有哪些激活函数,都什么性质和特点? 应用中如何选择合适的激活函数? 如果你对以上几个问题不是很清楚,下面的内容对你是...
  • 状态空间描述到传递函数

    千次阅读 2015-05-02 18:30:09
    2.14计算下列状态空间描述的传递函数G(s)clear; syms s; A = [0 1 0; 0 0 1; -3 -1 -2]; B = [1 0; 0 1; 1 1]; C = [1 1 1]; D = [0 0]; %第一个输出 [num,den] = ss2tf(A, B, C, D, 1) %第二个输出 [num,den] = ss2...
  • Sigmoid 函数 f1(x)=11+e−xf_1(x)=\frac1{1+e^{-x}}   f1(x)f_1(x)的导函数为: ddxf1(x)=f1(x)(1−f1(x))\frac{d}{\mathrm{d}x}f_1(x) = f_1(x)(1-f_1(x))tanh函数sinh(x)=ex−e−x2sinh(x)=\frac{e^x-e^{-x}}2 ...
  • 神经网络常见的激活函数汇总

    万次阅读 2018-08-14 10:15:29
    1.激活函数的作用 在神经网络中,激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。 比如在下面的这个问题中: 如上图所示,这是一个简单的...2.常见的激活函数...
  • 程序包或函数 WM_CONCAT 处于无效状态

    千次阅读 2018-12-21 10:32:04
    今天运行了很久的项目,点了一下查询突然发现出现了一个 程序包或函数 WM_CONCAT 处于无效状态的问题报错,妈耶,因为啥啊,咋地了,跑了这么就...找到那个函数,完事打一顿,然后再看一下Functions 没有红色的x...
  • 传递函数:在零初始条件下,线性定常系统输出象函数X0(s)与输入象函数Xi(s)之比,称为系统的传递函数,用G(s)表示。 传递函数的概念只适用于线性定常系统。 状态空间模型:系统的动态特性由状态变量构成的一阶...
  • 控制工程——传递函数状态方程

    千次阅读 2020-08-02 19:11:27
    状态方程:信号理论、控制理论与 热学都有状态方程,我现在指的是前者的。 状态:控制系统中 可决定系统状态的最小数目的一组变量组成的集合 状态向量:状态变量在某一时刻的值。在t=0时刻的的状态向量也称初始状态...
  • 介绍了从传递函数状态空间模型的基本方法、线性叠加法、串联法、并联法,从状态空间模型求传递函数的方法,传递函数状态空间模型的对偶性。
  • MFC中的CWnd类提供了下面两个函数用于判断窗口的最大化、最小化状态,其子类继承了这些函数: IsZoomed:判断窗口是否处于最大化状态。 IsIconic:判断窗口是否处于最小化状态。 可以使用CWnd::ShowWindow...
  • 传递函数化为状态空间表达式

    千次阅读 2020-08-30 22:31:44
    G(s)=N(s)D(s)G(s)=\frac{N(s)}{D(s)}G(s)=D(s)N(s)​ 的串联分解形式 可控标准型 可观测标准型      实例 G(s)=N(s)D(s)G(s)=\frac{N(s)}{D(s)}G(s)=D(s)N(s)...状态空间表达式 其中:    ...
  • 在知道状态值了之后我们就可以尝试理解动作值函数了, 首先假设我们已经得到了状态函数, 我们的想法是走到状态值高的地方相对来说我们就可以得到更高的预期收益, 但是当智能体在做出一个动作的时候是不能确定是否...
  • 状态机与函数指针

    千次阅读 2006-03-31 15:09:00
    其实原来就做过状态机相关的东西,毕竟在手机实时系统上状态是个很常见也很重要的东西。但是状态机的设计和实现的好坏直接影响整个系统的性能及可维护性。从设计上讲,无非是画状态图,理清各个状态之间的迁移关系;...
  • Matlab 由状态方程求系统传递函数矩阵代码:  已知状态方程的系数矩阵如下: syms s GG gg; A=[0 1 0;0 0 1;-3 -1 -2]; B=[1 0; 0 1;1 1]; C=[1 1 1]; 利用自控原理的定理求出传递函数的一般式: GG=C*inv...
  • MATLAB中常见数字信号处理相关函数汇总 现将MATLAB信号处理工具箱函数进行分组,便于记忆查询和长期回顾。 Waveform Generation(波形产生) chairp: 产生扫频余弦函数; diric: 产生Dirichlet或周期sinc函数; ...
  • 而对于退出该界面后,轮询逻辑依然在定时器的执行中进行,此时需要用到钩子函数判断路由离开状态后,进行清除定时器 //离开当前页面 beforeRouteLeave(to, from, next) { window.clearInterval...
  • 在linux中,可以通过调用system函数执行linux命令,但是如何获取执行命令的结果状态呢,也就是是否执行成功。 #include #include int main() { int ret = -1; ret =system("cat /proc/mounts | grep sda"); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,716,561
精华内容 686,624
关键字:

常见的状态函数有哪些