BERT
自监督学习是一种无标注的学习方式。由于其不使用标注的数据,它可以看作是一种无监督学习方法。有趣的是,自监督学习的模型大多是以芝麻街的角色命名 BERT BERT 是一个 Transformer 的编码器,BERT 的架构与 Transformer 的编码器完全相同,里面有很多自注意力和残差连接、归一化等。 BERT 的输入是一段文字,接下来需要随即掩码一些输入文字,被掩码的部分是随机决定的。有两种方式实现掩码,第一种方法是用特殊符号替换句子里的单词,使用 “MASK” 来表示特殊符号;另一种方法是用另一个字随即替换一个字 如下图,掩码后,向 BERT 输入了一个序列,BERT 的相应输出就是另一个序列。接下来查看掩码部分的对应的输出,对这个输出的向量做线性变换(乘一个矩阵),然后做 softmax 并输出一个分布。输出是一个很长的向量,包含要处理的每个汉字,每个字对应一个分数,这个向量是 softmax 生成的分布。 BERT 的训练过程是这样的:由于 BERT 不知道掩码的实际字符,训练的目标是输出一个尽可能接近真实答案的字符,用 one-hot...
Transformer
Transformer 是一个基于自注意力的序列到序列模型,与基于循环网络的序列到序列模型不同,其可以并行计算。 序列到序列模型 序列到序列模型输入和输出都是一个序列,输入和输出序列长度之间的关系有两种情况。第一种情况下,输入和输出的长度一样;第二种情况下,机器决定输出的长度。序列到序列模型有广泛的应用,比如常见的 语音识别、机器翻译与语音翻译,TTS,聊天机器人,问答任务,句法分析、多标签分类 等等。 Transformer 结构 一般的序列到序列模型会分成编码器和解码器。编码器负责处理输入的序列,再把处理好的结果丢给解码器,由解码器决定要输出的序列。 Transformer 编码器 Transformer 编码器使用的是自注意力,输入一排向量,输出一排长度相同的向量。编码器分成很多的块,每个块不是神经网络的一层,块的结构如图所示。 先跳过残差连接与层归一化的设计,在每个块里,输入一排向量后做自注意力,考虑整个序列的信息,再将输出丢到全连接网络里,输出另外一排向量,这一排向量就是块的输出。 这时候把残差连接和层归一化加进来,如图所示,最左边的向量 $b$...
Word Embedding
Word2Vec Word2Vec 有以下几种方式: 1-of-N Encoding:vector 中元素的数量 = word 的数量,对一个单词来说只要 vector 中对应元素为 1,其他元素为 0 。但这种表示方式无法建立 word 之间的联系 Word Class:把具有相同性质的 word 进行聚类划分成多个 class,用 word 所属的 class 表示该 word。但聚类算法强迫每个样本属于并只属于一个 cluster,实际上一个样本会有多个 cluster 的特征,比如 dog 的 class 是动物,flower 的 class 是植物,但它们又同属于生物 Word Embedding:把所有 word 投影到一个空间,且该空间的维度远低于 1-of-N Encoding,这是一个 Dimension Reduction 的过程。语义相近的 word 在该投影空间中是比较接近的,且该空间的每一维都有特殊的含义。 Word Embedding 是一个无监督的方法,只要让机器阅读大量文章,它就可以知道每一个 word 在 embedding...
循环神经网络RNN部分原理
RNN 什么是 RNN? 隐藏层的输出会被保留在记忆元中,在处理下一次的输入时,记忆元中的值也会被考虑。它会考虑序列的顺序,输入序列的顺序不同输出也不同。下图为权重为 1,偏置为 0,激活函数为线性的 RNN 架构处理输入序列 $[1,1]^T,[1,1]^T,[2,2]^T$ 的情况 其他 RNN 循环神经网络的架构是可以任意设计的,之前提到的 RNN 只有一个隐藏层,但 RNN 也可以是深层的。 Elman 网络 &Jordan 网络 Jordan 网络存的是整个网络输出的值,它把输出值在下一个时间点在读进来,把输出存到记忆元里。Elman 网络没有目标,很难控制说它能学到什么隐藏层信息(学到什么放到记忆元里),但是 Jordan 网络是有目标,比较很清楚记忆元存储的东西。 双向循环神经网络 Bi-RNN 同时训练一个正向的循环神经网络,训练一个逆向的循环神经网络,然后把这两个循环神经网络的隐藏层拿出来,都接给一个输出层得到最后的 $y_t$。它的好处是神经元产生输出的时候,考虑的范围是比较广的 LSTM LSTM 有三个...
Self-Attention
Self-Attention 核心公式 $$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$ 来源 我们要通过考虑一整串输入的向量来得到输出,每个 $b$ 都是考虑了所有 $a$ 之后产生的。以 $b^1$ 为例,我们来介绍这个过程。 自注意力的目的是考虑整个序列,但是又不希望把整个序列的所有信息包在一个窗口里,所以有一个特别的机制,用 $\alpha$ 来判断每个向量与 $a^1$ 的关联程度 两个向量点积的结果在某种程度上可以反映两个向量的相似度。如图(a)方式,把输入的两个向量分别乘上两个不同的矩阵 $W^q$、$W^k$,得到两个向量 $q$ 和 $k$,再把 $q$ 和 $k$ 做点积,把他们做逐元素的相乘,求和后就得到了 $\alpha$。这是计算 $\alpha$ 的一种方法,也是目前最常用的一种方法,另一种计算方式见图(b) 将各个向量的关联性计算出之后(一般自己与自己也会计算关联性), 除以 $\sqrt{d_k}$(防止 $QK^T$...
DL基础
激活函数 $g’(z)=g(z)(1-g(z))$ tanh:$g(z)=tanh(z)=a=\frac{e^z-e^{-z}}{e^z+e^{-z}}$, $g’(z)=(1-g^2(z))$ ReLU: $g(z)=a=max(0,z)$ leaky ReLU: $a=max(0.01z,z)$ 损失函数 常见的损失函数有均方误差和交叉熵误差 均方误差(MSE) 公式:$E = \frac{1}{2} \sum_{k}(y_k - t_k)^2$,其中 $y_k$ 表示神经网络的输出,$t_k$ 表示监督数据,k 表示数据的维数。 python 实现: 12def mean_squared_error(y, t): return 0.5 * np.sum((y-t)**2) 交叉熵误差 公式:$E = -\sum_{k} t_k \log y_k$ python 实现: 123def cross_entropy_error(y, t): delta = 1e-7 return -np.sum(t * np.log(y + delta)) 这里,参数...





