# 入门 | 神经网络词嵌入：如何将《战争与和平》表示成一个向量？

1. 寻找嵌入空间中的最近邻。这可被用于基于用户兴趣或聚类类别来进行推荐；
2. 可作为机器学习模型的输入来学习监督式任务；
3. 可实现概念和类别之间的关系的可视化。

one-hot 编码的局限

one-hot 编码的类别变量的操作实际上是一种简单的嵌入，其中每个类别都被映射成了不同的向量。其过程是将离散的实体的每个观察都映射成由一定数量的 0 和单个 1 构成的向量，这个 1 指示了特定的类别。

one-hot 编码技术具有两大主要缺陷：

1. 对于高基数变量（即有很多特有类别的变量），变换得到的向量的维度将难以掌控。
2. 这种映射方式信息完全不充分：「近似」的类别在嵌入空间中并不处于相近的位置。

```# One Hot Encoding Categoricals
books = ["War and Peace", "Anna Karenina",
"The Hitchhiker's Guide to the Galaxy"]
books_encoded = [[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]
Similarity (dot product) between First and Second = 0
Similarity (dot product) between Second and Third = 0
Similarity (dot product) between First and Third = 0```

```# Idealized Representation of Embedding
books = ["War and Peace", "Anna Karenina",
"The Hitchhiker's Guide to the Galaxy"]
books_encoded_ideal = [[0.53,  0.85],
[0.60,  0.80],
[-0.78, -0.62]]
Similarity (dot product) between First and Second = 0.99
Similarity (dot product) between Second and Third = -0.94
Similarity (dot product) between First and Third = -0.97```

one-hot 编码的主要问题是其变换并不依赖于任何监督。通过在一个监督任务上使用神经网络来学习它们，我们可以对嵌入实现极大的提升。这些嵌入会构成网络的参数（权重），这些参数会得到调整以最小化在任务上的损失。所得到的嵌入向量是类别的表征，其中相似的任务（相对任务而言）的距离更近。

```# Both inputs are 1-dimensional
book = Input(name = 'book', shape = [1])

# Embedding the book (shape will be (None, 1, 50))
book_embedding = Embedding(name = 'book_embedding',
input_dim = len(book_index),
output_dim = embedding_size)(book)

# Embedding the link (shape will be (None, 1, 50))

# Merge the layers with a dot product along the second axis (shape will be (None, 1, 1))
merged = Dot(name = 'dot_product', normalize = True, axes = 2)([book_embedding, link_embedding])

# Reshape to be a single number (shape will be (None, 1))
merged = Reshape(target_shape = [1])(merged)

# Output neuron
out = Dense(1, activation = 'sigmoid')(merged)
model = Model(inputs = [book, link], outputs = out)

# Minimize binary cross entropy
model.compile(optimizer = 'Adam', loss = 'binary_crossentropy', metrics = ['accuracy'])```

```Books closest to War and Peace.
Book: War and Peace              Similarity: 1.0
Book: Anna Karenina              Similarity: 0.79
Book: The Master and Margarita   Similarity: 0.77
Book: Doctor Zhivago (novel)     Similarity: 0.76

（一个向量与其自身的余弦相似度肯定是 1.0）。经过一定的降维之后，我们可以得到下面的图像：

（TSNE 是一种流形学习技术，也就是说它会试图将高维数据映射成更低维度的流形，这个过程中会创建一个嵌入来维持数据中的局部结构。这基本上只在可视化时使用，因为其输出是随机的，不支持转换成新数据。另一种正在迅猛发展的新方法是统一流形近似和投影/UMAP，它的速度要快得多，而且也支持转换成嵌入空间中的新数据。）

• TensorFlow 的嵌入指南：https://www.tensorflow.org/guide/embedding
• 使用嵌入的书籍推荐系统：https://github.com/WillKoehrsen/wikipedia-data-science/blob/master/notebooks/Book%20Recommendation%20System.ipynb
• Keras 词嵌入教程：https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/

0 条评论

## 相关文章

3547

### 业界 | 4分钟训练ImageNet！腾讯机智创造AI训练世界纪录

2018年6月25日，OpenAI在其Dota2 5v5中取得一定成绩后介绍，其在训练中batch size取100W，而1v1的训练batch size更是达...

1453

2895

1222

2543

3428

### Conway生命游戏

1970年，英国数学家Conway发明了生命游戏。抛开元胞自动机的复杂概念，我们只是去感受一下二维的生命游戏，这其实是元胞自动机的一个特例。

2081

1998

913

### 图解神经网络机器翻译原理：LSTM、seq2seq到Zero-Shot

【新智元导读】这篇刊登在 blog.statsbot.co 上的博文，通过对 LSTM、BRNN、seq2seq、Zero-Shot Translation 和...

40310