# 数据向量化

**向量化**是提高数据操作效率的过程。它特别适用于处理大型数据集，通过同时操作多个数据点来提升性能，是数组编程的一个基本方面。

传统上，数据管理任务依赖于循环，以顺序的方式对每个数据片段执行操作，这种方法被称为标量计算。当处理大量数据时，这种标量方法往往显得比较缓慢。

相反，向量化促进了计算的并行执行。它允许对整个数据数组同时进行操作，而不是一次处理单个数据点。通过这种方式，向量化充分利用了现代图形处理单元（GPU）的设计，后者能够高效处理并行操作。像Python中的NumPy库就是一个很好的例子，它为向量化操作进行了高度优化。

在自然语言处理（NLP）领域，这种方法称为词嵌入（Word Embeddings）。因此，向量化或词嵌入将文本数据转换为数值向量。随后，这些向量用于构建各种机器学习模型。通过这种方式，我们可以说这是通过文本提取特征，以构建多个自然语言处理模型等。我们有不同的方法将文本数据转换为数值向量，这些将在后面讨论。

这个过程需要计算能力，尤其是**GPU**。

**不同类型的词嵌入**

广义上，词嵌入可以分为以下两类：

1. 基于频率或统计的词嵌入
2. 基于预测的词嵌入

主要使用的词嵌入技术有五种：独热编码（One-Hot Encoding）、计数向量化（Count Vectorizer）、矩阵形式（Matrix Formulation）、词袋模型（Bag-of-Words, BoW）、N-gram 向量化和TF-IDF 向量化。

1. **独热编码（One-Hot Encoding, OHE）**&#x20;

在这种技术中，词汇表中的每个唯一单词通过在向量中设置一个唯一的标记（值为1）来表示，而其余位置的值为0。简单来说，独热编码向量的向量表示为1和0，其中1表示单词所在的位置，0表示其他所有位置。

让我们考虑以下句子：

```
Sentence: I am teaching NLP in Python
```

这句话中的一个单词可能是“NLP”、“Python”、“teaching”等等。

字典是句子中所有唯一单词的列表。因此，字典可能看起来像这样—

```
Dictionary: [‘I’,’am’, ’teaching’,’ NLP’,’ in’, ’Python’] 
```

因此，按照上述字典，这种格式的向量表示为

```
Vector for NLP: [0,0,0,1,0,0] 
Vector for Python:  [0,0,0,0,0,1]
```

这只是用向量形式表示单词的一种简单方法。

One-hot编码的缺点

1. One-hot编码的一个缺点是向量大小等于词汇表中唯一单词的数量。
2. One-hot编码无法捕捉不同单词之间的关系，因此无法传达上下文信息。

**2. 计数向量化**

计数向量化是进行文本向量化的最简单方法之一。它创建一个文档-词项矩阵，表示特定单词在文档中是否出现的虚拟变量集。&#x20;

计数向量化将适应并学习单词词汇，并尝试创建一个文档-词项矩阵，其中每个单元格表示该单词在特定文档中的频率，也称为词频。矩阵的列对应语料库中的每个单词。

**3. 矩阵公式化**

考虑一个包含D个文档{d1, d2, …, dD}的语料库C，从中提取N个唯一标记。现在，字典由这N个标记组成，形成的计数向量矩阵M的大小为D X N。矩阵M中的每一行描述文档D(i)中标记的频率。

**4.词袋模型（BoW）**

这种向量化技术将文本内容转换为数值特征向量。词袋模型从语料库中提取文档，通过将每个文档中的单词映射到机器学习模型的特征向量来将其转换为数值向量。

**5. N-grams向量化**

与计数向量化技术类似，N-Gram方法生成一个文档-词项矩阵，每个单元格表示计数。列表示长度为n的相邻单词的所有列。计数向量化是N-Gram的一个特例，其中n=1。N-grams考虑文本中n个单词的顺序，其中n为(1, 2, 3…)如1-gram、2-gram的词对。与词袋模型不同，N-grams保持了单词的顺序。

**6. TF-IDF向量化**

如上面所讨论的，词袋方法简单且效果良好，但对所有单词的处理是相同的。因此，它无法区分常见单词和稀有单词。为了解决这个问题，TF-IDF应运而生！ 词频-逆文档频率（TF-IDF）是一种衡量，考虑一个单词的重要性，取决于它在文档和语料库中出现的频率。

### 网络中的计算节点&#x20;

在所示的网络中（见图1），计算节点以蓝色矩形突出显示。这些节点接收来自验证节点的验证数据集，并将其转换为向量格式，以便进行训练。

<figure><img src="https://content.gitbook.com/content/r2PyvL89MTgmGKhg3h05/blobs/FZ1qDlnYkzIZJION190c/image.png" alt="" width="563"><figcaption><p>Fig 1. Computation Node</p></figcaption></figure>

计算节点的功能将执行以下操作以生成向量。以处理推文为例：

**特征提取**：在这一步中，使用词袋模型（Bag of Words, BOW）从Twitter动态中提取特征。在该模型中，每个文档样本通常通过将单词与其观察到的频率关联来表示。文本内容中单词的顺序被认为是无关的。在获得BOW特征后，我们应用了去除停用词、词干提取和文本规范化步骤，采用了Zemberek和Lucene的方法。

