解决问题二:中间层的神经元和权重矩阵的乘积、Softmax 层的计算需要花费很多计算时间
第k个单词的 Softmax 的计算式如下,其中Si是第i个单词的得分。这个计算也与词汇量成正比,所以需要一个替代Softmax的计算。
使用 Negative Sampling (负采样) 替代 Softmax。也就是用二分类拟合多分类。
多分类问题:从100万个单词中选择1个正确单词。
二分类问题:处理答案为是或否的问题,比如目标词是 say 吗。
让神经网络来回答:当上下文是 you 和 goodbye 时,目标词是 say 吗?
这时输出层只需要一个神经元,神经元输出的是 say 的得分。
仅计算目标词得分的神经网络如下。
上面这个图,中间层是one-hot 表示矩阵和权重矩阵的乘积,也就是权重矩阵的某个特定行。
当输出侧神经元只有一个的时候,计算中间层和输出侧的权重矩阵的乘积,只需要提取输出侧权重矩阵的某一列(目标词所在的列),将提取的这一列与中间层进行内积计算。示意图如下图。
输出侧的权重矩阵中保存了各个单词ID对应的单词向量,提取目标词的单词向量,再求这个向量和中间层神经元 的内积,就是最终的得分。
多分类:输出层使用Softmax函数将得分转化为概率,损失函数使用交叉熵误差。
二分类:输出层使用sigmoid函数将得分转化为概率,损失函数使用交叉熵误差。
sigmoid 函数的输出可以解释为概率。
通过sigmoid函数得到概率后,可以由概率计算损失。
多分类交叉熵误差数学表达:yk是神经网络的输出,tk是正确解标签,k表示数据的维数。如果标签为one-hot表示,即tk中只有正确解标签索引为1,其他均为0 。那么式子只计算对应正确解标签的输出的自然对数。
二分类的交叉熵误差数学表达式:
y是sigmoid函数的输出(神经网络判断的目标词是say的得分),t是正确解标签,t取值为1或0。t=1,输出-tlogy,求目标词是say情况下的损失。t=0,求目标词不是say情况下的损失。这个式子和多分类的其实是一回事:式子只计算对应标签的输出的自然对数。
Sigmoid层和Cross Entropy Error层的计算图如下。y是神经网络输出的概率,t是正确解标签。y-t相当于误差。误差向前面的层传播。误差大时,模型学习得多(参数的更新力度增大)。
举个例子,t=1,y接近1,误差就小。
正确解标签是1是什么意思,其实就是:正确答案就是这个词,神经网络输出的概率越接近于1,表示预测的越准确。
二分类的CBOW模型:向Sigmoid with Loss 层输入正确解标签1,表示现在正在处理的问题的答案是Yes。当答案是No时,向 Sigmoid with Loss 层输入0。
Embedding Dot 层合并Embedding 层和 dot 运算(内积运算):
Embedding Dot 层实现代码如下:
成员变量:params保存参数,grads保存梯度。embed保存Embedding层,cache保存正向传播时的计算结果。
正向传播:参数接收中间层的神经元h,单词ID列表(idx)。首先调用Embedding层的forward(idx)方法,然后通过下面这种方式计算内积。
上面的例子,单词列表有3个数,表示mini-batch一并处理3个数据。
反向传播:乘法节点需要将上游传过来的导数dout乘正向传播的翻转值,然后传给下游。
class EmbeddingDot:def __init__(self, W):self.embed = Embedding(W)self.params = self.embed.paramsself.grads = self.embed.gradsself.cache = Nonedef forward(self, h, idx):target_W = self.embed.forward(idx)out = np.sum(target_W * h, axis=1)self.cache = (h, target_W)return outdef backward(self, dout):h, target_W = self.cachedout = dout.reshape(dout.shape[0], 1)dtarget_W = dout * hself.embed.backward(dtarget_W)dh = dout * target_Wreturn dh
目前,只是对正例say进行了二分类,如果此时模型有好的权重,则Sigmoid层的输出概率将接近1。
真正要做的事是,对于正例say,使Sigmoid层的输出接近1;对于负例(say 以外的单词),使Sigmoid层的输出接近0。
权重需要满足:当输入say时使Sigmoid层的输出接近1,当输入say以外的单词时使输出接近0。如下图,当上下文是 you和goodbye时,目标词是hello(错误答案)的概率要比较低。