白话白话transformer
1、attention的计算方法
每个词去计算与其他词的关系
经过attention之后每个词的向量不再是单单它本身的,还包括其上下文的。一个矩阵乘法就做完了,所以是并行的
2、multi-head
也就是self-attention做了多次, 一组QKV是一个特征的表达, 用多头提取不同的特征表达 将所有的特征表达进行拼接 ,然后用全连接矩阵进行降维
3、位置编码
(1)本身的input可能仅是某个词的信息,传统的表示位置的向量一般用one-hot,而这地方用的是正弦余弦周期信号
layernormal 经过self-attention后在layer的维度进行归一化为均值为0 方差为1 (红色箭头指向的,即纵向的)
batch normalize指的是将其以batch的维度进行归一化为均值为0 方差为1 (绿色箭头指向的,即横向的)
(2)残差连接:基本的残差连接方式
作用是相当于两条路,因为不保证做完各种操作后比原来的表示结果更好,所以加上第二条路相当于不做任何操作,原封不动的取过来(至少不比原来差)。至于选择哪个,模型自己选择(黄色表示经过各种操作过来的,绿色表示直接拿过来的)
4、Decoder
以上解释的是encoder的部分,下面说一下decoder与encoder的不同的地方
(1)attention计算方式不同
加了一个encoder-decoder attetion , 目的是也要把encoder部分出来的结果也进行一定的考虑
(2)加入mask机制
一个接一个出答案,比如说机器翻译的时候,后面没出来的不能用,只能用之前已经有的
5、最终结果
利用softmax 来预测,比如说一共10000个词,这回要输出的是第几个词
然后 cross-entropy 和分类任务一样的思想
总体过程:词---编码----位置编码---selfattention ---多头 ----残差连接---decoder --mask---self attention - softmax
白话白话BERT
BERT其实是transformer的encoder部分,并不需要标签,直接用语料就可以训练了
1、bert的训练方式
方法一:随机mask掉一些词,预测这些词是什么
方法二:预测两个句子是否连在一起,结果是YES OR NO
2、如何使用bert
并不需要先训练好向量,然后训练模型,而是把任务融合到bert中即可,一起训练
(1)先下载人家训练好的模型
(2)下载数据集
(3)把整个bert 给download下来
代码解读:
run_classifier.py 别忘了参数(数据预处理,做不做训练,做不做验证,用相对路径,语料表,人家预训练好的,batch_size调小一点,epoch = 小的就行,一就可以,保存位置)
写自己的数据预处理/标签个数
传进去的是词的索引
mask编码实际的词用1表示,补充的用0表示 做self-attention 的时候标识一下不让他们进行计算
构建模型
1、embedding层 词输入转向量 input【8,128】 output【8,128,768】+ position embedding只进行128长度内的 每一个微output【128,768】 +typeid【01表示是第几个句子one-hot就可以】output[2,768] 这三个维度一致
2、mask矩阵 标1的表示attention的时候进行计算,其实是将矩阵进行了扩展了一尾input【8,128】output【8,128,128】
3、QKV矩阵 最外一层循环是层的个数,然后每一个层里面有self attention
query是from产生的【1024,768】
k是to tensor 产生的【1024.
v是to tensor 产生的【】
4、全连接