吴恩达深度学习笔记(4)——序列模型

循环序列模型

序列模型应用场景

  • 声音转文字
  • 音乐生成
  • 自然语言情感分析
  • DNA序列分析
  • 机器翻译
  • 视频行为识别
  • 人名识别

数学符号

  • 在NLP中,用$T_X^{(i)}$表示第$i$个训练样本的输入序列长度,$T_y^{(i)}$表示第$i$个训练样本的输出序列长度
  • 在词典中,遍历训练样本上的词汇,将样本中出现的词标注为1,其余为0

循环神经网络模型

$$a^{<0>}=\vec{0}$$
$$a^{}=g(W_{aa}a^{}+W_{ax}X^{}+b_a)$$
$$\hat{y}^{}=g(W_{ya}a^{}+b_y)$$

  • 为了简化计算,把上一次的激活值与这一次的输入合并为一个矩阵

$$[W_{aa}\vdots W_{ax}]=W_a$$
$$a^{}=g(W_a[a^{},X^{}]+b_a)$$

  • 循环神经网络的输出不仅取决于这一次的输入,也与上几次的输入有关
  • 一般的循环神经网络在某一时刻的预测只取决于之前的信息,与之后的信息无关,双向循环神经网络(BRNN)则取决于之前与之后的信息
  • 循环神经网络的激活函数通常选择tanh,有时也用ReLU,输出层一般是sigmoidsoftmax函数

基于时间的反向传播

$$\mathcal{L}^{}(\hat{y}^{},y^{})=-y^{}\log\hat{y}^{}-(1-y^{})\log(1-\hat{y}^{})$$
$$\mathcal{L}(\hat{y},y)=\sum^{T_y}_{t=1}\mathcal{L}^{}(\hat{y}^{},y^{})$$

不同类型的RNN

  • RNN经常用来处理$T_X^{(i)}\not=T_y^{(i)}$的情况
  • 文本情感分析:输入一整句话,只在最后的时刻输出,称为多对一结构
  • 音乐生成:输入一个向量(可以为零向量),每一时刻都有输出,并把输出输入到下一层,称为一对多结构
  • 机器翻译:输入和输出的长度不同,称为多对多结构
  • 其他:一对一结构、注意力结构

