tokenize(Tokenized)

科灵网 179 0

1. jieba中文处理

jieba是一个在中文自然语言处理中用的最多的工具包之一,它以分词起家,目前已经能够实现包括分词、词性标注以及命名实体识别等多种功能。既然Jieba是以分词起家,我们自然要首先学习Jieba的中文分词功能。Jieba提供了三种分词模式:

在jieba分词中,最常用的分词函数有两个,分别是 cut 和 cut_for_search ,分别对应于“精确模式/全模式”和“搜索引擎模式”。

当然,两者的输入参数也不一样,cut函数的输入主要有三个,分别是:

cut_for_search 函数主要有两个参数:

需要注意的是, cut 和 cut_for_search 返回的都是generator,如果想直接返回列表,需要使用 lcut 和 lcut_for_search

如果在一些特定场景中,需要使用一些特殊词汇进行分词,就需要加载自定义的分词词典:

其中,用户字典的格式为:

每一行表示一个单词,每行最多由三部分组成

如果只是少量词汇,可以使用

需要注意的是,如果没有给出词频和词性信息,在后续的处理中可能会造成一定的影响。

jieba提供了两种关键词提取算法,分别是TF-IDF以及TextRank

关于TF-IDF的原理,可以参考吴军老师的《数学之美》,里面给出了很详细的说明。本文只介绍利用TF-IDF算法提取关键词。

其中:

TextRank的用法与extract_tags的函数定义完全一致

词性标注主要是在分词的基础上,对词的词性进行判别,在jieba中可以使用如下方式进行:

在jieba中采用将目标文档按行分割,对每一行采用一个Python进程进行分词处理,然后将结果归并到一起(有点类似于MapReduce)。据说目前尚不支持Windows,仅支持Linux和MacOS。

启动并行分词使用如下命令:

关闭并行分词使用如下命令:

使用tokenize函数后,会获得一个词语信息的元组,元组中的第一个元素是分词得到的结果,第二个元素是词的起始位置,第三个元素是词的终止位置。

除了本文介绍的jieba分词工具包以外,还有很多好用的中文分词工具,比如

tokenize(Tokenized)-第1张图片-科灵网

怎么理解token,tokenize,tokenizer

1、一种解释

token:令牌

tokenize:令牌化

tokenizer:令牌解析器

2、另一种翻译是:token可以翻译为“标记”,tokenize可以翻译为“标记解析”或“解析标记”,tokenizer可以翻译为“标记解析器”。

在编写词法分析器(Lexer)或语法分析器(Parser)的时候,除了Lexer和Parser这两个词会经常使用外,tokenize和tokenizer也会经常出现,基本上所有涉及到词法解析的源码都会用到tokenize。

在邱仲潘译的《Mastering Java 2》有这儿一段:

StreamTokenizer类根据用户定义的规则,从输入流中提取可识别的子串和标记符号,这个过程称为令牌化 ([i]tokenizing[/i]),因为流简化为了令牌符号。令牌([i]token[/i])通常代表关键字、变量名、字符串、直接量和大括号等 语法标点。

Python文本处理工具都有哪些?

1、 NLTK — Natural Language Toolkit

搞自然语言处理的同学应该没有人不知道NLTK吧,这儿也就不多说了。不过引荐两本书籍给刚刚触摸NLTK或许需求具体了解NLTK的同学: 一个是官方的《Natural Language Processing with Python》,以介绍NLTK里的功用用法为主,一起附带一些Python常识,一起国内陈涛同学友情翻译了一个中文版,这儿可以看到:引荐《用Python进行自然语言处理》中文翻译-NLTK配套书;另外一本是《Python Text Processing with NLTK 2.0 Cookbook》,这本书要深入一些,会涉及到NLTK的代码结构,一起会介绍怎么定制自己的语料和模型等,相当不错。

2、 Pattern

