1、离散特征处理

B 站视频:https://player.bilibili.com/player.html?bvid=BV1pS4y1a7QT

1.1 离散特征

  • 性别:男、女两种类别
  • 国籍:中国、美国、印度等 200 个国家
  • 英文单词:常见的英文单词有几万个
  • 物品 ID:小红书有几亿篇笔记,每篇笔记有一个 ID
  • 用户 ID:小红书有几亿个用户,每个用户有一个 ID

1.2 离散特征处理

离散特征的处理分为两步:

  1. 建立字典将类别映射成序号
  • eg. 以国籍特征为例,建立一个国家的字典:中国 → 1,美国 → 2,印度 → 3
  1. 向量化将序号映射成向量
    1. one-hot 编码:将序号映射成高维稀疏向量用于处理类别数量很小的离散特征的向量化
    • eg. 以国籍特征为例,假设有 200 个国家,每个国家被映射成一个 200 维的稀疏向量,序号对应位置的元素为 1,其余位置的元素都为 0
    1. embedding:将序号映射成低维稠密向量当类别数量很大时,用 Embedding 方法向量化
    • eg. 以国籍特征为例,每个国家被映射成一个 8 维的稠密向量
      1. Word embedding
      2. 用户 ID embedding
      3. 物品 ID embedding

1.2.1 One-hot 编码

例 1:性别特征

  • 性别:男、女两种类别
  • 字典:男 → 1,女 → 2
  • One-hot 编码:用 2 维向量表示性别
    • 未知 → 0 → [0, 0]
    • 男 → 1 → [1, 0]
    • 女 → 2 → [0, 1]

例 2:国籍特征

  • 国籍:中国、美国、印度等 200 种类别
  • 字典:中国 → 1,美国 → 2,印度 → 3,… …
  • One-hot 编码:用 200 维稀疏向量表示国籍
    • 未知 → 0 → [0, 0, 0, 0, ..., 0]
    • 中国 → 1 → [1, 0, 0, 0, ..., 0]
    • 美国 → 2 → [0, 1, 0, 0, ..., 0]
    • 印度 → 3 → [0, 0, 1, 0, ..., 0]

One-hot 编码适用于:对于性别这样的离散特征,类别数量很小,可以直接用 one-hot 向量

One-hot 编码的局限

  1. 例 1:自然语言处理(NLP)中,对单词做编码
  • 英文有几万个常见单词
  • 那么 one-hot 向量的维度是几万
  1. 例 2:推荐系统中,对物品 ID 做编码
  • 小红书有几亿篇笔记
  • 那么 one-hot 向量的维度是几亿

实践中通常不会用那么高维的向量。因此,类别数量太大时,通常不用 One-hot 编码

1.2.2 Embedding(嵌入)

例 1:国籍的 Embedding

  • 参数数量:向量维度 × 类别数量
    • 设 embedding 得到的向量都是 4 维的
    • 一共有 200 个国籍
    • 则,参数数量 = 4 × 200 = 800

image.png

例 2:物品 ID 的 Embedding(任务是给用户推荐电影)

  • 参数数量:向量维度 × 类别数量
    • 设 embedding 向量的维度是 16
    • 数据库里一共有 10000 部电影
    • embedding 层的参数数量 = 16 × 10000 = 160000
  • 下图中的每个点表示一部电影的 Embedding。如果训练的好,从物品的 embedding 可以看出物品的特点,比如:下图的右上角的点都是动画片,他们的距离比较近;下图的右下角的点都是间谍片,它们的距离也比较近;但是动画片和间谍片之间的距离就比较远

image.png

编程实现:TensorFlow、Pytorch 提供 embedding 层,在训练时会自动做反向传播

  • 参数以矩阵的形式保存,矩阵的大小是 向量维度 × 类别数量
  • 输入是序号,eg. 电影《阳光普照》的序号是 277
  • 输出是向量,eg. 电影《阳光普照》对应参数矩阵第 277 列的列向量
  • 即,Embedding 和 one-hot 编码的关系Embedding = 参数矩阵 × One-hot 向量
    • 因此,embedding 其实就是矩阵乘法,和全连接层非常像

image.png

  • 问题:但如果推荐系统中的物品数量很大,比如达到几十亿,那么 embedding 层会很大,一个神经网络中绝大多数的参数都在 embedding 层。因此,工业界的深度学习系统都会对 embedding 层做很多优化,这是存储和计算效率的关键所在