检查一下,你当前的项目路径是否完整存在,打开的网页路径是否正确1、ipynb文件可以通过在本地安装Jupyterlab打开,而Jupyterlab安装需要通过下载并安装Anaconda。
1首先我们安装Anaconda这款软件。
2安装完成后打开开始菜单找到Anaconda3(64-bit),点击AnacondaPrompt(类似windows的命令行工具)。
3在命令行进入存放ipynb文件所在的目录输入命令jupyterlab将在该目录下启动Jupyterlab。
4输入后会自动d出jupyterlab的网页app,在左面就是ipynb所在目录,点击任意一个ipynb文件,就可以在右侧显示内容了。
Transformer早在2017年就出现了,直到BERT问世,Transformer开始在NLP大放光彩,目前比较好的推进就是Transformer-XL(后期附上)。这里主要针对论文和程序进行解读,如有不详实之处,欢迎指出交流,如需了解更多细节之处,推荐知乎上 川陀学者 写的。本文程序的git地址在 这里 。程序如果有不详实之处,欢迎指出交流~
2017年6月,Google发布了一篇论文《Attention is All You Need》,在这篇论文中,提出了 Transformer 的模型,其旨在全部利用Attention方式来替代掉RNN的循环机制,从而通过实现并行化计算提速。在Transformer出现之前,RNN系列网络以及seq2seq+attention架构基本上铸就了所有NLP任务的铁桶江山。由于Attention模型本身就可以看到全局的信息, Transformer实现了完全不依赖于RNN结构仅利用Attention机制,在其并行性和对全局信息的有效处理上获得了比之前更好的效果。
纵观图1整个Transformer的结构,其核心模块其实就是三个:Multi-Head attention、Feed Forward 以及 Add&Norm。这里关于Multi-Head attention部分只讲程序的实现,关于更多细节原理,请移至开头推荐的知乎链接。
Transformer中的attention采用的是多头的self-attention结构,并且在编码器中,由于不同的输入mask的部分不一样,因此在softmax之前采用了mask *** 作,并且解码时由于不能看到t时刻之后的数据,同样在解码器的第一个Multi-Head attention中采用了mask *** 作,但是二者是不同的。因为编码器被mask的部分是需要在输入到Transformer之前事先确定好,而解码器第一个Multi-Head attention被mask的部分其实就是从t=1时刻开始一直到t=seq_len结束,对应于图2。在图2中,横坐标表示解码器一个batch上的输入序列长度(也就是t),紫色部分为被mask的部分,部分为未被mask的部分,可以看出,随着t的增加,被mask的部分逐一减少。而解码器第二个Multi-Head attention的mask *** 作和编码器中是一样的。
mask+softmax程序如下:
mask *** 作其实就是对于无效的输入,用一个负无穷的值代替这个输入,这样在softmax的时候其值就是0。而在attention中(attention *** 作见下式),softmax的 *** 作出来的结果其实就是attention weights,当attention weights为0时,表示不需要attention该位置的信息。
对于Multi-Head attention的实现,其实并没有像论文原文写的那样,逐一实现多个attention,再将最后的结果concat,并且通过一个输出权重输出。下面通过程序和公式讲解一下实际的实现过程,这里假设 , , 的来源是一样的,都是 ,其维度为[batch_size, seq_len, input_size]。(需要注意的是在解码器中第二个Multi-Head的输入中 与 的来源不一样)
首先,对于输入 ,通过三个权重变量得到 , , ,此时三者维度相同,都是[batch, seq_len, d_model],然后对其进行维度变换:[batch, seq_len, h, d_model//h]==>[batch, h, seq_len, d]==>[batch×h, seq_len, d],其中d=d_model//h,因此直接将变换后的 , , 直接做DotProductAttention就可以实现Multi-Head attention,最后只需要将DotProductAttention输出的维度依次变换回去,然后乘以输出权重就可以了。关于程序中的参数valid_length已在程序中做了详细的解读,这里不再赘述,注意的是输入的valid_length是针对batch这个维度的,而实际 *** 作中由于X的batch维度发生了改变(由batch变成了batch×h),因此需要对valid_length进行复制。
FFN的实现是很容易的,其实就是对输入进行第一个线性变换,其输出加上ReLU激活函数,然后在进行第二个线性变换就可以了。
Add&norm的实现就是利用残差网络进行连接,最后将连接的结果接上LN,值得注意的是,程序在Y的输出中加入了dropout正则化。同样的正则化技术还出现在masked softmax之后和positional encoding之后。
positional encoding的实现很简单,其实就是对输入序列给定一个唯一的位置,采用sin和cos的方式给了一个位置编码,其中sin处理的是偶数位置,cos处理的是奇数位置。但是,这一块的工作确实非常重要的,因为对于序列而言最主要的就是位置信息,显然BERT是没有去采用positional encoding(尽管在BERT的论文里有一个Position Embeddings的输入,但是显然描述的不是Transformer中要描述的位置信息),后续BERT在这一方面的改进工作体现在了XLNet中(其采用了Transformer-XL的结构),后续的中再介绍该部分的内容。
无论是编码器还是解码器,其实都是用上面说的三个基本模块堆叠而成,具体的实现细节大家可以看开头的git地址,这里需要强调的是以下几点:
中出现的程序都在开头的git中了,直接执行mainipynb就可以运行程序,如有不详实之处,还请指出~~~
vs调用note转存文件如下:直接PDF(需要latex)
这两种本身支持将noteboook直接导出到pdf格式,过程类似。以Jupyter Notebook为例:
在这里插入描述
点击左上角文件-下载-pdf即可导出为pdf格式文件。但是这种方法要求电脑提前安装latex,否则会报错。
可以尝试在电脑终端输入以下代码来安装latex:
sudo apt-get install texlive-full
1
1
如果这一步有问题可以尝试方法二或跳转到方法四查看详细的安装步骤。
2 Jupyter Notebook / Google Colab方法二:Markdown后PDF
除了直接导出pdf格式文件,也可以先将ipynb导出为Markdown格式再转换为pdf。首先通过点击文件-下载-md下载Markdown格式文件,之后用电脑本地软件进行格式转换。
这里推荐Typora,一款完全免费的、实时预览的 Markdown 文本编辑器。Typora安装包可以在官网下载。
打开Typora之后点击左上角文件-打开打开之前下载的md格式文件。
在这里插入描述
之后点击左上角文件-导出-PDF即可将文件导出为pdf格式。
有以下几点原因:
第一,有可能是只安装了pycharm,没有装anaconda,没有给编辑器添加解释器,所以运行不了代码。
第二,有可能是代码错误,如果下边爆红了,而且会有警告等词语,代码也无法运行。
第三,有可能是编辑器内部环境错误,没有添加编译环境。
pycharm主要功能
编码协助:其提供了一个带编码补全,代码片段,支持代码折叠和分割窗口的智能、可配置的编辑器,可帮助用户更快更轻松的完成编码工作。
项目代码导航:该IDE可帮助用户即时从一个文件导航至另一个,从一个方法至其申明或者用法甚至可以穿过类的层次。若用户学会使用其提供的快捷键的话甚至能更快。
代码分析:用户可使用其编码语法,错误高亮,智能检测以及一键式代码快速补全建议,使得编码更优化。
Python重构:有了该功能,用户便能在项目范围内轻松进行重命名,提取方法/超类,导入域/变量/常量,移动和前推/后退重构。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)