一、W2V的两种模型:CBOW和Skip-gram
W2V有两种模型,分别为CBOW和skip-gram,CBOW是根据上下文$context(w)$来预测中间词$w$,而skip-gram是根据中间词$w$来预测上下文$\displaystyle context(w)$ ;他们都有3层结构——输入层,投影层,输出层。(注:无隐藏层)
二、基于huffuman的CBOW
1、网络结构
H_CBOW的网络结构有3层,分别为输入层,投影层,输出层;以样本$(context(w),w)$为例,做简要说明。
输入层:上下文的2c个词的词向量$v(context(x))$(假设上文和下文分别为c各词)
投影层:将这个2c个向量直接求和,$\displaystyle x_{w}=\sum_{i=1}^{2C}v(context(w)_{i})$
输出层:对应一棵huffuman树,它以词典中的词为叶节点,以词出现的次数为叶节点的权重来构建;其中叶节点的个数为N,非叶节点的个数为(N-1);每个非叶节点对应一个二分类器
注:在以往的神经网络语言模型中,计算量高的地方在输出层矩阵运算和概率归一化,CBOW对此作出了两点改进:1、无隐藏层,输入层直接向量求和进行投影;2、输出层改为huffuman树,将原来的softmax线性搜索求极大(多分类),转化为求树的正确路径(多个二分类),大大减少计算量。
2、参数计算
2.1、符号的约定:
以词典中的某个词w为例,约定一些符号
$p^{w}$:词w对应的路径
$l^{w}$:词w对应路径上的节点个数
$p_{i}^{w},(i\in {1,2,...,l_{w}})$:路径$p^{w}$上的某个节点
$[d_{2}^{w},d_{3}^{w}...d_{l_{w}}^{w}]$:词w的huffuman编码。(注:无根节点)
$\theta_{i}^{w},(i\in {1,2,...,l_{w}-1})$:路径$p^{w}$上,内部节点的权重向量。因为每个内部节点对应一个二分类器,这些权重向量就是二分类器的参数(注:无叶节点)
这里有一点需要比较注意的,hufuuman编码左边为1,右边为0;但二分类的类别相反,左边为负,右边为正。
2.2、目标函数的推导
给定一个词的$context(w)$,预测生成目标词$w$概率,相当于沿着huffuman树进行搜索,每经过一个内部节点,就进行一次二分类并生成一个概率,将路径上的所有概率连乘起来,就表示生成目标词$w$的概率;(分类时,规定分到左边为负类,huffuman编码为1;分到右边为正类,huffuman编码为0,这里有点傻逼,强行倒着来)
因此,对于目标单词$w$的条件概率为:
$\displaystyle P(w|context(w))=\prod_{j=2}^{l_{w}} P(d_{j}^{w}|\theta_{j-1}^{w} ,x_{w})$
其中,每个二分类器是一个逻辑回归分类器,概率表示为:
$\displaystyle P(d_{j}^{w}|\theta_{j-1}^{w} ,x_{w}) = [\sigma (\theta_{j-1}^{w}\cdot x_{w})]^{1-d_{j}^{w}}+ [1-\sigma (\theta_{j-1}^{w}\cdot x_{w})]^{d_{j}^{w}}$
参数估计的问题采用极大似然的思想,也即找到一组参数,使得根据上下文$context(w)$预测为目标词$w$的“整体概率”最大;对于给定的语料库T,整体的似然函数为:
$\displaystyle L=\prod_{w\in T}P(w|context(w))$ #似然函数是“所有词的概率连乘”
$\displaystyle =\prod_{w\in T}\left(\prod_{j=2}^{l_{w}} P(d_{j}^{w}|\theta_{j-1}^{w} ,x_{w}) \right )$ #每个词的概率是“路径上所有节点概率的连乘”
$\displaystyle =\prod_{i=1}^{T}\left(\prod_{j=2}^{l_{w}}[\sigma (\theta_{i}^{w}\cdot x_{w})]^{1-d_{j}^{w}}+ [1-\sigma (\theta_{i}^{w}\cdot x_{w})]^{d_{j}^{w}}\right )$
#每个节点的概率表示为“逻辑回归的预测形式”(1:负类,0:正类)
对数似然函数为:
$\displaystyle L=\sum_{w\in T}\left(\sum_{j=2}^{l_{w}}(1-d_{j}^{w})\cdot log[\sigma (\theta_{j-1}^{w}\cdot x_{w})]+ (d_{j}^{w})\cdot log[1-\sigma (\theta_{j-1}^{w}\cdot x_{w})]\right )$
$\displaystyle =\sum_{w\in T}\left(\sum_{j=2}^{l_{w}}L(w,j)\right )$ #$L(w,j)$是每个二分类器的似然函数
2.3、梯度上升法求解参数
W2V其实没有直接优化上面的目标函数,而是采用随机梯度上升法,即每取一个样本$(context(w), w)$,就对所有的参数进行更新;并且优化$\displaystyle \left(\sum_{j=2}^{l_{w}}L(w,j)\right )$的方法是:独立地优化路径上每个二分类器的$ L(w,j)$,让每个$L(w,j)$同时往梯度上升的方向更新一小步,来逐步逼近整体的最大化。下面以样本$(context(w), w)$为例,推导参数的更新过程。
1、更新二分类器的参数:从根节点到目标单词w,其路径上有$l^{w}-1$个二分类器,并且对于一个样本,每个二分类器都有对应的正确类别输出(往左分支预测为负,往右分支预测为正),使用随机梯度上升法来训练这条路径的每个二分类便可。
$\displaystyle \frac{\partial L(w,j)}{\partial \theta _{j-1}^{w}}=\frac{\partial }{\partial \theta _{j-1}^{w}}\left \{ (1-d_{j}^{w})\cdot log[\sigma (\theta_{j-1}^{w}\cdot x_{w})]+ (d_{j}^{w})\cdot log[\sigma (\theta_{j-1}^{w}\cdot x_{w})] \right \}$
$\displaystyle =(1-d_{j}^{w})\cdot [1-\sigma (\theta_{j-1}^{w}\cdot x_{w})]x_{w}- (d_{j}^{w})\cdot \sigma (\theta_{j-1}^{w}\cdot x_{w}) x_{w}$
$\displaystyle =\left \{ (1-d_{j}^{w})\cdot [1-\sigma (\theta_{j-1}^{w}\cdot x_{w})]- (d_{j}^{w})\cdot \sigma (\theta_{j-1}^{w}\cdot x_{w}) \right \} x_{w}$
$\displaystyle =[1-d_{j}^{w}-\sigma (\theta_{j-1}^{w}\cdot x_{w})]x_{w}$
于是权重$\theta _{j}^{w}$的更新公式为:$\displaystyle \theta _{j-1}^{w} = \theta _{j-1}^{w} + \eta [1-d_{j}^{w}-\sigma (\theta_{j-1}^{w}\cdot x_{w})]x_{w}$
2、更新词向量的参数:依次往梯度上升的方向,更新窗口的每个词的词向量
$\displaystyle \frac{\partial L(w,j)}{\partial x_{w}}=[1-d_{j}^{w}-\sigma (\theta_{j-1}^{w}\cdot x_{w})]\theta_{j-1}^{w}$
词向量的更新公式为:$\displaystyle v(w_{i})=v(w_{i})+\eta \sum_{j=2}^{l_{w}}\frac{\alpha L(w,j)}{\alpha x_{w}},~~i\in 2C$
3、伪代码
以样本$(context(w), w)$为例(每取一个样本就对所有的参数进行更新),下面是huffuman CBOW的参数更新过程
1. $\displaystyle e=0$ 2. $\displaystyle x_{w}=\sum_{w\in context(w)}v(w)$ 3. $\displaystyle FOR~j=2:l^{w}~DO$ $\displaystyle g = \eta [1-d_{j}^{w} - \sigma (\theta_{j-1}^{w}\cdot x_{w})]$ $\displaystyle e = e + g\theta _{j-1}^{w}$ $\displaystyle \theta _{j-1}^{w} = \theta _{j-1}^{w} + gx_{w}$ 4. $\displaystyle FOR~i \in 2C~DO:$ $\displaystyle v(w_{i})=v(w_{i})+e$ |
三、基于hufuman的skip-gram