one-hot编码
one-hot编码通俗的理解就是创建一个词表,比如[‘a’,‘b’,‘c’,‘d’],而假如这个词出现则其对应的位置为1,其余为0。
a:[1,0,0,0]
b:[0,1,0,0]
c:[0,0,1,0]
d:[0,0,0,1]
所对应的问题,有时语料库会达到几百万个词,则每个词的为度都要达到几百万维这样的话计算将会出现极大的麻烦,而且向量过于稀疏,无法与上下文进行联系且不含有任何语义信息。
word embedding
Harris在1954年提出的分布假说:上下文相似的词,其语义也相似。而基于分布式假说的词表示方法,根据建模的不同,主要将其分为三类:基于矩阵的分布表示、基于聚类的分布表示和神经网络的分布表示。word embedding则是一种基于神经网络的分布表示。
for example 假如文档中的词为“A B C A A D B G”,我们则希望文档中每个不同的单词都得到一个不同的对应向量。也许对于上式我们可以得到 A[0.2,0.6,-1],B对应的向量为[0.3,0.6,0.9](这里的向量只用来示意)
注意:word embedding是将一个词向量化,或者说是一种基于神经网络的分布式表示可翻译成词嵌入,而下面要讲的word2vec是Google提出的word embedding的算法和工具
word2vec
word2vec最简单的理解就是只有一个隐层的全连接神经网络,用来预测给定单词最大的单词。或者说为一个语言模型
输入层:
词被转换为one-hot向量
隐层:
输入的为
W
∗
x
+
b
W*x+b
W∗x+b(
x
x
x为输入词向量,
W
、
b
W、b
W、b为参数),这里只有线性的映射并没有激活函数
第三层可以看成一个简单的分类器使用softmax回归,最后输出的是每个词的概率
假如我们的语料库中只有三句话:“the dog saw a cat”、“the dog chased the cat”、“the cat climbed a tree”,则语料库中拥有着这8个单词:“the”、“dog”、“saw”、“a”、“cat”、“chased”、“climbed”、“tree”。
那么维度V=8,输入层的初始可以表示为:
[1,1,1,1,1,1,1,1]代表[“the”、“dog”、“saw”、“a”、“cat”、“chased”、“climbed”、“tree”]
输入[" “、“dog”、” “、” “、” “、” “、” “、” “]可以表示为[0、1、0、0、0、0、0、0]
输入[” “、”"、“saw”、""、""、""、""、""]可以表示为[0、0、1、0、0、0、0、0]
W
W
W的大小是
N
∗
V
N*V
N∗V的,通过训练完毕后得到的
W
1
、
W
2
W1、W2
W1、W2当只输入单词,就能预测出最符合这个单词的上下文的一个词,这个时候
W
1
、
W
2
W1、W2
W1、W2精度最高。
CBOW
CBOW(continuous Bag-of-word)主要是通过上下文来预测中心词,:
输入层:
2
m
∗
n
2m*n
2m∗n个节点,上下文共
2
m
2m
2m个词的n维向量,注意一开始为随机初始化
投影层:n个节点,上下文共
2
m
2m
2m个词的词向量直接相加求平均值;
投影层到输出层的连接边:输出词矩阵
U
(
∣
V
∣
∗
n
)
U(|V|*n)
U(∣V∣∗n);
输出层:|V|个节点。第i个节点表示
w
i
,
i
i
wi,ii
wi,ii的概率
对于这里来说输入层的就是输入的词向量,我们看到,输入层每个词周围词用n个节点表示,n就是词向量的大小,一开始随机初始化,在只后作为模型参数学习更新,最终得到合适的词向量。
在gensim 和 google的 word2vec实现中,也是这样的结构,就是输入层初始化的时候直接为每个词随机生成一个n维的向量,并且把这个n维向量作为模型参数学习,最终得到该词向量。
另一种结构讲解为下:
输入层:
2
m
∗
∣
V
∣
2m*|V|
2m∗∣V∣个节点
2
m
2m
2m个词的one-hot编码表示
输入层到投影层到连接边:输入词矩阵
V
V
V:
n
∗
∣
V
∣
n*|V|
n∗∣V∣维
投影层:
n
n
n个节点,上下文共
2
m
2m
2m个词的one-hot表示和输入矩阵相乘后得到的词向量求和再求平均值,也就是
V
∗
x
V*x
V∗x的求和再平均
投影层到输出层的连接边:输出词矩阵
U
U
U:
∣
V
∣
∗
n
|V|*n
∣V∣∗n维;
输出层:
∣
V
∣
个
节
点
|V|个节点
∣V∣个节点,经过softmax
i
i
iii个节点代表
w
i
wi
wi的概率,后得到最大的概率用one-hot表示。
然后词向量就是神经网络中的参数,生成词向量的过程就是一个参数更新的过程。首先将one-hot向量转换为低维词向量这一层中,某个词的one-hot可以转换为
1
∗
∣
V
∣
1*|V|
1∗∣V∣维的向量,与这个系数矩阵
∣
V
∣
:
n
∗
∣
V
∣
|V|:n*|V|
∣V∣:n∗∣V∣维的矩阵,每一列对应了每个单词的词向量。在神经网络中,通过训练不断更新这个矩阵。
另外,对于投影层到输出层的输出层的输出词向量
U
:
∣
V
∣
∗
n
U:|V|*n
U:∣V∣∗n的每一行,也是对于每个单词的词向量。由于one-hot的只有一个位置为1其他为0,即与
U
U
U相乘时,得到的是对应的输出向量。