(Stanford CS224d) Deep Learning and NLP课程笔记(一):Deep NLP
Stanford大学在2015年开设了一门Deep Learning for Natural Language Processing的课程,广受好评。并在2016年春季再次开课。我将开始这门课程的学习,并做好每节课的课程笔记放在博客上。争取做到每周一更吧。
本文是第一篇。
NLP简介
NLP,全名Natural Language Processing(自然语言处理),是一门集计算机科学,人工智能,语言学三者于一身的交叉性学科。她的终极研究目标是让计算机能够处理甚至是“理解”人类的自然语言,进而帮助人类解决一些现实生活中遇到的实际问题。这里的语言“理解”是一个很抽象也很哲学的概念。在NLP中,我们将对语言的“理解”定义为是学习一个能够解决具体问题的复杂函数的过程。
对NLP的研究通常在5个Level上进行:
- 语音/文本分析:包括语言识别技术、OCR技术、分词技术等
- 词形分析:例如分析一个word的前后缀、词根等
- 语法分析:从语法结构上分析一个句子的构成
- 语义分析:理解一个句子或单词的语义
- 篇章分析:理解一段篇章的含义
注意,虽然这5个Level在研究的对象和难度上是一种递进的关系,但对这5个Level的研究并不一定是连续的——例如,我们可以跳过对一个句子语法结构的分析而直接去理解句子的语义。
接下来简单列举一些NLP技术的应用,以让大家对NLP能够处理什么样的问题有一个感性的认识:
- 简单的任务:拼写检查,关键词检索,同义词检索等
- 复杂一点的任务:信息提取(比如从网页中提取价格,产地,公司名等信息),情感分析,文本分类等
- 更复杂的任务:机器翻译,人机对话,QA系统
最后讨论一个问题:Why is NLP so HARD?为什么要把NLP从机器学习的任务列表中单独抽取出来做为一门课程甚至是研究的对象?根本原因在于语言用于表达客观世界的内在复杂性和多义性。举一个简单的例子:"Jane hit June and then she [fell/ran]"。当she所伴随的动作不同(fell or ran),其所指代的对象也发生了变化(June or Jane)。这样的例子太多,显然我们无法通过枚举所有的规则来解决语言内在的复杂性。另一个多义性的例子是:"I made her duck"。我们可以理解为:"I cooked her a duck",或是"I curved her a wooden duck",也可以理解为:"I transformed her into a duck with some magic"。
Deep Learning简介
深度学习是机器学习的一个研究子领域。传统机器学习算法面临的一个问题是,模型的优劣往往很大程度上依赖于特征的选取。例如,对于一个NER问题(Named Entity Recognition,命名实体识别),传统的机器学习算法(如CRF)通常需要输入目标词的大小写特征,词性特征,以及其上下文环境里的词性分布等特征。人工挑选一组合适的特征是一件非常琐碎的活。此外,这些特征往往是data-specific,这意味着,在处理一份新的数据集,比方说是另一门语言的语料,你需要再一次坐下来审视这批数据,以挑选新的特征组合。
毫不夸张的说,在传统机器学习领域,90%的时间被用于数据的处理。算法和模型只是简单的权重优化。
而深度学习的魅力在于,她将特征的提取变成了一个自动化的学习过程。
深度学习是一类特征学习(Representation Learning)。她可以从原始数据(比如原始的像素点,原始的单词甚至是字符)中自动学习到多个层次上的特征表达,并完成最终的分类或翻译的任务。(这里的“深度”一词可能会带来歧义:例如对于我们下一节课将要学习到的word2vec模型。她其实是一个非常浅层的网络模型。)
神经网络家族是深度学习算法的主流模型。我们的课程也主要以介绍不同种类的神经网络及其在NLP领域中的应用为主。也许有人会问,神经网络不过是一组logistic regression单元的堆砌,为什么会有如此优异的特征学习的能力呢?原因在于,我们同时引入了一些基本的建模原则,比如端对端的训练机制。这些指导性原则可以帮助神经元更好地从最终结果中学习到原始输入的特征。此外,人工神经网络模型和神经科学里的脑模型也有着千丝万缕的联系。这些联系在NLP问题中不是那么明显,但在计算机视觉领域(卷积神经网络,CNN)扮演着很重要的角色。
为什么我们要采用深度学习模型对NLP问题进行建模?这是因为,与传统的机器学习算法相比,深度学习模型通常不需要特定领域的先验知识,因此可以快速高效地进行特征的学习。与此同时,深度学习提供了一套灵活通用的特征学习框架(适用于包括语音、文字、视觉信息在内的多种数据的学习)。最后,深度学习可以有监督或无监督地从大量原始语料中学习到有用的特征。
另一个有趣的问题是:考虑到神经网络并不是近些年才提出的新技术,为什么直到现在深度学习才突然被人们所关注呢?这主要得益于近些年大数据的兴起和高速CPU/GPU的发展。数据是深度学习的食物。而高性能的计算资源可以帮助深度学习更好地消化这些食物。当然,深度学习的发展也离不开一些新的模型算法的提出(比如end-to-end的模型框架,机器翻译中的attention机制等)。
最后,对深度学习的发展历史感兴趣的同学,可以进一步阅读这篇文献:Deep Learning in Neural Networks: An Overview
Deep Learning + NLP = Deep NLP
Deep Learning的技术首先是在语音识别和计算机视觉的领域里取得了重大突破,直到近些年才被广泛地应用于NLP领域中。接下来,我们简单看下深度学习模型是如何帮助解决NLP难题的 。
- 语音Phonology:
传统的语音识别模型是通过人工建立一张语音词表,将相似发音的字母划分为一类;并借助一个分类模型实现语音到字母的转译。而深度学习模型将语音表达为一个embedding向量,可以直接从语音的向量特征中预测相应的单词。 - 词形Morphology:
传统的词形学将一个单词拆分为前缀、词干、后缀的表达,这些前后缀和词干统称为Morpheme。而深度学习将每一个Morpheme都处理成一个向量的表达,并借助于一个Recursive Neural Network将不同的Morpheme向量拼接成一个向量——这个向量代表了相应的Morpheme拼接后得到的单词。
这种将word表达成向量的思想在Deep NLP中十分基础。如果我们将这些词向量投影到一个二维平面上,会发现一些有趣的pattern。例如,相似的动词集中出现在平面的同一片区域内。 - 句法分析Syntax
在得到了词的表达后,接下来我们讨论句子的结构。
传统的句法分析将一个完整的句子解析成一棵语法树——每一个节点对应着一个特定的语法单元(例如,NP或VP)。而在深度学习中,我们可以对词向量进行计算,得到短语乃至整个句子的向量表达。并基于这些向量完成后续的分类预测等任务。 - 语义分析Semantics
传统的语义分析借助于一种叫做Lambda Calculus的技术。基本思想是在一棵句法树上递归地调用人工事先设定的Lambda函数进行语义的计算。而在深度学习中,同样地,我们对每一个单词,每一个短语,乃至每一个逻辑关系(比如\(A \in B\))都用一个向量去表达。借助于神经网络的计算,我们可以准确地预测两个句子之间的逻辑关系(例如,if "all reptiles walk" then "some turtles move")。有趣的是,在深度学习中,我们并不需要事先指定"reptiles"和"turtles","walk"和"move"之间的逻辑关系。
可以看出,与传统的NLP技术相比,Deep NLP核心思想在于 :everything can be a vector。无论是low level的音频,还是high level的短语。深度神经网络模型将低level的vector组装成更高level的vector,进一步完成分类、翻译等高级任务。
本节课的内容不多,主要是对NLP和深度学习技术的一个概要性介绍。下一节课,我们将开始学习计算word vector的几种常用模型。
(Stanford CS224d) Deep Learning and NLP课程笔记(一):Deep NLP的更多相关文章
- Deep learning with Python 学习笔记(11)
总结 机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)].将数据转换为程序的这个过程叫作学习(learning) 深 ...
- Deep learning with Python 学习笔记(10)
生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...
- Deep learning with Python 学习笔记(9)
神经网络模型的优化 使用 Keras 回调函数 使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推 ...
- Deep learning with Python 学习笔记(8)
Keras 函数式编程 利用 Keras 函数式 API,你可以构建类图(graph-like)模型.在不同的输入之间共享某一层,并且还可以像使用 Python 函数一样使用 Keras 模型.Ker ...
- Deep learning with Python 学习笔记(7)
介绍一维卷积神经网络 卷积神经网络能够进行卷积运算,从局部输入图块中提取特征,并能够将表示模块化,同时可以高效地利用数据.这些性质让卷积神经网络在计算机视觉领域表现优异,同样也让它对序列处理特别有效. ...
- Deep learning with Python 学习笔记(6)
本节介绍循环神经网络及其优化 循环神经网络(RNN,recurrent neural network)处理序列的方式是,遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息. ...
- Deep learning with Python 学习笔记(5)
本节讲深度学习用于文本和序列 用于处理序列的两种基本的深度学习算法分别是循环神经网络(recurrent neural network)和一维卷积神经网络(1D convnet) 与其他所有神经网络一 ...
- Deep learning with Python 学习笔记(4)
本节讲卷积神经网络的可视化 三种方法 可视化卷积神经网络的中间输出(中间激活) 有助于理解卷积神经网络连续的层如何对输入进行变换,也有助于初步了解卷积神经网络每个过滤器的含义 可视化卷积神经网络的过滤 ...
- Deep learning with Python 学习笔记(3)
本节介绍基于Keras的使用预训练模型方法 想要将深度学习应用于小型图像数据集,一种常用且非常高效的方法是使用预训练网络.预训练网络(pretrained network)是一个保存好的网络,之前已在 ...
随机推荐
- Openerp 修改 tree view 的列宽
在 tree 的后边添加自定义css 列:“my_class" 然后在对应的css文件中,添加样式: 保存,重新刷新页面即可.
- TryParse用法
int.Parse()是一种类型转换:表示将数字内容的字符串转为int类型. 如果字符串为空,则抛出ArgumentNullException异常: 如果字符串内容不是数字,则抛出FormatExce ...
- php array_flip() 删除数组重复元素
在PHP中,用于删除数组中重复元素有一个可用的函数,那就是 array_unique(), 但是它并不是一个最高效的方法,使用array_flip() 函数将比array_uniqure()在速度上高 ...
- Kibana插件sentinl实现邮件报警
为什么会突然想用到对日志的异常内容进行邮件报警,是因为在上周公司的线上业务多次出现锁表,开发在优化sql的同时,我也在想是不是可以对日志的异常内容进行检测并实现邮件预警. 在网上查询了一些资料后,决定 ...
- 详解shuffle过程(转载)
http://langyu.iteye.com/blog/992916 shuffle本意是洗牌的意思.在mapreduce中描述的是怎么将map task 的输出结果有效的传送到reduce tas ...
- CentOS 7_64位系统下搭建Hadoop_2.8.0分布式环境
准备条件: CentOS 7 64位操作系统 | 选择minimal版本即可(不带可视化桌面环境),也可以选择带完整版Hadoop-2.8.0 | 本文采用的是Hadoop-2.8.0版本.JDK1. ...
- R语言函数
函数是一个组织在一起的一组以执行特定任务的语句.R语言有大量的内置函数,用户也可以创建自己的函数. 在R语言中的函数是一个对象,所以R语言解释器为能够通过控制到该函数,带有参数可能是函数必要完成的操作 ...
- 去除tableView表头悬浮
UITableView设置为UITableViewStyleGrouped样式会出现多余间距,以前遇到过这样的问题,自己以为不难,只是一个知识点,也没太在意 ,今天又碰到了,发现自己把它给忘了,所以还 ...
- Xss和Csrf介绍
Xss和Csrf介绍 Xss Xss(跨站脚本攻击),全称Cross Site Scripting,恶意攻击者向web页面中植入恶意js代码,当用户浏览到该页时,植入的代码被执行,达到恶意攻击用户的目 ...
- protobuf简单测试应用
protobuf是google推出的一种数据交换协议,比较适合应用于底层服务交互,nodejs提供protobufjs包的实现,下面是一个简单的测试demo: 首先是.proto文件: package ...