赞
踩
传统词表示方法没有办法很好地处理未知或罕见的词汇。
WordPiece 和 BPE 是两种子词切分算法,两者非常相似。
WordPiece用于BERT,DistilBERT。
BPE使用RoBERTa。
BPE和WordPiece的区别在于如何选择两个子词进行合并
。
BPE的词表创建过程:
出现频率最高
的一组字符对加入词表中。反复2和3,直到词表大小达到指定大小。
WordPiece是贪心的最长匹配搜索算法。基本流程:
首先初始化词表,词表包含了训练数据中出现的所有字符。
2. 然后两两拼接字符,统计字符对加入词表后对语言模型的似然值的提升程度。
3. 选择提升语言模型似然值最大
的一组字符对加入词表中。
反复2和3,直到词表大小达到指定大小。
概率: 一件事发生的可能性
似然性:与概率相反,一件事已经发生,反推在什么情况下,这件事发生的概率最大
似然函数可以表示为:
互信息:可以看做一个随机变量中包含的关于另一个随机变量的信息量,或者说,一个随机变量由于已知另一个随机变量而减少的不确定性。
def tokenize(self, text): """Tokenizes a piece of text into its word pieces. This uses a greedy longest-match-first algorithm to perform tokenization using the given vocabulary. For example: input = "unaffable" output = ["un", "##aff", "##able"] Args: text: A single token or whitespace separated tokens. This should have already been passed through `BasicTokenizer`. Returns: A list of wordpiece tokens. """ def whitespace_tokenize(text): """Runs basic whitespace cleaning and splitting on a peice of text.""" text = text.strip() if not text: return [] tokens = text.split() return tokens output_tokens = [] for token in whitespace_tokenize(text): chars = list(token) if len(chars) > self.max_input_chars_per_word: #max_input_chars_per_word 默认为 100 output_tokens.append(self.unk_token) # 单词长度大于最大长度,用[UNK]表示单词 continue is_bad = False start = 0 sub_tokens = [] while start < len(chars): end = len(chars) cur_substr = None while start < end: # 贪心的最长匹配搜索 end从最后一位往前遍历,每移动一位,判断start:end是否存在于词表中 substr = "".join(chars[start:end]) if start > 0: # 若子词不是从位置0开始,前面要加“##” substr = "##" + substr if substr in self.vocab: cur_substr = substr break end -= 1 if cur_substr is None: #没有在词表中出现的子词,break is_bad = True break sub_tokens.append(cur_substr) start = end # 从上一子词的后一位开始下一轮遍历 if is_bad: #没有在词表中出现的子词(单词中的任何区域),用[unk]表示该词:比如“wordfi”,首先确定“word”为子词,后发现“fi”不存在在词表中,则最终用[UNK]表示“wordfi” output_tokens.append(self.unk_token) else: output_tokens.extend(sub_tokens) return output_tokens
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。