Pattern由比利时安特卫普大学CLiPS实验室出品,客观的说,Pattern不仅仅是一套文本处理东西,它更是一套web数据挖掘东西,囊括了数据抓取模块(包含Google, Twitter, 维基百科的API,以及爬虫和HTML剖析器),文本处理模块(词性标示,情感剖析等),机器学习模块(VSM, 聚类,SVM)以及可视化模块等,可以说,Pattern的这一整套逻辑也是这篇文章的组织逻辑,不过这儿我们暂时把Pattern放到文本处理部分。我个人首要使用的是它的英文处理模块Pattern.en, 有许多很不错的文本处理功用,包含基础的tokenize, 词性标示,语句切分,语法检查,拼写纠错,情感剖析,句法剖析等,相当不错。

3、 TextBlob: Simplified Text Processing

TextBlob是一个很有意思的Python文本处理东西包,它其实是根据上面两个Python东西包NLKT和Pattern做了封装(TextBlob stands on the giant shoulders of NLTK and pattern, and plays nicely with both),一起供给了许多文本处理功用的接口,包含词性标示,名词短语提取,情感剖析,文本分类,拼写检查等,甚至包含翻译和语言检测,不过这个是根据Google的API的,有调用次数约束。

4、 MBSP for Python

MBSP与Pattern同源,同出自比利时安特卫普大学CLiPS实验室,供给了Word Tokenization, 语句切分,词性标示,Chunking, Lemmatization,句法剖析等根本的文本处理功用,感兴趣的同学可以重视。

关于 Python文本处理工具都有哪些,环球青藤小编就和大家分享到这里了,学习是永无止境的,学习一项技能更是受益终身,所以,只要肯努力学,什么时候开始都不晚。如果您还想继续了解关于python编程的学习方法及素材等内容,可以点击本站其他文章学习。

【TODO】【scikit-learn翻译】4.2.3Text feature extraction

Text Analysis is a major application field for machine learning algorithms. However the raw data, a sequence of symbols cannot be fed directly to the algorithms themselves as most of them expect numerical feature vectors with a fixed size rather than the raw text documents with variable length.

文本分析是机器学习算法的主要应用领域。 然而,原始数据,符号文字序列不能直接传递给算法,因为它们大多数要求具有固定长度的数字矩阵特征向量,而不是具有可变长度的原始文本文档。

In order to address this, scikit-learn provides utilities for the most common ways to extract numerical features from text content, namely:

为解决这个问题,scikit-learn提供了从文本内容中提取数字特征的最常见方法,即:

In this scheme, features and samples are defined as follows:

在该方案中,特征和样本定义如下:

A corpus of documents can thus be represented by a matrix with one row per document and one column per token (e.g. word) occurring in the corpus.

因此,文本的集合可被表示为矩阵形式,每行对应一条文本,每列对应每个文本中出现的词令牌(如单个词)。

We call vectorization the general process of turning a collection of text documents into numerical feature vectors. This specific strategy (tokenization, counting and normalization) is called the Bag of Words or “Bag of n-grams” representation. Documents are described by word occurrences while completely ignoring the relative position information of the words in the document.

我们称 向量化 是将文本文档集合转换为数字集合特征向量的普通方法。 这种特殊思想(令牌化,计数和归一化)被称为 Bag of Words 或 “Bag of n-grams” 模型。 文档由单词出现来描述,同时完全忽略文档中单词的相对位置信息。

As most documents will typically use a very small subset of the words used in the corpus, the resulting matrix will have many feature values that are zeros (typically more than 99% of them).

由于大多数文本文档通常只使用文本词向量全集中的一个小子集,所以得到的矩阵将具有许多特征值为零(通常大于99%)。

For instance a collection of 10,000 short text documents (such as emails) will use a vocabulary with a size in the order of 100,000 unique words in total while each document will use 100 to 1000 unique words individually.

例如,10,000 个短文本文档(如电子邮件)的集合将使用总共100,000个独特词的大小的词汇,而每个文档将单独使用100到1000个独特的单词。

