什么是 Embedding()

本文只是初步解释, 或者解释

Embedding(input_dim, 
               output_dim,  
               embeddings_initializer='uniform',  embeddings_regularizer=None, activity_regularizer=None, 		embeddings_constraint=None, mask_zero=False,   
               input_length=None)

中的 input_dim, output_dim, input_length.

令 S 为一集合 S, Embedding 为函数 f : S → R n f: \text{S} \to \R^n f:SRn, n 为手选参数. 从 S 中放回抽取 m 次, 按抽取顺序排成一序列.可类比从词典中选词组成句子.

input_dim : 集合 S 的大小,
output_dim : n
input_length : m 的最大值.

假定 S : = { v 0 , v 1 , ⋯   , v 9 } \text{S}:=\{v_0,v_1,\cdots, v_9\} S:={v0,v1,,v9}. 构作编号 f 1 ( v i ) = i f_1(v_i)=i f1(vi)=i.
选 n=4, m=2.

基本想法是 使用 one-hot 编码
f 2 ( i ) = [ 0 , 0 , ⋯   , 0 , 1 , 0 , ⋯   , 0 ] f_2(i)=[0,0, \cdots, 0, 1, 0,\cdots,0] f2(i)=[0,0,,0,1,0,,0]
这两个函数是确定好的,不产生参数.
每次输入为两个 元素, 例如 ( v 1 v 2 ) → f 2 f 1 ( 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) \left( \begin{array}{c} v_1 \\ v_2 \end{array} \right) \xrightarrow{f_2f_1} \left( \begin{array}{c} 1,0,0,0,0,0,0,0,0,0\\ 0,1,0,0,0,0,0,0,0,0\\ \end{array} \right) (v1v2)f2f1 (1,0,0,0,0,0,0,0,0,00,1,0,0,0,0,0,0,0,0)

即得到是 2 × 10 2 \times 10 2×10 的矩阵, 将之转换为 2 × 4 2 \times 4 2×4 的矩阵
转换需要的矩阵的规模是 10 × 4 10 \times 4 10×4. 也即是
参数为 40.
输出的矩阵大小为 2 × 4 2 \times 4 2×4.

此即表明. Embedding() 的
输入是 input_length 大小的向量,
输出是 input_length × \times × out_put 的张量,
需要学习的参数是 input_dim × \times × out_put.

这个只是讨论了一个样本的情况, 对多个样本, 实际是 l × \times × input_length 的形式. 通常使用 keras 中的 Input 函数 , Input(shape(input_length,))
Embedding 改写为 Embedding(input_dim, output_dim).
l 为样本数, 可用 l 个句子理解.
(Input(shape(input_length,)))

其他参数的解释超出了能力范围, 不清楚. 下面是代码, 可自行运行.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding
import numpy as np
model = Sequential()
embedding_layer = Embedding(input_dim=10,output_dim=4,input_length=2)
model.add(embedding_layer)
model.compile('adam','mse')
input_data = np.array([[1,2]])
pred = model.predict(input_data)
print(input_data.shape)
print(pred)

此处没有经过训练, 能出数据是因为 Embedding 自带了初值.

我在此说一下 embedding 层到底干了什么.

输入矩阵 为 X n × t X_{n \times t} Xn×t, 权重矩阵为 W t × m W_{t \times m} Wt×m, embedding后为
Y = X W Y=XW Y=XW.所以
Y i , j = ∑ k X i , k W k , j Y_{i,j}=\sum_k X_{i,k}W_{k,j} Yi,j=kXi,kWk,j
考虑矩阵 Y 的第 i 行, 其由 X 的第 i 行线性组合得到, 见下式.
Y i = ( Y i , 1 , Y i , 2 , ⋯   , Y i , m ) = ( ∑ k X i , k W k , 1 , ∑ k X i , k W k , 2 , ⋯   , ∑ k X i , k W k , m ) = ( X i , 1 , ⋯   , X i , t ) W \begin{aligned} Y_i& =(Y_{i,1},Y_{i,2}, \cdots, Y_{i,m} )\\ &=(\sum_k X_{i,k}W_{k,1},\sum_k X_{i,k}W_{k,2},\cdots,\sum_k X_{i,k}W_{k,m})\\ &=(X_{i,1},\cdots,X_{i,t})W \end{aligned} Yi=(Yi,1,Yi,2,,Yi,m)=(kXi,kWk,1,kXi,kWk,2,,kXi,kWk,m)=(Xi,1,,Xi,t)W

f : R n → R m f:\R^n \to \R^m f:RnRm, f ( x ) = x W f(x)=xW f(x)=xW. 即 f 是一个线性变换, 变换矩阵是 W.
Embdding(X):= ( f ( x 1 ) ⋮ f ( x n ) ) \left( \begin{array}{c} f(x_1)\\ \vdots\\ f(x_n) \end{array} \right) f(x1)f(xn), 即 f 逐行作用在向量 X 上.

综上 Embedding 在矩阵上的作用实质是 逐行在矩阵的各行独立进行的线性变换. 行与行之间互不干扰.

你可能感兴趣的:(深度学习,tensorflow,keras)