电脑配置:Anaconda3 + Pycharm
word2Vec模型
自然语言处理最细的粒度是词语,词语是人类的抽象总结,是一种符号,对计算机而言是无法识别的。因此,要先把词语表示成可以让计算机识别并处理的数字或向量,这个过程叫做词嵌入(word Embedding)。
- word2vec词向量的训练第一步要构建语言模型,第二步选择优化算法获取嵌入词向量。
word2Vec模型 | ||
---|---|---|
语言模型 | CBOW:预测目标单词 | SG:预测上下文 |
优化算法 | Hierachical Softmax | Negtive Sampling |
基本思想
对出现在上下文环境里的词进行预测。对于每一条输入文本,选取一个上下文窗口和一个中心词,并基于中心词去预测窗口里其他词出现的概率。
- 两种常见的语言模型的网络结构:
符号说明: w ( t ) w(t) w(t)代表在句子中位置 t t t的词语,一般用one-hot编码的向量表示,其他记号同理。上图中CBOW是根据背景词预测中心词,跳词模型是根据中心词预测背景词。
- Word2Vec模型先基于训练数据构建一个神经网络,当这个模型训练好以后,我们并不会以这个训练好的模型处理新的任务,我们真正需要的是这个模型通过训练数据所学的的参数,例如隐层的权重矩阵。后面我们将会看到这些权重在Word2Vec中实际上就是我们试图去学习的“word vectors”。
如果看不懂的话,还有更白话的解释,神仙指路。
语言模型
- 在统计自然语言处理中,语言模型指的是计算一个句子的概率模型。传统的语言模型中词的表示是原始的、面向字符串的、两个语义相似地词的字符串可能完全不同,比如“土豆”和“洋芋”。字符串本身无法储存语义信息。
- 神经概率语言模型(Neuaral Probabilistic Language
Model)中词的表示是向量形式、面向语义的。是一种有监督的机器学习模型。
语言模型CBOW
sample
{
(
C
o
n
t
e
x
t
(
w
)
,
w
)
∣
w
∈
C
}
\{(Context(w),w)|w\in C\}
{(Context(w),w)∣w∈C}
输入样本train_X:Context(w),由w前后各c个词构成,称其为w的上下文。
输出值train_y:w
model
y
=
f
(
x
)
y=f(x)
y=f(x)
goal: 基于训练集数据用机器学习算法得到语言模型f。这样做的好处是:利用这个f的模型参数得到输入x的某种向量化表示。
最大化对数似然函数
L
=
∑
w
∈
C
l
o
g
P
(
w
∣
C
o
n
t
e
x
t
(
w
)
)
L=\sum_{w \in C} log P(w|Context(w))
L=w∈C∑logP(w∣Context(w))
其中w表示语料库C中任意一个词。
- Input(输入层)是下文词语的词向量(什么!我们不是在训练词向量吗?不不不,我们是在训练CBOW模型,词向量只是个副产品,确切来说,是CBOW模型的一个参数。训练开始的时候,词向量是个随机值,随着训练的进行不断被更新)
- Projection(投影层)对其求和,所谓求和,就是简单的向量加法。
- Output(输出层)输出最可能的w。由于语料库中词汇量是固定的|C|个,所以上述过程其实可以看做一个多分类问题。给定特征,从|C|个分类中挑一个。
解决基于神经网络模型的多分类问题常用方法是softmax回归。
[
p
(
y
(
i
)
=
1
∣
x
(
i
)
;
θ
)
p
(
y
(
i
)
=
2
∣
x
(
i
)
;
θ
)
.
.
.
p
(
y
(
i
)
=
k
∣
x
(
i
)
;
θ
)
]
=
1
∑
j
=
1
k
e
θ
j
T
x
(
i
)
[
e
θ
j
T
x
(
1
)
e
θ
j
T
x
(
2
)
.
.
.
e
θ
j
T
x
(
n
)
]
\begin{gathered} \begin{bmatrix} p(y^{(i)} = 1| x^{(i)};\theta) \\p(y^{(i)} = 2| x^{(i)};\theta)\\...\\p(y^{(i)} = k| x^{(i)};\theta) \end{bmatrix}=\frac{1}{\sum_{j=1}^k e^{\theta^{T}_{j}x^{(i)}} }\begin{bmatrix} e^{\theta^{T}_{j}x^{(1)}} \\e^{\theta^{T}_{j}x^{(2)}}\\...\\e^{\theta^{T}_{j}x^{(n)}} \end{bmatrix} \end{gathered}
⎣⎢⎢⎡p(y(i)=1∣x(i);θ)p(y(i)=2∣x(i);θ)...p(y(i)=k∣x(i);θ)⎦⎥⎥⎤=∑j=1keθjTx(i)1⎣⎢⎢⎢⎡eθjTx(1)eθjTx(2)...eθjTx(n)⎦⎥⎥⎥⎤
也就是说,softmax回归需要对语料库中每个词语(类)都计算一遍输出概率并进行归一化。(一个词一个类 ????这。。)因此,
为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射。
CBOW模型的网络输出层就是一个霍夫曼树。
非叶子节点相当于一个神经元(感知机,逻辑斯谛回归就是感知机的输出带入
f
(
x
)
=
1
1
+
e
x
f(x)=\frac{1}{1+ e ^{x}}
f(x)=1+ex1),二分类决策输出1或者0,分别代表向下左转或向下右转;每个叶子节点代表语料库中的一个词语,于是每个词语都可以被01唯一地编码,并且其编码序列对应一个事件序列,于是我们可以计算条件概率
P
(
w
∣
C
o
n
t
e
x
t
(
w
)
)
P(w|Context(w))
P(w∣Context(w))具体的推算过程可见数学推导。
语言模型Skip-grams
举例说明Skip-grams过程:
假如我们有一个句子“The dog barked at the mailman”。
1、首先我们选句子中间的一个词作为我们的输入词,例如我们选取‘doa’作为input word,称其为中心词;
2、有了中心词,我们再设置一个skip_window
的参数,它代表着我们从当前input word的一侧(左边或者右边)选取词的数量,称其为窗口大小。如果我们设置skip_window = 2,那我们最终获得窗口的词就是[‘The’, ‘dog’,‘barked’,‘at’]。skip_window = 2代表着选取左input word左侧2个词和右侧2个词进入我们的窗口,所以整个窗口大小span = 2*2=4。中心词两侧的词称其为背景词。另一个参数叫做num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的output word。语料库中的每一个词都有两种身份,中心词或者背景词。
3、神经网络基于这些训练数据将会输出一个概率分布,这个概率代表着我们的词典中每个词作为input word的ouput word 的可能性。
- 模型构建:
sample
{ ( w , C o n t e x t ( w ) ) ∣ w ∈ C } \{(w,Context(w))|w\in C\} {(w,Context(w))∣w∈C}
model
y = f ( x ) y=f(x) y=f(x)
goal: 基于训练集数据用机器学习算法得到语言模型f。这样做的好处是:利用这个f的模型参数得到输入x的某种向量化表示。
作业
尝试通过Word2Vec训练词向量
安装torch费了点时间,一直报错无法安装,参考了博客安装代码
直接在cmd里输入:
pip install torch==1.5.1+cpu torchvision==0.6.1+cpu -f https://download.pytorch.org/whl/torch_stable.html
回车,安装成功。
- 导入第三方模块