116人参与 • 2024-08-05 • 神经网络
如果你是nlp领域初学者,欢迎关注我的博客,我不仅会分享理论知识,更会通过实例和实用技巧帮助你迅速入门。我的目标是让每个初学者都能轻松理解复杂的nlp概念,并在实践中掌握这一领域的核心技能。
通过我的博客,你将了解到:
不论你是刚刚踏入nlp的大门,还是这个领域的资深专家,我的博客都将为你提供有益的信息。一起探索语言的边界,迎接未知的挑战,让我们共同在nlp的海洋中畅游!期待与你一同成长,感谢你的关注和支持。欢迎任何人前来讨论问题。
【nlp基础知识一】词嵌入(word embeddings)
【nlp基础知识二】词嵌入(word embeddings)之“word2vec:一种基于预测的方法”
【nlp基础知识三】词嵌入(word embeddings)之“glove:单词表示的全局向量”
【nlp基础知识四】文本分类
让神经网络学习有用的特征,而非手动定义特征。
基于神经网络的分类的主要思想是:可以使用神经网络获得输入文本的特征表示。我们将输入token的词嵌入(embedding)传入神经网络,用于提供输入文本的向量表示。 之后,再使用该向量用于分类。
在处理神经网络时,我们可以以非常简单的方式考虑分类部分(即如何从文本的向量表示中获取类别概率)。
经过神经网络的文本向量表示的维度为
d
d
d。而最终,我们需要一个大小为
k
k
k(
k
k
k 个类别的概率)的向量。 要从
d
d
d 大小得到
k
k
k 大小的向量,我们可以使用线性层。 一旦我们有了一个
k
k
k 大小的向量,剩下的就是应用 softmax 操作将原始数字转换为类概率。
让我们看一下神经网络分类器。 我们使用输入文本的向量表示的方式与我们使用经典方法的逻辑斯蒂回归的方式完全相同:我们根据每个类的特征权重对特征进行加权。 与经典方法的逻辑斯蒂回归的唯一区别在于特征的来源:它们要么是手动定义的(就像我们之前所做的那样),要么是通过神经网络获得的。
如果我们更仔细地观察这个最后的线性层,我们会看到它的矩阵的列其实就是向量
w
i
w_i
wi。这些向量可以被认为是类的向量表示。一个好的神经网络将学习以这种方式以表示输入文本,即文本向量将指向相应类向量的方向。
训练神经网络分类器来预测类的概率分布,直观地说,就是在每一步,我们都会最大化模型分配给正确类别的概率。
标准损失函数是 交叉熵损失 (cross-entropy loss) 。 目标概率分布的交叉熵损失
p
∗
=
(
0
,
…
,
0
,
1
,
0
,
…
)
k
×
1
p^{\ast} = (0, \dots, 0, 1, 0, \dots)_{k\times 1}
p∗=(0,…,0,1,0,…)k×1 (目标标签为 1,其余为 0),并且预测的模型分布为
p
=
(
p
1
,
…
,
p
k
)
,
p
i
=
p
(
i
∣
x
)
p=(p_1, \dots, p_k), p_i=p(i|x)
p=(p1,…,pk),pi=p(i∣x)
l
o
s
s
(
p
∗
,
p
)
=
−
p
∗
log
(
p
)
=
−
∑
i
=
1
k
p
i
∗
log
(
p
i
)
.
loss(p^{\ast}, p^{})= - p^{\ast} \log(p) = -\sum\limits_{i=1}^{k}p_i^{\ast} \log(p_i).
loss(p∗,p)=−p∗log(p)=−i=1∑kpi∗log(pi).
因为只有一个
p
i
∗
p_i^{\ast}
pi∗ 是非零的(目标标签 k 为 1,其余为 0),我们将得到:
l
o
s
s
(
p
∗
,
p
)
=
−
log
(
p
k
)
=
−
log
(
p
(
k
∣
x
)
)
.
loss(p^{\ast}, p) = -\log(p_{k})=-\log(p(k| x)).
loss(p∗,p)=−log(pk)=−log(p(k∣x)). 具体的训练样本示例见下图。
在训练中,我们多次迭代,逐步提高模型权重,具体来说:迭代训练样本(或批量样本)并进行梯度更新。在每一步,我们最大化模型分配给正确类别的概率。同时,也最小化错误类别的概率总和:由于所有概率的总和是恒定的,通过增加一个概率我们减少所有其他概率的总和 ( 编者按:这里我通常想象一群小猫从同一个碗里吃东西: 一只小猫吃得多总是以其他小猫吃得少为代价 )。
训练过程见下图。
不要忘记在谈论最大熵分类器(逻辑回归)时,我们表明最小化交叉熵等同于最大化数据似然。因此,这里我们也试图得到模型参数的 最大似然估计(mle) 。
我们需要一个可以为不同长度的输入生成固定大小向量的模型。
在这一部分中,我们将研究使用神经网络获取输入文本的向量表示的不同方法。请注意,虽然输入文本可以有不同的长度,但文本的向量表示必须具有固定大小:否则,网络将无法“工作”。
我们从仅使用词嵌入的最简单方法开始(在此之上不添加模型)。然后我们看看循环和卷积网络。
你可以做的最简单的事情是仅使用词嵌入(word embedding)而不使用任何神经网络。为了获得所有文本的向量表示,我们可以对所有token的embedding(bag of embeddings)求和,也可以使用这些embedding的加权和(例如,权重为tf-idf或其他)。
bag of embeddings(理想情况下,连同朴素贝叶斯)应该是任何具有神经网络模型的基线模型:如果你不能做得比这更好,那么根本不值得使用 nn。如果你没有太多数据,可能会出现效果低于基线模型的状况。
虽然bag of embeddings (boe) 有时称为词袋 (bow),但请注意, 这两者是非常不同的。 boe 是嵌入(embedding)的总和,bow 是 one-hot 向量的总和: 相较而言,boe 对语言了解更多。预训练的嵌入(例如 word2vec 或 glove)能够理解单词之间的相似性。例如, awesome, brilliant, great 在 bow 中是不相关的特征表示,但在 boe 中会有相似的词向量表示。
另请注意,如果到这里,想使用嵌入的加权和,可能会要用一种方法来获得权重。然而,这正是我们希望通过使用神经网络来避免的:我们不想引入手动特征,而是让网络学习有用的模式。
你可以在 boe 之上使用 svm!与经典方法中的支持向量机svm的唯一区别在于内核的选择,这里 rbf 核更好。
从某种意义上说,循环网络是处理文本的一种自然方式,类似于人类,它们一个接一个地“读取”一系列token并处理信息。 并希望在每一步,神经网络都会“记住”它之前读过的所有内容 (译者注:这里的“所有”是相对而言的理想状况,而受模型及参数限制,会进行一定的遗忘。)
在这里,我们(终于!)看看如何使用循环模型进行文本分类。你将在此处看到的所有内容都将适用于所有循环单元,并且在本部分中,“rnn”指的是普遍意义上的的循环单元(例如 vanilla rnn、lstm、gru 等)。
让我们回忆一下我们需要什么:
我们需要一个可以为不同长度的输入生成固定大小向量的模型。
卷积模型的详细描述在卷积模型补充文章中。在本章该部分中,我们只考虑用于文本分类的卷积。
卷积网络最初是为计算机视觉任务而开发的。因此,让我们首先了解图像卷积模型背后的直觉。
想象一下,我们想要将图像分类为几个类别,例如猫、狗、飞机等。在这种情况下,如果你在图像上找到一只猫,你并不关心 这只猫在图像上的什么位置:你只关心它是否存在在某个地方。
卷积网络针对图像的每个局部应用相同的操作:这就是它们提取特征的方式。每个操作都在寻找与模式的匹配,并且网络会学习哪些模式是有用的。随着层数的增加,学习模式变得越来越复杂:从早期层的线条到上层非常复杂的模式(例如,整只猫或狗)。你可以查看分析与解释 章节中的示例。
这个属性被称为 平移不变性: 平移是因为我们谈论的是空间的变化, 不变性是因为我们认为它在此处无关紧要。
对于图像,一切都很清楚:例如我们能够移动一只猫,因为我们不在乎猫在哪里。但是文本呢?乍一看,这不是那么简单:我们不能轻易移动短语,因为意思会改变,或者我们会得到一些没有多大意义的东西。
但是,在某些应用程序中,我们可以想到相同的直觉。假设我们想要对文本进行分类,但不是像图像中那样对猫/狗进行分类,而是对正面/负面情绪进行分类。然后有一些单词和短语可能是非常有用的“线索”(例如 it’s been great, bored to death, absolutely amazing, the best ever等) ,以及其他根本不重要的。我们不太在乎我们在文本中看到 bored to death 在文本哪一部分哪来理解情绪,对吧?
按照上面的直觉,我们想检测一些模式,但我们不太关心这些模式到底在哪里。此行为通过两层实现:
卷积神经网络最初是为计算机视觉任务而开发的,例如图像分类(猫与狗等)。卷积的想法是用滑动窗口遍历图像,并对每个窗口应用相同的 卷积filter操作。
该图(取自 仓库)显示了一个filter的卷积过程 底部是输入图像,filter顶部是输出。由于图像具有二维(宽度和高度),因此卷积是二维的。
与图像不同,文本只有一维:这里的卷积是一维的:看插图。
卷积是应用于每个输入窗口的线性层(后面是非线性层)。 正式地,让我们假设
直观地说,卷积中的每个filter都会提取一个特征。
在一个卷积从每个窗口中提取 m m m 个特征之后,一个池化层总结了某个区域的特征。池化 层用于减少输入维度,从而减少网络使用的参数数量。
现在,当我们了解卷积和池化的工作原理后,让我们来进行建模。首先,让我们回顾一下我们需要什么:
我们需要一个可以为 不同 长度的输入生成 固定大小 向量的模型。
因此,我们需要构建一个将文本表示为单个向量的卷积模型。 文本分类的基本卷积模型如图所示。它几乎和我们之前看到的一样:唯一改变的是我们指定了使用的池化类型。
文本分类的基本卷积模型如图所示。 它几乎和我们之前看到的一样:唯一改变的是我们指定了使用的池化类型。 具体来说,在卷积之后,我们使用了 global-over-time pooling 。这是关键操作:它允许将文本压缩为单个向量。模型本身可以不同,但在某些时候它必须使用全局池化将输入压缩到单个向量中。
多标签 分类与我们之前讨论的 单标签 问题不同,每个输入可以有几个正确的标签。例如,一个推特可以有多个主题标签,一个用户可以有多个感兴趣的主题,等等。
对于多标签问题,我们需要在之前讨论的单标签pipeline中更改两件事:
在最后一个线性层之后,我们有对应于
k
k
k 个类别的
k
k
k 个值——这些值是我们必须转换为类别概率的值。
对于单标签问题,我们使用softmax:它将
k
k
k 个值转化为概率分布,即所有概率之和为1。这意味着类共享相同的概率质量: 如果一个类的概率高,其他类可以概率不大。 ( 编者按:再次想象一下,一群小猫从同一个碗里吃东西:一只小猫吃得多总是以牺牲其他小猫吃得少为代价 )。
对于多标签问题,我们将
k
k
k 个值中的每一个值都转换为对应类别的概率,独立于其他类别。 具体来说,我们将 sigmoid 函数应用于每个
k
k
k 值:
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x)=\frac{1}{1+e^{-x}}
σ(x)=1+e−x1
直观地说,我们可以认为多标签分类是
k
k
k 个独立的二进制分类器组合,其中,这些分类器使用相同的文本表示。
损失函数更改以启用多个标签:对于每个类,我们使用二元交叉熵损失。 见下图。
网络的输入由词嵌入表示。 您有三种选择如何为您的模型获取这些嵌入:
在这个充满科技魔力的时代,自然语言处理(nlp)正如一颗璀璨的明星般照亮我们的数字世界。当我们涉足nlp的浩瀚宇宙,仿佛开启了一场语言的奇幻冒险。正如亚历克斯·康普顿所言:“语言是我们思想的工具,而nlp则是赋予语言新生命的魔法。”这篇博客将引领你走进nlp前沿,发现语言与技术的交汇点,探寻其中的无尽可能。不论你是刚刚踏入nlp的大门,还是这个领域的资深专家,我的博客都将为你提供有益的信息。一起探索语言的边界,迎接未知的挑战,让我们共同在nlp的海洋中畅游!期待与你一同成长,感谢你的关注和支持。欢迎任何人前来讨论问题。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论