In order to be able to store such a matrix in memory but also to speed up algebraic operations matrix / vector, implementations will typically use a sparse representation such as the implementations available in the scipy.sparse package.

为了能够将这样的矩阵存储在存储器中,并且还可以加速代数的矩阵/向量运算,实现通常将使用诸如 scipy.sparse 包中的稀疏实现。

CountVectorizer implements both tokenization and occurrence counting in a single class:

类 CountVectorizer 在单个类中实现了 tokenization (词语切分)和 occurrence counting (出现频数统计):

This model has many parameters, however the default values are quite reasonable (please see the reference documentation for the details):

这个模型有很多参数,但参数的默认初始值是相当合理的(请参阅 参考文档 了解详细信息):

Let’s use it to tokenize and count the word occurrences of a minimalistic corpus of text documents:

我们用它来对简约的文本语料库进行 tokenize(分词)和统计单词出现频数:

The default configuration tokenizes the string by extracting words of at least 2 letters. The specific function that does this step can be requested explicitly:

默认配置通过提取至少 2 个字母的单词来对 string 进行分词。做这一步的函数可以显式地被调用:

Each term found by the analyzer during the fit is assigned a unique integer index corresponding to a column in the resulting matrix. This interpretation of the columns can be retrieved as follows:

analyzer 在拟合过程中找到的每个 term(项)都会被分配一个唯一的整数索引,对应于 resulting matrix(结果矩阵)中的一列。此列的一些说明可以被检索如下:

The converse mapping from feature name to column index is stored in the vocabulary_ attribute of the vectorizer:

从 feature 名称到 column index(列索引) 的逆映射存储在 vocabulary_ 属性中:

Hence words that were not seen in the training corpus will be completely ignored in future calls to the transform method:

因此,在未来对 transform 方法的调用中,在 training corpus (训练语料库)中没有看到的单词将被完全忽略:

Note that in the previous corpus, the first and the last documents have exactly the same words hence are encoded in equal vectors. In particular we lose the information that the last document is an interrogative form. To preserve some of the local ordering information we can extract 2-grams of words in addition to the 1-grams (individual words):

请注意,在前面的 corpus(语料库)中,第一个和最后一个文档具有完全相同的词,因为被编码成相同的向量。 特别是我们丢失了最后一个文件是一个疑问的形式的信息。为了防止词组顺序颠倒,除了提取一元模型 1-grams(个别词)之外,我们还可以提取 2-grams 的单词:

The vocabulary extracted by this vectorizer is hence much bigger and can now resolve ambiguities encoded in local positioning patterns:

由 vectorizer(向量化器)提取的 vocabulary(词汇)因此会变得更大,同时可以在定位模式时消除歧义:

In particular the interrogative form “Is this” is only present in the last document:

特别是 “Is this” 的疑问形式只出现在最后一个文档中:

In a large text corpus, some words will be very present (e.g. “the”, “a”, “is” in English) hence carrying very little meaningful information about the actual contents of the document. If we were to feed the direct count data directly to a classifier those very frequent terms would shadow the frequencies of rarer yet more interesting terms.

在一个大的文本语料库中,一些单词将出现很多次(例如 “the”, “a”, “is” 是英文),因此对文档的实际内容没有什么有意义的信息。 如果我们将直接计数数据直接提供给分类器,那么这些频繁词组会掩盖住那些我们关注但很少出现的词。

In order to re-weight the count features into floating point values suitable for usage by a classifier it is very common to use the tf–idf transform.

为了为了重新计算特征权重,并将其转化为适合分类器使用的浮点值,因此使用 tf-idf 变换是非常常见的。

Tf means term-frequency while tf–idf means term-frequency times inverse document-frequency :

Using the TfidfTransformer ’s default settings, TfidfTransformer(norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False) the term frequency, the number of times a term occurs in a given document, is multiplied with idf component, which is computed as

,

where is the total number of documents, and

is the number of documents that contain term . The resulting tf-idf vectors are then normalized by the Euclidean norm:

