本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
BlazingText 算法
Amazon SageMaker BlazingText 算法提供了 Word2Vec 和文本分类算法的高度优化的实现。Word2vec 算法对很多下游自然语言处理 (NLP) 任务很有用,例如情感分析、命名实体识别、机器翻译等。对于执行 Web 搜索、信息检索、排名和文档分类的应用程序来说,文本分类是一项重要任务。
Word2vec 算法将单词映射到高质量的分布式向量。单词的结果向量表示被称为词嵌入。语义相似的单词对应于相近的向量。这样一来,词嵌入便能捕获单词之间的语义关系。
很多自然语言处理 (NLP) 应用程序通过对大量文档集进行训练来学习词嵌入。这些预训练的向量表示提供了有关语义和单词分布的信息,这些信息通常会改善稍后在更有限数量的数据上训练的其他模型的普遍性。Word2vec 算法的大多数实施未针对多核 CPU 架构进行优化。这使得难以扩展到大型数据集。
使用该 BlazingText 算法,您可以轻松扩展到大型数据集。与 Word2vec 类似,它提供 Skip-Gram 和连续 bag-of-words (CBOW) 训练架构。 BlazingText实现了监督式多类、多标签文本分类算法,将 FastText 文本分类器扩展为在自定义 CUDA 内核中使用 GPU 加速。
该 BlazingText 算法不可并行化。有关训练相关参数的更多信息,请参阅 SageMaker 内置算法的 Docker 注册表路径。
该 SageMaker BlazingText 算法提供以下功能:
-
使用高度优化的 CUDA 内核在多核 CPU 或 GPU 以及 GPU 上的 Word2Vec 上加速训练 fastText 文本分类器。有关更多信息,请参阅 BlazingText:使用多个 GPU 扩展和加速 Word2Vec
。 -
通过学习字符 n-grams 的向量表示,丰富了包含子词信息的词向量
。这种方法允许通过 BlazingText 将单词的向量表示为字符 n-gram out-of-vocabulary (子词)向量的总和,从而为(OOV)单词生成有意义的向量。 -
Word2Vec 算法的
batch_skipgram
mode
,它允许跨多个 CPU 节点进行更快的训练和分布式计算。batch_skipgram
mode
使用负采样共享策略进行小型批处理,将级别 1 BLAS 运算转换为级别 3 BLAS 运算。这有效地利用了现代架构的乘-加指令。有关更多信息,请参阅在共享和分布式内存中并行处理 Word2Vec。
总而言之,不同类型的实例支持以下模式: BlazingText
模式 |
Word2Vec (自主学习) |
文本分类 (指导式学习) |
---|---|---|
单 CPU 实例 |
|
|
单 GPU 实例(具有一个或多个 GPU) |
|
|
多个 CPU 实例 |
Batch Skip-gram |
无 |
有关背后数学的更多信息 BlazingText,请参阅 BlazingText:使用多个 GPU 缩放和加速 Word2Vec
算法的输入/输出接口 BlazingText
该 BlazingText 算法需要一个带有空格分隔标记的预处理文本文件。文件中的每一行都应包含一个句子。如果您需要训练多个文本文件,请将它们连接成一个文件并在相应的通道中上传该文件。
训练和验证数据格式
Word2Vec 算法的训练和验证数据格式
对于 Word2Vec 训练,在训练 通道下上传文件。不支持任何其他通道。文件中的每一行都应包含一个训练句子。
文本分类算法的训练和验证数据格式
对于指导式模式,您可以使用文件模式或增强清单文本格式进行训练。
使用文件模式进行训练
对于 supervised
模式,训练/验证文件应包含训练句子(一行一个)以及标签。标签是以字符串 __label__ 作为前缀的单词。以下是训练/验证文件的示例:
__label__4 linux ready for prime time , intel says , despite all the linux hype , the open-source movement has yet to make a huge splash in the desktop market . that may be about to change , thanks to chipmaking giant intel corp . __label__2 bowled by the slower one again , kolkata , november 14 the past caught up with sourav ganguly as the indian skippers return to international cricket was short lived .
注意
句子中标签的顺序无关紧要。
在训练通道下上传训练文件,并可以选择在验证通道下上传验证文件。
使用增强清单文本格式进行训练
适用于 CPU 实例的有监督式模式还支持增强清单格式,这使您能够在管道模式下进行训练,而无需创建 RecordIO 文件。在使用此格式时,需要生成一个包含句子及其相应标签的列表的 S3 清单文件。清单文件格式应为 JSON 行source
标签指定句子,并且可使用 label
标签指定标签。应在 AttributeNames
参数值下面提供 source
和 label
标签,如请求中指定。
{"source":"linux ready for prime time , intel says , despite all the linux hype", "label":1} {"source":"bowled by the slower one again , kolkata , november 14 the past caught up with sourav ganguly", "label":2}
也可以通过指定标签的 JSON 数组来支持多标签训练。
{"source":"linux ready for prime time , intel says , despite all the linux hype", "label": [1, 3]} {"source":"bowled by the slower one again , kolkata , november 14 the past caught up with sourav ganguly", "label": [2, 4, 5]}
有关增强清单文件的更多信息,请参阅用于训练作业的增强清单文件。
模型构件和推理
Word2Vec 算法的模型构件
对于 Word2Vec 训练,模型工件包括 vectors.txt(包含 words-to-vectors 映射)和 vectors.bin( BlazingText 用于托管、推断或两者兼而有之的二进制文件)。 vectors.txt 以与 Gensim 和 Spacy 等其他工具兼容的格式存储矢量。例如,Gensim 用户可以运行以下命令来加载 vectors.txt 文件:
from gensim.models import KeyedVectors word_vectors = KeyedVectors.load_word2vec_format('vectors.txt', binary=False) word_vectors.most_similar(positive=['woman', 'king'], negative=['man']) word_vectors.doesnt_match("breakfast cereal dinner lunch".split())
如果将评估参数设置为 True
,则会创建另一个文件 eval.json。此文件包含 WS-353 数据集的相似性评估结果(使用 Spearman 的秩相关系数)。报告训练语料库中不存在的 WS-353 数据集中的单词的数量。
对于推理请求,模型接受一个包含字符串列表的 JSON 文件,并返回一个向量列表。如果在词汇表中找不到该单词,则推理返回零向量。如果True
在训练期间将子词设置为,则模型能够为 out-of-vocabulary (OOV) 单词生成向量。
示例 JSON 请求
Mime 类型: application/json
{ "instances": ["word1", "word2", "word3"] }
文本分类算法的模型构件
使用受监督的输出进行训练会创建一个 model.bin 文件,该文件可供 BlazingText 托管使用。为了进行推理, BlazingText模型接受包含句子列表的 JSON 文件,并返回相应的预测标签和概率分数列表。每个句子都应是一个字符串,其中包含空格分隔的令牌和/或单词。
示例 JSON 请求
Mime 类型: application/json
{ "instances": ["the movie was excellent", "i did not like the plot ."] }
默认情况下,服务器仅返回一个预测,即概率最高的预测。要检索前 k 个预测,您可以在配置中设置 k,如下所示:
{ "instances": ["the movie was excellent", "i did not like the plot ."], "configuration": {"k": 2} }
对于 BlazingText, content-type
和accept
参数必须相等。对于批量转换,它们都需要是 application/jsonlines
。如果它们不同,则将忽略 Accept
字段。输入的格式如下:
content-type: application/jsonlines {"source": "source_0"} {"source": "source_1"} if you need to pass the value of k for top-k, then you can do it in the following way: {"source": "source_0", "k": 2} {"source": "source_1", "k": 3}
输出的格式如下:
accept: application/jsonlines {"prob": [prob_1], "label": ["__label__1"]} {"prob": [prob_1], "label": ["__label__1"]} If you have passed the value of k to be more than 1, then response will be in this format: {"prob": [prob_1, prob_2], "label": ["__label__1", "__label__2"]} {"prob": [prob_1, prob_2], "label": ["__label__1", "__label__2"]}
对于监督(文本分类)和无监督(Word2Vec)模式,FastText BlazingText 可以交叉使用生成的二进制文件(*.bin),反之亦然。你可以使用 FastText 生成的 BlazingText 二进制文件。同样,您可以使用托管使用 FastT BlazingText ext 创建的模型二进制文件。
以下是如何使用通过 FastText 生成的模型 BlazingText 的示例:
#Download the model artifact from S3 aws s3 cp s3://<YOUR_S3_BUCKET>/<PREFIX>/model.tar.gz model.tar.gz #Unzip the model archive tar -xzf model.tar.gz #Use the model archive with fastText fasttext predict ./model.bin test.txt
但是,仅在 CPU 和单 GPU 上训练时支持二进制文件;在多 GPU 上训练时不会生成二进制文件。
该 BlazingText算法的 EC2 实例推荐
对于cbow
和skipgram
模式, BlazingText 支持单 CPU 和单 GPU 实例。这两种模式都支持学习 subwords
嵌入。为了在不影响准确性的情况下实现最高速度,我们建议您使用 ml.p3.2xlarge 实例。
对于batch_skipgram
模式, BlazingText 支持单个或多个 CPU 实例。在多个实例上训练时,请设置传递CreateTrainingJob
给的S3DataSource
对象的S3DataDistributionType
字段值FullyReplicated
。 BlazingText负责在计算机之间分配数据。
对于指导式文本分类模式,如果训练数据集小于 2 GB,则建议使用 C5 实例。对于较大的数据集,请使用具有单个 GPU 的实例。 BlazingText 支持 P2、P3、G4dn 和 G5 实例进行训练和推理。
BlazingText 示例笔记本
有关训练和部署 SageMaker BlazingText 算法以生成词向量的示例笔记本,请参阅使用学习 Word2Vec 单词