终于在八月末学完了这门课程,这个月虽然为此不停地忙碌,但每天都在进步也是一种乐趣。
吴恩达教授的课程循序渐进,适合初学者,非常感谢他的辛苦付出。
文章目录
- 第一周:循环序列模型
- 循环神经网络(RNN)模型
- 语言模型和序列生成
- GRU(门控循环单元)
- LSTM(长短期记忆)
- 双向循环神经网络/BRNN
- 深层RNN
- 第二周:自然语言处理与词嵌入
- 词汇表征
- 使用词嵌入
- 词嵌入的特性
- 嵌入矩阵
- 学习词嵌入:Word2Vec 的 skip-gram模型
- 负采样
- GloVe 词向量
- 情感分类问题
- 消除词嵌入中的歧视:以性别为例
- 第三周:序列模型和注意力机制
- 基础模型
- 条件语言模型
- 集束搜索及优化
- 集束搜索的误差分析
- 注意力模型
第一周:循环序列模型
循环神经网络(RNN)模型
代价计算和反向传播
更多RNN模型
语言模型和序列生成
语言模型做的最基本工作就是输入一个文本序列,然后语言模型会估计某个句子序列中各个单词出现的可能性。
如:语言模型可以根据输入计算出两句话各自的可能性,并选择可能性较大的一句。
当序列中含有字典中不存在的单词时,使用UNK代表未知词。
训练语言模型:
训练后对其进行取样,将y_hat1作为y_1输入到第二个单元并获得y_hat2,以此类推。
GRU(门控循环单元)
对很深的RNN网络从左到右做前向传播然后再反向传播。反向传播时只有距离较近的y才能影响附近的参数,而从输出y得到的梯度很难传播回去,影响靠前层的权重。可以使用GRU或LSTM解决远距离依赖的问题。
使用c(memory cell)记录需要保存,以备使用的值。
LSTM(长短期记忆)
双向循环神经网络/BRNN
基本单元不仅仅是标准 RNN 单元,也可以是 GRU单元或者 LSTM 单元。
每个单元的预测结果不仅输入了过去的信息,还考虑了未来的信息。
深层RNN
将单层的RNN堆叠可以得到深层RNN
深层RNN的层数通常不多,因为在时间维度上,每层RNN的计算量已经很大,多层RNN堆叠的算力需求更高
第二周:自然语言处理与词嵌入
词汇表征
嵌入是语言表示的一种方式,可以让算法自动的理解一些类似的词,比如男人和女人、国王和王后等。
相比较使用独热向量,用特征化的表示来表示每个词更能达到嵌入的目的。比如,将维度分为性别、年龄、大小等维度,而每个词对应一个维度长度的向量。
使用词嵌入
词嵌入能够达到这种效果,其中一个原因就是学习词嵌入的算法会考察非常大的文本集,数据集可以是 1 亿个单词,甚至达到 100 亿也都是合理的,大量的无标签的文本的训练集。通过考察大量的无标签文本,可以发现 orange 和 durian 相近,farmer 和 cultivator 相近。接下来可以把词嵌入应用到识别任务当中,训练集虽然比较小,但是可以使用迁移学习。
词嵌入的特性
man 如果对应 woman,那么 king 应该对应什么:
余弦相似度
嵌入矩阵
本质上是形状为 (特征数, 词汇数) 的矩阵,将其右侧乘以独热向量后,得到特定词汇的特征向量。
学习词嵌入:Word2Vec 的 skip-gram模型
在 Skip-Gram 模型中需要抽取上下文和目标词配对,来构造一个监督学习问题。上下文不一定总是目标单词之前离得最近的四个单词,或最近的n个单词。我们要的做的是随机选一个词作为上下文词,然后随机在一定词距内选另一个词。
缺点是Softmax计算会很慢。
分级的 softmax 分类器,不是立刻就确定到底是属于 10,000 类中的哪一类,而是逐步缩小范围直到找到目标。
负采样
问题就是给定一对单词,比如 orange 和 juice,我们要去预测这是否是一对上下文词-目标词。
生成这些数据的方式是我们选择一个上下文词,再选一个目标词,作为表的第一行,它代表一个正样本,并给定标签为 1。然后给定K(小数据集的话,K从 5 到 20 比较好。如果数据集很大,K就选的小一点,例中K=4),用相同的上下文词,再从字典中选取随机的词作为目标词,并标记 0,这些就会成为负样本。如果从字典中随机选到的词,正好出现在了词距内也没关系。
目标是定义一个逻辑回归模型,给定输入的(c,t)的条件下,y =1的概率,即:
把这些看作 10,000 个二分类逻辑回归分类器,但并不是每次迭代都训练全部 10,000 个,而是只训练其中的 5 个,训练对应真正目标词那一个分类器,再训练 4 个随机选取的负样本,这就是K= 4的情况。所以不使用一个巨大的 10,000 维度的 softmax,因为计算成本很高,而是把它转变为 10,000 个二分类问题,每个都很容易计算,每次迭代只是训练它们其中的 5 个,一般而言就是K + 1个,其中K个负样本和 1 个正样本。这也是为什么这个算法计算成本更低。
这个算法有一个重要的细节就是如何选取负样本,即在选取了上下文词 orange 之后,你如何对这些词进行采样生成负样本?一个办法是对中间的这些词进行采样,即候选的目标词,你可以根据其在语料中的经验频率进行采样,就是通过词出现的频率对其进行采样。但问题是这会导致你在 like、the、of、and 诸如此类的词上有很高的频率。另一个极端就是用1 除以词汇表总词数,即 1/|v|,均匀且随机地抽取负样本,这对于英文单词的分布是非常没有代表性的。一种根据经验的结论是:
GloVe 词向量
假定𝑋𝑖𝑗是单词𝑖在单词𝑗上下文中出现的次数,那么这里𝑖和𝑗就和𝑡和𝑐的功能一样。对于 GloVe 算法,我们定义上下文和目标词为任意两个位置相近的单词,假设是左右各10 词的距离,那么𝑋𝑖𝑗就是一个能够获取单词𝑖和单词𝑗出现位置相近时的频率的计数器。
该模型的目的是优化:
是如果𝑋𝑖𝑗是等于 0 的话,那么𝑙𝑜𝑔0就是未定义的,是负无穷大的,所以我们想要对𝑋𝑖𝑗为 0 时进行求和,因此要做的就是添加一个额外的加权项𝑓(𝑋𝑖𝑗)。如果𝑋𝑖𝑗等于 0 的话,同时我们会用一个约定,即0𝑙𝑜𝑔0 = 0,这个的意思是如果𝑋𝑖𝑗 = 0,先不要进行求和,所以这个𝑙𝑜𝑔0项就是不相关项。
加权因子
𝑓(𝑋𝑖𝑗)可以让即使是像 durion 这样不常用的词,它也能给予大量有意义的运算,同时也能够给像 this,is,of,a 这样在英语里出现更频繁的词更大但不至于过分的权重。因此有一些对加权函数𝑓的选择有着启发性的原则,就是既不给这些词(this,is,of,a)过分的权重,也不给这些不常用词(durion)太小的权值。
情感分类问题
情感分类任务就是看一段文本,然后分辨这个人是否喜欢他们在讨论的这个东西。
算法1:
这个算法有一个问题就是没考虑词序,尤其是这样一个负面的评价"Completely lackingin good taste, good service, and good ambiance.",但是 good 这个词出现了很多次,有 3 个good,忽略词序,仅仅把所有单词的词嵌入加起来或者平均下来,最后的特征向量会有很多 good 的表示,分类器很可能认为这是一个好的评论。
算法2:使用RNN
消除词嵌入中的歧视:以性别为例
第三周:序列模型和注意力机制
基础模型
从序列到序列:对应RNN模型中,多输入多输出的例子。在所有输入完成后得到特征向量,传递给后层的输出单元。
从图像到序列:对输入图像进行卷积神经网络操作,得到特征向量,同上。
条件语言模型
相比较一般的语言模型 ,条件语言模型附加了输入作为条件。
相比之前的模型随机地生成句子,在该模型中要找到最可能的英语翻译。当使用这个模型来进行机器翻译时你并不是从得到的分布中进行随机取样,而是要找到英语句子y,使得条件概率P(y_1…y_Ty | x_1…x_Tx)最大化。
集束搜索及优化
确定超参数值B,即进行每层输出时,同时考虑可能性最大的B个情况。
当B=1时本质上是贪心算法。
操作时,为了防止多个概率P相乘时数值下溢(即数值过小导致计算机无法精确存储):
集束搜索不是精确的搜索算法,不保证能找到最优解。
集束搜索的误差分析
集束搜索的神经网络分为 RNN(编码) 和 BeamSearch(解码) 两部分
对同一个输入,人工翻译结果为y*,算法翻译结果为y^
若P(y* | x)>P(y^ | x),说明BeamSearch出错
若P(y* | x)<=P(y^ | x),说明RNN出错
注意力模型
在输出每个翻译后的词时,考虑到输入词加权后的影响因素。