语言模型和序列生成

  • 包含大量单词的语料库(corpus
  • 某个词在词典中的位置为1,其余为0的向量:1-hot向量
  • 增加句子结尾的标识符<EOS>
  • 对不存在字典中的词替换成<UNK>代表未知字符
  • 对于每时刻的输入,模型通过softmax函数给出预测,下一层通过输入上一层的$a$以及真实的$y$,预测这一时刻的输出

从训练好的RNN中重采样

  • 输入$a_0$和$X_1$,输出$\hat{y}_1$,将其作为下一个时刻的输入,直到最后输出<EOS>或达到设定长度为止
  • 除了基于单词的词典外,也有基于字符的词典,其优点是不会输出<UNK>,缺点是难以捕捉长句的前文关系,且计算代价高昂

梯度消失

  • 基础的RNN模型不擅长捕获长期依赖效应(例如生成一个长句子很难记住单复数的形式),这与RNN模型梯度易消失有关

GRU单元

  • 门控循环单元:改善梯度消失问题
  • $c$称为记忆细胞,它具有记忆功能

$$c^{}=a^{}$$
$$\tilde{c}^{}=tanh(W_c[c^{},X^{}]+b_c)$$
$$\Gamma_u=\sigma(W_u[c^{},X^{}]+b_u)$$
$$c^{}=\Gamma_u*\tilde{c}^{}+(1-\Gamma_u)*c^{}$$

  • 门$\Gamma_u$决定什么时候更新$c$的值,如果$\Gamma_u=1$则使用新值,如果$\Gamma_u=0$则使用旧值

长短时记忆(LSTM)

  • 通常,LSTM比GRU更加强大和灵活

$$\tilde{c}^{}=tanh(W_c[a^{},X^{}]+b_c)$$
$$\Gamma_u=\sigma(W_u[a^{},X^{}]+b_u)\ \text{(update)}$$
$$\Gamma_f=\sigma(W_f[a^{},X^{}]+b_f)\ \text{(forget)}$$
$$\Gamma_o=\sigma(W_o[a^{},X^{}]+b_o)\ \text{(output)}$$
$$c^{}=\Gamma_u\tilde{c}^{}+\Gamma_fc^{}$$
$$a^{}=\Gamma_o*\tanh\ c^{}$$

  • 偷窥孔连接(Peephole Connection):门值不仅取决于上一个激活值和X,也取决于上一个记忆细胞的值

双向RNN

  • 增加反向连接层,前向传播一部分计算从左到右,另一部分从右到左,计算两部分的激活值

$$\hat{y}^{}=g(W_y[\overrightarrow{a^{}},\overleftarrow{a^{}}]+b_y)$$

  • NLP问题首选LSTM+BRNN模型
  • 缺点是需要完整的数据序列

深层RNN

  • 通常,循环神经网络只有一个隐藏层,当使用两个以上隐藏层时得到深度循环神经网络

自然语言处理

词嵌入

  • 词汇表与1-hot向量:任何词向量的内积都是0,因此对相关词的泛化性能不强
  • 使用词的高维特征表示(词嵌入),能够得到更好的泛化性能
  • t-SNE算法能将词的高维特征可视化到二维空间里

将词嵌入运用到NLP中

  • 词嵌入算法会考察非常大的文本量(或者来自互联网上的预先训练好的模型),迁移学习到只有少量标记的训练集中,并可以利用新数据微调词嵌入模型

词嵌入的特性

  • 类比:将具有相关性的词的向量相减,得到两者之间的特征向量,可用于类比到具有相似性质的词上,例如,要从“man”以及“woman”之间的关系求“King”相对应的词(期望是“Queen”),只要求

$$e_{man}-e_{woman}\approx e_{king}-e_w$$
$$\text{Find word w}:\arg\max \ sim(e_w,e_{king}-e_{man}+e_{women})$$

  • 其中利用向量间的余弦相似度

$$sim(u,v)=\frac{u^Tv}{||u||_2||v||_2}$$

词嵌入矩阵

  • 例如,有一个词典$E$,具有10000个词汇和300维特征,它是$300\times10000$维的矩阵;其中第6257位的单词“Orange”的1-hot向量为10000维向量,相乘得到“Orange”的嵌入向量

$$E\cdot o_{6257}=e_{6257}$$

  • 在实际中利用矩阵乘法获取嵌入向量效率低下,因此直接获取词典矩阵的某一列元素

学习词嵌入

  • 预测一句话的最后一个单词,可将这句话前面的所有单词(或者固定长度的历史窗口)的向量输入一个神经网络,经过softmax函数输出预测的单词
  • 其他方法包括将所需预测单词的左边n个和右边n个单词输入神经网络;或只取所需预测单词的左边1个单词;或取最邻近的某个单词,称为skip-gram模型

Word2Vec

  • skip-gram:抽取上下文的目标词配对,构造监督学习问题
  • 输入一个词的1-hot向量,与词嵌入矩阵相乘得到嵌入向量,输入进softmax函数,预测这个词前后是什么词的概率
  • 例如在10000维的词典中,得到某单词的嵌入向量$e_c$,输入softmax函数,输出预测$\hat{y}$

$$P(t|c)=\frac{e^{\theta_t^Te_c}}{\sum^{10000}{j=1}e^{\theta_j^Te_c}}$$
$$\mathcal{L}(\hat{y},y)=-\sum^{10000}
{i=1}y_i\log \hat{y}_i$$

  • $\theta_t$是与$t$有关的参数,是$t$与标签相符的概率
  • 由于过大的词典会导致计算代价高昂,故常采用树状二分类器
  • CBOW:获得中间词两边的上下文,利用周围的词预测中间词

负采样

  • 在一句话中抽取一个上下文词和目标词作为一对正样本,利用相同的上下文词在词典中抽取k个词作为负样本,即便这个词出现在目标词上下文中
  • 学习算法输入一对词,输出它们是否配对的预测
  • 对于小数据集,k选取5~20
  • 对于大数据集,k选取2~5
  • 将1个正样本和k个负样本输入softmax函数

$$P(y=1|c,t)=\sigma(\theta_t^Te_c)$$

  • 相比skip-gram,只需更新k+1个logistic单元
  • 负采样的抽样方法:根据经验,按照英文单词分布的抽样方法

$$P(W_i)=\frac{f(W_i)^{\frac{3}{4}}}{\sum^{10000}_{j=1}f(W_j)^{\frac{3}{4}}}$$

GloVe词向量

  • 记$X_{ij}$是单词i在单词j上下文中出现的次数

$$\text{minimize} \sum^{10000}{i=1}\sum^{10000}{j=1}f(X_{ij})(\theta^T_ie_j+b_i+b_j’-\log X_{ij})^2$$

情绪分类

  • 从一句话的单词中提取嵌入向量,用求和或平均的方法得到特征向量,输入softmax函数,预测评分
  • 缺点:没有考虑词序对情绪分类的影响
  • 使用多对一的RNN结构,在最后时刻输出对整句话的评分

词嵌入除偏

  • 使用机器学习进行决策的一个优点在于避免了人为的主观偏见,而词嵌入模型往往会出现性别歧视、种族歧视、年龄歧视等不期望出现的偏见,因此要修改学习算法尽量避免这些偏见
  • 辨别出想要消除特定偏见的趋势,例如求出“he”和“she”以及“male”和“female”的嵌入向量之差,求平均得到性别偏见的方向向量
  • 中和步(Neutralizer):对于定义不明确的单词,例如“doctor”和“babysitter”,减少它们在存在偏见的方向上的距离
  • 均衡步(Equalize pairs):利用线性代数的方法让存在明显性别区别的一对词同某个不存在性别偏见的词的距离相接近

序列模型和注意力机制

Seq2Seq模型

  • 机器翻译:多对多结构
  • 图片转文字:用循环网络替换深度卷积网络的softmax层

语言模型与机器翻译

  • 语言模型:输入一个零向量,用上一时刻的输出作为这一时刻的输入
  • 机器翻译(条件语言模型):后半部分(Decoder)类似于语言模型,区别在于输入是一个句子构成Encoder
  • 贪心搜索:每个时刻都取概率最大的输出值

$$\arg\max_{y^{<1>},\cdots,y^{}}P(y^{<1>},\cdots,y^{}|x)$$

集束搜索

  • 集束宽度(Beam Width):集束搜索考虑的结果个数
  • 集束宽度大,结果越好,计算越慢
  • 集束搜索在每一时刻的输入都保留集束宽度个结果,结果通常比贪心搜索效果好
  • 第一步输入Encoder的结果,输出词典中每个词的概率,取前集束宽度个结果保存,并作为下一时刻的输入
  • 第二步将上一时刻的多个输出作为输入,计算组合概率

$$P(y^{<1>},y^{<2>}|x)=P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})$$