.

Tf表示 词频 ,而 tf-idf 表示术语频率乘以 逆文档频率 :

使用 TfidfTransformer 的默认设置, TfidfTransformer(norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False) 词频即一个词在给定文档中出现的次数,乘以 idf 即通过 计算,

其中 是文档的总数, 是包含词 的文档数。 然后,所得到的tf-idf向量通过欧几里得范数归一化:

.

This was originally a term weighting scheme developed for information retrieval (as a ranking function for search engines results) that has also found good use in document classification and clustering.

The following sections contain further explanations and examples that illustrate how the tf-idfs are computed exactly and how the tf-idfs computed in scikit-learn’s TfidfTransformer and TfidfVectorizer differ slightly from the standard textbook notation that defines the idf as

In the TfidfTransformer and TfidfVectorizer with smooth_idf=False , the “1” count is added to the idf instead of the idf’s denominator:

它源于一个词权重的信息检索方式(作为搜索引擎结果的评级函数),同时也在文档分类和聚类中表现良好。

以下部分包含进一步说明和示例,说明如何精确计算 tf-idfs 以及如何在 scikit-learn 中计算 tf-idfs, TfidfTransformer 并 TfidfVectorizer 与定义 idf 的标准教科书符号略有不同

在 TfidfTransformer 和 TfidfVectorizer 中 smooth_idf=False ,将 “1” 计数添加到 idf 而不是 idf 的分母:

This normalization is implemented by the TfidfTransformer class:

该归一化由类 TfidfTransformer 实现:

Again please see the reference documentation for the details on all the parameters.

有关所有参数的详细信息,请参阅 参考文档 。

Let’s take an example with the following counts. The first term is present 100% of the time hence not very interesting. The two other features only in less than 50% of the time hence probably more representative of the content of the documents:

让我们以下方的词频为例。第一个次在任何时间都是100%出现,因此不是很有重要。另外两个特征只占不到50%的比例,因此可能更具有代表性:

Each row is normalized to have unit Euclidean norm:

For example, we can compute the tf-idf of the first term in the first document in the cite style="font-style: normal;"counts/cite array as follows:

Now, if we repeat this computation for the remaining 2 terms in the document, we get

and the vector of raw tf-idfs:

Then, applying the Euclidean (L2) norm, we obtain the following tf-idfs for document 1:

Furthermore, the default parameter smooth_idf=True adds “1” to the numerator and denominator as if an extra document was seen containing every term in the collection exactly once, which prevents zero divisions:

Using this modification, the tf-idf of the third term in document 1 changes to 1.8473:

And the L2-normalized tf-idf changes to

:

每行都被正则化,使其适应欧几里得标准:

例如,我们可以计算 计数 数组中第一个文档中第一个项的 tf-idf ,如下所示:

现在,如果我们对文档中剩下的2个术语重复这个计算,我们得到:

和原始 tf-idfs 的向量:

然后,应用欧几里德(L2)规范,我们获得文档1的以下 tf-idfs:

此外,默认参数 smooth_idf=True 将 “1” 添加到分子和分母,就好像一个额外的文档被看到一样包含集合中的每个术语,这样可以避免零分割:

使用此修改,文档1中第三项的 tf-idf 更改为 1.8473:

而 L2 标准化的 tf-idf 变为

:

The weights of each feature computed by the fit method call are stored in a model attribute:

通过 fit 方法调用计算出的每个特征的权重存储在模型属性中:

As tf–idf is very often used for text features, there is also another class called TfidfVectorizer that combines all the options of CountVectorizer and TfidfTransformer in a single model:

由于 tf-idf 经常用于文本特征,所以还有一个类 TfidfVectorizer ,它将 CountVectorizer 和 TfidfTransformer 的所有选项组合在一个单例模型中:

While the tf–idf normalization is often very useful, there might be cases where the binary occurrence markers might offer better features. This can be achieved by using the binary parameter of CountVectorizer . In particular, some estimators such as Bernoulli Naive Bayes explicitly model discrete boolean random variables. Also, very short texts are likely to have noisy tf–idf values while the binary occurrence info is more stable.

