AI课堂开讲,就差你了!
很多人说,看了再多的文章,可是没有人手把手地教授,还是很难真正地入门AI。为了将AI知识体系以最简单的方式呈现给你,从这个星期开始,芯君邀请AI专业人士开设“周末学习课堂”——每周就AI学习中的一个重点问题进行深度分析,课程会分为理论篇和代码篇,理论与实操,一个都不能少!
来,退出让你废寝忘食的游戏页面,取消只有胡吃海塞的周末聚会吧。未来你与同龄人的差异,也许就从每周末的这堂AI课开启了!
全文共2358字,预计学习时长5分钟
one-hot encoding的意义
无论是统计学习还是深度学习,学习器能处理的也只是数值。样本的特征都用向量或者二阶张量来描述,样本的target用标量或者向量来描述。
截止目前为止,我们所接触到的数据都是数值型的,并不涉及如何把一个样本量化。有些样本天然就具备着数值条件,比如图片,RGB的每个像素点都是一个三维的向量,向量的元素代表三个通道在这个点的强弱。如果本身就不是数值化的,比如猫狗的图片分类,猫和狗作为target很难量化,但我们可以给其分别赋值为0,1。
如果是多分类问题,并且我们使用交叉熵作为Loss,那么就不能采用单一的数值,因为在进行距离度量的时候,编号为0的类别会比编号为9的类别距离编号为1的更近,更近就代表着他们是更相似的,这是不合理的。取而代之,我们采用one-hot编码将一个类别映射为彼此正交的归一化向量,每个类别距离都相同,再使用交叉熵就变得合理。
如图,我们将0,1,2,3采用one-hot encoding,映射为向量,对象的个数决定了向量的维数,彼此正交,我们使用向量之间的相似度的时候,只要在欧几里得空间内,会发现几乎全部的距离度量方法会给出相同的距离。
Bag of words 和tf-idf
当我们面对文本这类数据,每一个词都可以进行one-hot encoding。我们可以想象一个巨大的词典,每一个词都可以在这个词典中找到位置,比如我们的字典是:
"John","Mary","likes","to","watch","movies","too","also","football","games"
这个字典只包含10个词汇,我们对每一个词汇进行one-hot encoidng,就会变为:
"John": [1,0,0,0,0,0,0,0,0,0]
"Mary": [0,1,0,0,0,0,0,0,0,0]
"likes": [0,0,1,0,0,0,0,0,0,0]
"to": [0,0,0,1,0,0,0,0,0,0]
"watch": [0,0,0,0,1,0,0,0,0,0]
"movies": [0,0,0,0,0,1,0,0,0,0]
"too": [0,0,0,0,0,0,1,0,0,0]
"also": [0,0,0,0,0,0,0,1,0,0]
"football":[0,0,0,0,0,0,0,0,1,0]
"games": [0,0,0,0,0,0,0,0,0,1]
我们得到了词的表示,由词组成的句子就可以在其基础上表示为向量,该向量的维数仍然是字典的长度,如果出现了相同的词,那么就在该词的维度上添加数值。比如,我们有一个句子:
John likes to watch movies. Mary likes movies too
我们将词的表示依次相加,就会得到:
[1,1,2,1,1,2,1,0,0]
其中,moives和likes都出现了两次,所以相应的编码就变为了2。另一个句子和其表示为:
John also likes to watch football games. [1,0,1,1,1,0,0,1,1,1]
这就是基本的词袋模型(bag of words model),每个句子都被表示成了一个向量,它所具备的特征就简单的依赖于词出现的频率,词的频率越高,对应的数值就越大,代表了该词的重要程度。
每个词的重要程度如果只是根据出现的频率来确定,是不合理的:
句子越长,词就越可能在句子中出现,相应的频率也会变的很高。
在中文中,我们会发现“的”,“了”,“个”等词出现频率很高,在英文中,我们会发现“of”,“a”,"the"等词出现的频率也很高,但这些对于我们理解文本的真实含义却没有什么帮助。
第一个问题较为容易解决,我们只需要对总共的长度做归一化。第二个问题的解决,我们可以根据tf-idf来对不同的词语赋予不同的权重。从它的英文,term frequency–inverse document frequency,我们很容易理解到,句子中词的出现频率越高,那么词就越重要,在整个文件中出现的频率越高,那么词就越不重要,因为如果在所有文件中都出现了该词,那么我们可以认为这个词在句子的并没有什么特殊的地位,比如“的”、“of”。(tf-idf只是一种加权的手段,并没有本质上的操作,此处不详解)
Word Embedding和语言模型
tf-idf只是更加合理的调整了词袋模型中的权重因子,但基本的框架还是词袋模型,而这种类型的表示对于文本这类自然语言结构的数据还存在更大的缺陷:
词袋模型建立在词的one-hot encoding上,它使得每个词相互独立,但实际上词与词之间存在着相互关联,在语境中,一些词比另外一些词更相似。
词袋模型的中词的位置和顺序无法体现,但词的位置很重要,比如在中文里,“我打你”和“你打我”的词袋表示可能是一样的,但是含义却不同。
词袋模型的维数就是词典中词的个数,使用词袋模型就代表着我们将会在高维空间中操作,将会带来维数灾难。
前两点可以被概括为,词袋模型未能使用语义信息,只使用了统计信息。很多分别独立的解决其中的一个或者两个,并且取得了较好的不错的效果。比如基于特征值和奇异值分解的LSA,基于主题分类的LDA(Latent Dirichlet Allocation)。
我们在这里介绍神经网络如何与语言模型结合在一起,来得到一个“好”的低维表示,其中语言模型来解决语义问题,神经网络来解决高维问题(与自编码器的手段类似,通过限制神经元的个数来得到低维)。
常见的N-gram模型说的是,每个词语只与前面的N-1个词相关。我们就可以将一个句子表示为一个条件概率的连乘:
条件概率我们通过简单的计数办法就可以得到,如果我们对大量的文献做了统计,那么N-gram模型会根据我们的上下文去预测什么词是合理的。但是如果我们将N增大到一定程度,会加剧数据的稀疏程度,因为N的增大会使得条件概率的链变得很长,在一篇文章可能会出现,但在其他文章就不会再出现。如果我们想使用更长的序列,那么就不能再依靠统计的办法。
有人就尝试使用神经网络来表示这样的语言模型:
神经网络包括四层,最左端是输入层,我们输入的就是一个基于词袋模型表征的词语,在嵌入层中映射为低维向量,经过隐层,最后在softmax层输出我们的词语。这里值得注意两点:
softmax函数具有概率的特点,就可以看作N-gram模型的在输入为N个词的时候得到的下个词的条件概率。
所有的词都是基于词袋模型,所以我们完全可以使用交叉熵作为损失函数,几乎对原本的神经网络不需要改动。
图中的table lookup就是一个全连接层,只是这个全连接层的输入是一个one-hot encoding的向量,所以不需要进行矩阵运算,而是直接查找不为零的元素。
此时,我们得到了一个语言模型,词语的低维表示在哪里呢?其实,蓝色的向量就是我们得到的词语的低维表示,真正需要的是训练完成以后的矩阵C,我们在一个神经网络中将词语的低维表示嵌入到了语言模型的学习过程中,这样做一并解决了上述的三个问题。
读芯君开扒
课堂TIPS
利用神经网络可以一并得到语言模型和词嵌入向量,我们在隐层使用的技术不局限于全连接层,几乎可以用任何的网络设计来完成该过程,区别只是效果的差异。
通过神经网络得到的词向量,是如何进一步得到句子的表示呢?简单的方法是,我们对组成句子的词向量取平均,或者采用tf-idf的办法取加权平均,稍微麻烦的方法是,利用额外的标注数据训练得到句子的表示。
留言 点赞 发个朋友圈
我们一起分享AI学习与发展的干货
作者:唐僧不用海飞丝
如需转载,请后台留言,遵守转载规范
领取专属 10元无门槛券
私享最新 技术干货