[转]NLP模型与深度学习

1、自然语言处理简介 根据工业界的估计,仅有21% 的数据是以结构化的形式展现的[1]。在日常生活中,大量的数据是以文本、语音的方式产生(例如短信、微博、录音、聊天记录等等),这种方式是高度无结构化的。如何去对这些文本数据进行系统化分析、理解、以及做信息提取,就是自然语言处理(Natural Language Processing,NLP)需要做的事情。 在NLP中,常见的任务包括:自动摘要、机器翻译、命名体识别(NER)、关系提取、情感分析、语音识别、主题分割等。 在NLP与深度学习系列文章中,不会逐一解释各个NLP任务,而是主要介绍深度学习模型在NLP中的应用。整体分为以下几点: 首先介绍NLP基本流程以及在数据预处理方面的技术;而后会介绍最初期使用的神经网络:SimpleRNN、LSTM;继而引入使得文本处理性能得到很大提升的Attention机制以及Transformer模型;最后介绍近几年非常热门的预训练模型BERT,以及如何使用BERT预训练模型的例子 下面首先介绍的NLP任务的一个基本工作流程。 2、NLP 任务流程 典型的NLP任务分为以下几步: 数据收集 数据标注 文本标准化(Normalization) 文本向量化/特征化(Vectorization/Featuring) 建模 前期主要是数据收集,并根据任务类型对数据做标注(例如情感分析中,对好、坏评价做标注)。接下来的2个步骤均是对文本进行预处理的步骤,为了提取文本中隐含的信息,最后通过机器学习建模,达到任务目标。其中 3 – 5 这几步是迭代的流程,为了模型的精度更准确,需要迭代这个过程,进行不断尝试。 数据收集以及标注并非在本文讨论范围内,接下来介绍文本标准化的目标与方法。 3、文本标准化 由于文本数据在可用的数据中是非常无结构的,它内部会包含很多不同类型的噪点。所以在对文本进行预处理之前,它暂时是不适合被用于做直接分析的。 文本预处理过程主要是对 文本数据进行清洗与标准化。这个过程会让我们的数据没有噪声,并可以对它直接做分析。 而文本标准化是NLP任务里的一个数据预处理过程。它的主要目标与常规数据预处理的目标一致:提升文本质量,使得文本数据更便于模型训练。 文本标准化主要包含4个步骤: 大小写标准化(Case Normalization) 分词(Tokenization)与 停止词移除(stop word removal) 词性(Parts-of-Speech,POS)标注(Tagging) 词干提取(Stemming) 3.1 大小写标准化 大小写标准化是将大写字符转为小写字符,一般在西语中会用到。但是对于中文,不需要做此操作。而且Case Normalization 也并非是在所有任务场景中都有用,例如在英文垃圾邮件分类中,一般一个明显的特征就是充斥着大写单词,所以在这种情况下,并不需要将单词转为小写。 3.2 分词 文本数据一般序列的形式存在,分词是为了将文本转为单词列表,这个过程称为分词(tokenization),转为的单词称为token。根据任务的类别,单词并非是分词的最小单位,最小单位为字符。在一个英语单词序列中,例如 ride a bike,单词分词的结果为 [ride, a, bkie]。字符分词的结果为[r, i, d, e, a, b, k, e]。 在中文中,分词的最小单元可以不是单个字,而是词语。 3.3 停止词移除 停止词移除是将文本中的标点、停顿词(例如 is,in,of等等)、特殊符号(如@、#等)移除。大部分情况下,此步骤能提升模型效果,但也并非在任何时候都有用。例如在骚扰邮件、垃圾邮件识别中,特殊字符相对较多,对于分辨是否是垃圾邮件有一定帮助。 3.4 词性标注 语言是有语法结构的,在大部分语言中,单词可以被大体分为动词、名词、形容词、副词等等。词性标注的目的就是就是为了一条语句中的单词标注它的词性。 3.5 词干提取 在部分语言中,例如英语,一个单词会有多种表示形式。例如play,它的不同形式有played,plays,playing等,都是play的变种。虽然他们的意思稍微有些区别,但是大部分情况下它们的意思是相近的。词干提取就是提取出词根(例如play 就是它各种不同形式的单词的词根),这样可以减少词库的大小,并且增加单词匹配的精度。 这些文本标准化的步骤,可以用于对文本进行预处理。在进一步基于这些文本数据进行分析时,我们需要将它转化为特征。根据使用用途不同,文本特征可以根据各种技术建立而成。如:句法分析(Syntactical Parsing),N元语法(N-grams),基于单词计数的特征,统计学特征,以及词向量(word embeddings)等。 ...

December 2, 2021

成为深度学习专家的七个步骤

1、对机器学习有基本的理解,最好的材料是Andrew Ng在coursera上的公开课程,看过教程能让你对机器学习有基本的认识,完成课程中的任务会让你对机器学习有更深入的理解; 2、接下来需要培养对神经网络的感觉,实现一个神经网络,并利用它做点事情; 3、理解神经网络的原理很重要,但简单的神经网络并不足以解决最有趣的问题。神经网络的变体-卷积神经网络(CNN)非常适合于图像识别类的任务,斯坦福大学的有关资料如下:CS231n 用于图像识别的卷积神经网络(笔记)和课件。另外两个参考资料如下CNN 参考资料1和CNN 参考资料1。 4、接下来需要在自己的电脑上运行CNN; step1:买一块GPU,安装CUDA开发工具包 step2:安装Caffe和GUI包Digit step3:安装Boinc,这个工具对你理解深度学习并没有帮助,但能够让其他研究人员在闲暇时间利用你的GPU做科研 5、Digit提供了少量算法,比如用于字符识别的lenet算法和用于图像分类的Googlenet算法。要想运行这些算法,需要下载相应的数据集lenet数据集和Googlenet数据集。你也可以修改算法来执行其他的图像识别任务,比如我们的工作; 6、对于自然语言处理任务,递归神经网络RNN更适合。学习RNN最好的材料是斯坦福的讲座及笔记,也可以下载Tensorflow来构建RNN; 7、现在你可以尝试用深度学习来解决各种各样的难题了,比如面部识别、语音识别和自动驾驶等; 如果你认真完成以上步骤,那么祝贺你,可以去Google、Baidu、Microsoft, Facebook或Amazon申请职位。

December 10, 2017

深度学习随感

“深度学习是一个激情澎湃却又相对单一的领域。有一些深刻的想法,一些主要的学术会议,其中若干会议之间也存在着很多重叠。然后,一篇篇的论文在不断地提升和完善同样的一些基本想法:使用SGD(或者类似的变体)来优化一个代价函数。这些想法非常成功。但是我们现在还没有看到这个领域的健康发展,每个人在研究自己的深刻想法,将深度学习推向很多的方向。所以,根据社会复杂性度量,忽略文字游戏,深度学习仍然是一个相当粗浅的领域。现在还是可以完全地掌握该领域大多数的深刻想法的。” via:Michael Nielsen 上世纪50、60年代神经网络曾经非常火爆,局限于计算能力和算法束缚,没有获得商用,迅速进入寒冬,但Hinton和Yann Lecun坚持做了二十多年,去年以来媒体对AI大肆渲染,而这两位深度学习的领袖却保持很理性的认识。下面是Yann Lecun在facebook的声明:AlphaGo战胜李世石后,Slashdot上有帖子帖子宣称:“我们现在知道,我们不需要任何大的新的突破,以获得真正的AI”。 这是完全,完全,可笑的错误。 正如我在前面的陈述中所说的:大多数人类和动物学习是无监督的学习。 如果智力是一个蛋糕,无监督学习将是蛋糕,监督学习将是蛋糕上的糖霜,强化学习将是蛋糕上的樱桃。 我们知道如何做结冰和樱桃,但我们不知道如何做蛋糕。在我们想获得真正的AI之前,需要先解决无监督的学习问题。 这只是我们知道的一个障碍。还有大量的我们不知道的障碍。 最近几年deep learning使得机器对图像,语音,人类语言的认知能力获得了质的飞跃,在图像识别方面甚至已经超越人类,出现了很多看起来是黑科技并且非常实用的技术,比如人脸识别,图片自动标注描述,机器翻译,无人车等等。但不应该去夸大AI,媒体的大肆宣传,会让大家都以为实现科幻电影里出现的强AI,这样只会换来失望,从而导致AI的下一个寒冬。当然,乐观的来讲,深度学习对于弱AI的发展起到了非常大的作用,而且也有理由相信未来(我觉得还需要近上百年的发展)肯定会诞生强AI。

June 4, 2017

深度学习猜想

推荐所有立志从事机器学习特别是深度神经网络学习算法的人认真研读这本书。书评:作者从最根本最朴素的思想开始,结合实践进入深度神经网络,这本书堪称神经网络的几何原本。另外,第二章有非常多的多元微积分公式和证明,作者说可以跳过,但建议数学系毕业的人认真研读并完成证明,因为只有了解这些才可能进行算法的创新。 如果拉马努金在世,他应该能从上帝那里拿来神奇的公式,让深度学习的算法更优。另外,我猜想基于欧拉公式设计逻辑神经元的算法,或许会彻底改变神经网络算法—因为现在的S型神经元只包含自然对数e,英应该要加入pi,i,0和-1才是优美的。哦,这只是天马行空的猜想。

May 4, 2017

Hadoop介绍

Hadoop一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有着高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以流的形式访问(streaming access)文件系统中的数据。 Hadoop是一个能够对大量数据进行分布式处理的软件框架。但是 Hadoop 是以一种可靠、高效、可伸缩的方式进行处理的。Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。Hadoop 还是可伸缩的,能够处理 PB 级数据。此外,Hadoop 依赖于社区服务器,因此它的成本比较低,任何人都可以使用。 Hadoop带有用 Java 语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如 C++。 Hadoop主要包括如下子项目 Hadoop Common: 在0.20及以前的版本中,包含HDFS、MapReduce和其他项目公共内容,从0.21开始HDFS和MapReduce被分离为独立的子项目,其余内容为Hadoop Common HDFS: Hadoop 分布式文件系统 (Distributed File System) - HDFS (Hadoop Distributed File System) MapReduce:并行计算框架,0.20前使用 org.apache.hadoop.mapred 旧接口,0.20版本开始引入org.apache.hadoop.mapreduce的新API HBase: 类似Google BigTable的分布式NoSQL列数据库。(HBase 和 Avro 已经于2010年5月成为顶级 Apache 项目) Hive:数据仓库工具,由Facebook贡献。 Zookeeper:分布式锁设施,提供类似Google Chubby的功能,由Facebook贡献。 Avro:新的数据序列化格式与传输工具,将逐步取代Hadoop原有的IPC机制。 要掌握hadoop,首先必须深入研究google的3篇论文:map-reduce、gfs和bigtable。

July 24, 2012