Bert
1、简介Bert是一种预训练transformer的方法。Bidirectional Encoder Representations from Transformers(BERT)
BERT在18年提出, 19年发表, bert的目的是预训练transformer的encoder网络,从而大幅度提高准确率。bert的基本想法有两个, 一个是随机遮挡一个或多个单词, 让encoder网络根据上下文来预测被遮挡的单词。第二个想法是把两个句子放在一起, 让encoder网络判断两句话是不是原文中相邻的两句话。bert用这两个任务来预训练transformer模型中的encoder网络。
2、Predict Masked Word首先回顾一下transformer中的encoder网络, 输入是一句话, 被分成很多个单词。embedding层把每一个单词映射到一个词向量。encoder网络是由多个block堆叠起来的, 每个block有两层, Self-Attention层和全连接层。
the cat sat on the mat. 输入有6个单词, embedding层把这两个单词映射 ...
MultiHead_SelfAttention
1、简介之前构造了attention layer和Self-Attention layer, 本文通过基本组件搭建深度神经网络。
首先通过attention构建multi-head attention。之前定义的Self-Attention层, 输入是一个序列, x1到xm, Self-Attention有三个参数矩阵, Wq, Wk, Wv, 输出是一个序列, 这样的Self-Attention被称为single head。
Multi-Head Self-Attention是由多个单头Self-Attention组成。它们各自有各自的参数, 不共享参数。每个单头Self-Attention有三个参数矩阵, 所以Multi-Head Self-Attention有3l个参数矩阵, 这样就得到了多头注意力。所有单头Self-Attention都有相同的输入, 输入都是x序列, 但它们的参数矩阵各不相同, 所以输出的c序列也各不相同。
把l个单头Self-Attention输出的序列做concatination堆叠起来, 作为多头Self-Attention的输出,堆叠起来的c向 ...
Transformer
1、简介transformer模型完全基于attention, attention原本是用在RNN上的, 这里把RNN去掉, 只保留attention。
transformer是一种很新的模型, 2017年才发表, 比attention晚两年。论文的名字叫做attention is all you need。这里讲解transformer的模型结构, transformer模型很复杂, 这里主要重点解释attention模块。
transformer模型是一种seq2seq模型, 它有一个encoder和一个decoder。很适合做机器翻译, transformer不是循环神经网络。transformer没有循环结构, 只有attention和全连接层。transformer的实验效果非常惊人, 可以完爆最好的RNN+transformer。 机器翻译问题已经没有人使用RNN了, 业界都是用transformer+bert。
现在告诉你, 可以去掉RNN, 只保留attention, 然后用attention来搭建一个深度神经网络来代替RNN。那么你会怎么做, 现在按照这个思路, ...
Self_Attention
1、简介seq2seq模型有两个RNN网络, 一个encoder, 一个decoder。这里介绍self-attention, 把attention用在一个RNN网络上。
attention的第一篇文章发表在2015年, 用来改进seq2seq模型, 解决RNN的遗忘问题。其实attention并不局限于seq2seq模型, attention可以用在所有的RNN上。下面介绍Self-Attention, 文章发表在2016年, 比第一篇attention论文晚一年。
Self-Attention的原始论文把attention用在LSTM上, 把它们的论文做了简化。为了方便理解, 把LSTM换成simple RNN。
现在开始simple RNN与Self-Attention的结合,初始的时候状态向量h与context vector c都是全零向量。
RNN读入第一个输出x1, 需要更新状态h。把x1的信息压缩到新的状态h里面。标准的simple RNN是这样计算状态h1的。新的状态h1依赖于旧的状态h0与新的输入x1。
上面的公式中, 新的输入x1与旧的状态h做concati ...
Attention
1、简介先回顾seq2seq模型, seq2seq模型有一个encoder和一个decoder。encoder的输入是英语, decoder把英语翻译成德语。encoder每次读入一个英语向量x, 在状态h中积累输入的信息。最后一个状态hm中积累了所有词向量x的信息。encoder输出最后ig状态hm, 把之前的状态向量全部扔掉。
decoder RNN的初始状态s0等于encoder RNN的最后一个状态hm。hm包含了输入英语句子的信息, 通过hm, decoder就知道了这句英语。然后decoder就像文本生成器一样, 逐字生成一句德语。这句德语就是模型生成的翻译。
但seq2seq模型有一个明显的缺陷, 就是如果输入的句子很长, 那么encoder会记不住完整的句子。encoder最后一个状态可能会漏掉一些信息。假如输入的英语里有个别词被忘记了, 那么decoder就无从得知完整的句子, 也就不可能产生正确的翻译。
如果你拿seq2seq模型做机器翻译, 你会得到这样的结果。 横轴是输入句子的长度。纵轴是BLEU, BLEU score是评价机器翻译好坏的标准。BLEU ...
Seq2Seq
1、简介使用RNN来做机器翻译, 机器翻译模型有很多种, 这里介绍sequence-2-sequence模型, 机器翻译是many-2-many多对多的问题。输入的英语长度大于1, 输出的德语长度也大于1,而且输入和输出的长度不固定。
做任何机器学习的应用, 第一步都是处理输出。这里就取一个小规模数据集就行。可用该网站英语翻译语料 (manythings.org)](http://www.manythings.org/anki/))提供的小规模数据集来训练一个seq-2-seq模型。这个网站上有多种语言翻译的数据, 这个文件是德语和英语的翻译。文件中, 坐标是英语句子, 右边是德语句子, 给定一句英语, 如何翻译结果呢, match其中一个德语句子就算完全正确。
处理数据时, 把这些句子用矩阵表示, 首先做预处理, 比如把大小变成小写, 去掉标点符号。
处理之后就要做tokenization, 把一句话变成很多个单词或者字符。做tokenization时, 要用两个不同的tokenizer, 英语用一个, 德语用一个。tokenization之后要建立两个字典, 一个英语字典, ...
TextGeneration
1、简介可以训练一个RNN, 它它自动生成文本, 生成的文本就像人写的一样。如果用莎士比亚的书来训练RNN, 生成的文本就像莎士比亚写的一样, 举个例子来解释文本生成。
输入本句话the cat sat on the ma, 要求训练一个神经网络来预测下一个字符。训练数据是很多文本, 把文本分割成字符, 用one-hot encoding来表示字符,这样每个字符就表示成一个one hot向量。把这些one-hot向量依次输入到RNN, RNN的状态向量h会积累看到的信息, RNN返回最后一个状态向量h。RNN层上面是一个softmax分类器, 把h与参数矩阵w相乘, 得到一个向量,经过softmax函数的变换, 最终输出是一个向量。向量每个元素都在0~1之间,元素全加起来等于1, softmax分类器的输出其实就是一个概率分布。
假设这个神经网络已经训练好了, 我们把the cat sat on the mat输入到这个神经网络中, 神经网络最上层softmax分类器会输出这些概率值。每个字符对应一个概率值, 其中概率最大的是字符t, 大小约为0.175。有了这些概率值, 我们就 ...
make_RNN_more_efficient
1、stacked RNN3个技巧提升RNN的效果。
第一个是Stacked RNN。stack RNN为多层RNN, 可以把很多全连接层堆叠起来, 构成一个multilayer percepter, 也可把很多卷积层堆叠起来, 构成一个深度卷积网络。同样的道理也可以把很多RNN堆叠起来构成一个多层RNN网络。神经网络的每一步都会更新状态h, 新算出来的h有两个copy, 一份送到下一个时刻, 另外一份作为输出。这一层输出的状态h成为了上一层的输入。再解释一下, 最底层的RNN的输入是词向量x, 这层RNN会输出每一步的状态向量h, 这些输出的状态向量又成为了第二次RNN的输入。
第二次RNN有自己的模型参数, 会更新和输出自己的状态向量h, 第二层输出的状态向量h又成为了第三层RNN的输入。
一共有三层RNN, 最上层的状态向量是最终的输出, 可以用最后一个状态ht看成是从最底层的输入I love the movie so much中提取的特征向量。
使用keras实现多层LSTM, 这里用了三层LSTM层。第一层的输出会成为第二层的输入, 所以第一层的return_sequ ...
LSTM
1、简介LSTM是一种RNN模型, 是对Simple RNN的改进, LSTM可以避免梯度消失的问题, 可以有更长的记忆。原论文 Long Short-term Memory (researchgate.net)](https://www.researchgate.net/publication/13853244_Long_Short-term_Memory))是1997年发表的。下图是LSTM原论文中的截取的图。
LSTM也是一种循环神经网络, 原理跟Simple RNN差不多。
每当读取一个新的输入x就会更新状态h, lstm的结构比simple RNN要复杂很多。Simple RNN只有一个参数矩阵, LSTM有4个参数矩阵, 下面看一下LSTM内部的具体结构。
2、LSTM结构LSTM最重要的设计是这个传输带, 即为向量C。过去的信息通过传输带送到下一个时刻,不会发生太大的变化, LSTM就是通过传输传输带来避免梯度消失。
LSTM中有很多gate可以有选择的让信息通过, 先来看一下forget gate遗忘门。遗忘门由sigmoid function和Element ...
RNN
1、简介RNN循环神经网络在nlp领域有些过时了, 训练数据足够多时, RNN的效果不如transformers模型, 但在小规模问题上, RNN还是很有用。机器学习中经常用到的文本、语音等时序数据, 思考一下, 如何对时序数据建模。在上面的基础部分讲到把一段文字整体输入到一个logistics regression模型, 让模型做二分类, 这属于one-to-one模型。 一个输入对应一个输出, 全连接神经网络和卷积网络都是one-to-one模型,但人类并不会把一整段文字全部输入到大脑中。 人类阅读时会从左到右阅读一段文字, 阅读时逐渐在大脑中积累文本的信息, 阅读一段话后脑中积累了整段文字的大意。one-to-one模型要求一个输入对应一个输出, 比如输入一张图片, 输出每一类的概率值。one-to-one模型很适合图片的问题, 但不太适合文本的问题。
对于文本问题, 输入和输出长度并不固定。 一句话可长可短, 所以输入的长度并不固定, 输出的长度也不固定。 比如把英文翻译成汉语, 英语可能有10个单词, 但翻译成的汉语可能有10个也可能有8个, 输出汉语的字数并不固定。由于 ...