当前位置: 首页 > article >正文

手撸 chatgpt 大模型:详解 OpenAI 训练 gpt3 模型时使用的数据预处理算法:BPE

ChatGPT使用了另一种复杂的分词方案,叫做“字节对编码”(Byte Pair Encoding,简称BPE),最初这是一种数据压缩算法,让我们来看看它的过程。BPE在多次迭代中合并频繁使用的字符对。例如,给定字符串:

“low low low low low lower lower newest newest newest newest newest newest widest widest widest”

单词频率统计如下:

{ “low”: 5, “lower”: 2, “newest”: 6, “widest”: 3, }

现在,我们将单词拆分成字符,字符集将是初始词汇表: {l, o, w, e, r, n, s, t, i, d}

每个单词拆分成字符集合如下:

{ “l o w”: 5, “l o w e r”: 2, “n e w e s t”: 6, “w i d e s t”: 3, }

现在,我们来看每对相邻字符对。例如,“l o w”有两个相邻字符对“lo”和“ow”,由于“lo”出现在“l o w”和“l o w e r”中,前者的频率为5,后者的频率为2,那么字符对“lo”的频率为7。通过这种方式,我们得到以下统计:

{ “l o”: 7, “o w”: 7, “w e”: 8, “e r”: 2, “n e”: 6, “e w”: 6, “e s”: 9, “s t”: 9, “w i”: 3, “i d”: 3, “d e”: 3, }

现在我们可以看到最频繁的字符对是“e s”和“s t”,然后我们将“e s”合并为一个单位,命名为“es”,并将“es”添加到词汇表中: {l, o, w, e, r, n, s, t, i, d, es} 每个单词的字符集合变为:

{ “l o w”: 5, “l o w e r”: 2, “n e w es t”: 6, “w i d es t”: 3, }

此时最频繁的字符对是“es”和“t”,然后我们将它们合并为“est”,并将其添加到词汇表中: {l, o, w, e, r, n, s, t, i, d, es, est} 每个单词的字符集合变为:

{ “l o w”: 5, “l o w e r”: 2, “n e w est”: 6, “w i d est”: 3 }

这时最频繁的字符对是“l o”,我们将它们添加到词汇表中:

{l, o, w, e, r, n, s, t, i, d, es, est, lo}

单词集合为:

{ “lo w”: 5, “lo w e r”: 2, “n e w est”: 6, “w i d est”: 3 }

现在很容易看出,最频繁的字符对是“lo”和“w”,将它们合并并添加到词汇表中: {l, o, w, e, r, n, s, t, i, d, es, est, lo, low}

单词字符集合为: { “low”: 5, “low e r”: 2, “n e w est”: 6, “w i d est”: 3 }

通过这种方式,我们可以继续迭代,直到达到预设的次数或者词汇表达到预期的大小。接下来我们来看如何使用代码实现这个过程:

from collections import defaultdict
# 计算单词频率并将单词拆分成字符集合
def get_vocab(data):
  vocab = defaultdict(int)
  for word in data.split():
          vocab[' '.join(list(word))] += 1
  return vocab

vocab = get_vocab("low low low low low lower lower newest newest newest newest newest newest widest widest widest")
print(vocab)

运行上面的代码,我们得到以下结果:

defaultdict(<class 'int'>, {
   'l o w': 5, 'l o w e r': 2, 'n e w e s t': 6, 'w i d e s t': 3})

接下来我们可以计算相邻字符对的频率:

# 计算相邻字符对的频率
from collections import Counter
def get_stats(vocab):
  pairs = Counter()
  for word, freq in vocab.items(<

http://www.kler.cn/a/403243.html

相关文章:

  • windows的WSL Ubuntu子系统重置root或其他用户的密码
  • vue中mixin(混入)的使用
  • 一种程序结构设计json,多线程,避免数据竞争
  • ts: 定义一个对象接收后端返回对象数据,但是报错了有红色的红线为什么
  • 【代码随想录】贪心
  • TheadLocal出现的内存泄漏具体泄漏的是什么?弱引用在里面有什么作用?什么情景什么问题?
  • IDEA怎么定位java类所用maven依赖版本及引用位置
  • 自动化生成边界测试和极端情况测试用例
  • 如何用专线网络搭建亚马逊美国站
  • python基础之学生成绩管理系统
  • 编译安装 openssl-3.0.14
  • Hive分桶超详细!!!
  • vulfocus在线靶场:CVE-2018-7600 速通手册
  • STL序列式容器之slist
  • jenkins的安装(War包安装)
  • Python学习------第十天
  • Kadane 算法 详解
  • C++:类和对象
  • 使用MATLAB进行遗传算法设计
  • kafka是如何做到高效读写
  • 前端算法题
  • 前端基础的讲解-JS(14)
  • 【AIGC】ChatGPT提示词Prompt解析:情感分析,分手后还可以做朋友吗?
  • LTE Cat 1 无线通信模块 AT 指令使用
  • uni-app Vue3语法实现微信小程序样式穿透uview-plus框架
  • 第7章硬件测试-7.3 功能测试