本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:
Ctrl + B
Ctrl + I
Ctrl + Q
Ctrl + L
Ctrl + K
Ctrl + G
Ctrl + H
Ctrl + O
Ctrl + U
Ctrl + R
Ctrl + Z
Ctrl + Y
Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]
使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。
本编辑器支持 Markdown Extra , 扩展了很多好用的功能。具体请参考Github.
Markdown Extra 表格语法:
项目 | 价格 |
---|---|
Computer | $1600 |
Phone | $12 |
Pipe | $1 |
可以使用冒号来定义对齐方式:
项目 | 价格 | 数量 |
---|---|---|
Computer | 1600 元 | 5 |
Phone | 12 元 | 12 |
Pipe | 1 元 | 234 |
###定义列表
定义 D
定义D内容
代码块语法遵循标准markdown代码,例如:
@requires_authorization
def somefunc(param1='', param2=0):
'''A docstring'''
if param1 > param2: # interesting
print 'Greater'
return (param2 - param1 + 1) or None
class SomeClass:
pass
>>> message = '''interpreter
... prompt'''
###脚注 生成一个脚注[^footnote]. [^footnote]: 这里是 脚注 的 内容.
用 [TOC]
来生成目录:
[TOC]
使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.
更多LaTex语法请参考 这儿.
可以渲染序列图:
张三->李四: 嘿,小四儿, 写博客了没?
Note right of 李四: 李四愣了一下,说:
李四-->张三: 忙得吐血,哪有时间写。
或者流程图:
st=>start: 开始
e=>end: 结束
op=>operation: 我的操作
cond=>condition: 确认?
st->op->cond
cond(yes)->e
cond(no)->op
即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。
用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。
博客发表后,本地缓存将被删除。
用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。
注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱。
Pytorch 环境搭建
PyTorch 的安装十分简单,根据 PyTorch 官网,对系统选择和安装方式等灵活选择即可。 这里以 anaconda 为例,简单的说一下步骤和要点。 国内安装 anaconda 建议使用清华或者中科大 [http://mirrors.ustc.edu.cn/help/anaconda.html] 镜像,快的不是一点半点。
简述如下:GPT 1.0采取预训练+FineTuning两个阶段,它采取Transformer作为特征抽取器。预训练阶段采用“单向语言模型”作为训练任务,把语言知识编码到Transformer里。第二阶段,在第一阶段训练好的模型基础上,通过Finetuning来做具体的NLP任务。
从大框架上来说,Bert基本就是GPT 1.0的结构,除了预训练阶段采取的是“双向语言模型”之外,它们并没什么本质差异,其它的技术差异都是细枝末节,不影响大局,基本可忽略。
GPT2.0大框架其实还是GPT 1.0的框架,但是把第二阶段的Finetuning做有监督地下游NLP任务,换成了无监督地做下游任务。本质上,GPT2.0选择了这么一条路来强化Bert或者是强化GPT 1.0的第一个预训练阶段:就是说首先把Transformer模型参数扩容,常规的Transformer Big包含24个叠加的Block,GPT2.0将Transformer层数增加到48层,参数规模15亿。真正的目的是:GPT 2.0准备用更多的训练数据来做预训练,更大的模型,更多的参数,意味着更高的模型容量,所以先扩容,免得Transformer楼层不够多的房间(模型容量)容纳不下过多的住户(就是NLP知识)。
GPT2.0的语料:GPT2.0找了800万互联网网页作为语言模型的训练数据,它们被称为WebText,互联网网页的优点是覆盖的主题范围非常广,这样训练出来的语言模型,通用性好,覆盖几乎任何领域的内容,这意味着它可以用于任意领域的下游任务,有点像图像领域的Imagenet的意思。GPT 2.0论文其实更强调训练数据的通用性强这点。当然,除了量大通用性强外,数据质量也很重要,高质量的数据必然包含更好的语言及人类知识,所以GPT 2.0还做了数据质量筛选,过滤出高质量的网页内容来。
GPT 2.0用这些网页做“单向语言模型”,GPT 2.0没有像Bert或者1.0版本一样,拿这个第一阶段的预训练模型有监督地去做第二阶段的Finetuning任务,而是选择了无监督地去做下游任务。另外论文中提到的对Transformer结构的微调,以及BPE输入方式,我相信都是不太关键的改动,应该不影响大局。
问题一:为什么GPT 2.0第二阶段不通过Finetuning去有监督地做下游任务呢?无监督地去做很多第二阶段的任务,只是GPT作者想说明在第一阶段Transformer学到了很多通用的包含各个领域的知识,第二部分各种实验是对这点的例证,如此而已。这是为何说第二阶段其实不重要,因为它不是论文的中心思想,而是说明中心思想的例子。
问题二:在预训练阶段,为什么GPT 2.0仍然固执地用单向语言模型,而不是双向语言模型呢?Bert在论文的实验部分已经证明了:Bert的效果比GPT好主要归因于这个双向语言模型。也许GPT 作者只想强调他们想做语言模型这个事情,毕竟生成内容后续单词这种模式,单向语言模型更方便,这估计是真正原因。
问题三:GPT 2.0 既然第二阶段是无监督的任务,而它不做Finetuning,那么你训练好一个语言模型,它当然会根据输入的一句话,给你蹦出后面可能紧跟那个单词,这是标准的语言模型过程,这个正常。但是如果这时候让它去做一个文本摘要任务,它怎么知道它现在在做什么事情呢,根据输入,应该输出什么东西呢?其实GPT 2.0在做下游无监督任务的时候,给定输入(对于不同类型的输入,加入一些引导字符,引导GPT正确地预测目标,比如如果做摘要,在输入时候加入“TL:DR”引导字符串),它的输出跟语言模型的输出是一样的,就是蹦出一个单词。那么问题来了:对于比如摘要任务,我们期待的输出结果是一句话或者几句话,你给我一个单词,有点太小气,那该怎么办?很简单,继续一个字一个字往出蹦,按照这些字从系统里蹦出来的时间顺序连起来,就是你想要的摘要结果,这种所有任务采取相同的往出蹦字的输出模式也是有点意思的。就是说,GPT2.0给出了一种新颖的生成式任务的做法,就是一个字一个字往出蹦,然后拼接出输出内容作为翻译结果或者摘要结果。传统的NLP网络的输出模式一般需要有个序列的产生结构的,而GPT 2.0完全是语言模型的产生结果方式:一个字一个字往出蹦,没有输出的序列结构。
我们可以从两个不同的角度来理解GPT 2.0。
一个角度是把它看作采取类似Elmo/GPT/Bert的两阶段模型解决NLP任务的一种后续改进策略,这种策略可以用来持续优化第一阶段的预训练过程。通过现在的Transformer架构,采用更高质量的数据,采用更宽泛的数据(Web数据量大了估计包含任何你能想到的领域),采用更大量的数据(WebText,800万网页),Transformer采用更复杂的模型(最大的GPT2.0模型是Transformer的两倍层深),那么在Transformer里能学会更多更好的NLP的通用知识。如果我们第二阶段仍然采取Finetuning,对下游任务的提升效果是可以很乐观地期待的。
另外一个角度也可以把GPT 2.0看成一个效果特别好的语言模型,可以用它来做语言生成类任务,比如摘要,QA这种,再比如给个故事的开头,让它给你写完后面的情节,目前看它的效果出奇的好。
GPT2.0给出的思路是优化Bert的第一个预训练阶段,方向是扩充数据数量,提升数据质量,增强通用性,追求的是通过做大来做强。
另一个思路:机器学习里面还有有监督学习,NLP任务里也有不少有监督任务是有训练数据的,这些数据能用来改善Bert第二阶段学习各种知识的Transformer。这种做法一个典型的模型是最近微软推出的MT-DNN,核心思想:结构上底层就是标准的Bert Transformer,第一阶段采用Bert的预训练模型不动,在Finetuning阶段,在上层针对不同任务构造不同优化目标,所有不同上层任务共享底层Transformer参数,这样就强迫Transformer通过预训练做很多NLP任务,来学会新的知识,并编码到Transformer的参数中。
论文地址:微软MT-DNN论文《Multi-Task Deep Neural Networks for Natural Language Understanding》
谷歌的BERT在各个NLP任务(GLUE、SQuAD、命名实体识别、SWAG)上的表现都很好,但是BERT在词向量的预训练的第二阶段只使用了单个任务进行模型fine-tune,我们自然而然地会问:Fine-tune阶段使用多任务同时对网络参数进行微调效果会不会更好?。
微软研究院在2019年发布的论文《Multi-Task Deep Neural Networks for Natural Language Understanding》就做了这方面的实验。论文提出了一个假设:在单一领域的数据集上使用单一的任务训练模型限制了模型的泛化。MT-DNN提供的思路是:利用多任务之间的约束来避免单一任务上的过拟合问题,从而提高模型的泛化能力。文章中使用的多任务是相似的,作者任务机器能够像人一样在相似的任务中获取到相关的经验,比如会滑雪的人就能比较容易的学会滑冰,对机器来说也就是能够使用更少的训练数据是模型获得相同的效果。
(1)MT-DNN在8/9的GLUE1任务中取得了SOAT成绩,其中未达到SOAT成绩的原因是数据集存在问题。这8个数据集(任务)可以归纳分为以下四种类别:
任务 | 数据集 |
---|---|
Single sentence classification | CoLA:情感分类 SST-2:判断句子是否符合语法要求 |
Text similarity score | STS-B:两句话的相似性 |
Pairwise Text classification | RET、MNLI:判断两句话的关系(emtaiment, controdictional, neutral) QQP, MRPC:判断那两句话是否具有相同的语义 |
Relevence ranking | QNLI:判断问答句子对的相关性 |
(2)通过这种多任务训练得到的模型能够很好的适用于其他未见过的相似任务,即使只有很少的带标注的数据。因为MT-DNN底层使用的是BERT(Base)的网络,所以这种相似任务之间的适用性的提高可以确定由多任务的fine-tune带来的。实验表明即使只使用原始数据集的0.1%、1%样本,同样能够获得不错的准确率。下面是MT-DNN模型和BERT两个模型在SNLI数据集上的表现:
模型 | 0.1% | 1% | 10% | 100% |
---|---|---|---|---|
BERT | 51% | 82% | 90% | 94% |
MT-DNN | 82% | 88% | 91% | 96% |
智能服务产业是新蓝海:传统人类密集型产业,有广阔自动化、智能化空间;随着AI技术、IOT技术等的创新,市场在快速成长。
服务型对话
产业界应用:
人机融合、多模态智能服务的产业时代
服务即对话:多模态、大规模开放领域、具有常识和情感、能完成复杂任务的对话系统是推动下一代智能产业的核心技术。
分级 | 目标 |
---|---|
低级智能对话 | 对用户简单意图进行识别并给出预设答案 |
初级智能对话 | 能识别复杂意图,联系上下文给出回答 |
中级智能对话 | 根据用户问题及情绪完成个性化多轮对话,协助用户完成目标 |
高级智能对话 | 能对多模态信息进行推理,自主判断,并组织语言与用户沟通,具备自我学习能力 |
通用智能对话 | 能基于一切信息开展自我学习,自我适应,及自我创新。在复杂问题领域达到人类水平。 |
计算机视觉领域常使用在 ImageNet 上预训练的模型,它们可以进一步用于目标检测、语义分割等不同的 CV 任务。而在自然语言处理领域中,我们通常只会使用预训练词嵌入向量编码词汇间的关系,因此也就没有一个能用于整体模型的预训练方法。Sebastian Ruder 表示语言模型有作为整体预训练模型的潜质,它能由浅到深抽取语言的各种特征,并用于机器翻译、问答系统和自动摘要等广泛的 NLP 任务。Ruder 同样展示了用语言模型做预训练模型的效果,并表示 NLP 领域中的「ImageNet」终要到来。