虽然tf-idf标准化通常非常有用,但是可能有一种情况是二元变量显示会提供更好的特征。 这可以使用类 CountVectorizer 的 二进制 参数来实现。 特别地,一些估计器,诸如 伯努利朴素贝叶斯 显式的使用离散的布尔随机变量。 而且,非常短的文本很可能影响 tf-idf 值,而二进制出现信息更稳定。

As usual the best way to adjust the feature extraction parameters is to use a cross-validated grid search, for instance by pipelining the feature extractor with a classifier:

通常情况下,调整特征提取参数的最佳方法是使用基于网格搜索的交叉验证,例如通过将特征提取器与分类器进行流水线化:

Text is made of characters, but files are made of bytes. These bytes represent characters according to some encoding . To work with text files in Python, their bytes must be decoded to a character set called Unicode. Common encodings are ASCII, Latin-1 (Western Europe), KOI8-R (Russian) and the universal encodings UTF-8 and UTF-16. Many others exist.

Note

An encoding can also be called a ‘character set’, but this term is less accurate: several encodings can exist for a single character set.

The text feature extractors in scikit-learn know how to decode text files, but only if you tell them what encoding the files are in. The CountVectorizer takes an encoding parameter for this purpose. For modern text files, the correct encoding is probably UTF-8, which is therefore the default ( encoding="utf-8" ).

If the text you are loading is not actually encoded with UTF-8, however, you will get a UnicodeDecodeError . The vectorizers can be told to be silent about decoding errors by setting the decode_error parameter to either "ignore" or "replace" . See the documentation for the Python function bytes.decode for more details (type help(bytes.decode) at the Python prompt).

If you are having trouble decoding text, here are some things to try:

For example, the following snippet uses chardet (not shipped with scikit-learn, must be installed separately) to figure out the encoding of three texts. It then vectorizes the texts and prints the learned vocabulary. The output is not shown here.

pre style="padding: 5px 10px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 13px; color: rgb(34, 34, 34); border-radius: 4px; display: block; margin: 0.1em 0px 0.5em; line-height: 1.2em; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgb(248, 248, 248); border: 1px solid rgb(221, 221, 221); overflow: auto hidden;" import chardet

(Depending on the version of chardet , it might get the first one wrong.)

For an introduction to Unicode and character encodings in general, see Joel Spolsky’s Absolute Minimum Every Software Developer Must Know About Unicode .

怎么转换Tokenize这个函数

一、NLTK进行分词 用到的函数: nltk.sent_tokenize(text) #对文本按照句子进行分割 nltk.word_tokenize(sent) #对句子进行分词 二、NLTK进行词性标注 用到的函数: nltk.pos_tag(tokens)#tokens是句子分词后的结果,同样是句子级的标注

《Attention Is All You Need》算法详解

该篇文章右谷歌大脑团队在17年提出,目的是解决对于NLP中使用RNN不能并行计算(详情参考 《【译】理解LSTM(通俗易懂版)》 ),从而导致算法效率低的问题。该篇文章中的模型就是近几年大家到处可以听到的Transformer模型。

由于该文章提出是解决NLP(Nature Language Processing)中的任务,例如文章实验是在翻译任务上做的。为了CV同学更好的理解,先简单介绍一下NLP任务的一个工作流程,来理解模型的输入和输出是什么。

首先拿CV中的分类任务来说,训练前我们会有以下几个常见步骤:

所以对于分类任务来说,模型的输入为预处理过的图片,输出为图片的类别(一般为预测的向量,然后求argmax获得类别)。

在介绍NLP任务预处理流程前,先解释两个词,一个是tokenize,一个是embedding。

tokenize 是把文本切分成一个字符串序列,可以暂且简单的理解为对输入的文本进行分词操作。对英文来说分词操作输出一个一个的单词,对中文来说分词操作输出一个一个的字。(实际的分词操作多有种方式,会复杂一点,这里说的只是一种分词方式,姑且这么定,方便下面的理解。)

