November 1, 2019

Exploring Word Vectors

Exploring Word Vectors

CS224n 2019,assignment #1

总结:

  1. 主要讲了语言的传统和现代表征方式(以 2013 年的 word2vec 论文为界),one-hot 表示方法是说给所有单词统一编号,类似计算机里面的 gb2312 这种,每个字一个号;这种表征方式(represention) 好处是编码容易,坏处有两个:

    • 形成的矩阵是稠密矩阵,特征不明显,这个很好理解,比如一个矩阵 10 个元素,除了第 9 个之外都是 0 ,那么特征很明显容易记,但如果十个元素分别有十个不同的数字,那就让人抓不住重点,了。
    • 第二个坏处是 one-hot 方式无法展现出两个字词之间的关系,比如 big/huge,金融/公司,理解上应该是很近的,但如果通过 one-hot 方式计算他们的余弦相似度()你会发现每两个词都是正交关系,也就是木有关系。
  2. 词嵌入方式(word-embedding)的提出完全就是针对 one-hot 的这两个缺点,该思路从概率的角度出发,计算在某一特定的上下文(context)里面,特定词出现的概率,从而计算出某一句话出现的概率,从这个思路可知,word embedding 计算出来的两个词向量表示肯定是存在特定关系滴(概率)。

  3. 除one-hot模型外,词向量模型可以是概率模型、共生矩阵(co-occurrence matrix)模型或神经元网络模型。

    • 传统做法是统计一个词语的共生矩阵X。X是一个|V|×|V| 大小的矩阵,X[i,j]表示在所有语料中,词汇表V(vocabulary)中第i个词和第j个词同时出现的词数,|V|为词汇表的大小。对X做矩阵分解,得到的U即视为所有词的词向量
    • 从无监督的预训练模型中导出词向量(word2vec),比如从 BERT/GloVe/ERNIE 中提取,值得注意的是该过程是无监督机器学习,的。
  4. 在 cs224n 第一课中,教授用了巨幅时间去推导公式,如果暂时无法接受的话,只需要记住「目标函数」、「梯度下降」、「优化算法」这三个概念。

  5. 神经网络计算本质上就是一下三个步骤的无数迭代,这三个步骤分别是:

    • 预测
    • 反向传播
    • 梯度下降
  6. 其他还有提到 softmax,softmax 是一个激活函数,跟 sigmoid、ReLU 等作用类似,只不过在分类任务中,softmax 更多的被用在多分类任务,而 sigmoid 更多的被用在二分类任务中。

  7. 关于 numpy/sklearn 以及 matplotlib 这三个 python 库,numpy 是一个高性能数学计算 lib,提供包括各种矩阵计算在内的 python 封装,sklearn 包含了 SVM 在内的各种传统机器学习算法,matplotlib 用来画出各种类似线框、饼状图等方便说明的 plot。

  8. 四个名词:

    • 标量,就是 int/float... 等等这些数
    • 向量,vector,就是数组
    • 矩阵,Matrix,二维数组
    • 张量, Tensor,三维数组
  9. 大部分 word embedding 模型的思路都来源于这么一句话: you shall know a word by the compony it keeps, 而这句话其实是来源于: you shall know a person by the compony it keeps , 中文中类似的说法如下,很有意思:

    其一:不知其人视其友 出自《孔子家语》(中华书局版,2009:136页)电子版下载
    子曰:"商也好与贤己者处,赐也好说不若己者。不知其子视其父,不知其人视其友,不知其君视其所使,不知其地视其草木。故曰与善人居,如入芝兰之室,久而不闻其香,即与之化矣。与不善人居,如入鲍鱼之肆,久而不闻其臭,亦与之化矣。丹之所藏者赤,漆之所藏者黑,是以君子必慎其所与处者焉。"
    
    其二:观人于其所友
    李敖引自中国古语,详细出处未考出。也或许为李敖所造。
    
    • 拿你画我猜举例,你看到一个词然后通过不能直接说出物体名字的各种描述来让你朋友说出这个词,想想一下如果把你朋友换成机器,那么你朋友做的事,就是机器学习做的事。
    • 又比如你跟朋友玩儿一个猜数字的游戏,你朋友心里默认一个数字并写下来(但不能让你看到),你猜一个数(预测),比如 100,然后问你朋友对不对(反向传播),不对的话问大了还是小了,然后继续猜,继续问(梯度下降),一直到猜到。这个过程中,你的目标就是通过不断的迭代问问题,降低你猜的数字和实际数字的差值(损失函数)。

关于作业:

  1. nltk 数据放 github 上,有时候不能下载,作业中用到的 reuters 数据集可以从这里下载好(wget http://106.13.94.241/6ae0d2adaa4e/reuters.zip),然后按照以下步骤放到对应目录:
    # 找到对应目录
    >> nltk.data.find('.')
    FileSystemPathPointer('/Users/xxx/nltk_data')
    
    # 放到该目录的「语料」目录: /Users/xxx/nltk_data/corpora/reuters.zip
    # 然后到 notebook 中把 nltk.download('reuters') 注释掉就好