**表示和术语加权：**&#x6BCF;条推文在TTF数据集中作为特征向量表示，使用向量空间模型（Vector Space Model, VSM）。在VSM中，每个特征通过其词频或权重值以数字形式表示。因此，术语加权是一个重要的步骤，它为样本向量中每个相关特征分配一个权重，以指示其重要性。在此步骤中，使用TF-IDF（词频-逆文档频率）方法，这是文本分类中最常用的加权方案。TF-IDF根据其逆文档频率和词频因素对特征应用加权。这意味着如果更多的推文出现，则该术语的重要性会降低，权重也会减少。TF-IDF可以用公式表示为：                                                                                                                   &#x20;

<figure><img src="https://content.gitbook.com/content/r2PyvL89MTgmGKhg3h05/blobs/h1fwPv3hgTpfdFFuiNQr/image.png" alt="" width="260"><figcaption><p>Fig 1</p></figcaption></figure>

其中，tf\_ij、N 和 n\_j 分别表示推文 𝑖 中术语 𝑗 的原始词频、数据集中推文的总数以及术语 𝑗 出现的推文数量。

**GPU并行计算架构与CUDA编程模型：**

CUDA是一种并行计算架构，可以利用NVIDIA的GPU强大计算能力显著提高计算性能。随着TESLA GPU架构的发展，NVIDIA证明了可以将GPU视为可编程的处理器。此前，GPU主要用于图形应用。对CUDA架构的研究表明，GPU在性能上优于CPU。这一差异的原因在于，GPU架构是为高并行度和高运算强度的操作而设计的，例如图形处理。与需要流控制的CPU操作相反，GPU旨在处理并行计算应用，如数据处理、图像处理、3D渲染和信号处理，这些操作通常包含重复的和算术密集的运算。如图2所示，GPU并行计算使得架构能够集中大量晶体管用于数据处理，而不是在CPU中用于缓存内存和流控制机制。多核GPU与通用多核CPU之间的性能差异主要源于这两种处理器的设计差异。与CPU相比，GPU拥有更多的算术逻辑单元（ALU，见图2），而且组件较少（例如缓存内存和流控制）。这对于获得执行并行算术运算所需的高算术运算能力和容量至关重要。GPU还允许在遵循SIMD（单指令多数据）编程的情况下，对不同数据元素执行相同的操作，并且GPU上的小型缓存内存能够控制应用所需的带宽。因此，对于尝试访问同一内存区域中的数据的线程，不必返回到动态随机存取内存（DRAM）。这样，对于在GPU上运行的任何具有可并行化功能的应用，结果获取速度都会更快。由于其易于管理的线程结构和可在GPU上使用的共享内存，CUDA非常有用且实用。此外，CUDA使得用C语言编写的CPU应用能够通过在图形处理器上使用多线程运行，因为它是一种基于C的并行编程语言。在这一方面，CUDA编程与NVIDIA GPU一起，还为非图形应用提供了充足的API。

<figure><img src="https://content.gitbook.com/content/r2PyvL89MTgmGKhg3h05/blobs/TatWYrKgqwymznDgiZyw/image.png" alt="" width="563"><figcaption><p>Fig 2. GPU allocates more transistors for data processing</p></figcaption></figure>

并行实现：k-NN算法采用并行方式实现。我们选择的主要原因如下：

• k-NN在机器学习算法中通常是最慢的算法，因为在计算复杂度或准确性方面，它往往优于其他知名分类器（如决策树、朴素贝叶斯等），特别是在文本分类方面。

• 与其他分类算法相比，该方法更适合并行运行，因为寻找最近邻可以独立计算。这个任务是k-NN中最耗时的部分。

实现其他分类器也是可能的，但每种算法都有其计算策略，并非所有算法都具有相同的并行化潜力。例如，与k-NN相比，以并行方式运行朴素贝叶斯算法可能与其串行执行相比不会产生显著的性能差异。因此，在本研究中，我们选择了k-NN算法，这是一个懒惰学习器，需要密集计算，特别是在文本分类中。由于距离计算是k-NN分类中最耗时的部分，我们使用距离计算内核进行并行计算。

K-近邻分类器：k-NN是一种基于样本距离（或相似度）的监督学习算法。这种方法的分类过程耗时，且估计最适合的k值很困难。K-NN分类器通过距离函数找到k个最近邻，并使用这些邻居的类别权重为测试样本分配类别。距离（如欧几里得距离、曼哈顿距离、明可夫斯基距离等）或相似度函数可能不同。然而，在K-NN分类器中通常使用欧几里得距离来确定最近邻。

设d0, dj ∈ k-NN(d0)和C分别表示测试样本、k个最近邻和类别集。然后，使用其k个最近邻的类别权重为测试样本分配类别的过程如公式(2)和(3)所示：

&#x20;                                                   ![](https://content.gitbook.com/content/r2PyvL89MTgmGKhg3h05/blobs/MYxpVJXNwze9oUSpXXqP/image.png)

<figure><img src="https://content.gitbook.com/content/r2PyvL89MTgmGKhg3h05/blobs/kponfCAHqBQxnHlLJu2S/image.png" alt="" width="375"><figcaption><p>The effect of pre-processing on TTF dataset</p></figcaption></figure>

\
在向量化过程中，经过前期验证的数据集通过所述的计算方法转换为向量形式。这个阶段需要大量的计算资源，图形处理单元（GPU）是维持数据持续向量转换的基础硬件。

如前一章所述，计算节点被指定执行这些向量化任务，从而确保数据集转换过程的完整性和准确性。需要特别注意的是，计算节点是基于许可制运行的，这意味着只有满足规定硬件标准的节点才被授权作为计算节点运行。这个前提条件保证了计算需求能以所需的性能效率得到满足。
