[TensorFlow]Embedding Layer 和 GlobalAveragePooling1d Layer原理及作用

[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=313xi]
MaxPooling

改图片引用自知乎高分回答
该图引用了知乎高分回答,作者@G-kdom
在该图中,左边的图片被分成了四部分,每一部分取最大值,重新组成一个新的规模更小的二维数组。这样可以突出图片的关键特征,并降低数据规模,减少模型训练难度。

综上,GlobalAveragePooling1D 的作用就是对向量化的输入数据进行池化,来降低训练难度。

Embedding 的作用

简单说就是将输入的数据向量化,并计算不同的向量之间的coefficient,然后通过参数迭代使关系紧密的词汇向量靠在一起,实现一种聚类。

Embedding 的原理

其实Embedding的原理展开细说也没有什么必要,但是这里会简单说一下它的工作原理和学习过程。
Youtube博主 @TechwithTim 分享了自己的观点我认为很好理解,所以在这里我主要总结一下Tim的观点。
在此之前,先来理解Embedding将要收到的数据是什么样子。
对于序列化输入数据来说,有几个关键的元素:单元(unit)、句长(Sequence)、包(batch)。这里因为中文翻译的问题,有些说法可能不一致,但是重要的是理解其作用。单元是输入数据语料库中的最小单位,如文字中的词汇(vocabulary),乐谱中的音符(notations)。句长是每次输入到模型中的数据是由多少个单位组成的。关于如何组合句子,可以参考实例:XXX。(好吧,其实这个实例我还没写完,以后会更新的哈哈哈)包是指对总体样本进行的随机抽样。由于数据的样本规模大,每次都穷尽所有数据进行训练效率太低,但是如果分部分进行训练,无法得到总体的分布。所以,一种折中的方法就是,每次随机提取数据中的一部分数据,保证每一个抽样样本独立同分布,进行多次快速迭代,也就是minibatch方法。
所以序列模型的数据预处理一般是:

Created with Raphaël 2.3.0 原始数据 建立int2chart和chart2int映射表 确定句长 建立batch抽样函数 利用映射表将确定句长的输入数据转码,并输入到嵌入层 在编译中定义其他参数,如batch_size等 Embedding Layer

当数据到达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],idim_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=1nwixi=n1WX
等会,是不是和深度学习启蒙BP的 线性结构一样?确实除了平均和偏置,其余是一样的,这样就构成点到点的线性结构,就能够通过梯度下降来学习优化参数了(Ohhhhhhhhh!)
那么数据未进入模型之前就已经先上了学前班,在向量空间里找到了相似关系,进入模型后学习效果就会好很多。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值