14.6.2 字节对编码

' '.join(list(token))是将token中的每个元素用空格给连接起来。比如' '.join(['f', 'a', 's', 't', '_']) → 'f a s t _'

split()函数的默认行为是按照任意空白字符(包括空格、制表符、换行符等)进行分割,并且会自动处理连续的空格和前导/尾随空格

拓展一下max函数。如果参数key其实就是类似于sortcmp。现在我们传入了一个字典,那么字典进行排序的方式是很多的,我们现在就要指定一个排序方式。key就是传入一个函数,然后以这个函数作为比较方式,这里就相当于获得最大的pairs键了。这里传入的是一个字典,注意返回的是字典的键,而不是值

我们为什么要使用BPE呢?除了书上说的几种情况,还有如下
我们构建的tokenizer是包含一个<UNK>的,我们没见过的词都嵌入到<UNK>中,如下
image
这看起来不是很好,因为我们没见过的词不仅包含不在预训练词表中的,还包含图中所说的几种情况:变种(taaaaasty,可能是某一位网友故意这么打来强调美味),拼写错误和新单词
还有一种情形就是书上说的同一动词的不同形式,如果我们要对所有形式都进行编码,显然会增加很多复杂度
那么字节对编码就可以尝试解决这个问题,如下
image
对于前两个词,由于太常见了,我们在编码的时候就把他们两个合成出来了,所以编码器可以直接对整个词进行编码;对于后面的三个词,我们将每个词拆开,去分析词的一部分,每个部分都可以得到编码,这个样子就可以得到更好的分析(而不是像之前一样所有词全部编码为一个<UNK>)。那么我们最后如何将每一个部分整合起来呢?取决于具体的任务,可以拼接,也可以求平均

讲座中提到一点,我们尽量不要去处理原始数据,也就是说一些标点符号,连字符等等都要对其进行编码
还有一个人提到了一个问题,以上面图中的"Transformerity"分成"Transformer"和"ify",那么为什么"ify"不拆分为"i"和"fy"呢?一般来说,我们认为拆分的数量越少越好(见《动手学深度学习》对应内容的segment_BPE函数)

posted @ 2025-03-02 14:57  最爱丁珰  阅读(9)  评论(0)    收藏  举报