1 Embedding
Embeding在自然语言处理中是十分重要而且常见的操作, 目的是把符号化的字符用数字表示便于计算机的处理, 同时具有一定的语义信息。比如, 假设英文词表有30000个词汇,当然最简单的办法是把这30000个词汇编号, 如0-29999, 这样也完成了数字化,但这个编号毫无语义信息, 编号的大小也没有什么意义, 因此简单的编号不是一个好的方案。One-Hot编码是一种可行的方案, 但是当词表非常大的时候(比如本例中的30000), One-Hot编码会非常稀疏, 也非常浪费计算和存储。Embedding就是一个用来进行语义表示的方法, 它把稀疏的信息嵌入到一个稠密的空间, 语义信息表示更加紧凑。比如Embedding可以把用One-Hot编码需要30000维压缩到1024维, 只用30000x1024大小就表示了原本需要30000x30000才能表达的语义编码。
其实更通俗一点说, Embedding就是一个投影的过程, 把稀疏的高维信息投影到密集的低维空间表示。
2 Fc
fc就是全连接层, 也是一个投影的过程。
其实Embedding与Fc并无什么关联, 只是因为都是类似于投影的操作, 导致初学者理解Embedding的时候会与Fc混淆。那么下面就说一下他们的区别吧:
Embedding本质上就是一个查找表,通过索引查找对应的词嵌入表示, 比如有一个30000x1024大小的查找表, 其中包含30000个字符的词嵌入表示, 每个字符用1024大小的向量表示。当然Embedding层也是可以训练的, 训练方式与fc层是一样的。比如30000个字符, 每个字符用1024维表示, Embedding层包含30000x1024个可训练参数, 训练完后这些参数就是最终需要的结果。 同样地输入维度是30000, 输出维度1024的fc也包含同样多个参数, 但是fc层的参数仅仅是个参数, 最终的输出还是1024维的。 或许正是因为在维度相同的时候他们的参数个数相同, 过程也类似才容易混淆吧。