1、离散特征处理
B 站视频:https://player.bilibili.com/player.html?bvid=BV1pS4y1a7QT
1.1 离散特征
- 性别:男、女两种类别
- 国籍:中国、美国、印度等 200 个国家
- 英文单词:常见的英文单词有几万个
- 物品 ID:小红书有几亿篇笔记,每篇笔记有一个 ID
- 用户 ID:小红书有几亿个用户,每个用户有一个 ID
1.2 离散特征处理
离散特征的处理分为两步:
- 建立字典:将类别映射成序号
- eg. 以国籍特征为例,建立一个国家的字典:中国 → 1,美国 → 2,印度 → 3
- 向量化:将序号映射成向量
- one-hot 编码:将序号映射成高维稀疏向量(用于处理类别数量很小的离散特征的向量化)
- eg. 以国籍特征为例,假设有 200 个国家,每个国家被映射成一个 200 维的稀疏向量,序号对应位置的元素为 1,其余位置的元素都为 0
- embedding:将序号映射成低维稠密向量(当类别数量很大时,用 Embedding 方法向量化)
- eg. 以国籍特征为例,每个国家被映射成一个 8 维的稠密向量
- Word embedding
- 用户 ID embedding
- 物品 ID embedding
1.2.1 One-hot 编码
例 1:性别特征
- 性别:男、女两种类别
- 字典:男 → 1,女 → 2
- One-hot 编码:用 2 维向量表示性别
- 未知 → 0 →
[0, 0]
- 男 → 1 →
[1, 0]
- 女 → 2 →
[0, 1]
- 未知 → 0 →
例 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]
- 未知 → 0 →
One-hot 编码适用于:对于性别这样的离散特征,类别数量很小,可以直接用 one-hot 向量
One-hot 编码的局限:
- 例 1:自然语言处理(NLP)中,对单词做编码
- 英文有几万个常见单词
- 那么 one-hot 向量的维度是几万
- 例 2:推荐系统中,对物品 ID 做编码
- 小红书有几亿篇笔记
- 那么 one-hot 向量的维度是几亿
实践中通常不会用那么高维的向量。因此,类别数量太大时,通常不用 One-hot 编码
- 解决办法:Embedding 方法
1.2.2 Embedding(嵌入)
例 1:国籍的 Embedding
- 参数数量:向量维度 × 类别数量
- 设 embedding 得到的向量都是 4 维的
- 一共有 200 个国籍
- 则,参数数量 = 4 × 200 = 800
例 2:物品 ID 的 Embedding(任务是给用户推荐电影)
- 参数数量:向量维度 × 类别数量
- 设 embedding 向量的维度是 16
- 数据库里一共有 10000 部电影
- embedding 层的参数数量 = 16 × 10000 = 160000
- 下图中的每个点表示一部电影的 Embedding。如果训练的好,从物品的 embedding 可以看出物品的特点,比如:下图的右上角的点都是动画片,他们的距离比较近;下图的右下角的点都是间谍片,它们的距离也比较近;但是动画片和间谍片之间的距离就比较远
编程实现:TensorFlow、Pytorch 提供 embedding 层,在训练时会自动做反向传播
- 参数以矩阵的形式保存,矩阵的大小是 向量维度 × 类别数量
- 输入是序号,eg. 电影《阳光普照》的序号是 277
- 输出是向量,eg. 电影《阳光普照》对应参数矩阵第 277 列的列向量
- 即,Embedding 和 one-hot 编码的关系:Embedding = 参数矩阵 × One-hot 向量
- 因此,embedding 其实就是矩阵乘法,和全连接层非常像
- 问题:但如果推荐系统中的物品数量很大,比如达到几十亿,那么 embedding 层会很大,一个神经网络中绝大多数的参数都在 embedding 层。因此,工业界的深度学习系统都会对 embedding 层做很多优化,这是存储和计算效率的关键所在