精华内容
下载资源
问答
  • 我是名传统的前端开发者,我的很大部分工作就是各种类型的网页写 CSS,写了很多年。我从三年前开始接触并使用 CSS 预处理,如鱼得水,相见恨晚。因此,我感觉有必要写些文章来总结一下这方面的心得。如果你是...

    前言

    你好,我是魔法哥。我是一名传统的前端开发者,我的很大一部分工作就是为各种类型的网页写 CSS,写了很多年。

    我从三年前开始接触并使用 CSS 预处理,如鱼得水,相见恨晚。因此,我感觉有必要写些文章来总结一下这方面的心得。如果你是一位还没有接触预处理器的 CSS 开发者,希望我的文章能够帮助你轻松开始!

    (注:本文的示例代码均采用 Stylus 作为 CSS 预处理语言。)

    背景

    CSS 自诞生以来,基本语法和核心机制一直没有本质上的变化,它的发展几乎全是表现力层面上的提升。最开始 CSS 在网页中的作用只是辅助性的装饰,轻便易学是最大的需求;然而如今网站的复杂度已经不可同日而语,原生 CSS 已经让开发者力不从心。

    当一门语言的能力不足而用户的运行环境又不支持其它选择的时候,这门语言就会沦为 “编译目标” 语言。开发者将选择另一门更高级的语言来进行开发,然后编译到底层语言以便实际运行。

    于是,在前端领域,天降大任于斯人也,CSS 预处理器应运而生。而 CSS 这门古老的语言以另一种方式 “重新适应” 了网页开发的需求。

    预处理器赋予我们的 “超能力”

    简单梳理一下,CSS 预处理器为我们带来了几项重要的能力,由浅入深排列如下。(不用在意你用到了多少,无论深浅,都是获益。)

    文件切分

    页面越来越复杂,需要加载的 CSS 文件也越来越大,我们有必要把大文件切分开来,否则难以维护。传统的 CSS 文件切分方案基本上就是 CSS 原生的 @import 指令,或在 HTML 中加载多个 CSS 文件,这些方案通常不能满足性能要求。

    CSS 预处理器扩展了 @import 指令的能力,通过编译环节将切分后的文件重新合并为一个大文件。这一方面解决了大文件不便维护的问题,另一方面也解决了一堆小文件在加载时的性能问题。

    模块化

    把文件切分的思路再向前推进一步,就是 “模块化”。一个大的 CSS 文件在合理切分之后,所产生的这些小文件的相互关系应该是一个树形结构。

    树形的根结节一般称作 “入口文件”,树形的其它节点一般称作 “模块文件”。入口文件通常会依赖多个模块文件,各个模块文件也可能会依赖其它更末端的模块,从而构成整个树形。

    以下是一个简单的示例:

    entry.styl

    ├─ base.styl

    │   ├─ normalize.styl

    │   └─ reset.styl

    ├─ layout.styl

    │   ├─ header.styl

    │   │   └─ nav.styl

    │   └─ footer.styl

    ├─ section-foo.styl

    ├─ section-bar.styl

    └─ ...

    (入口文件 entry.styl 在编译时会引入所需的模块,生成 entry.css,然后被页面引用。)

    如果你用过其它拥有模块机制的编程语言,应该已经深有体会,模块化是一种非常好的代码组织方式,是开发者设计代码结构的重要手段。模块可以很清晰地实现代码的分层、复用和依赖管理,让 CSS 的开发过程也能享受到现代程序开发的便利。

    选择符嵌套

    选择符嵌套是文件内部的代码组织方式,它可以让一系列相关的规则呈现出层级关系。在以前,如果要达到这个目的,我们只能这样写:

    .nav {margin: auto /* 水平居中 */; width: 1000px; color: #333;}

    .nav li {float: left /* 水平排列 */; width: 100px;}

    .nav li a {display: block; text-decoration: none;}

    这种写法需要我们手工维护缩进关系,当上级选择符发生变化时,所有相关的下级选择符都要修改;此外,把每条规则写成一行也不易阅读,为单条声明写注释也很尴尬(只能插在声明之间了)。

    在 CSS 预处理语言中,嵌套语法可以很容易地表达出规则之间的层级关系,为单条声明写注释也很清晰易读:

    .nav

    margin: auto  // 水平居中

    width: 1000px

    color: #333

    li

    float: left  // 水平排列

    width: 100px

    a

    display: block

    text-decoration: none

    变量

    在变更出现之前,CSS 中的所有属性值都是 “幻数”。你不知道这个值是怎么来的、它的什么样的意义。有了变量之后,我们就可以给这些 “幻数” 起个名字了,便于记忆、阅读和理解。

    接下来我们会发现,当某个特定的值在多处用到时,变量就是一种简单而有效的抽象方式,可以把这种重复消灭掉,让你的代码更加 DRY。

    我们来比较一下以下两段代码:

    /* 原生 CSS 代码 */

    strong {

    color: #ff4466;

    font-weight: bold;

    }

    /* ... */

    .notice {

    color: #ff4466;

    }

    // 用 Stylus 来写

    $color-primary = #ff4466

    strong

    color: $color-primary

    font-weight: bold

    /* ... */

    .notice

    color: $color-primary

    你可能已经意识到了,变量让开发者更容易实现网站视觉风格的统一,也让 “换肤” 这样的需求变得更加轻松易行。

    运算

    光有变量还是不够的,我们还需要有运算。如果说变量让值有了意义,那么运算则可以让值和值建立关联。有些属性的值其实跟其它属性的值是紧密相关的,CSS 语法无法表达这层关系;而在预处理语言中,我们可以用变量和表达式来呈现这种关系。

    举个例子,我们需要让一个容器最多只显示三行文字,在以前我们通常是这样写的:

    .wrapper {

    overflow-y: hidden;

    line-height: 1.5;

    max-height: 4.5em;  /* = 1.5 x 3 */

    }

    大家可以发现,我们只能用注释来表达 max-height 的值是怎么来的,而且注释中 3 这样的值也是幻数,还需要进一步解释。未来当行高或行数发生变化的时候,max-height 的值和注释中的算式也需要同步更新,维护起来很不方便。

    接下来我们用预处理语言来改良一下:

    .wrapper

    $max-lines = 3

    $line-height = 1.5

    overflow-y: hidden

    line-height: $line-height

    max-height: unit($line-height * $max-lines, 'em')

    乍一看,代码行数似乎变多了,但代码的意图却更加清楚了——不需要任何注释就把整件事情说清楚了。在后期维护时,只要修改那两个变量就可以了。

    值得一提的是,这种写法还带来另一个好处。$line-height 这个变量可以是 .wrapper 自己定义的局部变量(比如上面那段代码),也可以从更上层的作用域获取:

    $line-height = 1.5  // 全局统一行高

    body

    line-height: $line-height

    .wrapper

    $max-lines = 3

    max-height: unit($line-height * $max-lines, 'em')

    overflow-y: hidden

    这意味着 .wrapper 可以向祖先继承行高,而不需要为这个 “只显示三行” 的需求把自己的行高写死。有了运算,我们就有能力表达属性与属性之间的关联,它令我们的代码更加灵活、更加 DRY。

    函数

    把常用的运算操作抽象出来,我们就得到了函数。

    开发者可以自定义函数,预处理器自己也内置了大量的函数。最常用的内置函数应该就是颜色的运算函数了吧!有了它们,我们甚至都不需要打开 Photoshop 来调色,就可以得到某个颜色的同色系变种了。

    举个例子,我们要给一个按钮添加鼠标悬停效果,而最简单的悬停效果就是让按钮的颜色加深一些。我们写出的 CSS 代码可能是这样的:

    .button {

    background-color: #ff4466;

    }

    .button:hover {

    background-color: #f57900;

    }

    我相信即使是最资深的视觉设计师,也很难分清 #ff4466 和 #f57900 这两种颜色到底有什么关联。而如果我们的代码是用预处理语言来写的,那事情就直观多了:

    .button

    $color = #ff9833

    background-color: $color

    &:hover

    background-color: darken($color, 20%)

    此外,预处理器的函数往往还支持默认参数、具名实参、arguments 对象等高级功能,内部还可以设置条件分支,可以满足复杂的逻辑需求。

    Mixin

    Mixin 是 CSS 预处理器提供的又一项实用功能。Mixin 的形态和用法跟函数十分类似——先定义,然后在需要的地方调用,在调用时可以接受参数。它与函数的不同之处在于…………

    ……

    ……

    百姓网前端工程师,移动 Web UI 框架 CMUI 作者,自称 “披着前端工程师外衣的设计师”。

    个人主页 ·

    我的文章

    · 12 ·

    展开全文
  • 背景CSS 自诞生以来,基本语法和核心机制一直没有本质上的变化,它的发展几乎全是表现力层面上的提升。最开始 CSS 在网页中的作用只是辅助性的装饰,...开发者将选择另一门更高级的语言来进行开发,然后编译到底层语...

    背景

    CSS 自诞生以来,基本语法和核心机制一直没有本质上的变化,它的发展几乎全是表现力层面上的提升。最开始 CSS 在网页中的作用只是辅助性的装饰,轻便易学是最大的需求;然而如今网站的复杂度已经不可同日而语,原生 CSS 已经让开发者力不从心。

    当一门语言的能力不足而用户的运行环境又不支持其它选择的时候,这门语言就会沦为 “编译目标” 语言。开发者将选择另一门更高级的语言来进行开发,然后编译到底层语言以便实际运行。

    于是,在前端领域,天降大任于斯人也,CSS 预处理器应运而生。而 CSS 这门古老的语言以另一种方式 “重新适应” 了网页开发的需求。

    预处理器赋予我们的 “超能力”

    简单梳理一下,CSS 预处理器为我们带来了几项重要的能力,由浅入深排列如下。(不用在意你用到了多少,无论深浅,都是获益。)

    1.文件切分

    页面越来越复杂,需要加载的 CSS 文件也越来越大,我们有必要把大文件切分开来,否则难以维护。传统的 CSS 文件切分方案基本上就是 CSS 原生的 @import 指令,或在 HTML 中加载多个 CSS 文件,这些方案通常不能满足性能要求。

    CSS 预处理器扩展了 @import 指令的能力,通过编译环节将切分后的文件重新合并为一个大文件。这一方面解决了大文件不便维护的问题,另一方面也解决了一堆小文件在加载时的性能问题。

    2.模块化

    把文件切分的思路再向前推进一步,就是 “模块化”。一个大的 CSS 文件在合理切分之后,所产生的这些小文件的相互关系应该是一个树形结构。

    树形的根结节一般称作 “入口文件”,树形的其它节点一般称作 “模块文件”。入口文件通常会依赖多个模块文件,各个模块文件也可能会依赖其它更末端的模块,从而构成整个树形。

    以下是一个简单的示例:

    entry.styl

    ├─ base.styl

    │   ├─ normalize.styl

    │   └─ reset.styl

    ├─ layout.styl

    │   ├─ header.styl

    │   │   └─ nav.styl

    │   └─ footer.styl

    ├─ section-foo.styl

    ├─ section-bar.styl

    └─ ...

    (入口文件 entry.styl 在编译时会引入所需的模块,生成 entry.css,然后被页面引用。)

    如果你用过其它拥有模块机制的编程语言,应该已经深有体会,模块化是一种非常好的代码组织方式,是开发者设计代码结构的重要手段。模块可以很清晰地实现代码的分层、复用和依赖管理,让 CSS 的开发过程也能享受到现代程序开发的便利。

    3.选择符嵌套

    选择符嵌套是文件内部的代码组织方式,它可以让一系列相关的规则呈现出层级关系。在以前,如果要达到这个目的,我们只能这样写:

    .nav {margin:auto /* 水平居中 */; width:1000px; color:#333;}

    .nav li {float:left /* 水平排列 */; width:100px;}

    .nav li a {display:block; text-decoration:none;}

    这种写法需要我们手工维护缩进关系,当上级选择符发生变化时,所有相关的下级选择符都要修改;此外,把每条规则写成一行也不易阅读,为单条声明写注释也很尴尬(只能插在声明之间了)。

    在 CSS 预处理语言中,嵌套语法可以很容易地表达出规则之间的层级关系,为单条声明写注释也很清晰易读:

    .nav

    margin: auto  // 水平居中

    width: 1000px

    color: #333

    li

    float: left  // 水平排列

    width: 100px

    a

    display: block

    text-decoration: none

    4.变量

    在变更出现之前,CSS 中的所有属性值都是 “幻数”。你不知道这个值是怎么来的、它的什么样的意义。有了变量之后,我们就可以给这些 “幻数” 起个名字了,便于记忆、阅读和理解。

    接下来我们会发现,当某个特定的值在多处用到时,变量就是一种简单而有效的抽象方式,可以把这种重复消灭掉,让你的代码更加 DRY。

    我们来比较一下以下两段代码:

    /* 原生 CSS 代码 */

    strong {

    color:#ff4466;

    font-weight:bold;

    }

    /* ... */

    .notice {

    color:#ff4466;

    }

    // 用 Stylus 来写

    $color-primary = #ff4466

    strong

    color: $color-primary

    font-weight: bold

    /* ... */

    .notice

    color: $color-primary

    你可能已经意识到了,变量让开发者更容易实现网站视觉风格的统一,也让 “换肤” 这样的需求变得更加轻松易行。

    5.运算

    光有变量还是不够的,我们还需要有运算。如果说变量让值有了意义,那么运算则可以让值和值建立关联。有些属性的值其实跟其它属性的值是紧密相关的,CSS 语法无法表达这层关系;而在预处理语言中,我们可以用变量和表达式来呈现这种关系。

    举个例子,我们需要让一个容器最多只显示三行文字,在以前我们通常是这样写的:

    .wrapper {

    overflow-y:hidden;

    line-height:1.5;

    max-height:4.5em;  /* = 1.5 x 3 */

    }

    大家可以发现,我们只能用注释来表达 max-height 的值是怎么来的,而且注释中 3这样的值也是幻数,还需要进一步解释。未来当行高或行数发生变化的时候,max-height 的值和注释中的算式也需要同步更新,维护起来很不方便。

    接下来我们用预处理语言来改良一下:

    .wrapper

    $max-lines = 3

    $line-height = 1.5

    overflow-y: hidden

    line-height: $line-height

    max-height: unit($line-height * $max-lines, 'em')

    乍一看,代码行数似乎变多了,但代码的意图却更加清楚了——不需要任何注释就把整件事情说清楚了。在后期维护时,只要修改那两个变量就可以了。

    值得一提的是,这种写法还带来另一个好处。$line-height 这个变量可以是 .wrapper 自己定义的局部变量(比如上面那段代码),也可以从更上层的作用域获取:

    $line-height = 1.5  // 全局统一行高

    body

    line-height: $line-height

    .wrapper

    $max-lines = 3

    max-height: unit($line-height * $max-lines, 'em')

    overflow-y: hidden

    这意味着 .wrapper 可以向祖先继承行高,而不需要为这个 “只显示三行” 的需求把自己的行高写死。有了运算,我们就有能力表达属性与属性之间的关联,它令我们的代码更加灵活、更加 DRY。

    6.函数

    把常用的运算操作抽象出来,我们就得到了函数。

    开发者可以自定义函数,预处理器自己也内置了大量的函数。最常用的内置函数应该就是颜色的运算函数了吧!有了它们,我们甚至都不需要打开 Photoshop 来调色,就可以得到某个颜色的同色系变种了。

    举个例子,我们要给一个按钮添加鼠标悬停效果,而最简单的悬停效果就是让按钮的颜色加深一些。我们写出的 CSS 代码可能是这样的:

    .button {

    background-color:#ff4466;

    }

    .button:hover {

    background-color:#f57900;

    }

    我相信即使是最资深的视觉设计师,也很难分清 #ff4466 和 #f57900 这两种颜色到底有什么关联。而如果我们的代码是用预处理语言来写的,那事情就直观多了:

    .button

    $color = #ff9833

    background-color: $color

    &:hover

    background-color: darken($color, 20%)

    此外,预处理器的函数往往还支持默认参数、具名实参、arguments 对象等高级功能,内部还可以设置条件分支,可以满足复杂的逻辑需求。

    7.Mixin

    Mixin 是 CSS 预处理器提供的又一项实用功能。Mixin 的形态和用法跟函数十分类似——先定义,然后在需要的地方调用,在调用时可以接受参数。它与函数的不同之处在于,函数用于产生一个值,而 Mixin 的作用是产生一段 CSS 代码。

    Mixin 可以产生多条 CSS 规则,也可以只产生一些 CSS 声明。

    一般来说,Mixin 可以把 CSS 文件中类似的代码块抽象出来,并给它一个直观的名字。比如 CSS 框架可以把一些常用的代码片断包装为 mixin 备用,在内部按需调用,或暴露给使用者在业务层调用。

    举个例子,我们经常会用到 clearfix 来闭合浮动。在原生 CSS 中,如果要避免 clearfix 代码的重复,往往只能先定义好一个 .clearfix 类,然后在 HTML 中挂载到需要的元素身上:

    /* 为 clearfix 定义一个类 */

    .clearfix {...}

    .clearfix::after {...}

    ...

    ...

    ...

    把表现层的实现暴露到了结构层,是不是很不爽?而在预处理器中,我们还可以选择另一种重用方式:

    // 为 clearfix 定义一个 mixin

    clearfix()

    ...

    &::after

    ...

    // 在需要的元素身上调用

    .info

    clearfix()

    footer

    clearfix()

    8.工程化

    CSS 预处理语言无法直接运行于浏览器环境,这意味着我们编写的源码需要编译为 CSS 代码之后才能用于网页。这似乎是一个门槛,需要我们付出 “额外” 的成本。

    但在目前的大环境下,大多数项目的前端开发流程已经包含了构建环节,比如选择任何一个脚本模块化方案都是需要在部署时走一道打包程序的。所以对大多数团队来说,这个门槛其实已经跨过去一大半了。

    而一旦接受了这种设定,我们还可以享受到 “额外” 的福利。在给 CSS 的开发加入编译环节的同时,还可以顺道加入其它构建环节,比如代码校验、代码压缩、代码后处理等等。

    “代码后处理” 是指 PostCSS 平台上各类插件所提供的功能,光是 Autoprefixer 这一项就已经值回票价了。我们再也不需要在 CSS 代码中手工添加浏览器前缀了,直接使用标准写法,剩下的事情让工具搞定吧!

    展开全文
  • 训练模型到底什么,它是如何被应用在产品里,未来又有哪些机会和挑战?根据微软亚洲研究院副院长、国际计算语言学会(ACL)前任主席、中国计算机学会副理事长周明在2020年中国人工智能大会做的主题训练模型...

    预训练模型到底是什么,它是如何被应用在产品里,未来又有哪些机会和挑战?

    根据微软亚洲研究院副院长、国际计算语言学会(ACL)前任主席、中国计算机学会副理事长周明在2020年中国人工智能大会做的主题为《预训练模型在多语言、多模态任务的进展》的特邀报告,我们整理了以下答案,希望能对你有所帮助~

    预训练模型把迁移学习很好地用起来了,让我们感到眼前一亮。这和小孩子读书一样,一开始语文、数学、化学都学,读书、网上游戏等,在脑子里积攒了很多。当他学习计算机时,实际上把他以前学到的所有知识都带进去了。如果他以前没上过中学,没上过小学,突然学计算机就不懂这里有什么道理。这和我们预训练模型一样,预训练模型就意味着把人类的语言知识,先学了一个东西,然后再代入到某个具体任务,就顺手了,就是这么一个简单的道理。

    为什么要做预训练模型

    自然语言处理(NLP),目的是使得计算机具备人类的听、说、读、写、译、问、答、搜索、摘要、对话和聊天等能力,并可利用知识和常识进行推理和决策,并支持客服、诊断、法律、教学等场景。自然语言理解,被认为是 AI 皇冠上的明珠。一旦有突破,则会大幅度推动 AI 在很多重要场景落地。

    过去这五年,对自然语言是一个难忘的五年,它的一个标志就是神经网络全面引入到了自然语言理解。从大规模的语言数据到强有力的算力,加上深度学习,把整个自然语言带到一个新的阶段。

    预训练模型,则是使自然语言处理由原来的手工调参、依靠 ML 专家的阶段,进入到可以大规模、可复制的大工业施展的阶段。而且预训练模型从单语言、扩展到多语言、多模态任务。一路锐气正盛,所向披靡。

    预训练通过自监督学习从大规模数据中获得与具体任务无关的预训练模型。体现某一个词在一个特定上下文中的语义表征。第二个步骤是微调,针对具体的任务修正网络。训练数据可以是文本、文本-图像对、文本-视频对。预训练模型的训练方法可使用自监督学习技术(如自回归的语言模型和自编码技术)。可训练单语言、多语言和多模态的模型。此类模型可经过微调之后,用于支持分类、序列标记、结构预测和序列生成等各项技术,并构建文摘、机器翻译、图片检索、视频注释等应用。

    为什么我们要做预训练模型?首先,预训练模型是一种迁移学习的应用,利用几乎无限的文本,学习输入句子的每一个成员的上下文相关的表示,它隐式地学习到了通用的语法语义知识。第二,它可以将从开放领域学到的知识迁移到下游任务,以改善低资源任务,对低资源语言处理也非常有利。第三,预训练模型在几乎所有 NLP 任务中都取得了目前最佳的成果。最后,这个预训练模型+微调机制具备很好的可扩展性,在支持一个新任务时,只需要利用该任务的标注数据进行微调即可,一般工程师就可以实现。

    预训练模型的三个关键技术

    首先,第一个关键技术是 Transformer。它在 NLP 各个任务中都取得了优异的性能,它是预训练语言模型的核心网络。给定一句话或是一个段落作为输入,首先将输入序列中各个词转换为其对应的词向量,同时加上每一个词的位置向量,体现词在序列的位置。然后将这些词向量输入到多层 Transformer 网络中,通过自注意力(self-attention)机制来学习词与词之间的关系,编码其上下文信息,再通过一个前馈网络经过非线性变化,输出综合了上下文特征的各个词的向量表示。每一层 Transformer 网络主要由 Multi-head self-attention 层(多头自注意力机制)和前馈网络层两个子层构成。Multi-head self-attention 会并行地执行多个不同参数的 self-attention,并将各个 self-attention 的结果拼接作为后续网络的输入,self-attention 机制会在后面中做详细介绍。此后,我们得到了蕴含当前上下文信息的各个词的表示,然后网络会将其输入到前馈网络层以计算非线性层次的特征。

    在每一层 Transformer 网络中,会将残差连接(residual connection)把自注意力机制前或者前馈神经网络之前的向量引入进来,以增强自注意力机制或者前馈网络的输出结果向量。并且还做一个 layer normalization,也就是通过归一化把同层的各个节点的多维向量映射到一个区间里面,这样各层节点的向量在一个区间里面。这两个操作加入在每个子层后,可更加平滑地训练深层次网络。

    Transformer 可以用于编码,也可以用于解码。所谓解码就是根据一个句子的输入得到一个预想的结果,比如机器翻译(输入源语言句子,输出目标语言句子),或者阅读理解(输入文档和问题,输出答案)。解码时,已经解码出来的词要做一个自注意力机制,之后和编码得到的隐状态的序列再做一个注意力机制。这样可以做 N 层,然后通过一个线性层映射到词表的大小的一个向量。每个向量代表一个词表词的输出可能性,经过一个softmax 层得到每个词的输出概率。

    接下来介绍一下 self-attention 机制,以一个 head 作为示例。假定当前输入包含三个词,给定其输入词向量或是其上一层 Transformer 网络的输出,将其通过三组线性变换,转换得到三组 queries、keys 和 values 向量。Query 和 key 向量用来计算两两词之间的得分,也就是其依赖关系,这个得分会同其对应的 value 向量做加权和,以得到每个词综合上下文信息的表示。给定当前第一个词的 query 向量,其首先同各个词的 key 向量通过点积操作得到这两个词的得分,这些得分用来表示这两个词的依赖或是相关程度。这些得分之后会根据 query 等向量的维度做一定比例的缩放,并将这些得分通过 softmax 操作做归一化。之后,各个得分会同其相对应的 value 向量相乘得到针对第一个词加权的各个 value 向量,这些加权的 value 向量最终相加以得到当前第一个词的上下文表示。

    在得到第一个词的上下文表示后,给定第二个词的 query 向量,我们会重复之前的操作,计算当前 query 向量同各个词 key 向量的得分,对这些得分做 softmax 归一化处理,并将这些得分同其对应的 value 向量做加权和,以得到其编码上下文信息的表示。

    第二个关键技术是自监督学习。在预训练的模型中,AR(自回归)LM 和 AE(自动编码器)是最常用的自监督学习方法,其中,自回归 LM 旨在利用前面的词序列预测下个词的出现概率(语言模型)。自动编码器旨在对损坏的输入句子,比如遮掩了句子某个词、或者打乱了词序等,重建原始数据。通过这些自监督学习手段来学习单词的上下文相关表示。

    第三个关键技术就是微调。在做具体任务时,微调旨在利用其标注样本对预训练网络的参数进行调整。以我们使用基于 BERT(一种流行的预训练模型)为例来判断两个句子是否语义相同。输入是两个句子,经过 BERT 得到每个句子的对应编码表示,我们可以简单地用预训练模型的第一个隐节点预测分类标记判断两个句子是同义句子的概率,同时需要额外加一个线性层和 softmax 计算得到分类标签的分布。预测损失可以反传给 BERT 再对网络进行微调。当然也可以针对具体任务设计一个新网络,把预训练的结果作为其输入。

    总体来讲,预训练模型发展趋势:第一,模型越来越大。比如 Transformer 的层数变化,从12层的 Base 模型到24层的 Large 模型。导致模型的参数越来越大,比如 GPT 110 M,到 GPT-2 是1.5 Billion,图灵是 17 Billion,而 GPT-3 达到了惊人的 175 Billion。一般而言模型大了,其能力也会越来越强,但是训练代价确实非常大。第二,预训练方法也在不断增加,从自回归 LM,到自动编码的各种方法,以及各种多任务训练等。第三,还有从语言、多语言到多模态不断演进。最后就是模型压缩,使之能在实际应用中经济的使用,比如在手机端。这就涉及到知识蒸馏和 teacher-student models,把大模型作为 teacher,让一个小模型作为 student 来学习,接近大模型的能力,但是模型的参数减少很多。

    预训练模型发展趋势

    第一,模型越来越大。比如 Transformer 的层数变化,从12层的 Base 模型到24层的 Large 模型。导致模型的参数越来越大,比如 GPT 110 M,到 GPT-2 是1.5 Billion,图灵是 17 Billion,而 GPT-3 达到了惊人的 175 Billion。一般而言模型大了,其能力也会越来越强,但是训练代价确实非常大。

    第二,预训练方法也在不断增加,从自回归 LM,到自动编码的各种方法,以及各种多任务训练等。

    第三,还有从语言、多语言到多模态不断演进。最后就是模型压缩,使之能在实际应用中经济的使用,比如在手机端。这就涉及到知识蒸馏和 teacher-student models,把大模型作为 teacher,让一个小模型作为 student 来学习,接近大模型的能力,但是模型的参数减少很多。

    如果想要对预训练模型和预训练模型在多语言、多模态任务的进展有更多了解,请点击阅读文章《讲堂丨周明:预训练模型在多语言、多模态任务的进展》,这里有更详细的版本哦~

    本账号为微软亚洲研究院的官方知乎账号。本账号立足于计算机领域,特别是人工智能相关的前沿研究,旨在为人工智能的相关研究提供范例,从专业的角度促进公众对人工智能的理解,并为研究人员提供讨论和参与的开放平台,从而共建计算机领域的未来。

    微软亚洲研究院的每一位专家都是我们的智囊团,你在这个账号可以阅读到来自计算机科学领域各个不同方向的专家们的见解。请大家不要吝惜手里的“邀请”,让我们在分享中共同进步。

    也欢迎大家关注我们的微博和微信 (ID:MSRAsia) 账号,了解更多我们的研究。

    展开全文
  • 文/郝老师聊教育根据数据显示,2019年考研的报考人数达到290万人左右,都说“考研本身就是个痛苦而又寂寞的过程”,但为什么报考的人数又如此之多呢?随着我国社会的不断发展,参加高考的人数越来越多,导致同学们...

    文/郝老师聊教育

    根据数据显示,2019年考研的报考人数达到290万人左右,都说“考研本身就是一个痛苦而又寂寞的过程”,但为什么报考的人数又如此之多呢?

    随着我国社会的不断发展,参加高考的人数越来越多,导致同学们之间的竞争力也越来越大,根据近几年来看,很多高校毕业生都会面临着失业的问题,而这其中包含了很多本科院校的学生,所以大家也是为了提升社会竞争力而选择考研。

    8de92f1e91e7bcea2132fa92412cfb8c.png

    考研到底有多火?

    2021年考研预报名已经开始了,很多同学为了能够在毕业之后找到一份稳定的工作,所以就会有想考研的心理,不过大家都知道,考研的难度可比高考要难上几倍有余,更是考生们之间的相互摩擦和较量。

    而在这次报名当中,可能同学们并没有因为考研的难度而退缩,甚至在预报名的第一天,服务器出现了“故障”,这也是报考的人数多的原因导致,所以很多同学可能也在担心,如果无法报名应该怎么办?

    641973fabc9e9fce9ccaf277b2fb0f54.png

    都说考研的热度一直未减,但是在今年不但没减,反而报名人数空前的多,不过大家也不要担心自己报不上名,在这里教大家两种报名攻略,虽然都是再普通不过的办法,但或许也可以帮到部分同学。

    第一种,同学们可以在报名的窗口多刷新几遍,因为报名的人数比较多,出现网络异常的现象也是不可避免的,或许多刷几遍就能进去了,这一点需要耐心,第二种,大家可以关闭所运行的程序,重新进一下,还有一种就是换浏览器。

    考研报名是需要耐心的,大家不要因为试几次没有效果就感觉到失落,连这样的魄力都没有,你还怎么坚持考研呢?

    8135bb37cc140290a9b421c12016e7b0.png

    考研到底有哪些优势?

    1、就业范围广

    其实现在之所以有那么多高校毕业生面临着失业问题,无非就是两个原因,第一个就是自己掌握的专业知识不够,能力不足,而现在更多的企业并不会花费时间去培养一个新人,这也是需要资本的一件事。

    另一个原因就是学历上的问题,现在一般正常的企业可能都会要求“本科及以上学历”,如果你想进入一些企事业单位,那么对你学历的要求就会更高一些,而在找工作的过程中,要求不高的你又看不上,你想去的人家又不要你。

    a0371f61d434d59ab321168e20933f6e.png

    但是如果你是研究生毕业,可以说你的就业范围是比较广的,很多家企业会供你选择,但前提是你要掌握足够的知识和能力,而并不是说只要你是研究生毕业,不管你的能力怎么样人家都会录用你。

    2、薪资待遇高

    现在大学生普遍的薪资都会在3000元左右,不过很多人都说过这样一句话,那就是“你有多大的能力,企业就会给你多少佣金”,其实这句话是有一定道理的,你有多大的能力,决定着你的薪资水平,这也是很多企业的衡量标准。

    904802902bbd40466aa712470bf0fc8b.png

    那么对于一名研究生来说,从最基本的薪资上就会比专科生或者本科生多一些,并不说歧视那些学历低的同学,而是现在社会的发展就是如此,如果你能力够强,并能够为企业带来一定的利益,那么你就薪资待遇就会比较高。

    一般研究生毕业的薪资起步可能会在5000元左右,不过这也是根据不同的企业规定来计算的,可能有些企业的薪资会更高一些,这也和城市的等级划分有关,像那些一线城市和二线城市,也就是就经济发达的地区,薪资水平也会高一些。

    6ab0dc84c830d64572b87d95eb2cb83a.png

    3、社会阅历多

    考研可以丰富同学们的社会阅历这是毋庸置疑的,众所周知,能够参加考研的同学一定是有魄力,并且对自己的未来已经做好规划的同学,大家都知道考研的难度比较大,而选择考研这条路都已经在一定程度上超越了很多人。

    在考研学习的过程中,同学们会认识到很多学识渊博的人才,这也是学霸之间的较量,大家可以和同学之间相互交流经验,甚至可以交到不同的朋友,而这个朋友或许是你以后能够用到的,能够给你提供一定帮助的人。

    写在最后:

    考研的道路虽然艰辛,但是最后的结果是好的,你可以为你以后的人生道路做出多种选择,而不是让我也去选择你,增加自己的竞争力,不过在考研之前大家也一定要做好心理准备,毕竟考研的道路是艰辛的,需要同学们去坚持。

    735f16d26973f155f0067630e94b5d8b.png

    你觉得考研有啥好处呢?欢迎大家在下方交流分享

    郝老师聊教育专注教育那些事!每天将分享小学到大学生活的日常,解读教育中遇到的疑难问题,如果你在我的文章中找到共鸣,那么请关注我,把我的文章分享给更多人。

    举报/反馈

    展开全文
  • 尤其是PT这种模型,为什么few-shot和zero-shot就能起作用,其实就是模型本身已经见过组够多的数据了,我们只需要几个样本告诉他我们需要的是什么就够了。说到底如果想做出好的效果,大的训练模型是一定要有的,...
  • 编译指令常见用法

    2021-06-16 00:16:45
    关注+星标公众号,不错过精彩内容来源|小麦大叔很多优秀的代码,都会借用编译指令来完善代码,今天就来讲讲关于编译指令的内容。常见的预处理指令如下:#指令,无任何效果#include含...
  • 头文件为什么编译语句?typedefintElementType;/*START:fig3_6.txt*/#ifndef_List_H#define_List_HstructNode;typedefstructNode*PtrToNode;typedefPtrToNodeList;typedefPtrToNodePosition;ListMakeEmpty(L...
  • 什么是序列帧类H5我们遇到的类H5,其中包括“强动画”效果,UI设计提供的是系列序列帧的素材时,前端将序列帧素材还原成动画进行展示的H5.几种实现方法gif采用gif格式的图片来展示序列帧动画,会存在图片文件大...
  • mysql编译

    2021-01-19 00:49:44
    .背景:用Mybatis+mysql的架构做开发,大家都知道,Mybatis内置参数,形如#{xxx}的,均采用了sql编译的形式,举例如下:Xml代码select*fromblogwhereid=#{id}查看日志后,会发现这个sql执行时被记录如下:Sql...
  • 20.到底组件

    2020-12-21 13:22:43
    、案例效果二、组件效果原理:对于该组件的理解,是基于原有的X轴、Y轴视觉基础,在Z轴上将多个元素...常规的到底画面是多个PNG图片,需要上传前保证是PNG格式的,保证边缘没有被裁切的痕迹;文字可以直接在La...
  • C语言处理器详解

    2021-05-25 08:05:38
    1.预定义符号下面这些是C语言的处理器定义的符号,他们都是常量十进制数,或者是常量字符串。他们用来指示调试输出来源以及编译程序加如时间信息。而STDC用来进行条件编译。其详细意义如下:FILE:表示进行编译...
  • 到底什么训练?什么需要训练呢? 以下内容节选自《训练语言模型》书! –正文– 01 训练 训练属于迁移学习的范畴。 现有的神经网络在进行训练时,一般基于后向传播(Back Propagation,
  • 你知道的越多,不知道的就越多,业余的像棵小草!成功路上并不拥挤,因为坚持的人不多。编辑:业余草zhouwenxing.github.io推荐:https://www.xttblog.co...
  • 今天学习了一下JS的编译,对此想做篇博文用来总结一下...为什么?到这里可能有很多人知道变量声明声明提升,函数声明整体提升比如说这个。这里打印的fn的值 fn函数。但是其实者两句话知识个对编译出现的现...
  • 近年来,在深度学习和大数据的支撑下,自然语言处理技术迅猛发展。而训练语言模型把自然语言处理带入了个新的阶段,也得到了工业界的广泛关注。通过大数据训练加小数据微调,自然语言处理任务的解...
  • 点上方蓝字人工智能算法与Python大数据获取更多干货在右上方···设星标★,第时间获取资源仅做学术分享,如有侵权,联系删除转载于 :AI科技评论Bert模型自18年10月推出,...
  • 探究mysql编译

    2021-02-01 06:03:14
    .背景:用Mybatis+mysql的架构做开发,大家都知道,Mybatis内置参数,形如#{xxx}的,均采用了sql编译的形式,举例如下:select * from blog where id = #{id}查看日志后,会发现这个sql执行时被记录如下:...
  • 近年来,在深度学习和大数据的支撑下,自然语言处理技术迅猛发展。而训练语言模型把自然语言处理带入了个新的阶段,也得到了工业界的广泛关注。通过大数据训练加小数据微调,自然语言处理任务的解...
  • 点击下面卡片,关注我呀,每天给你送来AI技术干货!来自:哈工大讯飞联合实验室本期导读:自从BERT出现以来,训练技术逐渐发展成为了 NLP 领域不可或缺的主流技术。这给我们处理NLP任务...
  • 残差学习 Residual Learning 前面分析得出,如果深层网络后面的层都是是恒等映射,那么模型就可以转化为一个浅层网络。那现在的问题就是如何得到恒等映射了。 事实上,已有的神经网络很难拟合潜在的恒等映射函数H(x...
  • 因为训练不光做LM还要做以两个句子输入的分类任务 c.Position Embeddings:和之前文章中的Transformer不同,不是三角函数而是学习出来的 预测目标词Masked LM 随机挑选个句子中15%的词,用上下文来预测。...
  • 自然语言处理被誉为“人工智能皇冠上的明珠”!深度学习等技术的引入自然语言处理技术带来了场革命,近年来也出现了自然语言处理的新范式。为什么自然语言是“人工智能皇冠上的明珠”呢?自然语言处...
  • CSS 处理器定义了种新的语言,其基本思想是,用种专门的编程语言, CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行编码工作。 CSS 处理器用种专门的编程语言,...
  • iOS之深入解析乘透明度Premultiplied Alpha

    万次阅读 多人点赞 2021-10-18 15:32:35
    、前言 Premultiplied Alpha 的概念,做过游戏开发的应该都知道,...那么,Premultiplied Alpha 到底什么呢? 在 Alpha Blending: To Pre or Not To Pre 一文中,详情地阐明了 Premultiplied Alpha 的相关解释
  • 我在执行get_defined_constants()时意外地发现php有个内部的常量...不应该是个数据类型boolean的值么?我试着执行echo(true) ,浏览器输出字符1,而我var_dump(true),输出了bool(true),这不是显然矛盾么?而...
  • IPsec是个协议簇,它是通过多个协议的 互相组合最后达成个安全的通信。当IPsec的连接建立之后,会在数据包中的层次之间添加用于安全相关的包头。 这些后添加的包头的内容并不复杂,复杂的内容在于双方该如何...
  • Word2vec模型 ...Word2vec是种基于神经网络的而且被广泛使用的算法,也可以看成“深度学习”的种算法,虽然它本身层次可能并不深。 Word2vec通过使用大量的没有注释过的文本,自动的学习单词之间的
  • 刚开始工作时,总有人开玩笑说,编程实际上就是 CV,调侃很多程序员写程序依靠的是复制粘贴。 至今,很多初级甚至高级程序员写代码依旧是复制粘贴,...而且,只要你少改处,就意味着留下处潜在bug,发布时发现又
  • C语言中的编译宏定义导语:C初学者可能对处理器没什么概念, 这是情有可原,下面是C中的编译宏定义,起来学习下吧:() 预处理命令简介预处理命令由#(hash字符)开头, 它独占行, #之前只能是空白符....
  • C语言中的处理器

    2021-11-27 15:51:25
    而第阶段的预处理阶段到底时做什么呢?答案就是:在源代码编译之前对其进行一些文本性质的操作。那么,什么是文本性质的操作呢? 就个人理解来说,应该是想表达种使用某种文本去替换另种文本的操作 它的主要任务...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,783
精华内容 32,313
关键字:

为什么一预到底