embedding 是可以简单理解为通过某种方式将词向量化,即输入一个词输出该词对应的一个向量。(embedding可以采用训练好的模型如GLOVE等进行处理,也可以直接利用深度学习模型直接学习一个embedding层,Transformer模型的embedding方式是第二种,即自己去学习的一个embedding层。)

在NLP中,拿翻译任务(英文翻译为中文)来说,训练模型前存在下面步骤:

所以对于翻译任务来说,翻译模型的输入为句子每个词的one-hot向量或者embedding后的向量(取决于embedding是否是翻译模型自己学习的,如果是则输入one-hot就可以了,如果不是那么输入就是通过别的模型获得的embedding向量)组成的序列,输出为当前预测词的类别(一般为词表大小维度的向量)

知道了Transformer模型的输入和输出后,下面来介绍一下Transformer模型的结构。

先来看看Transformer的整体结构,如下图所示:

可以看出它是一个典型的seq2seq结构(encoder-decoder结构),Encoder里面有N个重复的block结构,Decoder里面也有N个重复的block结构。

可以注意到这里的embedding操作是与翻译模型一起学习的。所以Transformer模型的输入为对句子分词后,每个词的one-hot向量组成的一个向量序列,输出为预测的每个词的预测向量。

为了更好的利用序列的位置信息,在对embedding后的向量加上位置相关的编码。文章采用的是人工预设的方式计算出来的编码。计算方式如下

上式中,pos表示当前词在句子中的位置,例如输入的序列长L=5,那么pos取值分别为0-4,i表示维度的位置,偶数位置用 公式计算, 奇数位置用 公式计算。

文章也采用了加入模型训练来自动学习位置编码的方式,发现效果与人工预设方式差不多。

Encoder包含了N个重复的block结构,文章N=6。下面来拆解一个每个块的具体结构。

为了便于理解,介绍Multi-Head Attention结构前,先介绍一下基础的Scaled Dot-Product Attention结构,该结构是Transformer的核心结构。

Scaled Dot-Product Attention结构如下图所示

Scaled Dot-Product Attention模块用公式表示如下

上式中,可以假设Q\K的维度皆为 ,V的维度为 ,L为输入的句子长度, 为特征维度。

得到的维度为 ,该张量可以理解为计算Q与K中向量两两间的相似度或者说是模型应该着重关注(attention)的地方。这里还除了 ,文章解释是防止维度 太大得到的值就会太大,导致后续的导数会太小。(这里为什么一定要除 而不是 或者其它数值,文章没有给出解释。)

经过 获得attention权重后,与V相乘,既可以得到attention后的张量信息。最终的 输出维度为

这里还可以看到在Scaled Dot-Product Attention模块中还存在一个可选的Mask模块(Mask(opt.)),后续会介绍它的作用。

文章认为采用多头(Multi-Head)机制有利于模型的性能提高,所以文章引入了Multi-Head Attention结构。

Multi-Head Attention结构如下图所示

Multi-Head Attention结构用公式表示如下

上述参数矩阵为 , , , 。 为multi-head attention模块输入与输出张量的通道维度,h为head个数。文中h=8, ,

关于multi-head机制为什么可以提高模型性能

文章末尾给出了多头中其中两个头的attention可视化结果,如下所示

图中,线条越粗表示attention的权重越大,可以看出,两个头关注的地方不一样,绿色图说明该头更关注全局信息,红色图说明该头更关注局部信息。

从结构图不难看出网络加入了residual结构,所以add很好理解,就是输入张量与输出张量相加的操作。

Norm操作与CV常用的BN不太一样,这里采用NLP领域较常用的LN(Layer Norm)。(关于BN、LN、IN、GN的计算方式可以参考 《GN-Group Normalization》 )

还要多说一下的是,文章中共AddNorm结构是先相加再进行Norm操作。

