《深度学习进阶 自然语言处理》学习笔记(1)

目录

  • 前言
    • 第一章 神经网络的复习
    • 第二章 自然语言和单词的分布式表示
      • 预处理
      • 背景
      • 基于计数的方法
        • 共现矩阵(co-occurence matrix)
        • 基于计数的方法的改进
          • 点互信息
          • 降维
      • PTB数据集
    • 第三章 word2vec
      • 基于推理的方法的概要
        • CBOW模型
        • skip-gram 模型
    • 第四章 word2vec的高速化
      • 总结

前言

这本书结合代码(可从官网免费下载:源代码地址),深入浅出、逐层深入地讲解了NLP中的word2vec、RNN、LSTM、Attention等经典模型,是教学质量极高的一本书,遂笔记整理。

第一章 神经网络的复习

简要回顾一个经典的前馈升级网络的模型架构与原理,无需笔记

第二章 自然语言和单词的分布式表示

预处理

    text = text.lower()
    text = text.replace('.', ' .')
    words = text.split(' ')
  1. 建立 word_to_idid_to_word 的哈希表
  2. 得到语料库(corpus,由id组成的文本序列)
	corpus = np.array([word_to_id[w] for w in words])

背景

  1. WordNet 等同义词词典存在需要大量人力、新词难更新等问题
  2. 单词含义由其周围的单词构成”的分布式假设(distributional hypothesis)

基于计数的方法

共现矩阵(co-occurence matrix)

  1. you say goodbye and i say hello . 的窗口为2(上下文包括左右各2个单词)的共现矩阵如下:
    《深度学习进阶 自然语言处理》学习笔记(1)_第1张图片
  2. 根据共现矩阵中的单词向量,计算单词之间的余弦相似度

基于计数的方法的改进

点互信息
  1. 英文为Pointwise Mutual Information, 避免类似 “… the car …” 的频繁出现使得the和car关联性过强
  2. PMI(x, y) = log( P(x, y) / (P(x) * P(y)) )
  3. PPMI(x, y) = max(0, PMI(x, y) ) (避免PMI出现负数)
  4. 将共现矩阵进行PPMI的实现
	def ppmi(C, eps = 1e-8):
	    '''生成PPMI(正的点互信息)
	    :param C: 共现矩阵
	    :return: M
	    '''
	    M = np.zeros_like(C, dtype=np.float32)
	    N = np.sum(C)
	    S = np.sum(C, axis=0)
	    total = C.shape[0] * C.shape[1]
	    cnt = 0
	
	    for i in range(C.shape[0]):
	        for j in range(C.shape[1]):
	        	# 核心公式
	            pmi = np.log2(C[i, j] * N / (S[j]*S[i]) + eps)  
	            M[i, j] = max(0, pmi)
	    return M
降维

对 PPMI处理过的共现矩阵进行SVD(奇异值分解),得到降维后的单词向量
《深度学习进阶 自然语言处理》学习笔记(1)_第2张图片

	# 输出的U即为可以进行降维的单词向量矩阵
	U, S, V = np.linalg.svd(M)
	# Res即将U降到2维的降维矩阵
	Res = U[:, :2]

PTB数据集

第三章 word2vec

word2vec本质是基于推理的方法(后验概率),相对于计数方法的优势:mini-batch学习,无需对整个数据集进行batch学习(共现矩阵必须生成整个词库 x 词库的矩阵)

  1. 基于推理的方法以预测为目标,同时获得了作为副产物的单词的分布式表示;

  2. word2vec 是基于推理的方法,由简单的 2 层神经网络构成;

  3. word2vec 有 skip-gram 模型和 CBOW 模型;

  4. CBOW 模型从多个单词(上下文)预测 1 个单词(目标词);

  5. skip-gram 模型反过来从 1 个单词(目标词)预测多个单词(上下文);

  6. 由于 word2vec 可以进行权重的增量学习,所以能够高效地更新或添加单词的分布式;

基于推理的方法的概要

示例:you (?) goodbye and i say hello .
目标:已知上下文的you和goodbye,推导 (?) 位置出现词库里单词的概率(本质上是后验概率

CBOW模型

  1. 结构(本质是全连接神经网络
    《深度学习进阶 自然语言处理》学习笔记(1)_第3张图片
    输入:两个one-hot的上下文向量
    输出:一个得分向量
    W_in:训练出的W_in可以视为单词的分布式表示

  2. 损失函数:负对数似然
    上下文大小为1的一个样本的损失函数 L= -log P(w_t | w_t-1, w_t+1) ,总的损失函数则为求和求均值

skip-gram 模型

1.结构
《深度学习进阶 自然语言处理》学习笔记(1)_第4张图片
输入:一个one-hot向量
输出:两个得分向量

第四章 word2vec的高速化

  1. 输入—— one-hot向量组 ===> 单词id组成的上下文向量
  2. Embedding层 —— Embedding矩阵根据输入单词的id取出第id行向量进行运算(Embedding即单词向量空间
  3. 多分类到二分类 —— 使用Sigmoid+交叉熵作为损失函数(负采样
    《深度学习进阶 自然语言处理》学习笔记(1)_第5张图片
    h 为中间层的神经元,上图为正例say的学习。同时我们还要采样负例(5-10个,防止模型过大)进行学习,即负采样,如下图,为负采样模型结构(对负例helloi学习)。
    《深度学习进阶 自然语言处理》学习笔记(1)_第6张图片
    负采样的采样指标是单词的出现概率

总结

  1. Embedding 层保存单词的分布式表示,在正向传播时,提取单词 ID 对应的向量;

  2. 因为 word2vec 的计算量会随着词汇量的增加而成比例地增加,所以最好使用近似计算来加速;

  3. 负采样技术采样若干负例,使用这一方法可以将多分类问题转化为二分类问题进行处理;

  4. 基于 word2vec 获得的单词的分布式表示内嵌了单词含义,在相似的上下文中使用的单词在单词向量空间上处于相近的位置;

  5. word2vec 的单词的分布式表示的一个特性是可以基于向量的加减法运算来求解类推问题;

  6. word2vec 的迁移学习能力非常重要,它的单词的分布式表示可以应用于各种各样的自然语言处理任务;

你可能感兴趣的:(自然语言处理,神经网络,机器学习,深度学习)