精华内容
下载资源
问答
  • 修饰成本的词
    2017-09-04 10:25:36

    1、包的概念

    package语句
    

    定义类时需要指定类的名称,但如果仅仅将类名作为类的唯一标识,则不可避免的出现命名冲突的问题,这会给组件复用及团队间的合作造成很大的麻烦。
    在java语言中,用包(package)的概念来解决命名冲突的问题,在定义一个类时,除了定义类的名称一般还要指定一个包名。
    package语句必须写在java源文件的最开始,在定义类之前。

        包名建议的命名规则
    
        域名反写.项目名称.模块名称
        com.cnasir.www
    

    2、import语句

    访问一个类时需要使用该类的全称,但这样的书写过于繁琐;
    可以通过import语句对类的全称进行声明。
    通过了import语句声明了类的全称后,可以直接使用类名。

    3、封装

    对外提供可调用的、稳定的功能
    封装容易变化的、具体的实现细节,外界不可访问,这样的意义在于:
    · 降低代码出错的可能性,便于维护
    · 当内部的实现细节改变时,只要保证对外的功能定义不变,其他的模块就不会因此而受到牵连。

    4、public和private

    private修饰的成员变量及方法仅仅只能在本类中调用;
    public修饰的成员变量和方法可以在任何地方调用。
    public修饰的内容是对外提供可以被调用的功能,需要相对稳定;private修饰的内容是对内实现的封装,如果“公开”会增加维护成本。

    5、protected和默认的访问控制

    用protected修饰的成员变量和方法可以被子类及同一个包中的类使用。
    默认访问控制即不书写任何访问控制符。默认访问控制的成员变量和方法可以被同一个包中的类使用。

    6、访问控制符修饰类

    对于类的修饰可以用public和默认方式。public修饰的类可被任何一个类使用;默认访问控制的类只可以被同一个包中的类使用。
    protected和private可以用于修饰内部类。

    更多相关内容
  • java修饰符详解

    2021-09-15 00:42:32
    关键字,修饰符,标识符 关键字: Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者...

    基础不牢,地动山摇!!!

    访问修饰符权限范围


    一些相关的名词

    关键字修饰符标识符

    • 关键字:

    Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数

    关键字汇总和解释详见下表:

    abstractassertbooleanbreakbyte
    casecatchcharclassconst
    continuedefaultdodoubleelse
    enumextendsfinalfinallyfloat
    forgotoifimplementsimport
    instanceofintinterfacelongnative
    newpackageprivateprotectedpublic
    returnstrictfpshortstaticsuper
    switchsynchronizedthisthrowthrows
    transienttryvoidvolatilewhile
    关键字含义
    abstract表明类或者成员方法具有抽象属性
    assert断言,用来进行程序调试
    boolean基本数据类型之一,声明布尔类型的关键字
    break提前跳出一个块
    byte基本数据类型之一,字节类型
    case用在switch语句之中,表示其中的一个分支
    catch用在异常处理中,用来捕捉异常
    char基本数据类型之一,字符类型
    class声明一个类
    const保留关键字,没有具体含义
    continue回到一个块的开始处
    default默认,例如,用在switch语句中,表明一个默认的分支。Java8 中也作用于声明接口函数的默认实现
    do用在do-while循环结构中
    double基本数据类型之一,双精度浮点数类型
    else用在条件语句中,表明当条件不成立时的分支
    enum枚举
    extends表明一个类型是另一个类型的子类型。对于类,可以是另一个类或者抽象类;对于接口,可以是另一个接口
    final用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量
    finally用于处理异常情况,用来声明一个基本肯定会被执行到的语句块
    float基本数据类型之一,单精度浮点数类型
    for一种循环结构的引导词
    goto保留关键字,没有具体含义
    if条件语句的引导词
    implements表明一个类实现了给定的接口
    import表明要访问指定的类或包
    instanceof用来测试一个对象是否是指定类型的实例对象
    int基本数据类型之一,整数类型
    interface接口
    long基本数据类型之一,长整数类型
    native用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
    new用来创建新实例对象
    package
    private一种访问控制方式:私用模式
    protected一种访问控制方式:保护模式
    public一种访问控制方式:共用模式
    return从成员方法中返回数据
    short基本数据类型之一,短整数类型
    static表明具有静态属性
    strictfp用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范
    super表明当前对象的父类型的引用或者父类型的构造方法
    switch分支语句结构的引导词
    synchronized表明一段代码需要同步执行
    this指向当前实例对象的引用
    throw抛出一个异常
    throws声明在当前定义的成员方法中所有需要抛出的异常
    transient声明不用序列化的成员域
    try尝试一个可能抛出异常的程序块
    void声明当前成员方法没有返回值
    volatile表明两个或者多个变量必须同步地发生变化
    while用在循环结构中
    • 修饰符

      修饰符是java关键字其中的一部分,其是用来修饰类名,方法名,变量名,以达到控制其访问权限,功能定义的目的

      修饰符的学习比一般关键字要更加深入和重要

    • 标识符:

      Java 中标识符是为方法、变量或其他用户定义项所定义的名称。标识符可以有一个或多个字符。在 Java 语言中,标识符的构成规则如下。

      标识符由数字(0~9)和字母(A~Z 和 a~z)、美元符号($)、下划线(_)以及 Unicode 字符集中符号大于 0xC0 的所有符号组合构成(各符号之间没有空格)。标识符的第一个符号为字母、下划线和美元符号,后面可以是任何字母、数字、美元符号或下划线。

      另外,java标识符区分大小写,因此name和 Name是两个不同的标识符。

      标识符可以理解为用户自定义的“关键字”,标识符虽然有自己的书写规则,但是通常规范来说标识符应当遵守“小驼峰”规则。最好不要用特殊字符开头,会影响代码可阅读性。在遵守规范的前提下,标识符可以按照开发者意愿命名。基本没有什么学习成本

    这三个名词概念对于java程序员来说应当是基础中的基础,但是由于本人总是混淆,特此记录。

    其中修饰符最为重要并且有一定的学习难度

    范围:标识符>关键字>修饰符


    修饰符

    我从前认为java修饰符分为两类,即:访问修饰符,非访问修饰符。这个认知本质上没有问题,但是在我查阅资料之后我意识到在这个分类的上层概念还有一个分类,即:类修饰符,方法修饰符,变量修饰符。其中的每一类再细分为访问修饰符和非访问修饰符。以此方可以更加清晰的掌握修饰符的用法


    类修饰符

    访问修饰符:

    public(公共类修饰符)

    1. public :java有且仅有一个公共类访问修饰符:public,其表示公共的,在同一个工程里的其他文件都可以import这个类

    问:类必须用public修饰嘛?

    答:并不是,这存在两种情况:

    • 第一种公共类不用public修饰,那么上面说到公共类有且仅有一个访问修饰符public。如果不用public修饰怎么办呢?不是自相矛盾么,其实不用public修饰的意思是不写访问修饰符,即缺省修饰符的写法(在有的文档里解释为default或者friendly。我不主张这种说法,这存在误导性,实际上Java中并没有名为default或者friendly的访问修饰符(即不能使用default或者friendly定义类或变量),只是为了方便标识缺省访问控制符的情况,写这样的代码是直接报错的)。这种情况我们直接理解为不写访问修饰符,那么此时主类的访问权限便被控制在了同包里。

    • 第二种情况是内部类,内部类是可以被public,protected,缺省,private修饰的。内部类我们用类成员去理解即可

    非访问控制符:

    abstract(抽象类修饰符 ) 、 final(最终类修饰符)

    1. abstract :用 abstract 修饰符修饰的类,被称为抽象类。(有关抽象类的概念我将在其他文章记录)

    2. final :当一个类不能被继承时可用修饰符 final修饰为最终类。被定义为 final 的类通常是一些有固定作用、用来完成某种标准功能的类。


    方法修饰符

    访问修饰符

    public(公共访问修饰符)、protected(保护访问修饰符)、缺省访问控制符、private(私有访问修饰符)

    1. public:同工程范围

    2. protected:同包加子类

    3. 缺省:同包

    4. private:同类,只允许自己访问(从这里可以看出private不能用来修饰类是有原因的,类如果私有了,还有什么意义呢)

    非访问修饰符

    abstract(抽象方法修饰符) 、static(静态方法修饰符)、final (最终方法修饰符)、native (本地方法修饰符)、synchronized(同步方法修饰符)

    1. abstract : abstract 修饰的方法称为抽象方法。抽象方法仅有方法头,没有方法体和具体实现。

    2. static :用修饰符 static 修饰的方法称为静态方法。静态方法是属于整个类的类方法;而不使用static 修饰、限定的方法是属于某个具体类对象的方法。 由于 static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,即 static 方法只能处理 static的域。(静态域的理解区分类和实例的概念就明白了,类的属性行为可以理解为静态的。而类实例化得到的对象的属性行为则不是静态的,静态的行为属性是在程序初始化就加载到内存的,同时需要注意的是对象可以访问静态域的行为属性,但是类不能访问对象的行为属性)

    3. final :用修饰符 final修饰的方法称为最终方法。最终方法是功能和内部语句不能更改的方法,即最终方法不能重写覆盖。final固定了方法所具有的功能和操作,防止当前类的子类对父类关键方法的错误定义,保证了程序的安全性和正确性。所有被 private 修饰符限定为私有的方法,以及所有包含在 final 类 ( 最终类) 中的方法,都被认为是最终方法。

    4. native :用修饰符 native 修饰的方法称为本地方法。为了提高程序的运行速度,需要用其它的高级语言书写程序的方法体,那么该方法可定义为本地方法用修饰符 native 来修饰。(感觉不常用)

      查看Thread.start()方法的源码,可以看到下面代码块

      public synchronized void start() {
              if (threadStatus != 0)
                  throw new IllegalThreadStateException();
              group.add(this);
      ​
              boolean started = false;
              try {
                  start0();
                  started = true;
              } finally {
                  try {
                      if (!started) {
                          group.threadStartFailed(this);
                      }
                  } catch (Throwable ignore) {
                  }
              }
          }
      ​
          private native void start0();

      其中 private native void start0();

      就用了native修饰符,这个方法表示启动本地操作系统的一个新线程,

    5. synchronized :该修饰符主要用于多线程程序中的协调和同步。


    变量修饰符

    访问控制符

    public (公共访问修饰符)、protected(保护访问修饰符) 、缺省访问修饰符、private(私有访问修饰符)

    1. public:用 public 修饰的域称为公共域。由于 public 修饰符会降低运行的安全性和数据的封装性,所以一般应减少 public 域的使用。

    2. protected:用 protected 修饰的成员变量可以被三种类所引用:①该类自身;②同一个包中的其它类;③其它包中的子类。

      使用修饰符 protected 的主要作用是允许其它包中的子类来访问父类的特定属性。

    3. 缺省:没有访问控制符的成员变量可以被该类本身或同一包中的其他类访问。

    4. private:private 修饰的成员变量只能被该类自身所访问,不能被其它任何类 ( 包括子类 ) 访问。

    非访问控制符

    static (静态域修饰符)、 final(最终域修饰符) 、volatile (易失 ( 共享 ) 域修饰符)、transient(暂时性域修饰符)。

    1. static :用 static修饰的成员变量仅属于类的变量,而不属于任何一个具体的对象,静态成员变量的值是保存在类的内存区域的公共存储单元,而不是保存在某一个对象的内存区间。该类的任一对象访问它时取到的都是相同的数据;该类的任一对象修改它时 , 也都是对同一个内存单元进行操作。

    2. final :最终域修饰符 final 是用来定义常量的。一个类的域 ( 成员变量 ) 如果被修饰符 final 说明,则它的取值在程序的整个执行过程中都是不变的。

    3. volatile :易失 ( 共享 ) 域修饰符 volatile是用来说明这个成员变量可能被几个线程所控制和修改。也就是说在程序运行过程中,这个成员变量有可能被其它的程序影响或改变它的取值。通常 volatile 用来修饰接受外部输入的域。

    4. 暂时性域修饰符 transient :暂时性域修饰符 transient 用来定义一个暂时性变量。其特点是:用修饰符transient 限定的暂时性变量,将指定 Java虚拟机认定该暂时性变量不属于永久状态,以实现不同对象的存档功能。否则,类中所有变量都是对象的永久状态的一部分,存储对象时必须同时保存这些变量。

      (JPA中有一个@Transient注解,可以做到不报存被该注解修饰的字段,与transient有相同的意思)


    访问控制修饰符总结

    访问级别访问控制修饰符同类同包子类(不同包)不同包(其他类)
    公共public允许允许允许允许
    受保护protected允许允许允许不允许
    默认缺省修饰符允许允许不允许不允许
    私有private允许不允许不允许不允许

    注意:protected修饰的属性或方法,允许不同包的子类中访问。注意这里的访问方式是通过继承访问父类中的protected属性或方法,而不是直接通过父类实例访问protected属性或方法

    本文部分内容参考老鼠只爱大米

    原文链接:Java中各类修饰符的使用总结(看完这篇就够了)_夏日清风-CSDN博客_java 修饰符

    展开全文
  • 日常Java练习题(每天进步一点点系列)

    万次阅读 多人点赞 2021-05-16 23:26:00
    提示:好多小伙伴反映,直接看到答案不太好...1、与未加访问控制符的缺省情况相比,public和protected修饰符扩大了属性和方法的被访问范围,private修饰符则缩小了这种范围。 正确答案: A 你的答案: A (正确) 正确 错误

    提示:好多小伙伴反映,直接看到答案不太好,那我把答案的颜色设置为透明,答案位置还是在题目后面,需要鼠标选中才能看见(操作如下图),同时为了手机端的小伙伴(手机端也可以长按选中查看),我还会把所有答案放到文章最下面,希望给每天进步一点点的小伙伴更好的体验。
    在这里插入图片描述

    1、与未加访问控制符的缺省情况相比,public和protected修饰符扩大了属性和方法的被访问范围,private修饰符则缩小了这种范围。
    正确答案: A 你的答案: A (正确)
    正确
    错误

    题解:
    在这里插入图片描述

    2、下列叙述错误的是( )
    正确答案: D 你的答案: D (正确)
    在接口中定义的方法除了default和static关键字修饰的方法拥有方法体,其他方法都应是没有方法体的抽象方法(JDK1.8以后)
    一个java类只能有一个父类,但可以实现多个接口
    在类声明中,用implements关键字声明该类实现的接口
    定义接口时使用implements关键字。

    题解:
    A、JDK8开始,接口中可以定义有方法体的方法,方法必须被default和static修饰。除此之外,其他方法都是抽象方法。
    B、Java的语法是单继承,但是继承可以传递。其实B更准确一点是只能有一个直接父类。
    C、继承用extends,实现用implements。先继承后实现。
    D、定义类是class,接口是interface。

    3、能用来修饰interface的有()
    正确答案: B 你的答案: B (正确)
    private
    public
    protected
    static

    题解:
    java中接口只能使用public修饰,接口内方法默认为public abstract

    4、关于访问权限,说法正确的是? ( )
    正确答案: A 你的答案: A (正确)
    类A和类B在同一包中,类B有个protected的方法testB,类A不是类B的子类(或子类的子类),类A可以访问类B的方法testB
    类A和类B在同一包中,类B有个protected的方法testB,类A不是类B的子类(或子类的子类),类A不可以访问类B的方法testB
    访问权限大小范围:public > 包权限 > protected > private
    访问权限大小范围:public > 包权限 > private > protected

    题解:
    private 权限限于同一个类中; default 权限限于同一个包中,即包权限=default权限; protected权限限于同一个包中,以及不在同一个包中的子类 public 权限在不同包中都可以
    在这里插入图片描述

    5、下列说法正确的有()
    正确答案: A 你的答案: A (正确)
    能被java.exe成功运行的java class文件必须有main()方法
    J2SDK就是Java API
    Appletviewer.exe可利用jar选项运行.jar文件
    能被Appletviewer成功运行的java class文件必须有main()方法

    题解:
    A:正确,main方法是入口
    B:J2SDK当然不仅仅包含java API
    C:jar选项是java.exe 的选项
    D:Appletviewer是运行applet的, applet 不用main方法,继承applet类即可。

    6、Java数据库连接库JDBC用到哪种设计模式?
    正确答案: B 你的答案: B (正确)
    生成器
    桥接模式
    抽象工厂
    单例模式

    题解:
    桥接模式:
    定义 :将抽象部分与它的实现部分分离,使它们都可以独立地变化。
    桥接模式所涉及的角色
    1 . Abstraction :定义抽象接口,拥有一个Implementor类型的对象引用
    2 . RefinedAbstraction :扩展Abstraction中的接口定义
    3 . Implementor :是具体实现的接口,Implementor和RefinedAbstraction接口并不一定完全一致,实际上这两个接口可以完全不一样Implementor提供具体操作方法,而Abstraction提供更高层次的调用
    4 . ConcreteImplementor :实现Implementor接口,给出具体实现
    Jdk中的桥接模式:JDBC
    JDBC连接 数据库 的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不动,原因就是JDBC提供了统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了

    7、public void test() {
    int a = 10;
    System.out.println(a++ + a–);
    }
    最后输出什么?
    正确答案: C 你的答案: C (正确)
    19
    20
    21
    22

    题解:
    a++ + a-- 等价于 10 + 11,a++ 先把10赋值给a 再+1 所以左边是10 但此时a=11。右边a-- 也是先赋值 a=11,再进行-1操作,就没啥影响了。所以10+11=21 最后a=10。

    8、如何获取ServletContext设置的参数值?
    正确答案: B 你的答案: B (正确)
    context.getParameter()
    context.getInitParameter()
    context.getAttribute()
    context.getRequestDispatcher()

    题解:
    getParameter()是获取POST/GET传递的参数值;
    getInitParameter获取Tomcat的server.xml中设置Context的初始化参数
    getAttribute()是获取对象容器中的数据值;
    getRequestDispatcher是请求转发。

    9、下面关于程序编译说法正确的是()
    正确答案: C 你的答案: C (正确)
    java语言是编译型语言,会把java程序编译成二进制机器指令直接运行
    java编译出来的目标文件与具体操作系统有关
    java在运行时才进行翻译指令
    java编译出来的目标文件,可以运行在任意jvm上

    题解:
    A: .java编译成的是字节码,再被各系统的jvm翻译成本系统可以识别的机器码,这就是java一次编程多平台应用的跨平台性
    B: java源文件生成的是class文件,与系统无关
    C: 注意字节码和机器码不是一回事 java程序在运行时字节码才会被jvm翻译成机 器码,所以说java是解释性语言
    D: 注意jvm的版本

    10、关于身份证号,以下正确的正则表达式为( )
    正确答案: A C 你的答案: A C (正确)
    A:isIDCard=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
    B:isIDCard=/^[1-9]\d{7}((9\d)|(1[0-2]))(([0|1|2]\d)|3[9-1])\d{3}$/;
    C:isIDCard=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
    D:isIDCard=/^[1-9]\d{5}[1-9]\d{3}((9\d)|(1[9-2]))(([0|1|2]\d)|3[9-1])\d{4}$/;

    题解:
    正确选项
    A选项:isIDCard=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/
    C选项:isIDCard=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/
    ^:起始符号,^x表示以x开头
    $:结束符号,x$表示以x结尾
    [n-m]:表示从n到m的数字
    \d:表示数字,等同于[0-9]
    X{m}:表示由m个X字符构成,\d{4}表示4位数字
    15位身份证的构成:六位出生地区码+六位出身日期码+三位顺序码
    18位身份证的构成:六位出生地区码+八位出生日期码+三位顺序码+一位校验码
    C选项的构成:
    [1-9]\d{5}:六位出生地区码,出生地区码没有以0开头,因此第一位为[1-9]。
    [1-9]\d{3}:八位出生日期码的四位年份,同样年份没有以0开头。
    ((0\d)|(1[0-2])):八位出生日期码的两位月份,| 表示或者,月份的形式为0\d或者是10、11、12。
    (([0|1|2]\d)|3[0-1]):八位出生日期码的两位日期,日期由01至31。
    \d{4}:三位顺序码+一位校验码,共四位。
    A选项的构成:
    [1-9]\d{7}:六位出生地区码+两位出生日期码的年份,这里的年份指后两位,因此没有第一位不能为0的限制,所以合并了。
    后面的与C选项类似了。
    其实我也是第一次知道身份证还有15位的。
    一代身份证15位,二代18位。

    答案汇总:
    1、正确答案: A
    2、正确答案: D
    3、正确答案: B
    4、正确答案: A
    5、正确答案: A
    6、正确答案: B
    7、正确答案: C
    8、正确答案: B
    9、正确答案: C
    10、正确答案: A C

    以上部分题解来自牛客评论区,感谢评论区大佬的解释。

    每天进步一点点!
    不进则退!

    看完如果对你有帮助,感谢点赞支持!
    如果你是电脑端,看到右下角的 “一键三连” 了吗,没错点它[哈哈]

    在这里插入图片描述
    加油!

    共同努力!

    Keafmd

    展开全文
  • NLP领域的ImageNet时代:嵌入已死,语言模型当立 https://www.toutiao.com/a6742137243487437316/ NLP领域的ImageNet时代:嵌入已死,语言模型当立 选自the Gradient,作者:Sebastian Ruder,机器之心...

    NLP领域的ImageNet时代:词嵌入已死,语言模型当立

     

     

    https://www.toutiao.com/a6742137243487437316/

     

    NLP领域的ImageNet时代:词嵌入已死,语言模型当立

    选自the Gradient,作者:Sebastian Ruder,机器之心编译。

    计算机视觉领域常使用在 ImageNet 上预训练的模型,它们可以进一步用于目标检测、语义分割等不同的 CV 任务。而在自然语言处理领域中,我们通常只会使用预训练词嵌入向量编码词汇间的关系,因此也就没有一个能用于整体模型的预训练方法。Sebastian Ruder 表示语言模型有作为整体预训练模型的潜质,它能由浅到深抽取语言的各种特征,并用于机器翻译、问答系统和自动摘要等广泛的 NLP 任务。Ruder 同样展示了用语言模型做预训练模型的效果,并表示 NLP 领域中的「ImageNet」终要到来。

    自然语言处理(NLP)领域正在发生巨变。

    长期以来,词向量一直是自然语言处理的核心表征技术。然而,其统治地位正在被一系列令人振奋的新挑战所动摇,如:ELMo、ULMFiT 及 OpenAI transformer。这些方法因证明预训练的语言模型可以在一大批 NLP 任务中达到当前最优水平而吸引了很多目光。这些方法预示着一个分水岭:它们在 NLP 中拥有的影响,可能和预训练的 ImageNet 模型在计算机视觉中的作用一样广泛。

    由浅入深的预训练

    预训练的词向量给 NLP 带来了很大的提高。2013 年提出的语言建模近似——word2vec 凭借其效率和易用性在硬件速度慢得多且深度学习模型没有得到广泛支持的时代得到采用。此后,进行 NLP 项目的标准方式基本保持不变:通过 word2vec 和 GloVe 等算法对大量未标记数据进行预处理的词嵌入被用于初始化神经网络的第一层,其它层随后在特定任务的数据上进行训练。在大多数训练数据有限的任务中,这种方法帮助提高了两到三个百分点。尽管这些预训练的词嵌入颇具影响力,但它们也有局限:它们仅包含模型第一层的先验知识——网络的其余部分还需要从头开始训练。

    word2vec 捕捉到的关系。(来源:TensorFlow tutorial)

    word2vec 及其它相关方法是为了实现效率而牺牲表达性的浅层方法。使用词嵌入就像利用仅编码图像边缘信息的预训练表征初始化计算机视觉模型:它们在许多任务中都能发挥作用,但是却无法捕捉到可能发挥更大作用的高层次信息。利用词向量初始化的模型需要从头开始学习,不仅是学习消除歧义,还要学习从词组成的句子中提取意义。这是语言理解的核心,需要建模语义组合、一词多义、首语重复、长期依赖、一致性、否定等许多复杂的语言现象。因此,用这些浅层表示初始化的 NLP 模型仍然需要大量的示例才能获得良好的性能也就不足为奇了。

    ULMFiT、ELMo 和 OpenAI transformer 最新进展的核心是一个关键的范式转变:从仅仅初始化模型的第一层到用分层表示对整个模型进行预处理。如果学习词向量就像仅学习图像的边,那么这些方法就像学习特征的完整层次,从边到形状,再到高级语义概念。

    有趣的是,预训练整个模型以获得初级和高级特征在计算机视觉社区中已经采用好几年了。大多数情况下,预训练模型都是在 ImageNet 大型数据集上学习分类图像而训练出来的。ULMFiT、ELMo 和 OpenAI transformer 已经为 NLP 社区带来了自然语言中的「ImageNet」,这种任务能允许模型学习语言的高级细微差别。这就类似于 ImageNet 允许预训练 CV 模型以学习普遍意义的图像特征。在本文后面的部分中,我们将语言建模与 ImageNet 计算机视觉建模做类比,并展示为什么这种方法看起来会如此有前景。

    ImageNet

    ImageNet 大规模视觉识别挑战赛。(来源:Xavier Giro-o-Nieto)

    ImageNet 对机器学习研究具有重要影响。该数据集最初发布于 2009 年,并迅速演变为 ImageNet 大规模视觉识别挑战赛(ILSVRC)。2012 年,Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 提交的深度神经网络超过第二名 41 %,表明深度学习是一种可行的机器学习策略,该深度神经网络可以说是引发了机器学习研究中深度学习的爆发。

    ImageNet 的成功凸显了在深度学习时代,数据至少和算法一样重要。ImageNet 数据集不仅使 2012 年非常重要的深度学习能力展示成为可能,而且在迁移学习中也取得了同样重要的突破:研究人员很快意识到,在 ImageNet 现有模型中学习的权重可用于完全初始化其它数据集的模型,并显著提高性能。这种「微调」方法允许在每个类别只有一个正面示例的情况下实现良好性能(Donahue et al., 2014)。

    在 ILSVRC-2012 上训练的特征泛化到 SUN-397 数据集上。(来源:Donahue et al., 2014)

    在目标识别、语义分割、人体姿态估计和视频识别等任务上,预处理的 ImageNet 模型已用来实现最优水平。与此同时,它们还使得 CV 得以应用于训练示例数量少、注释成本高的领域。在 CV 中,在 ImageNet 上通过预处理进行迁移学习实际上非常有效,以至于现在不使用它会被认为是蛮干(Mahajan et al., 2018)。

    ImageNet 中有什么?

    为了确定用于语言处理的 ImageNet 可能是什么样子,我们首先要确定什么使 ImageNet 有利于迁移学习。以往的研究只揭示了这个问题的一部分:减少每个类的示例数或类别数只会导致性能下降,而细粒度类和更多数据并非总意味着更好的结果。

    与其直接查看数据,更谨慎的做法是探究在数据上训练的模型学到了什么。众所周知,在 ImageNet 上训练的深层神经网络的特征迁移顺序为从第一层到最后一层、从一般任务到特定任务:较低层学习建模低级特征,如边缘,而较高层学习建模高级概念,如图案和整个部分或对象,如下图所示。重要的是,关于物体边缘、结构和视觉组成的知识与许多 CV 任务相关,这就揭示了为什么这些层会被迁移。因此,类似 ImageNet 的数据集的一个关键属性是鼓励模型学习可以泛化到问题域中新任务的特征。

    在 ImageNet 上训练的 GoogLeNet 中不同层特征捕获的信息可视化。(来源:Distill)

    除此之外,很难对 ImageNet 上迁移做得如此出色的原因作出进一步的概括。例如,ImageNet 数据集的另一个优点可能是数据的质量。ImageNet 的创建者尽力确保注释的可靠性和一致性。然而,远程监管的工作是一个对比,这表明大量弱标记数据通常是足够的。事实上,Facebook 的研究人员最近显示,他们可以通过预测数十亿个社交媒体图像上的 hashtags 到 ImageNet 上最新的准确性来预先训练模型。

    没有任何更具体的见解,但我们有两个关键的需求:

    1. 像 ImageNet 一样的数据集要足够大,即大约有数百万个训练示例。
    2. 它应该代表学科的问题空间。

    用于语言任务的 ImageNet

    相比于 CV,NLP 的模型通常浅得多。因此对特征的分析大部分聚焦于第一个嵌入层,很少有人研究迁移学习的高层性质。我们考虑规模足够大的数据集。在当前的 NLP 形势下,有以下几个常见任务,它们都有可能用于 NLP 的预训练模型。

    阅读理解是回答关于一个段落自然语言问题的任务。该任务最流行的数据集是 Stanford Question Answering Dataset (SQuAD),其中包含了超过 10 万个问答对,并通过突出显示段落中的几个单词来让模型回答一个问题,如下图所示:

    在 ImageNet 上训练的 GoogLeNet 的不同层特征捕捉到的信息的可视化(Rajpurkar et al., 2016,《SQuAD: 100,000+ Questions for Machine Comprehension of Text》)。

    自然语言推理是识别一段文本和一个假设之间关系(蕴涵、矛盾和中性等)的任务。该任务最流行的数据集是 Stanford Natural Language Inference (SNLI) Corpus,包含 57 万个人类写的英语句子对。该数据集的示例如下图所示。

    SNLI:nlp.stanford.edu/projects/sn…

    SNLI 数据集的示例。(Bowman et al., 2015,A large annotated corpus for learning natural language inference)

    机器翻译,即将文本从一种语言转换到另一种语言,是 NLP 中研究最充分的任务之一。并且多年来,人们为常用的语言对累积了大量的训练数据,例如 WMT2014 的 4 千万个英语法语句子对。下图是两个示例翻译对。

    来自 newstest2014 的法语到英语翻译(Artetxe et al., 2018,Unsupervised Neural Machine Translation)

    选区解析(Constituency parsing)以(线性化)解析树的形式提取句子的句法结构,如下图所示。在过去,人们在该任务中使用数百万个弱标记解析来训练序列到序列的模型(参见《Grammar as a Foreign Language》)。

    解析树和其线性化处理(Vinyals et al., 2015,Grammar as a Foreign Language)

    语言建模(LM)在给定前一个单词的情况下尝试预测下一个单词。已有的基准数据集由大约 10 亿个单词构成,但由于该任务是无监督的,因此可以使用任意数量的单词来训练。下图是由维基百科文章构成的常用 WikiText-2 数据集的示例。

    WikiText-2 语言建模数据集的示例。(来源: Salesforce)

    WikiText-2:einstein.ai/research/th…

    所有这些任务提供或允许收集足够数量的示例来训练。实际上,以上任务(以及很多其它任务例如情感分析、skip-thoughts 和自编码等)都曾在近几个月被用于预训练表征。

    虽然任何的数据都包含某些偏差,人类标注可能无意间引入额外信息,而模型也将会利用这些信息。近期研究表明在诸如阅读理解和自然语言推理这样的任务中的当前最优模型实际上并没有形成深度的自然语言理解,而是注意某些线索以执行粗浅的模式匹配。例如,Gururangan 等人 (2018) 在《Annotation Artifacts in Natural Language Inference Data》中表明,标注者倾向于通过移除性别或数量信息生成蕴涵示例,以及通过引入否定词生成矛盾。只需使用这些线索,模型就可以在未查看前提的情况下在 SNLI 数据集上以 67% 的准确率分类假设。

    因此,更困难的问题应该是:哪个任务在 NLP 中最具代表性?换种说法,哪个任务使我们能学到最多关于自然语言理解的知识或关系?

    语言建模

    为了预测句子中最可能出现的下一个词,模型不仅需要能表达语法,即模型预测下一个词的语法形式必须与其修饰语或动词匹配。同时模型还需要理解语义,此外那些最准确的模型必须包含世界知识或常识等内容。若思考一条不完整的语句「The service was poor, but the food was」,为了预测「yummy」或「delicious」等后续单词,模型不仅需要记住用于描述食物的属性,还需要识别连词「but」以引入相反的语义,因此新的属性应该是与情感词「poor」相对的。

    语言建模是最后提到的一种方法,它已经被证明能为下游任务捕获很多与语言相关的属性,例如长期依赖性关系、层级关系和情感语义等。相比于自编码器等无监督学习任务,语言建模即使只有少量训练数据也能在句法任务上有非常好的表现。

    语言建模最大的优势在于,训练数据可以免费从任何文本语料库获取,因此几乎能获得无限的训练数据。这非常重要,因为 NLP 并不只限于英语,有超过 1000 人使用的语言有 4500 种。作为预训练任务的语言建模为以前语言服务支持不好的语种打开了大门,我们可以直接使用文本数据无监督地训练语言模型,并应用到翻译、信息抽取等任务中。而对于那些无标注数据都不足的稀有语言,多语语言建模能先在多个相关语种上训练,例如跨语言词嵌入等。

    ULMFiT 不同的阶段(Howard and Ruder, 2018)

    到目前为止,我们将语言建模作为预训练任务的论点纯粹是概念性的。但是在最近几个月,我们也获得了一些实验性证明:语言模型的词嵌入(ELMo)、普遍语言模型精调(ULMiT)和 OpenAI Transformer 已经实验性地证明了语言模型能用于预训练任务,正如上图所示的 ULMFiT。这三种方法都使用预训练语言模型来实现当前最优的自然语言处理任务,例如文本分类、问答系统、自然语言推断、指代消歧和序列标注等问题。

    在如下所示的 ELMo 等很多情况中,使用预训练语言模型作为核心的算法在广泛研究的基准上,要比当前最优的结果高 10% 到 20%。ELMo 同时也获得了 NLP 顶会 NAACL-HLT 2018 的最佳论文。最后,这些模型表现出非常高的样本效率,达到最优性能只需要数百样本,甚至可以实现 zero-shot 学习。

    ELMo 在一系列 NLP 任务中取得的进步。(来源:Matthew Peters)

    鉴于这一步取得的变化,NLP 实践者很可能在一年后下载预处理的语言模型,而不是预处理的词嵌入,来用于他们自己的模型中,就像现在大多数 CV 项目的起点是如何预处理 ImageNet 模型一样。

    然而,和 word2vec 相似,语言建模的任务有其天然的局限性:它只是作为真正的语言理解的一个代理,并且单体模型并不足以为特定的下游任务捕捉需要的信息。例如,为了回答关于或跟随故事中人物轨迹的问题,模型需要学习执行指代或消解。此外,语言模型仅能捕捉它们所见过的东西。特定类型的信息,例如大部分常识,很难仅从文本中学习到,并需要整合外部信息。

    一个突出的问题是如何从一个预训练语言模型将信息迁移到下游任务中。有两个主要的范式,一是是否将预训练语言模型作为固定的特征提取器,并将其表征作为特征整合到随机初始化的模型(正如 ELMo 所做的)中;二是是否微调完整的语言模型(如 ULMFiT 所做的)。后者在计算机视觉中很常用,其中训练时会调整模型的最高层或最高的几层。虽然 NLP 模型通常更浅,因此相比对应的视觉模型需要不同的微调技术,但近期的的预训练模型变得更深了。我在下一月将展示 NLP 迁移学习的每个核心组件的作用:包括表达性很强的语言模型编码器(如深度 BiLSTM 或 Transformer),用于预训练的数据的量和本质,以及微调预训练模型使用的方法。

    但理论依据何在?

    到目前为止,我们的分析主要是概念和经验上的,我们仍然难以理解为什么模型先在 ImageNet 上进行训练就能在语言建模上迁移得如此之好。一种更为正式的、考虑预训练模型泛化能力的方式是基于「偏置学习」(bias learning)模型(Baxter, 2000)。假设我们的问题域覆盖特定学科中任务的所有排列,例如计算机视觉——它构成了环境。我们对此提供了许多数据集,允许我们诱导一系列假设空间 H=H'。我们在偏置学习中的目标是找到偏置,即假设空间 H'∈H,它可以在整个(可能是无限的)环境中最大化性能。

    多任务学习中的经验和理论结果(Caruana,1997; Baxter,2000)表明,在足够多的任务中学习到的偏置或许可以推广到在同样环境中未见过的任务上。通过多任务学习,在 ImageNet 上训练的模型可以学习大量的二进制分类任务(每个类一个)。这些任务都来自自然、真实世界的图像空间,可能对许多其他 CV 任务也有代表性。同样,语言模型通过学习大量分类任务(每个词一个)可能诱导出有助于自然语言领域许多其他任务的表征。然而,要想从理论上更好地理解为什么语言建模似乎在迁移学习中如此有效,还需要进行更多的研究。

    NLP 的 ImageNet 时代

    NLP 真正转向迁移学习的时机已经成熟。鉴于 ELMo、ULMFiT 和 OpenAI 令人印象深刻的实验结果,这种发展似乎只是一个时间问题,预训练的词嵌入将逐渐落伍,取而代之的是每个 NLP 从业者工具箱里的预训练语言模型。这可能会在标注数据数量不足时为 NLP 创造更多可能性。苍天已死,黄天当立!

     

    展开全文
  • 是用来修饰、限定、说明名词或代词的品质与特征的。 宾语 ,也称受,是指一个动作(动词)的接受者。 是的,在过程中,除了成为一个领域专家,也会成为一个语言专家的。所以,如果你们的表达都不好,你还需要一个...
  • 修饰词 指除了统计维度以外指标的业务场景限定抽象 修饰词隶属于一种修饰类型,如在日志域的访问终端类型下 有修饰词 PC 端、无线端等 度量/原子指标 原子指标和度量自含义相同,基于某一业务 事件行为下的度量,是...
  • 而麦壳在原料使用上也毫不吝啬,用的是服装行业里被誉为好棉花代名的新疆棉。 (品牌提供的新疆棉采购单????) 它不仅因为柔软亲肤又细腻的天然特性,成为许多优质贴身衣物的首选。 更重要的是,新疆棉的纤维长度...
  • 这个很准确,现在我重新组织我的语言,”不要打破链式调用!“,这句话更应该说,不要破坏 RxJava事件驱动型 的编程思想。 你到底想说什么? 现在让我们回到文章的标题上,Android开发中, 网络请求的错误处理...
  • 简介: 说起 Serverless 这个,我想大家应该都不陌生,那么 Serverless 这个到底是什么意思?Serverless 到底能解决什么问题?可能很多朋友还没有深刻的体会和体感,这篇文章我就和大家一起聊聊 Serverless。 ...
  • 原子指标、修饰类型及修饰词,直接归属在业务过程下,其中修饰词继承修饰类型的数据域。 派生指标可以选择多个修饰词修饰词之间的关系为“或”或者 “且”,由具体的派生指标语义决定。 派生指标唯一归属一个原子...
  • 其实数据治理的范围很⼴,包含数据本⾝的管理、数据安全、数据质量、数据成本等。在DAMA 数据管理知识体系指南中,数据治理位于数据管理“车轮图”的正中央,是数据架构、数据建模、数据存储、数据安全、数据质量、...
  • 因为根据修饰关系以及语义表达上的相关性,和目标对象越接近的越有可能是其对应的观点,观点出现在较远位置的概率会低很多。 然后,我们通过一个阈值,将目标相关的注意力权重转化成 0/1 分布的潜在观点标签...
  • 2019考研英语熟生义

    万次阅读 多人点赞 2019-06-04 08:29:57
    2019考研英语熟生意 1.abandon 放松,沉溺 She abandoned herself to the scene landscape. 2.abide:容忍 经受住 3.abroad:广为流传
  • ⒈英语词根

    千次阅读 2021-07-07 17:10:34
    放在词根(Root)、词干(Stem)或单词(Word)的前部(指Prefix)、后部(指Suffix)或中间(指Infix),用来修饰其意义的添加成分, 词干(Stem)是未添加任何语法性词尾的原形单词,与词干相对的语法性词尾,如-s...
  • 3)合理 即一个电商概念必须符合人类常识,反例如“欧式韩风窗帘”、“儿童性感连衣裙”等就不是电商概念,因为一个窗帘不可能即是欧式还是韩风的,而我们通常不会用性感去修饰一件儿童的连衣裙。 4)指向明确 即一个...
  • generator function,而且有数十个API,学习成本远超redux-thunk,最重要的是你的额外学习成本是只服务于这个库的,与redux-observable不同,redux-observable虽然也有额外学习成本但是背后是rxjs和一整套思想 2、 体积...
  • 修饰词:维度的一个或某些值,比如维度性别下,男和女就是2种修饰词 衍生指标:比如某一个促销活动的转化率就是衍生指标,因为需要促销投放人数指标和促销订单数指标进行计算得出。 7、标签 标签是人为设定的、根据...
  • 日期类型指标命名规范,命名时要遵循:业务修饰词+基础指标词根+日期修饰词/聚合修饰词。将日期后缀加到名称后面,如下图所示: 图8 日期类型指标规范 I.聚合类型指标,命名时要遵循:业务修饰词+基础指标词根+聚合...
  • 成本

    千次阅读 2011-05-08 17:34:00
    成本:拼音:cheng ben 英语:cost  总成本:英语:total cost  1、CCA中国成本协会发布的CCA2101:2005《成本管理体系 术语》标准中第2.1.2条中对成本术语的定义是:  —— 为过程增值和...
  • 短语抽取专利汇总

    2022-02-28 09:37:44
    本发明通过挖掘中文科技创新文档语料特征,构建出中文停用及停用模式库,实现对无效信息的高性能过滤; 此外借助领域专家标注对各类关键短语抽取算法进行量化评估分析,从而选用更加适合领域认知的算法模型,并...
  • 深入理解Java并发之synchronized实现原理

    万次阅读 多人点赞 2017-06-04 17:44:44
    由于synchronized关键字修饰的是静态increase方法,与修饰实例方法不同的是,其锁对象是当前类的class对象。注意代码中的increase4Obj方法是实例方法,其对象锁是当前实例对象,如果别的线程调用该方法,将不会产生...
  • 1、为什么要进行数据仓库建模 性能:良好的模型能帮我们快速查询需要的数据,减少数据的IO吞吐 成本:减少数据冗余、计算结果复用、从而降低存储和计算成本 效率:改善用户使用数据的体验,提高使用数据的效率 改善...
  • 现在的拼多多是很多人想要创业的选择,拼多多的投资成本低,很多人都不知道拼多多做好标题首先认识?只要了解了这个,相信后期做好标题轻而易举,下面就和成都敏之澳一起来看看具体资讯吧!  关键词的种类大致...
  • 数据中台之OneData体系

    万次阅读 多人点赞 2019-10-19 17:15:21
    日期类型指标命名规范,命名时要遵循:业务修饰词+基础指标词根+日期修饰词/聚合修饰词。将日期后缀加到名称后面,如下图所示: I. 聚合类型指标,命名时要遵循:业务修饰词+基础指标词根+聚合类型+日期修饰词。将...
  • 块 sgjsj 能行性 sgjsj 旁路电容 sgjsj 窗口标题 sgjsj 子插件板 sgjsj 适应度景象 sgjsj 指令处理 sgjsj 主控台 sgjsj 争用 sgjsj 一币一 sgjsj 调试 sgjsj 自学习 sgjsj 调度 sgjsj 信息加密 sgjsj 结构 sgjsj ...
  • 聊聊数据仓库建设

    2021-08-20 00:06:43
    修饰词修饰词是对原子指标进行修饰限定的词汇,对应着明确的业务场景和业务规则,用于圈定原子指标业务统计的范围。 派生指标:派生指标是原子指标与一个或多个修饰词的组合。 复合指标:原子指标和派生指标经过...
  • 数仓建设规范指南

    2021-11-23 00:47:28
    系统根据指标定义表达式以及数据源表生成原子指标SQL 派生指标: 在原子指标的基础之上选择了一些维度或者修饰限定。 6. 数据表处理规范 1) 增量表 新增数据,增量数据是上次导出之后的新数据。 记录每次增加的量...
  • 系统根据指标定义表达式以及数据源表生成原子指标 SQL 派生指标: 在原子指标的基础之上选择了一些维度或者修饰限定。 数据表处理规范 增量表 新增数据,增量数据是上次导出之后的新数据。 记录每次增加的量,而...
  • 秒懂,Java 注解 (Annotation)你可以这样学

    万次阅读 多人点赞 2017-06-27 21:48:30
    注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。 可以这样理解: 老子非常有钱,所以人们给他贴了一张标签叫做富豪。 老子的儿子长大后,只要没有和老子断绝...
  • after-milliseconds resque 10000 sentinel failover-timeout resque 180000 sentinel parallel-syncs resque 5 这是因为官网加了一个修饰词,是“典型的最小配置”,把重要参数和多主的例子都写出来了,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,645
精华内容 2,658
热门标签
关键字:

修饰成本的词