语言建模是许多重要的自然语言处理任务的核心。
最近,基于神经网络的语言模型在独立使用和作为更具挑战性的自然语言处理任务的一部分时,都表现出优于经典方法的性能。
在这篇文章中,您将了解自然语言处理中的语言建模。
阅读本文后,你将了解:
- 为什么语言建模对于解决自然语言处理任务至关重要。
- 什么是语言模型以及它们的一些应用示例。
- 如何将神经网络用于语言建模。
通过我的新书《自然语言处理深度学习》启动您的项目,其中包括逐步教程和所有示例的Python源代码文件。
让我们开始吧。
- 2019年6月更新:添加了逐步语言模型教程的链接。

统计语言建模和神经语言模型简明介绍
图片来源:Chris Sorge,保留部分权利。
概述
这篇文章分为3个部分;它们是
- 语言建模问题
- 统计语言建模
- 神经语言模型
需要深度学习处理文本数据的帮助吗?
立即参加我的免费7天电子邮件速成课程(附代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
1. 语言建模问题
形式语言,如编程语言,可以完全指定。
所有保留字都可以定义,并且可以精确定义它们可以使用的有效方式。
我们无法对自然语言这样做。自然语言不是被设计的;它们是自然形成的,因此没有正式的规范。
语言的某些部分可能有正式的规则和启发式方法,但通常会使用不符合规范的自然语言。自然语言涉及大量的术语,这些术语可以以引入各种歧义的方式使用,但仍然可以被其他人理解。
此外,语言会变化,词语用法会变化:它是一个不断变化的目标。
尽管如此,语言学家仍尝试用形式语法和结构来规定语言。这可以做到,但非常困难,而且结果可能很脆弱。
指定语言模型的另一种方法是从示例中学习它。
2. 统计语言建模
统计语言建模,简称语言建模或LM,是开发概率模型,这些模型能够根据序列中前面的词预测下一个词。
语言建模的任务是为语言中的句子分配一个概率。……除了为每个词序列分配一个概率外,语言模型还为给定词(或词序列)跟随一个词序列的可能性分配一个概率。
——《自然语言处理中的神经网络方法》,2017年,第105页。
语言模型根据文本示例学习词语出现的概率。较简单的模型可能会查看短词序列的上下文,而较大的模型可能会在句子或段落级别上工作。最常见的是,语言模型在词语级别上运行。
语言模型的概念本身就是概率性的。语言模型是一个函数,它对来自某个词汇表的字符串进行概率度量。
——《信息检索导论》,2008年,第238页。
语言模型可以独立开发和使用,例如生成看起来来自语料库的新文本序列。
语言建模是大量自然语言处理任务的根本问题。更实际地讲,语言模型用于需要语言理解的更复杂模型的后端或前端。
……语言建模是诸如机器翻译和自动语音识别等实际应用中的关键组成部分,[…] 由于这些原因,语言建模在自然语言处理、人工智能和机器学习研究中扮演着核心角色。
——《自然语言处理中的神经网络方法》,2017年,第105页。
一个很好的例子是语音识别,其中音频数据被用作模型的输入,输出需要一个语言模型来解释输入信号并识别已识别词语上下文中的每个新词。
语音识别主要关注将语音信号转录为词序列的问题。……从这个角度来看,语音被假定是由语言模型生成的,该模型提供了所有词串w的Pr(w)估计,独立于观测信号……语音识别的目标是找到给定观测声学信号的最可能词序列。
——《牛津计算语言学手册》,2005年,第205-206页。
同样,语言模型在许多类似的自然语言处理任务中用于生成文本,例如:
- 光学字符识别
- 手写识别。
- 机器翻译。
- 拼写纠正。
- 图像字幕。
- 文本摘要
- 等等。
语言建模是确定词序列概率的艺术。这在语音识别、光学字符识别、手写识别、机器翻译和拼写纠正等各种领域都很有用。
——《语言建模的一些进展》,2001年。
开发更好的语言模型通常会使模型在其预期的自然语言处理任务上表现更好。这是开发更好、更准确的语言模型的动机。
[语言模型]在传统的NLP任务中发挥了关键作用,例如语音识别、机器翻译或文本摘要。通常(尽管并非总是如此),训练更好的语言模型会改善下游任务的底层指标(例如语音识别的词错误率,或翻译的BLEU分数),这使得训练更好的语言模型本身就很有价值。
——《探索语言建模的极限》,2016年。
3. 神经语言模型
最近,神经网络在语言模型开发中的应用变得非常流行,以至于它现在可能成为首选方法。
在语言建模中使用神经网络通常被称为神经语言建模,简称NLM。
神经网络方法在独立语言模型以及将模型整合到语音识别和机器翻译等挑战性任务的更大模型中时,都取得了比经典方法更好的结果。
性能提升的关键原因可能是该方法能够进行泛化。
非线性神经网络模型解决了传统语言模型的一些缺点:它们允许在不断增大的上下文大小上进行条件化,且参数数量只呈线性增长;它们减轻了手动设计回退顺序的需求;它们支持跨不同上下文的泛化。
——《自然语言处理中的神经网络方法》,2017年,第109页。
具体来说,采用词嵌入,它使用实值向量来表示项目向量空间中的每个词。这种基于词语用法学习到的词语表示允许具有相似含义的词语具有相似的表示。
神经语言模型(NLM)通过将词语参数化为向量(词嵌入)并将其用作神经网络的输入来解决N-gram数据稀疏性问题。参数作为训练过程的一部分进行学习。通过NLM获得的词嵌入表现出语义上相近的词语在诱导向量空间中也相近的特性。
——《字符感知神经语言模型》,2015年。
这种泛化是经典统计语言模型中使用的表示形式难以实现的。
在离散词索引空间中,很难获得“真正的泛化”,因为词索引之间没有明显的关联。
——《用于大词汇连续语音识别的联结主义语言建模》,2002年。
此外,分布式表示方法允许嵌入表示更好地随着词汇量的大小而扩展。对于每个词都有一个离散表示的经典方法,随着越来越大的词汇量,会遇到维度诅咒问题,导致更长、更稀疏的表示。
语言建模的神经网络方法可以用以下三个模型属性来描述,这些属性取自2003年的“神经概率语言模型”。
- 将词汇表中的每个词与一个分布式词特征向量关联起来。
- 根据序列中这些词的特征向量,表达词序列的联合概率函数。
- 同时学习词特征向量和概率函数的参数。
这代表了一个相对简单的模型,其中表示和概率模型都是直接从原始文本数据中共同学习的。
最近,基于神经网络的方法开始并且持续地超越了经典的统计方法。
我们提供了充分的经验证据表明,联结主义语言模型优于标准的N-gram技术,除了它们较高的计算(训练)复杂度。
——《基于循环神经网络的语言模型》,2010年。
最初,前馈神经网络模型被用来引入这种方法。
最近,循环神经网络以及具有长期记忆的网络(如长短期记忆网络或LSTM)允许模型学习比简单前馈网络长得多的输入序列中的相关上下文。
[一个RNN语言模型]提供了进一步的泛化:它不仅考虑前面几个单词,还假设具有循环连接输入的神经元代表短期记忆。该模型自身从数据中学习如何表示记忆。虽然浅层前馈神经网络(只有一层隐藏层)只能对相似的单词进行聚类,但循环神经网络(可以被视为一种深度架构)可以对相似的历史进行聚类。这例如允许高效地表示可变长度的模式。
——《循环神经网络语言模型的扩展》,2011年。
最近,研究人员一直在探索这些语言模型的极限。在论文《探索语言建模的极限》中,作者通过对大型数据集(如包含一百万个词的语料库)进行语言模型评估,发现基于LSTM的神经网络语言模型优于经典方法。
……我们已经证明RNN LM可以训练大量数据,并且优于包括精心调整的N-gram在内的竞争模型。
——《探索语言建模的极限》,2016年。
此外,他们提出了一些开发高性能神经语言模型的一般性启发式方法:
- 规模很重要。最佳模型是最大模型,特别是内存单元的数量。
- 正则化很重要。在输入连接上使用dropout等正则化可以改善结果。
- CNN与嵌入。字符级卷积神经网络(CNN)模型可以用于前端而不是词嵌入,取得相似甚至更好的结果。
- 集成很重要。组合多个模型的预测可以大幅提高模型性能。
语言模型教程
本节列出了一些开发深度学习神经网络语言模型的逐步教程。
进一步阅读
如果您想深入了解此主题,本节提供了更多资源。
书籍
论文
- 神经概率语言模型,NIPS,2001年。
- 神经概率语言模型,JMLR,2003年。
- 用于大词汇连续语音识别的联结主义语言建模, 2002.
- 基于循环神经网络的语言模型, 2010.
- 循环神经网络语言模型的扩展, 2011.
- 字符感知神经语言模型, 2015.
- 用于语言建模的LSTM神经网络, 2012
- 探索语言建模的极限, 2016.
文章
总结
在这篇文章中,您发现了用于自然语言处理任务的语言建模。
具体来说,你学到了:
- 自然语言没有正式规定,需要使用统计模型从示例中学习。
- 统计语言模型是许多具有挑战性的自然语言处理任务的核心。
- 使用神经语言模型,特别是那些带有词嵌入和循环神经网络算法的模型,可以获得最先进的结果。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
亲爱的Jason博士您好,我一直关注您的教程,它非常有趣。
现在,我有关于OCR主题的以下问题。
1. 您能给我一个简单的例子,说明如何为文本图像识别实现CNN和LSTM(例如,如果图像是“playing foot ball”,等效文本是“playing foot ball”,那么如何提供图像和文本进行训练)?
这可能是一个很好的起点
https://machinelearning.org.cn/use-pre-trained-vgg-model-classify-objects-photographs/
不错的文章,参考文献帮助很大,但我希望在一个地方阅读所有关于语言模型的内容,在论文之间切换和阅读让我失去了对主题的把握。我知道,这不是文章的错,但如果您能像往常一样用自己的话解释这个主题,我会非常高兴。无论如何,谢谢您的贡献。
谢谢。
嗨,Jason,
感谢这篇精彩的文章。NLM仍然是活跃的研究领域吗?还是我们已经达到了一些饱和状态?
谢谢。
我相信是的,可以在scholar.google.com上查看。
您好,Jason Brownlee
你好
我是来自埃塞俄比亚的Teshome,我是词嵌入的初学者,那么该如何从零开始呢?
也许从这里开始
https://machinelearning.org.cn/what-are-word-embeddings/
还有这里
https://machinelearning.org.cn/develop-word-embeddings-python-gensim/
嗨,Jason,
感谢您的博文。内容如此丰富!我喜欢您的博客。
我不太明白这三步法中的第3步:
1. 将词汇表中的每个词与一个分布式词特征向量关联起来。
2. 根据序列中这些词的特征向量,表达词序列的联合概率函数。
3. 同时学习词特征向量和概率函数的参数。
如果词特征向量是预训练的词嵌入,为什么还需要训练它们?是不是因为它们仍然需要为最终任务进行训练?此外,概率函数的参数是什么?概率函数是什么?
不客气。
很好的问题,我相信第三种方法是在训练过程中与网络权重一起学习嵌入的想法。例如,本教程的第三部分:
https://machinelearning.org.cn/use-word-embedding-layers-deep-learning-keras/