第二次打卡-2020-02-14

2020-02-14  本文已影响0人  Vivus

学习笔记

一、文本预处理

文本是一类序列数据,一篇文章可以看作是字符或单词的序列,对文本处理主要包含以下步骤:

  1. 读入文本
  2. 分词
  3. 建立字典,将每个词映射到一个唯一的索引(index)
  4. 将文本从词的序列转换为索引的序列,方便输入模型

对于语言的不同,在分词上处理方式不太一样,英文单词的意义相对独立,分词较为方便,可以采用spaCyNLTK包来进行操作。
中文分词相对难度较大,主要集中在:分词标准、歧义、新词方面。参见中文分词

二、语言模型

一段分词后的自然语言文本可以看作是一个离散时间序列,通过假设词之间存在n阶马尔可夫链关系,可以简化语言模型计算,即:
P(w_1, w_2, \ldots, w_T) = \prod_{t=1}^T P(w_t \mid w_{t-(n-1)}, \ldots, w_{t-1}) .
不过这会带来参数空间过大以及数据稀疏的问题。即文本内存在高频无意义词,具体解决方式有待研究。

采样

在训练中我们需要每次随机读取小批量样本和标签,这就涉及到采样方式的选取:随机采样和相邻采样,具体如下:


采样

三、RNN-循环神经网络

RNN示意图
具体构造:

其中,,,,函数是非线性激活函数。由于引入了,能够捕捉截至当前时间步的序列的历史信息,就像是神经网络当前时间步的状态或记忆一样。由于的计算基于,上式的计算是循环的,使用循环计算的网络即循环神经网络(recurrent neural network)。
在时间步,输出层的输出为:

\boldsymbol{O}_t = \boldsymbol{H}_t \boldsymbol{W}_{hq} + \boldsymbol{b}_q.
其中\boldsymbol{W}_{hq} \in \mathbb{R}^{h \times q}\boldsymbol{b}_q \in \mathbb{R}^{1 \times q}
模型参数
{W}_{xh} : 状态-输入权重
{W}_{hh}: 状态-状态权重
{W}_{hq}: 状态-输出权重
{b}_h: 隐藏层的偏置
{b}_q: 输出层的偏置
循环神经网络的参数就是上述的三个权重和两个偏置,并且在沿着时间训练(参数的更新),参数的数量没有发生变化,仅仅是上述的参数的值在更新。循环神经网络可以看作是沿着时间维度上的权值共享
在卷积神经网络中,一个卷积核通过在特征图上滑动进行卷积,是空间维度的权值共享。在卷积神经网络中通过控制特征图的数量来控制每一层模型的复杂度,而循环神经网络是通过控制{W}_{xh}{W}_{hh}中h的维度来控制模型的复杂度。

一个batch的数据的表示

如何将一个batch的数据转换成时间步数个(批量大小,词典大小)的矩阵?
每个字符都是一个词典大小的向量,每个样本是时间步数个序列,每个batch是批量大小个样本
第一个(批量大小,词典大小)的矩阵:取出一个批量样本中每个序列的第一个字符,并将每个字符展开成词典大小的向量,就形成了第一个时间步所表示的矩阵
第二个(批量大小,词典大小)的矩阵:取出一个批量样本中每个序列的第二个字符,并将每个字符展开成词典大小的向量,就形成了第二个时间步所表示的矩阵
最后就形成了时间步个(批量大小,词典大小)的矩阵,这也就是每个batch最后的形式

隐藏状态的初始化

随机采样时:每次迭代都需要重新初始化隐藏状态(每个epoch有很多词迭代,每次迭代都需要进行初始化,因为对于随机采样的样本中只有一个批量内的数据是连续的)
相邻采样时:如果是相邻采样,则说明前后两个batch的数据是连续的,所以在训练每个batch的时候只需要更新一次(也就是说模型在一个epoch中的迭代不需要重新初始化隐藏状态)

detach

关于这方面,参见https://www.cnblogs.com/jiangkejie/p/9981707.html
https://zhuanlan.zhihu.com/p/79801410

待续

上一篇下一篇

猜你喜欢

热点阅读