glove
对于一个词 i 出现的次数为
X
i
X_i
Xi,在其某个窗口范围内的词 j 出现的次数为
X
i
j
X_{ij}
Xij,
X
i
j
X_{ij}
Xij 可以直接得到,
X
i
X_i
Xi 为所有
X
i
j
X_{ij}
Xij 的累加和。对于 i 来说,共现矩阵要对所有 i 出现的地方计算
X
i
j
X_{ij}
Xij,最后再累加求和得到
X
i
X_i
Xi。共现矩阵局算的是概率值
P
i
j
=
P
(
j
∣
i
)
=
X
i
j
X
i
P_{ij} = P(j|i) = \frac{X_{ij}}{X_i}
Pij=P(j∣i)=XiXij。
j 是 在 i 的窗口内出现的,所以利用到了局部窗口信息;次数的计算利用到了所有 i 和 j 共同出现的地方,这是全局信息。
glove 词向量为什么能够表现出词的意义?
假设有 3 个词:i,j,k。
- 如果词 k 与 i 关联较大,与 j 关联较小,那么 P i k P_{ik} Pik 较大, P j k P_{jk} Pjk 较小, P i k P j k \frac{P_{ik}}{P_{jk}} PjkPik 远大于 1;
- 如果词 k 与 i 关联较小,与 j 关联较大,那么 P i k P_{ik} Pik 较小, P j k P_{jk} Pjk 较大, P i k P j k \frac{P_{ik}}{P_{jk}} PjkPik 远小于 1;
- 如果词 k 与 i 关联较小,与 j 关联较小,那么 P i k P_{ik} Pik 较小, P j k P_{jk} Pjk 较小, P i k P j k \frac{P_{ik}}{P_{jk}} PjkPik 约等于 1;
这样子是不是就可以某种程度上表现出词的意义来了。
因为是由向量出现的比值来表现词的意义的,那么我们的模型应该由概率比值来呈现。
最初模型为:
F
(
w
i
,
w
j
,
w
k
)
=
P
i
k
P
j
k
F(w_i,w_j,w_k) = \frac{P_{ik}}{P_{jk}}
F(wi,wj,wk)=PjkPik
(其中
w
k
w_k
wk 为上下文向量)
因为一个好的word vector应当是线性可加减的,因此对于word之间的差异,可以用减法来进行衡量,所以:
F
(
w
i
−
w
j
,
w
k
)
=
P
i
k
P
j
k
F(w_i-w_j,w_k) = \frac{P_{ik}}{P_{jk}}
F(wi−wj,wk)=PjkPik
又等式右边是一个标量,那么,将 F 内部表示成向量乘积的形式是一种很简便的方法:
F
(
(
w
i
−
w
j
)
T
w
k
)
=
P
i
k
P
j
k
F((w_i-w_j)^Tw_k) = \frac{P_{ik}}{P_{jk}}
F((wi−wj)Twk)=PjkPik
又由于词向量与上下文词向量的角色不是固定的,我们应该能够随意地交换它们的角色,也就是说词向量和其上下文词向量的地位应该相等,将它们的位置颠倒 F 也不应该改变。那么公式应该对称。令
F
(
(
w
i
−
w
j
)
T
w
k
)
=
F
(
w
i
T
w
k
)
F
(
w
j
T
w
k
)
F((w_i-w_j)^Tw_k) = \frac{F(w_i^Tw_k)}{F(w^T_jw_k)}
F((wi−wj)Twk)=F(wjTwk)F(wiTwk)
其中,
F
(
w
i
T
w
k
)
=
P
i
k
F(w_i^Tw_k) = P_{ik}
F(wiTwk)=Pik
令 F = exp,那么:
w
i
T
w
k
=
l
o
g
(
P
i
k
)
=
l
o
g
(
X
i
k
)
−
l
o
g
(
X
i
)
w_i^Tw_k = log(P_{ik}) = log(X_{ik})-log(X_i)
wiTwk=log(Pik)=log(Xik)−log(Xi)
将
l
o
g
(
X
i
)
log(X_i)
log(Xi) 移到左边,因为其为常数,设为
b
i
b_i
bi,为了对称,加上一个常数
b
k
b_k
bk,
那么:
w
i
T
w
k
+
b
i
+
b
k
=
l
o
g
(
X
i
k
)
w_i^Tw_k + b_i + b_k = log(X_{ik})
wiTwk+bi+bk=log(Xik)
这个公式具有对称性,满足我们的要求(左边即为
F
(
w
i
T
w
k
)
F(w_i^Tw_k)
F(wiTwk)。
损失函数为:
J
=
∑
f
(
x
i
j
)
(
w
i
T
w
j
+
b
i
+
b
j
−
l
o
g
X
i
j
)
2
J = \sum f(x_{ij})(w_i^Tw_j+b_i+b_j-logX_{ij})^2
J=∑f(xij)(wiTwj+bi+bj−logXij)2
相对于通常的损失函数多出了一个加权函数
f
(
x
i
j
)
f(x_{ij})
f(xij)。
该加权函数应该满足下列条件:
- f(0) = 0.
- f(x) 应该为非减函数
- 对于很大的值 x,f(x) 应该相对较小
f
(
x
=
)
{
(
x
/
x
m
a
x
)
α
i
f
(
x
<
x
m
a
x
)
1
o
t
h
e
r
w
i
s
e
f(x=)\begin{cases} (x/x_max)^\alpha \ \ if (x < x_{max}) \\ 1 \ \ otherwise \end{cases}
f(x=){(x/xmax)α if(x<xmax)1 otherwise
fasttext
三层:输入层、隐藏层、输出层。
输出层为文本中的单词经过 lookup-table 得到的 embedding,通过线性变换到隐藏层(加权平均),再经过 softmax 输出该文本属于不同类的概率。当然,输出层可以换成层次 softmax (哈夫曼树)来提高计算效率。
一个突出的地方 n-gram。原本的输入是只有文本中单词的 embedding,现在还要加上 所有单词的 n-gram 对应的 embedding。举例来说 dog 和 dogs ,它们的 1-gram,2-gram。。。基本一样,对应的 embedding也基本一样,那么它们的向量叠加的结果也会基本一样,这样子就可以很容易地将他们归为一类了。
fasttext 的优点:
- 特别快
- 分类效果很好(因为 n-gram)
参考文献:
- https://pengfoo.com/post/machine-learning/2017-04-11
- GloVe: Global Vectors for Word Representation
- fastText 原理及实践