长度归一化

  • 集束搜索的目标是最大化条件概率

$$\arg\max_y\prod^{T_y}_{t=1}P(y^{}|x,y^{<1>},\cdots,y^{})$$

  • 为了防止结果超出浮点精度,通常取对数

$$\arg\max_y\sum^{T_y}_{t=1}\log P(y^{}|x,y^{<1>},\cdots,y^{})$$

  • 它会导致输出偏向较短的句子,因此采用归一化方法

$$\frac{1}{T_y^\alpha}\sum_{t=1}^{T_y}\log P(y^{}|x,y^{<1>},\cdots,y^{})$$

  • 通常取$\alpha=0.7$

集束搜索误差分析

  • 误差来源有RNN和集束搜索
  • 设人工翻译的预测为$y^*$,机器翻译的预测为$\hat{y}$
  • 若$P(y^*|x)>P(\hat{y}|x)$:集束搜索出现问题
  • 若$P(y^*|x)\leq P(\hat{y}|x)$:RNN出现问题
  • 对多个样本进行分析,从而判断主因

Bleu得分

  • Bleu得分能自动评价机器翻译的好坏
  • Bleu的原理是观察机器翻译的结果是否在人工翻译中至少出现一次
  • 改良后的精度评估:分母为某个单词在机器翻译中出现的次数,分子为该单词在人工翻译样本中出现次数的最大值
  • 以上扩展至n元词组,将从1至n的Bleu得分平均,并引入BP(简短惩罚)以惩罚太短的翻译结果,得到联合Bleu得分

$$BP=\begin{cases}1\ \text{if MT output length>reference output length}\\exp(1-\frac{\text{MT output length}}{\text{reference output length}})\ \text{otherwise}\end{cases}$$

注意力模型

  • 机器翻译通常在短句子上Bleu得分较高,在长句子上得分较低
  • 注意力模型使用注意力参数$\alpha^{<t,t’>}$来表示生成单词$t$时应该放多少注意力在单词$t’$上

$$\sum_{t’}\alpha^{<t,t’>}=1$$

  • 将X输入双向RNN中,得到前向和后向激活值,激活值乘以注意力参数得到上下文关系,输入到隐藏层S中

$$c^{}=\sum_{t’}\alpha^{<t,t’>}a^{<t’>}$$

  • 把上一个S层的输出以及激活值输入到softmax函数,输出$e^{<t,t’>}$,并计算注意力参数$\alpha$

$$\alpha^{<t,t’>}=\frac{\exp(e^{<t,t’>})}{\sum^{T_x}_{t’=1}\exp(e^{<t,t’>})}$$

语音识别

  • 注意力模型的语音识别
  • CTC损失函数语音识别:通过输出重复字符和空白符以使得输出维度等于输入维度,通过把空白符分隔开的重复字符折叠起来,得到较短的句子

触发字检测

  • 例如,Google Home(Okay Google),Apple Siri(Hey Siri)
  • 平时的标签为0,当检测到关键字时,标签为1
  • 为了适当提高标签为1的比例,并非只在一个时刻点标签1,而是一段时间内标签1