1.循环神经网络与NLP
1.1 序列模型
分类问题与预测问题
⚫ 图像分类:当前输入−>当前输出
⚫ 时间序列预测:当前+过去输入−>当前输出
自回归模型
假设一个交易员想在当日的股市中表现良好,于是通过以下途径 预测𝑥𝑡 :
𝑥𝑡 ∼ 𝑃(𝑥𝑡 ∣ 𝑥𝑡−1 , … , 𝑥1)
随着观测,时间序列越来越长,过去太久的数据不必要,因此:
𝑥𝑡 ∼ 𝑃(𝑥𝑡 ∣ 𝑥𝑡−1, … , 𝑥𝑡−𝜏)
保留一些对过去观测的总结ℎ𝑡, 并且同时更新预测和总结ℎ𝑡 。 这就产生了基于
估计𝑥𝑡 ,以及
ℎ𝑡 = 𝑔(ℎ𝑡−1 , 𝑥𝑡−1)
更新的模型。
1.2 数据预处理
1.2.1 特征编码
数值特征与类别特征
⚫ 第1列表示年龄,是一个数值特征
⚫ 第2列表示性别,是一个只有一位(0,1)的特征 0 -> Male, 1 -> Female
⚫ 第3列表示国籍,目前有197个国家 1 -> US, 2 -> China, …
⚫ 可以用一个整数来表示,或者用一个 独热向量来表示, 如US: [1,0, ….,0]
⚫ 数值特征不适合表示类别,因此一般使用独热编码
⚫ 国家编码从1开始,1~197,因为实际国籍有可能不填(对应0)。
总结: ⚫ 使用199维特征向量表达一个人的特征:
1.2.2 文本处理
按字母处理
⚫ 给定文本片段,如: S = “… to be or not to be…”.
⚫ 将文本切分为字母序列: L = […, ‘t’, ‘o’, ‘ ’, ‘b’, ‘e’, …],
按单词处理 文本切分 (tokenization)
⚫ 给定文本片段,如: S = “… to be or not to be…”.
⚫ 将文本切分为单词序列: L = […, to, be, or, not, to, be, …],
1.3 文本预处理与词嵌入
文本预处理 一篇文章可以被简单地看作一串单词序列,甚至是一串字符序列。 我们将 解析文本的常见预处理步骤。 这些步骤通常包括:
1.将文本作为字符串加载到内存中。
2.将字符串切分为词元(如单词和字符)。
3.建立一个字典,将拆分的词元映射到数字索引。
4.将文本转换为数字索引序列,方便模型操作。
第一步:读取数据集 以H.G.Well的时光机器为例 ,从中加载文本 。 这是一 个相当小的语料库 ,只有30000多个单词 ,而现实中 的文档集合可能会包含数十亿个单词 。 如Chatgpt包含 65 T数据 。
第二步:词汇切分 将原始文本以文本行为单位进行切分
第三步:构建词索引表
⚫ 打印前几个高频词及索引 [('', 0), ('the', 1), ('i', 2), ('and', 3), ('of', 4), ('a', 5), ('to', 6), ('was', 7), ('in', 8), ('that', 9)]
⚫ 将每一条文本行转换成一个数字索引列表 文本: ['the', 'time', 'machine', 'by', 'h', 'g', 'wells'] 索引: [1, 19, 50, 40, 2183, 2184, 400] 文 本 : ['twinkled', 'and', 'his', 'usually', 'pale', 'face', 'was', 'flushed', 'and', 'animated', 'the'] 索引: [2186, 3, 25, 1044, 362, 113, 7, 1421, 3, 1045, 1]
文本嵌入
如何将词映射成向量? 直接想法:使用之前所述的独热向量
问题:维数过高
词嵌入(word embedding) 将独热向量映射为低维向量
原始向量:𝑣维;映射后:𝑑维,𝑑 ≪ 𝑣; 映射矩阵:𝑑 × 𝑣,根据训练数据学习得到
1.4 RNN模型
如何建模序列数据?
图像分类中使用:1对1模型 输入和输出维度:固定
如何建模序列数据?
文本处理中: 输入维度不定(可能一直有单词输入); 输出维度不定或者是1(直接最终理解结果)
用RNN建模序列数据 输入 :The cat sat on the mat
RNN问题
随着输入的增加,会产生“遗忘”问题
1.5 RNN误差反传
每个时间步的隐状态和输出可以写为:
通过一个目标函数在所有𝑇个时间步内 评估输出𝑜𝑡和对应的 标签𝑦𝑡之间的差异:
按照链式法则:
ℎ𝑡既依赖于ℎ𝑡−1,又依赖于𝑤ℎ , 其中ℎ𝑡−1的计算也依赖于𝑤ℎ 。 因此,用链式法则产生:
使用下面的公式移除 上页中的循环计算:
截断时间步: 我们可以在𝜏步后截断上页式中的求和计算