自然语言处理
在这一系列与自然语言处理(NLP)相关的文章中,我们将首先讨论几个用于解决问题的基本概念和基础方法。随后,我们将介绍最新的方法,例如GPT。
我假设读者熟悉神经网络和多层感知器(MLP)的基本概念。
词嵌入 (Word Embedding)
基于计算机的方法处理的是数值数据。因此,有必要找到一种方法将字母语言中的单词或字符语言中的字符转换为数字。
One-hot向量是一个直接的概念,其中一个向量由一个设置为1的元素和所有其他设置为0的元素组成,以表示一个单词或字符。One-hot向量本质上就像一个词索引。然而,one-hot向量的问题在于其稀疏性,这使得大多数方法难以处理。因此,我们需要一种方法将这个one-hot向量(索引)映射到一个嵌入(一个密集向量)中。
某些神经网络模型具有一个嵌入层,可以在神经网络的训练过程中进行训练。也可以直接使用像Word2Vec和GloVe这样的预训练嵌入模型。
如何获得词嵌入
延伸阅读
主要思想是构建一个网络来预测句子中缺失的单词。例如,在句子“我吃苹果”中,如果我们遮盖掉“苹果”这个词(“我吃__”),网络的任务就是预测缺失的单词。这种方法使我们能够生成一个训练数据集而无需手动标记。
让我们给出一个更正式的描述。给定一个包含 个单词的词典,我们的目标是创建一个模型,将单词的one-hot编码映射到 维空间()中的嵌入。通过使用单词的嵌入作为输入,网络预测被省略的单词。因此,我们通过训练这个网络来获得词嵌入。
评论:词嵌入类似于降维。因此,像t-SNE和UMAP这样的技术可以被看作是获得词嵌入的方法。然而,这些方法不能直接应用,因为one-hot向量不捕捉单词之间的关系。但是,如果我们能够使用非神经网络方法将one-hot向量映射到特征空间,可能会得到更具可解释性的嵌入。
循环神经网络 (Recurrent Neural Network - RNN)
循环神经网络(RNN)是一种神经网络架构,允许在不同的时间步重复使用相同的网络。这使得它们特别适用于涉及序列数据的任务,例如自然语言处理和时间序列分析。
RNN的基本思想是维持一个隐藏状态,该状态捕获来自先前时间步的信息,并与当前输入结合以生成输出。这个隐藏状态充当一个记忆,允许网络捕获依赖关系和序列数据中的模式。
RNN的架构如下图所示:

在每个时间步,RNN接收一个输入向量,表示为 ,并将其与前一个时间步的隐藏状态 相结合。这种结合通常通过加权和来完成,其中的权重在训练过程中学习。得到的隐藏状态,表示为 ,然后用于生成该时间步的输出,表示为 。
控制RNN行为的方程可以总结如下:
在这些方程中, 代表激活函数,通常是sigmoid或双曲正切函数。、 和 是在训练过程中学习的权重矩阵。
需要注意的是,RNN存在一个称为“梯度消失”问题的局限性,这使得它们难以捕获数据中的长期依赖关系。这意味着在给定时间步的输出主要受该时间步的输入和前一个隐藏状态的影响,而不是更早时间步的输入。然而,已经开发出RNN的变体,如长短期记忆(LSTM)和门控循环单元(GRU),以解决这个问题。
RNN的应用范围广泛,包括语言翻译、文本生成、情感分析和语音识别。在处理具有时间依赖性的序列数据时,它们尤其有效。
训练RNN
要训练RNN,我们通常将问题表述为分类或回归任务,并使用适当的损失函数(如交叉熵或均方误差)来衡量预测输出与真实值之间的差异。然后使用基于梯度的优化算法(如时间反向传播(BPTT)或截断时间反向传播(TBPTT))来更新RNN的权重。
由于梯度消失问题和需要处理可变长度序列,训练RNN可能具有挑战性。可以采用梯度裁剪、正则化和批量归一化等技术来缓解这些挑战并改善训练过程。
总之,RNN是建模序列数据和捕获时间依赖性的强大工具。它们已在各个领域得到广泛应用,并为自然语言处理领域中更先进的架构(如Transformer和GPT)铺平了道路。
关于RNN的延伸阅读
以下是一些您可以探索的关于循环神经网络(RNN)的在线资源:
- Recurrent Neural Networks - Stanford University
- Understanding LSTM Networks - Christopher Olah
- The Unreasonable Effectiveness of Recurrent Neural Networks - Andrej Karpathy
- Deep Learning Book - Chapter 10: Sequence Modeling: Recurrent and Recursive Nets
- Sequence to Sequence Learning with Neural Networks - Ilya Sutskever, Oriol Vinyals, and Quoc V. Le
温度采样 (Temperature Sampling)
在处理序列到序列模型时,温度是一个重要的参数。在传统的分类网络中,我们使用交叉熵损失来训练网络,并旨在对预测类别有高置信度。然而,当涉及到用序列到序列模型生成创造性内容时,我们希望模型能探索最高概率词之外的可能。
在传统的分类网络中,我们通常使用top-1或top-5预测来生成输出。但是,如果我们在循环神经网络(RNN)中使用top-1预测,对于给定的输入,生成的序列将总是相同的。这限制了模型生成多样化输出的能力。例如,在英汉翻译中,对于给定的输入有多种有效的翻译。
为了解决这个问题,我们可以根据预测的概率对输出词进行采样。我们可以使用概率分布随机选择一个词,而不是总是选择概率最高的词。例如,如果“我吃了”之后下一个词的预测概率是苹果:0.1,橙子:0.8,香蕉:0.1,我们可以以10%的概率生成苹果或香蕉,以80%的概率生成橙子。
然而,在训练后,网络倾向于偏爱在训练期间大量使用的某些词。为了鼓励模型生成更多样化和创造性的结果,我们可以引入温度的概念。
温度参数在使用softmax函数计算词汇表上的概率分布时应用。标准的softmax函数是 。通过引入温度参数 ,函数变为 。较高的温度 会导致类别上更平滑的概率分布,从而鼓励采样中的更多样性,而较低的温度使模型对其首选更有信心。增加温度将增加生成输出的随机性和多样性。
这种使用温度和softmax函数的简单技术可以帮助网络更具创造性,并生成更广泛的结果。
注意力机制 (Attention Mechanism)
注意力机制是许多高级神经网络架构中的关键组成部分,尤其是在自然语言处理任务中,如机器翻译和文本摘要。它允许模型在进行预测时关注输入序列的不同部分,使其能够捕获相关信息并提高性能。
在宏观层面上,注意力机制通过根据输入序列中不同元素与当前预测的相关性为其分配权重来工作。然后,这些权重用于计算输入元素的加权和,该加权和与模型的隐藏状态相结合以生成最终输出。
有几种类型的注意力机制,包括加性注意力、乘性注意力和自注意力。每种类型都有其自身的优点,适用于不同的场景。
加性注意力,也称为Bahdanau注意力,使用前馈神经网络来计算注意力权重。它已在序列到序列模型中广泛使用,并在各种任务中表现出良好的性能。
乘性注意力,也称为Luong注意力,使用点积或双线性函数来计算注意力权重。它在计算上比加性注意力更高效,并已成功应用于机器翻译任务。
自注意力,也称为transformer注意力,是一种允许模型关注同一输入序列内不同位置的注意力机制。它是transformer模型中的一个关键组成部分,该模型在各种自然语言处理任务中取得了最先进的性能。