[TensorFlow]Embedding Layer 和 Globalaveragepooling1d Layer原理及作用
前言
序列模型主要针对文字,音乐,语言等这种上下文关系比较强的输入数据进行分类、预测工作。但是这类数据有一个很值得关注的问题:不同的元素之间并不是孤立的,而是存在复杂关系的。比如,“我很好”,"我很棒"中,"棒"和"好"可能是意义相近的。再比如,主语之后一般会加谓语,这是一种上下文的关系,"一般会"表示两者关系接近。所以,如果在模型进行训练之前,将意义接近或者关系紧密的词进行再整理,将会极大方便模型进行训练和学习。为了达到这样的效果,Embedding Layer 和 Globalaveragepooling1d Layer 被加入到了TF的常用组件中。
GlobalAveragePooling1D 的作用和原理
首先Pooling的意义就是把不同的维度的数据整合成一个数据。根据整合的方法不同,有不同类型的Pooling算法。如:
AveragePooling
[
x
1
,
x
2
,
x
3
]
⟶
[
y
1
=
1
3
∑
3
x
i
]
[x_{1},x_{2},x_{3}] \longrightarrow [y_{1}=\frac{1}{3}\sum^{3}x_{i}]
[x1,x2,x3]⟶[y1=31∑3xi]
MaxPooling
该图引用了知乎高分回答,作者@G-kdom
在该图中,左边的图片被分成了四部分,每一部分取最大值,重新组成一个新的规模更小的二维数组。这样可以突出图片的关键特征,并降低数据规模,减少模型训练难度。
综上,GlobalAveragePooling1D 的作用就是对向量化的输入数据进行池化,来降低训练难度。
Embedding 的作用
简单说就是将输入的数据向量化,并计算不同的向量之间的coefficient,然后通过参数迭代使关系紧密的词汇向量靠在一起,实现一种聚类。
Embedding 的原理
其实Embedding的原理展开细说也没有什么必要,但是这里会简单说一下它的工作原理和学习过程。
Youtube博主 @TechwithTim 分享了自己的观点我认为很好理解,所以在这里我主要总结一下Tim的观点。
在此之前,先来理解Embedding将要收到的数据是什么样子。
对于序列化输入数据来说,有几个关键的元素:单元(unit)、句长(Sequence)、包(batch)。这里因为中文翻译的问题,有些说法可能不一致,但是重要的是理解其作用。单元是输入数据语料库中的最小单位,如文字中的词汇(vocabulary),乐谱中的音符(notations)。句长是每次输入到模型中的数据是由多少个单位组成的。关于如何组合句子,可以参考实例:XXX。(好吧,其实这个实例我还没写完,以后会更新的哈哈哈)包是指对总体样本进行的随机抽样。由于数据的样本规模大,每次都穷尽所有数据进行训练效率太低,但是如果分部分进行训练,无法得到总体的分布。所以,一种折中的方法就是,每次随机提取数据中的一部分数据,保证每一个抽样样本独立同分布,进行多次快速迭代,也就是minibatch方法。
所以序列模型的数据预处理一般是:
当数据到达embedding的时候,每一个数据是一个一维的由整型数构成的数组。定义embedding的两个重要的参数:语料库规模,词汇向量化维度:
emb_layer = tf.keras.layers.Embedding(vocal_size, dim_num)
然后句子中每一个词会被分解成dim_num个维度的向量。如
I
h
a
v
e
a
p
e
n
⟶
[
a
1
⃗
,
a
2
⃗
,
a
3
⃗
,
a
4
⃗
]
I have a pen\longrightarrow [\vec{a_1},\vec{a_2} ,\vec{a_3} ,\vec{a_4} ]
Ihaveapen⟶[a1,a2,a3,a4]
其中
a
1
⃗
=
[
x
1
,
x
2
,
.
.
.
x
i
]
,
i
⇐
d
i
m
_
n
u
m
\vec{a_1}=[x_1,x_2,...x_i],i\Leftarrow dim\_num
a1=[x1,x2,...xi],i⇐dim_num
如果给向量中各个维度加入可以被优化的参数,那么
a
1
⃗
\vec{a_1}
a1就可以被表示为:
a
1
⃗
^
=
a
1
⃗
⨀
w
1
⃗
=
[
w
1
x
1
,
w
2
x
2
.
.
.
w
i
x
i
]
\hat{\vec{a_1}}=\vec{a_1}\bigodot \vec{w_1} =[w_1 x_1, w_2 x_2...w_ix_i]
a1^=a1⨀w1=[w1x1,w2x2...wixi]
之后这样的新向量
a
1
⃗
^
\hat{\vec{a_1}}
a1^会被作为输出进入到GlobalAveragePooling1d Layer进行池化。而根据上文提到的GAPL(省事儿写的缩写)的原理,可以将数据变成一维的新输出,其实就是把
a
1
⃗
^
\hat{\vec{a_1}}
a1^各个维度数字加总平均了:
b
=
1
n
∑
i
=
1
n
w
i
x
i
=
1
n
W
X
b=\frac{1}{n}\sum^{n}_{i=1}w_ix_i=\frac{1}{n}WX
b=n1i=1∑nwixi=n1WX
等会,是不是和深度学习启蒙BP的 线性结构一样?确实除了平均和偏置,其余是一样的,这样就构成点到点的线性结构,就能够通过梯度下降来学习优化参数了(Ohhhhhhhhh!)
那么数据未进入模型之前就已经先上了学前班,在向量空间里找到了相似关系,进入模型后学习效果就会好很多。