a.两个模型是CBOW和Skip-gram,两个加速训练的技巧是HS(Hierarchical Softmax)和负采样
b.假设一个训练样本是核心词w和其上下文context(w)组成,CBOW就是用去预测w;而SKip-gram则反过来,是用w去预测context(w)里的所有词
c.HS是试图用词频建立一棵哈夫曼树,那么经常出现的词路径会比较短。树的叶子节点表示词,共词典大小多个,而非叶子结点是模型的参数,比词典个数少一个。要预测的词,转化成预测从根节点到该词所在叶子节点的路径,是多个二分类问题。
d.对于负采样,则是把原来的 Softmax 多分类问题,直接转化成一个正例和多个负例的二分类问题。让正例预测 1,负例预测 0,这样子更新局部的参数。
a. 训练速度上 CBOW 应该会更快一点。因为每次会更新 context(w) 的词向量,而 Skip-gram 只更新核心词的词向量。两者的预测时间复杂度分别是 O(V),O(KV)
b.Skip-gram 对低频词效果比 CBOW好。因为是尝试用当前词去预测上下文,当前词是低频词还是高频词没有区别。但是 CBOW相当于是完形填空,会选择最常见或者说概率最大的词来补全,因此不太会选择低频词。(想想老师学生的那个例子)Skip-gram 在大一点的数据集可以提取更多的信息。总体比 CBOW 要好一些。
a.优化目标:
HS让每个非叶子节点去预测要选择的路径(每个节点是个二分类问题),目标函数是最大化路径上的二分类概率。
负采样是最大化正样例概率同时最小化负样例概率。
b.负采样更快一些,特别是词表很大的时候。与HS相比,负采样不再使用霍夫曼树,而是使用随机负采样,能大幅度提高性能。
因为这样可以让频率高的词先学习,然后带动其他词的学习
a.对于 Hierarchical Softmax 来说,哈夫曼树中的参数是不能拿来做词向量的,因为没办法和词典里的词对应。
b.负采样中的参数其实可以考虑做词向量,因为中间是和前一套词向量做内积,应该也是有意义的。但是考虑负样本采样是根据词频来的,可能有些词会采不到,也就学的不好
a.字向量其实可以解决一些问题,比如未登陆词,还有做一些任务的时候还可以避免分词带来的误差。
b.词向量它的语义空间更大,更加丰富,语料足够的情况下,词向量是能够学到更多的语义的。
a. 负采样
1在优化参数的时候,只更新涉及到的向量参数;
2 放弃用softmax而是用sigmoid,原来的方法中softmax需要遍历所有单词的概率得分。
b.分层softmax:上面的 Softmax 每次和全部的词向量做内积,复杂度是 O(V),V 是词典大小。如果考虑把每个词都放到哈夫曼树的叶节点上,用sigmoid做二分类,那么复杂度就可以降为 O(logV),即树的高度,因为只需要预测从根节点到相应叶节点的路径即可。
a.忽略了词序
b.一词多义无法识别
这是因为Huffman树对于高频词会赋予更短的编码,使得高频词离根节点距离更近,从而使得训练速度加快。
word2vec不是为了做语言模型,它不需要预测得更准
代码位于word2vec目录中
GPU:8G,NVIDIA GeForce RTX 3070 Ti
window-GPU运行时间:187.19s
window-CPU运行时间: 802.89s
mac-cpu运行时间:904.48s
看资料然后多试试
看懂pytorch实现版本的代码
实现tensorboard和实现训练中止并重启
4.各类文本分类地址(刷题):https://github.com/649453932
5.基于Pytorch的Bert应用项目,地址:https://mp.weixin.qq.com/s/GLG1NJQFboC-YyOT-sjF2Q
8.小工具,查看CPU/GPU实时情况:https://github.com/XuehaiPan/nvitop#device
表头 | 表头 | 表头 |
---|---|---|
内容 | 内容 | 内容 |
内容 | 内容 | 内容 |
() 代码... 代码... 代码... (
)