日期
Feb 1, 2023
Tags
深度学习
python
NLP
Charpter2:自然语言和单词的分布式表示
单词:语言的含义由单词构成,单词是含义的最小单位
- 单词含义的表示方法
- 基于同义词词典的方法
- 为单词简历近义词集合,使用图(单词网络)表示个个单词的关系
- 基于计数的方法
- 语料库:一般收集用于自然语言处理研究和应用的文本数据
- 文本 → 单词列表 → 单词ID列表(语料库)
- 单词的分布式表示(向量化):
- 分布式假设:某个单词的含义由它周围的单词形成
- 共现矩阵:各行对应相应单词的向量,记录了各个单词上下文中包含的单词频数
- 余弦相似度:用于测量单词向量表示的相似度
- 相似单词排序
- 基于计数的方法的改进
- 点互信息(PMI):PMI越高表明相关性越强
- 降维:减少向量维度,常用方法为SVD(奇异值分解)
- 基于推理的方法(下一章)
Charpter3:word2vec
基于推理的方法:
- 基于计数的方法的问题
- 在处理大规模语料库时会出现矩阵过大,计算困难的问题
- 一次性处理整个语料库的统计数据,获得单词的分布式表示
- 使用神经网络一次只需要一部分的学习数据,反复更新权重,逐步学习
神经网络中单词的处理方法:
- one-hot表示
CBOW模型:名为continuous bag-of-words,由Word2vec提出
从上下文的多个单词预测中间的单词(目标词)
- CBOW模型的网络结构
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb09311fc-eddf-4986-aabd-be44d754f444%2FUntitled.png?table=block&id=78bb4213-af0f-48c6-a5bc-638b2aadefbd&t=78bb4213-af0f-48c6-a5bc-638b2aadefbd&width=865&cache=v2)
skip-gram模型:反转了CBOW模型处理的上下文和目标词的模型
从中间的单词(目标词)预测周围的多个单词(上下文)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fcc8c660e-a758-4ba5-a1d7-d8283b6e33dd%2FUntitled.png?table=block&id=a75dcedd-4f83-48e6-b32a-df51e5de59e5&t=a75dcedd-4f83-48e6-b32a-df51e5de59e5&width=865&cache=v2)
对比:
- 从单词的分布式表示的准确度来看,在大多数情况下,skip-grm模型的结果更好。
- 随着语料库规模的增大,在低频词和类推问题的性能方面,skip-gram模型往往会有更好的表现
- 就学习速度而言, CBOW模型比skip-gram模型要快。这是因为skip-gram模型需要根据上下文数量计算相应个数的损失,计算成本变大
Charpter4:word2vec的高速化
Word2vec的计算瓶颈:
- 输入层的one-hot表示和权重矩阵的乘积
- 中间层和权重矩阵的乘积以及Softmax层的计算
1. Embedding层
存放词嵌入
词嵌入:在自然语言处理领域,单词的密集向量表示称为词嵌入或者单词的分布式表示
将模型的MatMul层改为Embedding层可以有效地减少不必要的计算,减少内存使用
2. 负采样(negative sampling)
将多分类问题转化为二分类问题,选择若干负例(负采样的本质)进行学习
负采样的采样方法:
- 根据语料库中单词频率,计算概率分布,依据概率分布进行采样
word2vec的应用:
- 模型不同,精度不同(根据语料库选择最佳的模型)
- 语料库越大,结果越好(始终需要大数据)
- 单词向量的维数必须适中(太大会导致精度变差)
Charpter5:RNN
RNN(Recurrent Neural Network,循环神经网络):具有环路,可以在内部记忆隐藏状态
- 通过展开RNN的循环,可以将其解释为多个RNN层连接起来的神经网络,可以通过常规的误差反向传播法进行学习(= BPTT)
马尔可夫性:马尔可夫性是指未来的状态仅依存于当前状态。
- 当某个事件的概率仅取决于其前面的N个事件时,称为“N阶马尔可夫链”。
Backpropagation Through Time(基于时间的反向传播),简称BPTT。
- Truncated BPTT是指按适当长度截断的误差反向传播法。
- 为什么截断?
- 序列太长,就会出现计算量或者内存使用量方面的问题
- 随着层变长,梯度逐渐变小,梯度将无法向前一层传递
- 为了维持正向传播的连接:
- 需要按顺序输入数据
⇒ 在水平方向上以适当的长度截断网络的反向传播的连接。
Tips: 只截断反向传播,不截断正向传播
RNN层的计算图:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F8a6d855f-8d31-484e-8115-b5ac6d6a3893%2FUntitled.png?table=block&id=b4b37473-48ce-4717-95eb-9ebd38b68292&t=b4b37473-48ce-4717-95eb-9ebd38b68292&width=865&cache=v2)
RNNLM:
RNNLM的模型结构
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F392e1aa2-1a75-4db1-8509-463116ea6a39%2FUntitled.png?table=block&id=71748625-0a07-4954-8304-8f0d735bfbfd&t=71748625-0a07-4954-8304-8f0d735bfbfd&width=865&cache=v2)
语言模型的评价:
- 困惑度(perplexity):用于评价语言模型的预测性能的指标
- 表示概率的倒数,困惑度越小越好
- 也可以称为分叉度:指下一个可以选择的选项的数量(下一个可能出现的单词的候选个数)。
Charpter6:Gated RNN
RNN的问题:
- RNN不擅长学习时序数据的长期依赖关系
- BPTT会发生梯度消失和梯度爆炸的问题
- 解决梯度爆炸的既定方法:梯度裁剪
⇒ 为了解决梯度消失问题:改变RNN层结构,提出了Gated RNN
Gated RNN
具有代表性的模型有LSTM和GRU
LSTM:Long Short-Term Memory(长短期记忆),意思是可以长(Long)时间维持短期记忆(Short-Term Memory)。
LSTM层与RNN层:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Facb6f15b-2548-4db2-8bd9-7d44ef86612a%2FUntitled.png?table=block&id=c4929db6-c300-430d-a671-edff95dc5242&t=c4929db6-c300-430d-a671-edff95dc5242&width=865&cache=v2)
- LSTM层多了路径,称为记忆单元
LSTM层基于记忆单元计算隐藏状态
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F0166cfbf-94f9-4e9b-a21f-c2c2149ed7d4%2FUntitled.png?table=block&id=617a4961-92c4-41d0-8f4c-1f24d04c21e1&t=617a4961-92c4-41d0-8f4c-1f24d04c21e1&width=865&cache=v2)
- tanh的输出是-1.0~1.0的实数。我们可以认为这个-1.0~1.0的数值表示某种被编码的“信息”的强弱(程度)。
⇒ 添加输出门(管理下一个隐藏状态的输出)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F007f96a8-ffa2-44f8-958a-eca6ff681870%2FUntitled.png?table=block&id=de97d085-99be-43e4-afe6-b8eb1bceef3b&t=de97d085-99be-43e4-afe6-b8eb1bceef3b&width=865&cache=v2)
⇒ 添加遗忘门(明确告诉记忆单元需要“忘记什么”)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F082b887d-0cf0-41ea-9a77-443b5c4d95dd%2FUntitled.png?table=block&id=96673f6d-2f86-4ccf-b3a3-d1e327ec4889&t=96673f6d-2f86-4ccf-b3a3-d1e327ec4889&width=865&cache=v2)
⇒ 添加新的tanh节点(向记忆单元添加一些应当记住的新信息)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F13776d87-dc6b-4593-937b-b91930611e72%2FUntitled.png?table=block&id=85bb7c70-674d-4fad-9652-dc49319b3aa9&t=85bb7c70-674d-4fad-9652-dc49319b3aa9&width=865&cache=v2)
⇒ 添加输入门(判断新增信息g的各个元素的价值有多大)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F76cf79f3-8bf0-40ca-bfd5-2729c98121a7%2FUntitled.png?table=block&id=b0022dd7-0dae-4290-8eb6-c2bb5056d9f6&t=b0022dd7-0dae-4290-8eb6-c2bb5056d9f6&width=865&cache=v2)
RNNLM模型的改进
- LSTM层的多层化:通过叠加多个层可以提高语言模型的精度
- 基于Dropout抑制过拟合:
- Dropout:在训练时随机忽略层的一部分
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe4d8d072-e3de-419a-bba6-735db06f2c60%2FUntitled.png?table=block&id=2c9c7e86-4e05-4188-a6cd-d7f9b8dc1fac&t=2c9c7e86-4e05-4188-a6cd-d7f9b8dc1fac&width=865&cache=v2)
- 权重共享:通过在不同层之间共享权重可以大大减少学习的参数数量,提高精度
- 为什么说权重共享是有效的呢?
- 直观上,共享权重可以减少需要学习的参数数量,从而促进学习。另外,参数数量减少,还能收获抑制过拟合的好处。
RNN的正则化很重要:模型正则化(Regularization),对学习算法的修改,限制参数的大小,减少泛化误差而不是训练误差。
Charpter7:基于RNN生成文本
使用语言模型生成文本:
- 将输出结果按概率采样生成
seq2seq模型:也称Encoder-Decoder模型
seq2seq可以用在机器翻译、聊天机器人和自动图像描述等各种各样的应用中
seq2seq基于编码器和解码器进行时序数据的转换
- 编码器
- 编码器的层结构:Encoder类由Embedding层和LSTM层组成。Embedding层将字符(字符ID)转化为字符向量,然后将字符向量输入LSTM层。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fbde5e815-a457-4439-9bde-2a10d33daecd%2FUntitled.png?table=block&id=0f954868-e49d-4db6-a18b-606d94ca44b1&t=0f954868-e49d-4db6-a18b-606d94ca44b1&width=865&cache=v2)
- 解码器
- 解码器的层结构:Decoder类接收Encoder类输出的h,输出目标字符串。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F57028619-f849-4631-b08e-13355e9f6909%2FUntitled.png?table=block&id=23af7c4c-3312-4c85-b75f-a6e8e38c3fc2&t=23af7c4c-3312-4c85-b75f-a6e8e38c3fc2&width=865&cache=v2)
时序数据转换:
- 可变长度的时序数据:
- 填充法
seq2seq的改进
- 反转输入数据:可以使得句子末尾单词的转换距离变近,梯度传播更容易,学习效率更高
- 偷窥(Peeky):
- Peeky Decoder ⇒ 将编码器的输出h分配给所有时刻的LSTM层和Affine层
- 将编码好的信息分配给解码器的其他层,这可以解释为其他层也能“偷窥”到编码信息。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F38e27c0d-4812-449c-b755-41fcc1d53ca9%2FUntitled.png?table=block&id=36b1ecc6-f7d5-43f3-9131-57b86452c88b&t=36b1ecc6-f7d5-43f3-9131-57b86452c88b&width=865&cache=v2)
Charpter8: Attention
seq2seq的注意力机制(Attention mechanism):基于Attention机制,seq2seq可以像我们人类一样,将“注意力”集中在必要的信息上。
seq2seq存在问题:
- seq2seq中使用编码器对时序数据进行编码,然后将编码信息传递给解码器。此时,编码器的输出是固定长度的向量。
- 固定长度的向量意味着,无论输入语句的长度如何(无论多长),都会被转换为长度相同的向量
- 编码器强行把信息塞入固定长度的向量中,早晚会遇到瓶颈,即有用的信息会从向量中溢出。
编码器的改进
- 使用各个时刻LSTM层的隐藏状态
解码器的改进
- 仅关注必要的信息,并根据该信息进行时序转换,即Attention机制
- 整体框架
- 新增一个进行“某种计算”的层。这个“某种计算”接收(解码器)各个时刻的LSTM层的隐藏状态和编码器的hs
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F873bc246-11f3-4600-8c16-55890b4ee577%2FUntitled.png?table=block&id=d18f5a4e-4824-4952-932d-1a0982d53f99&t=d18f5a4e-4824-4952-932d-1a0982d53f99&width=865&cache=v2)
- 求解表示各个单词重要度的权重a
- 计算上下文向量
Attention的实际含义:找到某个向量的相似向量
- Attention从数据中学习两个时序数据之间的对应关系
- Attention使用向量内积(方法之一)计算向量之间的相似度,并输出这个相似度的加权和向量
⇒ 具有Attention层的解码器的层结构
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F14a5dd71-494f-4880-b65a-1b9c72c94909%2FUntitled.png?table=block&id=7b15cd82-efc0-489b-88ec-0bf43935f63a&t=7b15cd82-efc0-489b-88ec-0bf43935f63a&width=865&cache=v2)
我们没有办法理解神经网络内部进行了什么工作(基于何种逻辑工作),而Attention赋予了模型“人类可以理解的结构和意义”。在上面的例子中,通过Attention,我们看到了单词和单词之间的关联性。由此,我们可以判断模型的工作逻辑是否符合人类的逻辑。
双向RNN:eg:双向LSTM在之前的LSTM层上添加了一个反方向处理的LSTM层。然后,拼接各个时刻的两个LSTM层的隐藏状态,将其作为最后的隐藏状态向量
- 双向处理,各个单词对应的隐藏状态向量可以从左右两个方向聚集信息。这些向量编码了更均衡的信息
seq2seq的深层化和skip connection:
- 加深层时为了避免泛化性能的下降,可以使用
- 残差连接
- Dropout
- 权重共享