该结构很简单,由两个全连接(或者kernel size为1的卷积)和一个ReLU激活单元组成。

Feed Forward结构用公式表示如下

Decoder同样也包含了N个重复的block结构,文章N=6。下面来拆解一个每个块的具体结构。

从名字可以看出它比2.3.1部分介绍的Multi-Head Attention结构多一个masked,其实它的基本结构如下图所示

可以看出这就是Scaled Dot-Product Attention,只是这里mask是启用的状态。

这里先从维度角度考虑mask是怎么工作的,然后再解释为什么要加这个mask操作。

mask工作方式

为了方便解释,先不考虑多batch和多head情况。

可以假设Q\K的维度皆为 ,V的维度为 。

那么在进行mask操作前,经过MatMul和Scale后得到的张量维度为 。

现在有一个提前计算好的mask为 ,M是一个上三角为-inf,下三角为0的方阵。如下图所示(图中假设L=5)。

的结果如下图所示(图中假设L=5)

注意:下图中的非0区域的值不一定是一样的,这里为了方便显示画成了一样的颜色

现在Scaled Dot-Product Attention的公式如下所示

可以看出经过M后,softmax在-inf处输出结果为0,其它地方为非0,所以softmax的输出为 ,该结果为上三角为0的方阵。与 进行相乘得到结果为 。

从上述运算可以看出mask的目的是为了让V与attention权重计算attention操作时只考虑当前元素以前的所有元素,而忽略之后元素的影响。即V的维度为 ,那么第i个元素只考虑0-i元素来得出attention的结果。

mask操作的作用

在解释mask作用之前,我们先解释一个概念叫 teacher forcing 。

teacher forcing这个操作方式经常在训练序列任务时被用到,它的含义是在训练一个序列预测模型时,模型的输入是ground truth。

举例来说,对于"I Love China - 我爱中国"这个翻译任务来说,测试阶段,Encoder会将输入英文编译为feature,Decoder解码时首先会收到一个BOS(Begin Of Sentence)标识,模型输出"我",然后将"我"作为decoder的输入,输出"爱",重复这个步骤直到输出EOS(End Of Sentence)标志。

但是为了能快速的训练一个效果好的网络,在训练时,不管decoder输出是什么,它的输入都是ground truth。例如,网络在收到BOS后,输出的是"你",那么下一步的网络输入依然还是使用gt中的"我"。这种训练方式称为teacher forcing。如下图所示

我们看下面两张图,第一张是没有mask操作时的示例图,第二张是有mask操作时的示例图。可以看到,按照teacher forcing的训练方式来训练Transformer,如果没有mask操作,模型在预测"我"这个词时,就会利用到"我爱中国"所有文字的信息,这不合理。所以需要加入mask,使得网络只能利用部分已知的信息来模拟推断阶段的流程。

decoder中的Multi-Head Attention内部结构与encoder是一模一样的,只是输入中的Q为2.4.1部分提到的Masked Multi-Head Attention的输出,输入中的K与V则都是encoder模块的输出。

下面用一张图来展示encoder和decoder之间的信息传递关系

decoder中AddNorm和Feed Forward结构都与encoder一模一样了。

1. 从图中看出encoder和decoder中每个block的输入都是一个张量,但是输入给attention确实Q\K\V三个张量?

对于block来说,Q=K=V=输入张量

2. 推断阶段,解码可以并行吗?

不可以,上面说的并行是采用了teacher forcing+mask的操作,是的训练可以并行计算。但是推断时的解码过程同RNN,都是通过auto-regression方式获得结果的。(当然也有non auto-regression方面的研究,就是一次估计出最终结果)

参考:

上述文章就是科灵网介绍的tokenize和Tokenized的详细回答,希望能够帮助到大家;如果你还想了解更多财经资讯知识,记得收藏关注我们。

标签: tokenize

抱歉,评论功能暂时关闭!

微信号已复制,请打开微信添加咨询详情!