独热编码其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
original data one-hot encoding优点: 一是解决了分类器不好处理离散数据的问题,二是在一定程度上也起到了扩充特征的作用。
缺点: 在文本特征表示上有些缺点就非常突出。首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也很重要的);其次,它假设词与词相互独立(在大多数情况下词与词是相互影响的);最后,它得到的特征是离散稀疏的。
问题: 能不能把词向量维度变小呢?
Dristributed representation 可以解决one hot encoding的问题。它的思路是通过训练将每个词都映射到一个较短的词向量上来,所有的词向量就构成了向量空间,进而可以用普通的统计学方法来研究词与词之间的关系。这个较短的词向量维度是训练是自己指定的。
映射必须满足的性质:1)单设,2)映射后的向量不会丢失之前的那种向量所含的信息。 这个过程称为word embedding(词嵌入)
经过降维操作,有了用Distributed representation 表示的较短的词向量,我们就可以较容易的分析词之间的关系了。因为我们得到最后的词向量的训练过程中引入了词的上下文。
降维Word2Vec
word2Vec 模型就是简单化的神经网络.
输入是One-hot vector, hidden layer 没有激活函数,也即是线性单元,Output layer维度跟Input layer的维度一样,用的是softmax回归。当这个模型训练好之后,我们并不会用这个训练好的模型处理新的任务,我们真正需要的是这个模型通过训练数据所学得参数,例如 隐层的权重矩阵。
这个模型是如何定义输入和输出的呢?一般分为CBOW 和skip-Gram 两种模型,CBOW的训练输入的是某个特征词的上下文相关的词对应的词向量,而输出就是这个特定的一个词的词向量。Skip-Gram 反过来,输入是一个特定的词的词向量,而输出是特定词对应的上下文词向量,CBOW 对应小型数据库比较合适,而Skip-Gram在大型语料中表现比较好。
CBOW 模型:
CBOW模型CBOW 模型:
1) 输入层: 上下文单词的onehot。(假设单词向量空间 dim为V,上下文单词个数为C)
2)所有onehot分别乘以共享的输入权重矩阵W(VN矩阵,N是自己设定的参数,初始化权重矩阵W) (1_V) * (V_N) = (1_N)
3)所得的向量(因为是onehot所以是向量)相加求平均作为隐层向量size为1N
4) 乘以输出矩阵权重W'{N,V}
5)得到向量{1V} 激活函数处理得到V-dim概率分布{因为是one-hot,其中每一维都代表着一个单词}
6)概率最大的index所指示的单词为预测出的中间词(target word)与true label的onehot做比较,误差越小越好(根据误差更新权重矩阵)
所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W'。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table,其实这个look up table就是矩阵W自身,也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。
假设我们此时得到的概率分布已经达到了设定的迭代次数,那么现在我们训练出来的look up table应该是矩阵W,即任何一个单词的one-hot表示乘以这个矩阵都将得到自己的word embedding.
Skip-Gram
给定input word来预测上下文。
如何训练神经网络?
假如有一个句子: ‘The dog barked at the mailman’. 首先我们选取句子中间的一个词作为我们的输入词,例如‘dog’, 我们再定义一个skip_window的参数,它代表着我们从当前input word的一侧(左侧或者右侧)选取词的数量,如果我们设置skip_window=2, 那么我们最终获得的窗口的词(包括input word在内)就是【‘The’, 'dog','barked','at'】。 skip_window =2 代表着选取左input word左侧2个词和右侧2个词进入我们的窗口,所以整个窗口大小span=2*2=4。另一个参数叫做num_skips, 它代表着我们从整个窗口中选取多少个不同的词作为我们的output word, 当skip_windows=2 num_skips=2时,我们将会得到两组(input word,output word)形式的训练数据,即(‘dog’,'barked')('dog','the')。
神经网络基于这些训练数据将会输出一个概率分布,这个概率代表着我们的词典中的每个词时output word的可能性。(第二步中我们在设置skip_window 和num_skips=2的情况下获得了2组训练数据,假如我们先拿一组数据来训练神经网络,那么模型通过学习这个训练样本,会告诉我们词汇表中每个单词‘barked’的概率大小)。
模型的输出概率代表着到我们词典中每个词有多大可能性跟input word同时出现。(比如:如果我们向神经网络模型中输入一个单词‘中国’,那么最终模型的输出概率中 ‘英国’,‘俄罗斯’等这些词出现的概率将远高于‘苹果’,‘蚂蚁’等非相关词的概率,因为‘英国’,‘俄罗斯’在文本中更大可能在‘中国’的窗口中出现,我们将通过给神经网络输入文本成对的单词来训练它完成上面所说的概率计算)。
下图给出了一些我们训练样本的例子,我们选定句子‘the quick brown fox jumps over the lazy dog.’ 设定窗口为2(window_size=2)也就是说我们仅选输入词前后各2个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词,Trainning Samples(输入,输出)。
我们的模型将会从每对单词出现的次数中学习得统计结果,例如:我们神经网络可能会得到更多类似’(‘中国’,‘英国’)这样的训练对,而对于(‘英国’,‘蝈蝈’)这样的组合却很少。因此,当我们的模型完成训练后,给定一个单词‘中国’作为输入,输出的结果中‘英国’要比‘蝈蝈’被赋予更高的概率。
注意!!! 最终我们需要的是训练出来的权重矩阵。
原文来自:(独热编码)
网友评论