两周深度学习计划(二)

今天是Task02,包含文本预处理;语言模型和循环神经网络基础课程。
这里讲述了一些文本预处理到普通RNN模型的解决方案,课程中讲的分词,建立字典的方案是较初步的处理,相较于比较复杂的非结构化的数据,特别是文本来说, 预处理的步骤是及其繁琐的,具体可参考针对于非结构化的数据(文本类)所述。

思维导图如下:

思维导图

列出一些问题,如下:

为何要建立词典?

词典的主要作用是将每一个词映射到一个唯一的索引号,主要构建了一个idx_to_token列表来存储所有的词,一个token_to_idx来存储所有词的索引。在实现的的流程上是:

  • 对语料进行分词,生成一个token列表,里面包含了语料的分词结果
  • 对分好的词统计词频,然后根据词频来构建词典(统计好的词频完成了去重的操作,同时也保留了词的频率,方便后续的操作)

其中有一些名词:
pad的作用是在采用批量样本训练时,对于长度不同的样本(句子),对于短的样本采用pad进行填充,使得每个样本的长度是一致的
bos( begin of sentence)和eos(end of sentence)是用来表示一句话的开始和结尾
unk(unknow)的作用是,处理遇到从未出现在预料库的词时都统一认为是unknow ,在代码中还可以将一些频率特别低的词也归为这一类。

循环神经网络使用相邻采样的时候为什么要detach参数?

我们知道相邻采样的前后两个批量的数据在在时间步上是连续的,所以模型会使用上一个批量的隐藏状态初始化当前的隐藏状态,表现形式就是不需要在一个epoch的每次迭代时随机初始化隐藏状态,那么,假如没有detach的操作,每次迭代之后的输出是一个叶子节点,并且该叶子节点的requires_grad = True,也就意味着两次或者说多次的迭代,计算图一直都是连着的,因为没有遇到梯度计算的结束位置,这样将会一直持续到下一次隐藏状态的初始化。所以这将会导致计算图非常的大,进而导致计算开销非常大。而每次将参数detach出来,其实就是相当于每次迭代之后虽然是使用上一次迭代的隐藏状态,只不过我们希望重新开始,具体的操作就是把上一次的输出节点的参数requires_grad设置为False的叶子节点。

posted @ 2020-02-15 13:35  Jamest  阅读(225)  评论(0编辑  收藏  举报