我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的、自己不知道的东西。
已经有人记了笔记(很用心,强烈推荐):https://github.com/Sakura-gh/ML-notes
本节内容综述
小细节
如上,我们如何让机器产生一段句子呢?这个我们已经清楚了。使用 RNN 把 word 或者说 character 一个一个产生出来。
此外,如上,还可以把图形拆分成像素,使用 RNN 生成。
但是,如上,我们应该让就近的像素对生成的像素进行影响,而非按行来。可以进行 filter + 3维记忆空间 的方法。
但是,使用RNN存在一些问题,如上图,我们希望根据不同情况给出信息。
如上,一般来讲,RNN产生的话是随机的。我们可以对图片进行处理,比如用CNN获得一个向量,然后输入RNN中。可以在每个时间点都把图片输入,防止机器“忘记”自己在说什么。
对于机器翻译,同理。如上,先在Encoder中,对句子的每个成分按照时间点挨个输入。这样最后得到的向量,就包含了句子的全部信息。将这个输入到Decoder,就可以得到翻译。
这就是 Seq2seq 。
此外,在聊天机器人中,我们需要让之前的信息也输入到模型中,防止说重复的内容。
如上,我们将 z 0 z^0 z0 与 各个 h h h 进行 match 函数计算,得到各个 h h h 对应的 α \alpha α 。这个 match 函数中的参数也是训练出来。
之后,经过一个 softmax ,然后求和得到 c c c ,此时, c c c 就是Decoder input 。此外,可以得到心得 z z z 。
之后继续进行该内容。
如上,颜色深度代表 match score 。
如上,可以把每个区域的向量与$z_0$进行运算得到,之后,进行 weighted sum,再交给 Decoder ,以此得到输出。
如上,在产生划线词汇是,其Attention也是集中在图片的相应位置的。
此外,还有些失败的地方,我们可以通过 Attention 进行分析,为什么出错了。
此外,机器还可以看视频说话。如上。
“我们的作业二就是做这个。”很有趣。
如上,也可以进行利用注意力做问答。
此外,Memory Network 也有更复杂的版本。
如上,有两组vector分别为 x x x与 h h h来表示Document, q q q与 x x x做match得到 α \alpha α,但是Extracted Information时,使用 h h h与 α \alpha α进行结合。
而得到的新向量,可以与 q 进行运算,表示机器在反复“思考”。这个过程叫做 Hopping 。
Neural Turing Machine 不仅可以读记忆,还可以改变记忆。
如上,实际上,k与memory产生四个新值其实有5个步骤。如下。
李老师:“我相信你一定没有兴趣知道他,所以我们把他跳过。”
如上, e e e与 a a a用于修改旧的 memory 。
总的计算框架如上。
如上,一个Bad Attention就是,可能 α \alpha α过于不均衡,导致机器只注意到了视频的主体。
我们可以用一个正则化的方法,让各个输入的部分都有近似的 attention weight 。如上图中的公式(这只是最简单的一种方法)。
如上,每次你的 RNN 的 input 其实来自于“正确的解答”。但这是训练时的状态。
如上,在实际使用时,在每次的 input 都来自自己上次的解答。
这将带来Exposure Bias。
如上,如果机器没有在一开始时正确地选择“A”,这将让接下来所有的生成都受影响。
那么,在训练时,就将 input 改为“自己生成”的答案呢?
但实际上,这将让我们的网络十分难以训练。
如上,我们用综合的想法来训练。
在输入时,我们随机地选择将 model输出 或者是 训练数据 进行作为输出。
要注意的是,我们在训练了一定步骤后,才考虑把 model输出 作为输入。随机选择的几率如上图中的表。
如上图,如果使用Scheduled Sampling,效果好很多。
如上,如果我们“贪婪地”每次都选择最好的那个输出,但是其最后的总的概率值(累成起来),未必是最高的。如上图中,绿色分支的分数是要高于粉色分数的。
因此,提出 Beam Search 。
如上,我们可以只选分数最高的 2 个,探索几步,看哪个分高。
如上,发现X、Y、W分数都高,因此,都在下一段时间输入。然后取分数最高的那个,最为下一时间的输入。
如上,在有细微错误时,其与正确答案的Loss值差别并不大。
因此,我们考虑使用object-level criterion(假设有这样一个评估函数 R R R,评估句子语法),可行吗?
不可行,因为很可能无法做微分。
可以使用强化学习的方法。
把 generation 这件事,当成 reinforcement learning 来做。
在结束后,通过 R R R函数判断奖励值。
如上,MIXER是使用了强化学习与传统方法相结合的方法。
如图,Pointer Network中可以解决如同的演算的内容。
如何转换为 Seq 2 seq 的模型呢?
如上,如果只是用 Encoder-Decoder 当然是不 work 的。当然,如果加入注意力是可以的。
如上,attention做了一点改善,不用 softmax 层,而使用 argmax 筛选输出。
这种方法,可以做到 100 个点规模都正确。
如上,使用 Pointer Network 可以有效利用文章中的人名地名,而且将文章中的词接起来一般来讲就可以得到 Summary 。
此外,还可以用在机器翻译上。
如上,对于Recursive,我们需要决定各个输入之间的关系。将某些输入值放在一起,输入到模型中。
如上,我们可以考虑用文法结构的顺序进行输入。
这个 f ,不能用一个简单的函数。因此需要一个 network。
如上,对于 g 与 f 函数,我们都要训练。
如上,作为 f 的输入,将两个输入简单的拼接并不是首选。我们考虑线性代数的输入方法(上面的矩阵运算计算了两次)。
如上,有一些实验,进行了检验。
尽管这篇文献的表现较差,但是李老师介绍了其中思想。
如上,我们“玄学地”将输入分离,分为 a a a与 A A A。之后交叉地进行相乘。
如上,基于 Recursive ,可以构建一个 Tree LSTM 。
比如 Sentence relatedness 。