精华内容
下载资源
问答
  • 2019-03-13 11:11:00

    资料来源:教育部关于研究生学科、专业目录的更新

    2011年,教育部、国务院学位委员会颁发了《关于印发<学位授予和人才培养学科目录(2011年)>的通知》(学位〔2011〕11号),规定自印发之日起,学位授权审核及学位与研究生教育质量监督工作按照新目录进行。2015年6月11日,国务院学位委员会、教育部颁发《关于增设网络空间安全一级学科的通知》(学位〔2015〕11号),在“工学”门类下增设“网络空间安全”一级学科,学科代码为“0839”,授予“工学”学位。上述文件均已在教育部政府门户网站上公开。

    目前,研究生培养和学位授予工作按照《学位授予和人才培养学科目录(2011年)》进行。根据《学位授予和人才培养学科目录设置与管理办法》(学位〔2009〕10号),一级学科的调整每10年进行一次,调整后向社会公开。

    一级和二级学科

    01 哲学

    0101 哲学

    02 经济学

    0201 理论经济学
    0202 应用经济学

    03 法学

    0301 法学
    0302 政治学
    0303 社会学
    0304 民族学
    0305 马克思主义理论
    0306 公安学

    04 教育学

    0401 教育学
    0402 心理学(可授教育学、理学学位)
    0403 体育学

    05 文学

    0501 中国语言文学
    0502 外国语言文学
    0503 新闻传播学

    06 历史学

    0601 考古学
    0602 中国史
    0603 世界史

    07 理学

    0701 数学
    0702 物理学
    0703 化学
    0704 天文学
    0705 地理学
    0706 大气科学
    0707 海洋科学
    0708 地球物理学
    0709 地质学
    0710 生物学
    0711 系统科学
    0712 科学技术史(分学科,可授理学、工学、农学、医学学位)
    0713 生态学
    0714 统计学(可授理学、经济学学位)

    08 工学

    0801 力学(可授工学、理学学位)
    0802 机械工程
    0803 光学工程
    0804 仪器科学与技术
    0805 材料科学与工程(可授工学、理学学位)
    0806 冶金工程
    0807 动力工程及工程热物理
    0808 电气工程
    0809 电子科学与技术(可授工学、理学学位)
    0810 信息与通信工程
    0811 控制科学与工程
    0812 计算机科学与技术(可授工学、理学学位)
    0813 建筑学
    0814 土木工程
    0815 水利工程
    0816 测绘科学与技术
    0817 化学工程与技术
    0818 地质资源与地质工程
    0819 矿业工程
    0820 石油与天然气工程
    0821 纺织科学与工程
    0822 轻工技术与工程
    0823 交通运输工程
    0824 船舶与海洋工程
    0825 航空宇航科学与技术
    0826 兵器科学与技术
    0827 核科学与技术
    0828 农业工程
    0829 林业工程
    0830 环境科学与工程(可授工学、理学、农学学位)
    0831 生物医学工程(可授工学、理学、医学学位)
    0832 食品科学与工程(可授工学、农学学位)
    0833 城乡规划学
    0834 风景园林学(可授工学、农学学位)
    0835 软件工程
    0836 生物工程
    0837 安全科学与工程
    0838 公安技术

    09 农学

    0901 作物学
    0902 园艺学
    0903 农业资源与环境
    0904 植物保护
    0905 畜牧学
    0906 兽医学
    0907 林学
    0908 水产
    0909 草学

    10 医学

    1001 基础医学(可授医学、理学学位)
    1002 临床医学
    1003 口腔医学
    1004 公共卫生与预防医学(可授医学、理学学位)
    1005 中医学
    1006 中西医结合
    1007 药学(可授医学、理学学位)
    1008 中药学(可授医学、理学学位)
    1009 特种医学
    1010 医学技术(可授医学、理学学位)
    1011 护理学(可授医学、理学学位)

    11 军事学

    1101 军事思想及军事历史
    1102 战略学
    1103 战役学
    1104 战术学
    1105 军队指挥学
    1106 军制学
    1107 军队政治工作学
    1108 军事后勤学
    1109 军事装备学
    1110 军事训练学

    12 管理学

    1201 管理科学与工程(可授管理学、工学学位)
    1202 工商管理
    1203 农林经济管理
    1204 公共管理
    1205 图书情报与档案管理

    13 艺术学

    1301 艺术学理论
    1302 音乐与舞蹈学
    1303 戏剧与影视学
    1304 美术学
    1305 设计学(可授艺术学、工学学位)

    附:
    专业学位授予和人才培养目录

    0251 金融 0853 城市规划
    0252 应用统计 0951 农业推广
    0253 税务 0952 *兽医
    0254 国际商务 0953 风景园林
    0255 保险 0954 林业
    0256 资产评估 1051 *临床医学
    0257 审计 1052 *口腔医学
    0351 法律 1053 公共卫生
    0352 社会工作 1054 护理
    0353 警务 1055 药学
    0451 *教育 1056 中药学
    0452 体育 1151 军事
    0453 汉语国际教育 1251 工商管理
    0454 应用心理 1252 公共管理
    0551 翻译 1253 会计
    0552 新闻与传播 1254 旅游管理
    0553 出版 1255 图书情报
    0651 文物与博物馆 1256 工程管理
    0851 建筑学 1351 艺术
    0852 *工程

    注:名称前加“*”的可授予硕士、博士专业学位;“建筑学”可授予学士、硕士专业学位;其它授予硕士专业学位。

    更多相关内容
  • 利用氨基酸的理化特性中包含的进化信息,由PSI-BLASTHMMER3谱生成的位置特异性得分矩阵作为混合反向传播系统的输入,可以预测二级结构的准确性显着提高。基于基于内部认知机制(KDTICM)理论的知识发现理论,我们...
  • 无忧全国计算机等级考试超级模拟软件演示文件更新包_二级ACCESS是考试系统频道下深受用户喜爱的软件  本套软件是根据国家教育部最新考试大纲,并汇聚了多年开发全国计算机等级考试模拟软件的丰富经验,并综合有...
  • Mybatis 实现原理之 一二级缓存

    千次阅读 2018-10-15 15:19:20
    本片文章讲述的是Mybatis是如何无感知的让用户使用到一二级缓存,以及一二级缓存的实现细节实现原理。 结论:Mybatis 下文通过代码DEMO的展示, 以及源码的解说介绍JDK动态代理, Mybatis对其的应用。 ...

    引言

    对Mybatis一直都没有做实质的记录。 现记录Mybatis的一些实现细节。组成一个系列。

    本片文章讲述的是Mybatis是如何无感知的让用户使用到一二级缓存,以及一二级缓存的实现细节和实现原理。

    系列文章:Mybatis 实现原理之 JDK动态代理和XML语句执行

    结论通常意义上的Mybatis一级缓存, 指的是SqlSession级别缓存,即在同一个SqlSession下,可以共享的缓存,该缓存默认被开启(可通过每行CRUD标签<flushCache>关闭),依据查询使用的Mapper和方法名、传参等组成查询Key,复用SqlSession的时候可以直接从缓存里面查询;

    Mybatis二级缓存,指的是Mapper(namespace)级别的缓存,是全局的,需要指定cacheEnabled字段(默认为true)以及每个CRUD的<useCache>字段,以及每个Mapper的<cache>标签。即每个Mapper下相同的查询条件,会直接从缓存中获取结果。

    2019年04月10日19:01:37 更新:
    关于一级缓存中的SqlSession,它是如何实现全局的SqlSession,又实现一级缓存的效果的呢~ 详见 Mybatis的一级缓存 – 基于SqlSession


    SqlSession的生命周期

    本博文只谈及Spring环境下的SqlSession

    在博文Mybatis 实现原理之 JDK动态代理和XML语句执行中有提到,Spring环境中的SqlSession实现者是SqlSessionTemplate, 但同时,它使用到了包装器模式。实际包装的, 依然是DefaultSqlSession

    包装器中的DefaultSqlSession在应用程序的运行中, 会频繁的创建和销毁。
    Spring管理的SqlSessionTemplate会贯穿整个Application。


    SqlSession的创建 – 动态代理和包装器

    Mybatis的Mapper的执行,依托于MapperProxy这个代理类。在博文Mybatis 实现原理之 JDK动态代理和XML语句执行介绍了Mapper代理的创建和执行过程。

    SqlSessionTemplate 的使用非常巧妙,它委托给Spring管理, 生命周期为整个Application。但是实际的执行者并不是它。而是它的一个类元素SqlSessionTemplate#sqlSessionProxy这个代理类,同样,代理类的生命周期也是贯穿整个Application。它会频繁的创造DefaultSqlSession用于SQL的执行。

    那么, 它是怎么实现SqlSession创建和事务内复用的呢?

    sqlSessionProxy, 顾名思义, 是一个代理类。实际的代理类是SqlSessionTemplate.SqlSessionInterceptor这个InvocationHandler。它会根据当前的事务环境重新创建或者复用SqlSession。创建时序图如下:

    执行Mapper方法 MapperProxy代理 执行SqlSession SqlSession getSqlSession() 真正的执行 调用invoke方法动态代理 执行SqlSession的CRUD方法 SqlSessionTemplate的元素sqlSessionProxy是被代理的 根据当前的事务情况,创建或者返回复用的SqlSession 这里面可能还涉及到一二级缓存 执行Mapper方法 MapperProxy代理 执行SqlSession SqlSession getSqlSession() 真正的执行

    此处重点分析下SqlSessionUtils#getSqlSession()方法

    SqlSessionUtils创建SqlSession的方式即是SessionFactory#openSession()(DefaultSqlSessionFactory)。然后它会将创建好的SqlSession(DefaultSqlSession)放到TransactionSynchronizationManager中。存储依赖于ThreadLocal,以及当前程序运行的事务环境(基于AOP)。因此:

    • 可以很好的做到线程隔离。
    • 一个线程下,一个SessionFactory创建的SqlSession在整个线程周期的可传递的事务中复用。
    • 自然,跨线程的一级缓存无从谈起,没有事务也没有一级缓存。但是还是有可能用上二级缓存。
    • 只支持Spring管理的事务,才会复用SqlSession(启用一级缓存)。

    在非Spring环境中,源于Mybatis的各项构造相对麻烦, 一般写法也是通过DefaultSqlSessionFactory#openSession()去创建SqlSession。且一般都是即用即创建。每次创建完毕之后便等待垃圾回收器去回收。不建议全局复用一个SqlSession


    Mybatis的一级缓存 – 基于SqlSession

    Mybatis的一级缓存默认开启,虽然Mybatis的一级缓存是SqlSession缓存,但是它储存位置并不是在SqlSession, 而是Executor中。是一个HashMap(PerpetualCache持有)。

    在博文Mybatis 实现原理之 JDK动态代理和XML语句执行有讲到, SqlSession的CRUD基于Executor。它的实现类都实现了一级缓存:优先从localCache获取,获取不到的情况下再从数据库中查询

    具体逻辑可以参考如下代码片段(org.apache.ibatis.executor.BaseExecutor#query):

          list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;
          if (list != null) {
            handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
          } else {
            // 从数据库里面查询
            list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
          }
    

    需要注意的是缓存的Key, 参见#createCacheKey方法,另参见CacheKey#hashCode()CacheKey#equals(Object)

    2019年04月10日更新
    如上文 SqlSession的创建 – 动态代理和包装器 描述, Spring环境中, SqlSessionTemplate 生命周期贯穿整个Application,而一级缓存又是基于SqlSession、当前线程。 这其中是不是有什么矛盾?
    *
    实际不矛盾⬇️⬇️⬇️ 此SqlSession并非Spring的SqlSessionTemplate

    SqlSessionTemplate的CRUD依托于SqlSessionTemplate.SqlSessionInterceptor这个InvocationHandler(SqlSessionTemplate本身不执行任何CRUD)。
    动态代理会依据当前的线程运行情况依据全局的DefaultSqlSessionFactory创建或者复用SqlSession。并会在任意命令之后完毕之后选择关闭创建的SqlSession


    Mybatis的一级缓存的可行性分析

    Spring环境中,对于缓存的使用,最起码的条件就是:

    分支条件实现方案是否满足
    同SQL Query,同结果CacheKey/localCache满足
    数据有Update,不再查询缓存SqlSession,所有查询都执行clear()方法满足
    只在事务中生效当前线程、当前事务共享SqlSession满足
    不同的事务隔离级别下,缓存生效与否区分不同的传播行为满足

    理论上的一级缓存,只应该存在于事务之中,且无关具体数据源的事务隔离级别。
    Spring环境中, Mybatis的SqlSession,在开启了事务、同一个线程、同一个SqlSessionFactory中,就会共享。这就意味着一级缓存也会共享。
    Mybatis通过相同的Mapper+Method+Parameter等参数定位具体缓存。
    每次的Update(insert/delete)语句,都会导致缓存被清空。
    无关数据库事务隔离级别配置, 在Spring默认配置下, Mybatis的一级缓存可行度非常高。
    需要注意的事情是,Mybatis的一级缓存只是用的HashMap,未做容量限制。如果查询出来的结果集特别大,最好还是默认关闭一级缓存

    Mybatis的一级缓存的作用域 – 当前线程,当前事务

    Mybatis的一级缓存是可行的, 如通过源码分析来展示它的作用域。

    Spring环境中Mybatis的SqlSession(一级缓存) 需要基于事务。在事务中才会获取到当前事务、当前线程共享的SqlSession

    基于当前线程
    TransactionSynchronizationManager#doGetResource(Object)
    这里的actualKey是SqlSessionFactoryresources是一个ThreadLocal。
    返回的value是SqlSessionHolder

    	private static Object doGetResource(Object actualKey) {
    		Map<Object, Object> map = resources.get();
    		if (map == null) {
    			return null;
    		}
    		Object value = map.get(actualKey);
    		// OTHER
    		return value;
    	}
    

    基于事务
    在获取SqlSession之后, 当前线程会尝试着将其缓存。
    通过 TransactionSynchronizationManager.isSynchronizationActive() 判断是不是要缓存这个SqlSession
    它依据一个类元素TheadLocal是否存放了值来判断 true/false。
    而这个TheadLocal的set方法, 必须在启用了事务之后才会被调用。
    只要启动了事务,且事务隔离级别满足需要。几乎都会缓存SqlSession
    见: AbstractPlatformTransactionManager#getTransaction(TransactionDefinition)
    在层级调用之后, 在TransactionSynchronizationManager#initSynchronization()里面塞了默认值。

    else if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED ||
        definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||
        definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) 
    

    如上, Spring环境中Mybatis的SqlSession的缓存, 几乎只基于事务传播类别。而缓存的SqlSession, 放在ThreadLocal中。自然, 一级缓存作用域也就是 当前线程,当前事务

    Mybatis的二级缓存 – 基于Mapper(namespace)

    在Mybatis中, 使用到了大量的包装器模式、动态代理。二级缓存也如此。

    Mybatis的二级缓存 – 依赖CachingExecutor

    在博文Mybatis 实现原理之 JDK动态代理和XML语句执行中有提到,Mybatis的SqlSession的执行, 实质上依赖于Executor的执行。

    Executor
    |_BaseExecutor
       |_SimpleExecutor
    |_CachingExecutor
    

    而二级缓存, 依赖的就是类:org.apache.ibatis.executor.CachingExecutor。 其获取方式如下Configuration#newExecutor(Transaction, ExecutorType):

      public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
        executorType = executorType == null ? defaultExecutorType : executorType;
        executorType = executorType == null ? ExecutorType.SIMPLE : executorType;
        Executor executor;
        if (ExecutorType.BATCH == executorType) {
          executor = new BatchExecutor(this, transaction);
        } else if (ExecutorType.REUSE == executorType) {
          executor = new ReuseExecutor(this, transaction);
        } else {
          executor = new SimpleExecutor(this, transaction);
        }
        if (cacheEnabled) {
          executor = new CachingExecutor(executor);
        }
        executor = (Executor) interceptorChain.pluginAll(executor);
        return executor;
      }
    

    这里的cacheEnabled字段是默认为True的。

    在开启(默认不开启)了二级缓存之后, 会优先从二级缓存里面取。 如下代码片段:

      @Override
      public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)
          throws SQLException {
        Cache cache = ms.getCache();
        if (cache != null) {
          flushCacheIfRequired(ms);
          if (ms.isUseCache() && resultHandler == null) {
            ensureNoOutParams(ms, parameterObject, boundSql);
            @SuppressWarnings("unchecked")
            List<E> list = (List<E>) tcm.getObject(cache, key);
            if (list == null) {
              list = delegate.<E> query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
              tcm.putObject(cache, key, list); // issue #578 and #116
            }
            return list;
          }
        }
        return delegate.<E> query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
      }
    

    如上优先从HashMap中取值, 实现二级缓存。Key还是一级缓存的那个Key.
    同时也不难发现, 二级缓存的优先级是高于一级缓存的。

    Mybatis的二级缓存 – 如何开启关闭

    从之前的代码片段中可以发现, Mybatis的查询默认使用的是CachingExecutor(cacheEnabled默认 true开启)。 但是它还有三个控件:

    • <select> SQL语句XML标签上的 flushCache 字段。默认 false开启。可控制一级缓存和二级缓存的开启(true为关闭)
    • <select> SQL语句XML标签上的 useCache 字段。默认 true开启
    • XML Mapper的文件上增加<cache></cache>标签。默认 无关闭

    也就是说Mybatis的二级缓存默认是被关闭的。默认添加标签就可以开启。 至于关闭, 从上述四个控件着手即可:

    • cacheEnabled全局关闭, 查询都使用SimpleExecutor
    • useCache单条关闭,只影响当前SQL
    • flushCache不建议使用,它的工作原理是在查询缓存前清空缓存。数据还是会缓存,包括一级和二级缓存。
    • 不要写 <cache></cache>标签

    对于上述的二级缓存开启/关闭方法中, 除了 <cache></cache> 之外, 还可以使用 @CacheNamespace 在 Mapper上。
    @CacheNamespace与<cache></cache> 冲突, 只能选一个。
    在使用的时候往往发现它不生效, 是因为XML标签只与XML标签搭配。注解只与注解搭配。
    如: <cache></cache> 开启即可生效。
    或者:@CacheNamespace 必须搭配 @Select("select a from b")

    Mybatis的二级缓存 – 实现源码解析

    二级缓存是被存放在MappedStatement#cache中(每条SQL语句), 他们持有的是当前Mapper(namespace)的缓存的引用, 也就是说二级缓存是一个namespace级别的缓存。

    通过之前的代码片段可以看到, 缓存的获取通过Mybatis的一个工具TransactionalCacheManager来取出。实际的缓存K/V存放数据结构非常复杂。Key与一级缓存的Key一致, 参见CacheKey, V层次较深, 也大量使用到了包装器模式, 包装层次为:

    TransactionalCache -> SynchronizedCache -> LoggingCache -> SerializedCache -> LruCache -> PerpetualCache -> HashMap
    

    在开启了二级缓存之后, 便会给相应的namespace创建二级缓存Cache, MappedStatement#cache才会有值。如下代码片段才会走 if 语句(CachingExecutor#query):

        Cache cache = ms.getCache();
        if (cache != null) {
            // 查缓存
        }
    

    这个缓存的创建也是非常繁杂。可参见代码XMLMapperBuilder#cacheElement(XNode)(使用注解创建的二级缓存代码类似)。

    缓存的创建方法可参见: CacheBuilder#build()跟二级缓存相关的参数, 如缓存大小、缓存刷新时间等相关的参数, 也可以在此类内被阅读(当然也可看出, Mybatis是多喜欢包装器模式)


    Mybatis的二级缓存作用域 – Namespace/跨事务

    二级缓存被区分不同的namespace创建之后, 还有一个存储过程。 它是跨事务的。
    同时, 因为二级缓存被MappedStatement持有, MappedStatement的生命周期为Application, 因此二级缓存的生命周期也延续整个Application

    为什么说二级缓存是Namespace级别的缓存?

    Mybatis源码中的查询大致时序:

    执行Mapper方法 MapperProxy代理 执行SqlSession Executor 执行 调用invoke方法动态代理,寻找MapperMethod 执行SqlSession的CRUD方法 MappedStatement是具体接口->>方法的映射 通过查询缓存/查询数据库 执行Mapper方法 MapperProxy代理 执行SqlSession Executor 执行

    这里的查缓存,就是CachingExecutorMappedStatement里面的二级缓存。而这个二级缓存,是在装配XML获取到XML的Mapper映射时, 根据<cache></cache>这个标签所建立的。MappedStatement持有的,与其对应的namespace是同一个对象。

    二级缓存是跨事务的, 在当前事务中只能享受一级缓存, 无法使用到二级缓存。
    毕竟在第一次事务中,已经可以直接从以及缓存取值了。
    那么,二级缓存是怎么从一级缓存中跑到二级缓存中去的呢?

    当一个Spring管理的事务执行完毕, 对应的事务则需要commit。毕竟实际的SQL执行者还是Executor,自然是委托给Executor#commit(boolean)。在对数据库发完毕commit命令的时候,实现类CachingExecutor也会对TransactionalCacheManager执行commit。 也就是把当前事务查询到的缓存,提交到二级缓存里面去。

    我理解这么做大致有这么些好处:
    1.缓存一致性。只有被提交的事务,它的查询才有意义被提交成为二级缓存。
    2.事务中本身已经能查一级缓存,没必要在事务中将没有完毕的事务数据提交到二级缓存(二级缓存可以被其它线程/事务访问)。


    Mybatis的二级缓存清理 – update/依赖LRU等

    清理策略一:update(insert / update / delete 语句)操作。
    清理策略二:完全依赖这几个缓存类:TransactionalCache -> SynchronizedCache -> LoggingCache -> SerializedCache -> LruCache -> PerpetualCache -> HashMap他们需要是有序的,但是不一定全都有。他们的用处分别是:

    类型描述作用
    TransactionalCache事务中缓存由这个管理,缓存事务管理事务提交时将缓存提交
    SynchronizedCache都有,同步器,在所有方法前加上synchronized多线程抢占
    LoggingCache记录日志在DEBUG级别下记录缓存命中率
    SerializedCache序列化到IO以ObjectOutputStream存Value
    LruCacheLinkedHashMap存最远最少访问(还有一个FIFO Cache)超过配置Size(不是字节大小)后删除最老的Value
    PerpetualCache和一级缓存一样, 包装器包装HashMap
    HashMap实际存储存<CacheKey, 数据>

    对于更新时候的清理, 则是在所有的update语句执行的时候,将缓存清理掉。 这个的机理类似于XML里面的flushCache这个字段。 只不过在<select> 语句中它默认是false, 在<update>/<insert>/<delete>语句中, 它默认是true。参见:

      @Override
      public int update(MappedStatement ms, Object parameterObject) throws SQLException {
        flushCacheIfRequired(ms);
        return delegate.update(ms, parameterObject);
      }
      
      private void flushCacheIfRequired(MappedStatement ms) {
        Cache cache = ms.getCache();
        if (cache != null && ms.isFlushCacheRequired()) {      
          tcm.clear(cache);
        }
      }
    

    为什么任何的update SQL都可以清理掉整个namespace的缓存呢?

    • 一个namespace(Mapper)下的所有的SQL语句共享一个二级缓存(xml还可以写成多份)。
    • SQL语句约等于MappedStatement。它们都持有namespace的二级缓存的引用。
    • SELECT默认的flushCachefalse, UPDATE默认true。它们操作同一份。
    • 一旦有UPDATE执行,二级缓存就清空了。

    从上面的描述中也可以得出,不同的namespace(Mapper)下的SQL, 持有的二级缓存是不一致的。也就是说,对于同样的数据库表, 另一个namespace(Mapper)下的UPDATE SQL, 无法清空当前namespace(Mapper)下的二级缓存。

    也就是说,同样的表的CRUD, 如果启用了二级缓存, 得写在一块。否则会出现缓存脏读


    总结

    Mybatis的一级缓存基于SqlSession, 在一个线程、一次事务上(这样才能获得同一个SqlSession)才生效。 默认开启, 通过flushCache这个标签关闭(不建议)。 每次更新语句执行之后就会被清空。


    Mybatis的二级缓存基于namespace(Mapper)

    • 开启比较麻烦
      • 需要使用XML里面的<cache>\</cache>标签。
      • 或者使用@CacheNamespace注解。
      • 上两者不能共同使用。
      • @CacheNamespace注解只能搭配@select使用。不能搭配XML语句。
    • 生命周期很长, 整个Application
      • 一个namespace下所有SQL共享。
      • 遇见UPDATE语句之后就会被清空。
      • 只有在事务提交之后才会被提交到二级缓存中更新原有缓存。
      • 不开启事务也可以用。每次Query都会提交到二级缓存。
    • 优先级高于一级缓存。
    • 使用到二级缓存,需要保证CRUD在一个namespace(Mapper)下。
    展开全文
  • 一级导数和二级导数的意义

    万次阅读 2018-04-10 00:14:59
    整体就是函数的单调性,而二阶是求函数整体的凹凸性,也就相当于求各点斜率的增减规律,也就是凹凸性拐点不一定是极值点 但极值点一定是拐点凹凸性可以纵观函数走势 凹凸性的作用就在于区分极点拐点……概念:一阶...

    通俗来讲:

    一阶求导是求函数各点的斜率 整体就是函数的单调性,而二阶是求函数整体的凹凸性,

    也就相当于求各点斜率的增减规律,

    也就是凹凸性

    拐点不一定是极值点 但极值点一定是拐点

    凹凸性可以纵观函数走势

    凹凸性的作用就在于区分极点和拐点……

    概念:

    一阶导数的物理意义:切线斜率变化的速度,表示的是一阶导数的变化率。

    二阶导数的物理意义:函数的凹凸性(例如加速度的方向总是指向轨迹曲线凹的一侧)。

    f'(x)=dy/dx (f(x)的一阶导数)
    f''(x)=d²y/dx²=d(dy/dx)/dx (f(x)的二阶导数)

    代数标记为:

    二阶导数记作
    即y''=(y')'。 [1]
    列如:y=x²的 导数为y'=2x,二阶导数即y'=2x的导数为y''=2。

    二级导数在应用领域主要可以做什么?
    1、二阶导数大于0,区间线段在在连接任意点的上面,否则在下方

    (1)如果一个 函数f(x)在某个 区间I上有f''(x)(即二阶导数)>0恒成立,那么对于区间I上的任意x,y,总有:
    f(x)+f(y)≥2f[(x+y)/2],如果总有f''(x)<0成立,那么上式的不等号反向。 [2]  
    几何的直观解释:如果一个函数f(x)在某个区间I上有f''(x)(即二阶导数)>0恒成立,那么在区间I上f(x)的图象上的任意两点连出的一条线段,这两点之间的函数图象都在该线段的下方,反之在该线段的上方。

    2、求取极大值和极小值

    (2)判断函数 极大值以及极小值。
      结合一阶、二阶导数可以求函数的极值。当一阶导数等于0,而二阶导数大于0时,为极小值点。当一阶导数等于0,而二阶导数 小于0时,为极大值点;当一阶导数和二阶导数都等于0时,为驻点。

    3、判断曲线函数的凹凸性

    (3)函数凹凸性。
      设f(x)在[a,b]上连续,在(a,b)内具有一阶和二阶导数,那么,
    (1)若在(a,b)内f''(x)>0,则f(x)在[a,b]上的图形是 的;
    (2)若在(a,b)内f’‘(x)<0,则f(x)在[a,b]上的图形是 的。


    注意:以上用途对理工科的人来讲很有用处




    展开全文
  • 由光场传播的波动方程得到信号场振幅所满足的方程,取一级近似得到传播方程的解析表述,给出介质中极化强度随时间的震荡过程啁啾光场在能级介质中的干涉效应.结果表明:信号场与输入场之间会发生干涉现象.
  • 是整理前馈神经网络中正向传播、误差反向传播和梯度下降的原理;三是梯度消失梯度爆炸问题的原因及解决思路。 、神经网络结构 目前比较常用的神经网络结构有如下三种: 1、前馈神经网络 前馈神经网络...

    转自:https://www.cnblogs.com/Luv-GEM/p/10694471.html

    这篇文章主要整理三部分内容,一是常见的三种神经网络结构:前馈神经网络、反馈神经网络和图网络;二是整理前馈神经网络中正向传播、误差反向传播和梯度下降的原理;三是梯度消失和梯度爆炸问题的原因及解决思路。

    一、神经网络结构

    目前比较常用的神经网络结构有如下三种:

    1、前馈神经网络

    前馈神经网络中,把每个神经元按接收信息的先后分为不同的组,每一组可以看做是一个神经层。每一层中的神经元接收前一层神经元的输出,并输出到下一层神经元。整个网络中的信息是朝着一个方向传播的,没有反向的信息传播(和误差反向传播不是一回事),可以用一个有向无环图来表示。

    前馈神经网络包括全连接前馈神经网络和卷积神经网络。

    前馈神经网络可以看做是一个函数,通过简单非线性函数的多次复合,实现输入空间到输出空间的复杂映射。

    2、反馈神经网络

    反馈神经网络中神经元不但可以接收其他神经元的信号,而且可以接收自己的反馈信号。和前馈神经网络相比,反馈神经网络中的神经元具有记忆功能,在不同时刻具有不同的状态。反馈神经网络中的信息传播可以是单向也可以是双向传播,因此可以用一个有向循环图或者无向图来表示。

    常见的反馈神经网络包括循环神经网络、Hopfield网络和玻尔兹曼机。

    而为了进一步增强记忆网络的记忆容量,可以映入外部记忆单元和读写机制,用来保存一些网络的中间状态,称为记忆增强网络,比如神经图灵机。

    3、图网络

    前馈神经网络和反馈神经网络的输入都可表示为向量或者向量序列,但实际应用中很多数据都是图结构的数据,比如知识图谱、社交网络和分子网络等。这时就需要用到图网络来进行处理。

    图网络是定义在图结构数据上的神经网络,图中每个结点都由一个或者一组神经元组成。结点之前的连接可以是有向的,也可以是无向的。每个结点可以收到来自相邻结点或自身的信息。

    以下是这三种神经网络结构的示意图:

     

    二、前馈神经网络

    在前馈神经网络(Feedforward Neural Network, FNN )中,每一层的神经元可以接收前一层神经元的信号,并产生信号输出到下一层。第0层叫做输入层,最后一层叫做输出层,其他中间层叫做隐藏层。整个网络中无反馈,信号从输入层向输出层单向传播,可用一个有向无环图表示。

    多层前馈神经网络的图示如下:

    1、前馈神经网络的前向传播

    用下面的记号来描述一个前馈神经网络:

    前馈神经网络通过下面公式进行信息传播:

    样前馈神经网络通过逐层的信息传递,得到网络最后的输出a(L)。整个网络可以看做是一个复合函数,将向量x作为第1层的输入a(0),将第L层的输出a(L)作为整个函数的输出。

     2、前馈神经网络的梯度下降法

    神经网络具有极其强大的拟合能力,可以作为一个万能函数来使用,通过进行复杂的特征转换,可以以任意精度来近似任何一个有界闭集函数。

    类似于其他机器学习算法求解参数的数值计算方法,我们首先考虑用梯度下降法来进行参数学习。

    如果采用交叉熵损失函数,对于样本(x,y),其损失函数为:

    其中y∈{0, 1}C是标签y对应的one-hot向量表示,C是类别的个数。

    给定训练集D={(x(1), y(1)),(x(2), y(2)),...,(x(N), y(N))},将每个样本x(n)输入给前馈神经网络,得到神经网络的输出后,其在训练集D上的结构化风险函数为:

    其中W和b分别表示网络中所有的权重矩阵和偏置向量。是正则化项,公式为:

    然后用梯度下降法来进行学习。在梯度下降法的每次迭代中,第l层的参数W(l)和b(l)的参数更新方式为:

    梯度下降法需要计算损失函数对参数的偏导数,如果用链式法则对每个参数逐一求偏导,涉及到矩阵微分,效率比较低。所以在神经网络中经常使用反向传播算法来高效地计算梯度。

    3、前馈神经网络的误差反向传播算法

    假设给定一个样本(x,y),将其输入到神经网络模型中,得到损失函数为:,如果要采用梯度下降法对神经网络的参数进行学习,那么就要计算损失函数关于每个参数的导数。

    我们就拿第l层中的参数矩阵W(l)和b(l)为例,计算损失函数对参数矩阵的偏导数。但因为的计算涉及到矩阵微分,非常繁琐,于是我们先计算W(l)中某个元素的偏导数。根据链式法则有:

    上面两个公式中的第二项都是目标函数关于第l层的神经元z(l)的偏导数,称为误差项。那么我们需要计算三个偏导数:

    (1)计算偏导数

    由于z(l)和Wij(l)的函数关系为,所以偏导数为

     其中Wi:(l)为权重矩阵W(l)的第i行。

    (2)计算偏导数

    因为z(l)与b(l)的函数关系为,因此偏导数是一个维度是m(l) × m(l) 的单位矩阵。

     (3)计算误差项

    用δ(l)来定义第l层神经元的误差项,它用来表示第l层神经元对最终损失的影响,也反映了最终损失对第l层神经元的敏感程度。

    根据链式法则,第l层的误差项为:

    首先根据,其中fl(•)是按位计算的函数,计算的偏导数如下。diag(•)表示对角矩阵。

    然后根据,有:

    于是第l层的误差项δ(l)最终表示为:

    其中⊙表示向量的点积运算符,表示每个元素相乘。

    上面这个公式就是误差的反向传播公式!因为第l层的误差项可以通过第l+1层的误差项计算得到。反向传播算法的含义是:第l层的一个神经元的误差项等于该神经元激活函数的梯度,再乘上所有与该神经元相连接的第l+1层的神经元的误差项的权重和。

    再回到开头求两个参数的公式:

    里面的三个偏导数都已经求出来了。于是可以求出:

    进一步,损失函数关于第l层权重W(l)梯度为:

    而损失函数关于第l层偏置b(l)的梯度为:

    于是在利用误差反向传播算法计算出每一层的误差项后,就可以得到每一层参数的梯度。

    基于误差反向传播算法(backpropagation,BP)的前馈神经网络训练过程可以分为以下三步:

    1、在前向传播时计算每一层的净输入z(l)和激活值a(l),直至最后一层;

    2、用误差反向传播计算每一层的误差项 δ(l);

    3、计算每一层参数的偏导数,并更新参数。

    使用随机梯度下降的误差反向传播算法的具体训练过程如下:

     

    三、梯度消失和梯度爆炸

    训练神经网络,尤其是深度神经网络时,面临的一个问题是梯度消失或者梯度爆炸,也就是神经元上的梯度会变得非常小或者非常大,从而加大训练的难度。

    1、原理

    梯度消失(Vanishing Gradient Problem,或称梯度弥散)的意思是,在误差反向传播的过程中,误差经过每一层传递都会不断衰减,当网络层数很深时,神经元上的梯度也会不断衰减,导致前面的隐含层神经元的学习速度慢于后面隐含层上的神经元。

    在上面我们得到了神经网络中误差反向传播的迭代公式:

    误差从输出层反向传播时,在每一层都要乘以该层的激活函数的导数,如果导数的值域小于1,甚至如Sigmoid函数在两端的饱和区导数趋于0,那么梯度就会不断衰减甚至消失。

    与之相对的问题是梯度爆炸(Exploding Gradient Problem),也就是前面层中神经元的梯度变得非常大。与梯度消失不太一样的是,梯度爆炸通常产生于过大的权重W。

    总结一下就是:梯度消失通常出现在深层网络和采用了不合适的损失函数(sigmoid)的情形,梯度爆炸一般出现在深层网络和权值初始化值太大的情况下。

    2、举例

    可以通过一个例子来更好的理解这两个问题。来看一个简单的深度神经网络:每一层都只有一个神经元。如下图是有三层隐含层的神经网络:

    这里w表示权重,b是偏置值,C是代价函数。然后通过计算代价函数关于第一个隐含神经元的偏置的梯度,以及关于第三个隐含神经元偏置的梯度,来考察梯度消失和梯度爆炸问题。

    经过推导可得梯度的公式:

     

    (1)梯度消失

    首先看公式中的导数σ'(z)。激活函数如果采用Sigmoid函数,则其导数为:,也就是说导数的最大值为0.25。

    其次看公式中的权重w。如果用均值为0标准差为1的高斯分布来初始化网络的权重,那么所有的权重会满足|wj|<1。

    那么就会与wjσ'(zj)<0.25,于是梯度公式中所有项相乘时,梯度以指数级下降;神经网络的层数越深,梯度的值下降得更快。

    然后再与第三个隐含神经元的梯度进行对比,如下图。可见前面的神经元的偏置的梯度是后面的1/16甚至更小。所以梯度消失产生的原因主要就是激活函数的导数值太小。

     

    (2)梯度爆炸

    梯度爆炸的一个原因是网络的权重设置得过大,比如在上图中,让wj=100 。然后选择偏置使得σ'(zj)项不会太小,比如σ'(zj)=0.25,那么wjσ'(zj)=25。代入上面的梯度公式中,可以看到梯度以25的指数级增大,神经网络的层数越深,梯度越大。这就带来了梯度爆炸的问题。

     3、解决

    那么如何解决梯度消失和梯度爆炸的问题呢?

    一般用以下几种方法来解决梯度消失和梯度爆炸的问题。

    (1)对于梯度消失问题,可以选择导数比较大的激活函数,比如ReLU激活函数。

    Sigmoid函数和Tanh函数都属于两端饱和型激活函数,使用这两种激活函数的神经网络,在训练过程中梯度通常会消失,因此可以选择其他激活函数来替代。

    ReLU激活函数在正数部分的导数恒为1,每层网络都可以得到相同的更新速度,因此在深层网络中不会产生梯度消失和梯度爆炸的问题。

    2)对于梯度爆炸问题,可以采取梯度截断和权重正则化的方法。

    梯度截断这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度截断阈值,然后在更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。

    权重正则化就是在损失函数中,加入对网络的权重进行惩罚的正则化项,比如权重的L1正则化或者L2正则化。如果发生梯度爆炸,权值的范数会变得非常大,通过正则化项进行惩罚,可以限制权重的值,从而减轻梯度爆炸的问题。

    (3)选择更好的随机初始化权重的方法。

    一是对每个权重都进行随机初始化,尽量让每个权重都不同,使不同神经元之间的区分性更好。

    二是选择合适的随机初始化权重的区间,不能太小,也不能太大。一般而言,参数初始化的区间应该根据神经元的性质进行差异化的设置,如果一个神经元的输入连接很多,那么每个输入连接上的权重要小一些,以避免神经元的输出过大(当激活函数为ReLU时,但输出为正时导数都是1)或者过饱和(当激活函数为Sigmoid函数时,梯度会接近于0)

    此外,还有Batchnorm(batch normalization)的方法,留待以后探究。

     

    参考资料:

    1、邱锡鹏:《神经网络与深度学习》

    2、Michael Nielsen:《Neural Network and Deep Learning》

    展开全文
  • 计算机等级考试--二级Java的知识点大全

    万次阅读 多人点赞 2019-03-16 20:42:59
    章 数据结构与算法 【考点1】算法的基本概念 1、算法:是指组有穷的指令集,是解题方案的准确而完整的描述。算法不等于程序,也不等于计算方法。 2、算法的基本特征: 1)确定性,算法中每步骤都必须有...
  • 计算机一级六大MS题型介绍

    千次阅读 2021-07-17 00:23:58
    计算机一级MS考试同学没必要太紧张,做题之前可以深呼吸,要相信自己一定能考过,给自己一些心里暗示,如心里默念:我能行,考试很简单,考不过也没关系,尽力就好!不要给自己压力,把它当做平时的一次普通练习。...
  • 一、一级学科列表(学科门类/一级学科):1、2、3、4、5、6、一级学科1、应用经济学哲学专业(Phil)是培养具有一定马克思主义哲学理论素养系统的专业基础知识,能运用科学的世界观方法论分析当代世界与中国的...
  • 技术是推动媒介发展的根本动因之,互联网的功能也随着技术的迭代、用户需求的变化不断拓展,因此网络技术处在种相互作用的良性互动关系中。 2.传播媒介属性(重点掌握) 1)复合性 ① 形态与形式的复合:...
  • 由于工作需要,需要在公司顶级域名下建立二级域名,公司服务器为阿里云下云服务器。但是自己之前根本没有此类基础,因此对域名相关知识,进行了相关了解,大多数为百度百科内容。,域名相关了解这里摘录的为百度...
  • 教育部学科门类及一级学科目录表教育部学科门类及一级学科目录表附一:教师学科统计表(个人)部门:姓 名 最高学历学科现从事学科一级学科二级学科一级学科二级学科附件二: 拟建设二级学科情况一览表(系部)部门:...
  • Spring 事务隔离级别和传播行为

    千次阅读 2021-11-15 23:50:35
    、spring支持7种事务传播行为 传播行为 含义 propagation_required(xml文件中为required) 表示当前方法必须在个具有事务的上下文中运行,如有客户端有事务在进行,那么被调用端将在该事务中运行,否则...
  • 计算机一级msoffice选择题题库40套含答案 全国计算机一级全国计算机一级考试选择题题库(最新)考试选择题题库(最新)第一套下列叙述中,正确的是()。)能直接读取硬盘上的数据)能直接存取内存储器)由存储器、运算器...
  • 利用Python分析《庆余年》人物图谱微博传播路径

    万次阅读 多人点赞 2019-12-01 11:55:04
    利用Python分析《庆余年》人物图谱微博传播路径 庆余年电视剧终于在前两天上了,这两天赶紧爬取微博数据看一下它的表现,已经分析原著中的人物关系图谱
  • 计算机一级考试有三个科目,分别是一级MS Office、一级WPS Office、一级Photoshop。因此考试题型也分为三个科目。那么计算机一级选择题必背的知识点有哪些呢。计算机一级选择题必背知识点有哪些1.计算机的发展史:...
  • 全国计算机级别考试一级试题及答案(25套)全国计算机级别考试一级试题及答案(25套)一、选取题(每题1分,共20分)一、选取题(每题1分,共20分)DD (1)世界上第一台计算机诞生于哪一年?(1)世界上第一台计算机诞生于哪...
  • 1 影响力最大化问题在ICLT模型上NP难。 在LT模型上,将最大覆盖问题规约到影响力最大化问题。 在IC模型上,将节点覆盖问题规约到影响力最大化问题。 2 利用次模函数可以得到1-1/e的近似比。 公式推导利用次...
  • 计算机一级选择题必背知识点有哪些?快来了解一下2019-11-0516:26:20来源: 作者:songzini计算机一级考试中选择题一共有20道,所占分值比例为20%,比重比较大,同时也是得分的关键点,因此备考时要好好复习选择题的...
  • 2009年春江苏计算机等级考试二级vb试卷绝密★启用前2009年春江苏省高等学校非计算机专业学生计算机基础知识应用能力等级考试二级试卷试卷语种:VisualBasic说明:1.本试卷包括计算机基础知识部分程序设计部分,...
  • 这个select 标签在执行时是不清除一级和二级缓存的,只有insert,update,delete标签 运行时会自动清除一级和二级缓存。 关键入口类 :org.apache.ibatis.session.defaults.DefaultSqlSession org....
  • Spring事务传播属性隔离级别

    千次阅读 2021-11-16 22:02:03
    Spring事务传播属性隔离级别 ????程序员小王的博客:程序员小王的博客 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? ???? 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 ????java自学的...
  • 计算机一级考试基础知识练习题(三)一、单选题1、第一台电子数字计算机的运算速度为每秒______。A:500000次B:50000次C:5000次D:500次答案: C2、计算机可分为数字计算机、模拟计算机混合计算机,这种分类是依据...
  • 节 信息传播模型 、创新扩散模型 、传染病模型 三、阈值模型 四、级联模型 五、分支过程模型 第三节 信息传播的机器学习分析框架 第四节 影响信息传播的其他因素 、用户地理位置 、信息自身...
  • 1. 神经网络这是个常见的神经网络的图:这是个常见的三层神经网络的基本构成,Layer L1是输入层,Layer L2是隐含层
  • 传播解读与2016年下半年江苏计算机一级准考证打印入口及网址,计算机等级考试时间查询-相关精选《2016年下半年江苏计算机三级准考证打印入口及网址,计算机等级考试时间查询》是由传播招生网为你搜集整理,希望对你...
  • 反向传播算法(BP神经网络)

    千次阅读 2019-11-02 17:19:50
    是谁在耳边,说“信号正向传播,误差反向传播” ? 梦回遥远大三的计算智能课,三年前我可想不到居然有朝一日会重新"预习"它...... 每堂课、本书,当时只道是寻常,如今不经意想起,忽怀念这些瞬间。所谓成长...
  • 给出了个双光栅级联谱组束系统实例,将组束阵元按波长分为两组,利用具有相应波长选择性的体光栅分别对它们进行组束,由于两个联体光栅的角度选择性互不重叠,所有光束经第个体光栅后都沿其布拉格(Bragg)角方向出...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 124,282
精华内容 49,712
关键字:

一级传播和二级传播的区别

友情链接: mmysql-connecy.rar