前面我们详细的介绍了Transformer的原理,但是有的细节还是一头雾水,所以我们接下来介绍一下Transformer的实现,主要参考了文章The Annotated Transformergithub地址

本文的代码部分来自于github,而图来源于The Annotated Transformer

Prelims

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os
from os.path import exists
import torch
import torch.nn as nn
from torch.nn.functional import log_softmax, pad
import math
import copy
import time
from torch.optim.lr_scheduler import LambdaLR
import pandas as pd
import altair as alt
from torchtext.data.functional import to_map_style_dataset
from torch.utils.data import DataLoader
from torchtext.vocab import build_vocab_from_iterator
import torchtext.datasets as datasets
import spacy
import GPUtil

from torch.utils.data.distributed import DistributedSampler
import torch.distributed as dist
import torch.multiprocessing as mp
from torch.nn.parallel import DistributedDataParallel as DDP

# Set to False to skip notebook execution (e.g. for debugging)
RUN_EXAMPLES = True
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Some convenience helper functions used throughout the notebook


def is_interactive_notebook():
return __name__ == "__main__"

def show_example(fn, args=[]):
if __name__ == "__main__" and RUN_EXAMPLES:
return fn(*args)

def execute_example(fn, args=[]):
if __name__ == "__main__" and RUN_EXAMPLES:
fn(*args)

class DummyOptimizer(torch.optim.Optimizer):
def __init__(self):
self.param_groups = [{"lr": 0}]
None

def step(self):
None

def zero_grad(self, set_to_none=False):
None

class DummyScheduler:
def step(self):
None
阅读全文 »

最近需要用到fairseq框架中的翻译任务,这里记录一下。

从实战开始

首先下载翻译模型:

1
2
3
4
5
6
mkdir -p model
cd model
wget https://dl.fbaipublicfiles.com/fairseq/models/wmt16.en-de.joined-dict.transformer.tar.bz2

bunzip2 wmt16.en-de.joined-dict.transformer.tar.bz2
tar -xvf wmt16.en-de.joined-dict.transformer.tar

解压后的文件如下:

阅读全文 »

之前没有接触过NLP,所以不太理解里面的基本名词。所以这里学习一些NLP的基本概念。事先声明,以下大部分内容来源于第1章-自然语言处理基础概念和easyai的《非技术也能看懂的NLP入门科普》。不理解的地方我会加上自己的批注。

自然语言

自然语言是指汉语、英语、法语等人们日常使用的语言,是自然而然的随着人类社会发展演变而来的语言,区别于如程序设计的语言的人工语言。

语音和文字是构成语言的两个基本属性,语音是语言的物质外壳,文字则是记录语言的书写符号系统。

自然语言与编程语言的对比

阅读全文 »

Transformer由论文《Attention is All You Need》提出。学(烤)习(贝)一下。实现声明,本文大部分内容来源于Transformer模型详解(图解最完整版),对于不理解的地方,我会加上个人注解。

整体结构

首先介绍 Transformer 的整体结构,下图是 Transformer 用于中英文翻译的整体结构:

img

可以看到 Transformer 由 Encoder 和 Decoder 两个部分组成,各包含 6 个 block。它的工作流程大体如下:

阅读全文 »

事先声明,本文章大部分内容来源于理解TensorFlow的Queue,并添加个人理解。

Queue相关的概念只有三个:

  • Queue是TF队列和缓存机制的实现
  • QueueRunner是TF中对操作Queue的线程的封装
  • Coordinator是TF中用来协调线程运行的工具

虽然它们经常同时出现,但这三样东西在TensorFlow里面是可以单独使用的,不妨先分开来看待。

Queue

阅读全文 »

事先声明,以下大部分内容来源于tensorflow 模型导出总结,并加上个人见解。

tensorflow 1.0 以及2.0 提供了多种不同的模型导出格式,例如说有checkpoint,SavedModel,Frozen GraphDef,Keras model(HDF5) 以及用于移动端,嵌入式的TFLite。

模型导出主要包含了:参数以及网络结构的导出,不同的导出格式可能是分别导出,或者是整合成一个独立的文件。

  • 参数和网络结构分开保存:checkpoint, SavedModel
  • 只保存权重:HDF5(可选)
  • 参数和网络结构保存在一个文件:Frozen GraphDef,HDF5(可选)

在tensorflow 1.0中,可以见下图,主要有三种主要的API:Keras、Estimator以及Legacy即最初的session模型,其中tf.Keras主要保存为HDF5,Estimator保存为SavedModel,而Lagacy主要保存的是Checkpoint,并且可以通过freeze_graph,将模型变量冻结,得到Frozen GradhDef的文件。这三种格式的模型,都可以通过TFLite Converter导出为 .tflite 的模型文件,用于安卓/ios/嵌入式设备的serving。

阅读全文 »

最近,学完字符编码之后,准备一鼓作气,看一下数字编码。

整数编码

在C语音中,整数编码可以分为有符号整数和无符号整数。当用关键字 char short long等指定,默认的是前面有signed,如果声明为有符号类型,需要在关键字前加unsigned,如unsigned short ,unsigned long等等。

那么这些数据是如何存储的呢?

无符号整数

阅读全文 »

最近在搞二进制分析的东西,对于字符编码特别糊涂,所以学习了一下,本来觉得阮一峰的笔记挺好的,但是感觉又有点问题,所以我这里在自己总结一下,以下大部分内容还是来源于阮一峰的笔记。当然我自己总结的可能也不太对(知识有限呀),之后可以再修改。

ASCII 码

计算机中,每一个二进制位(bit)有01两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000011111111

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。

ASCII 码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0

阅读全文 »

之前一直知道Pytorch、numpy之类有好几种变换维度的方法,但是之前了解的不深,今天总结一下。

Reshape

Pytorch在reshape的时候,是按照行存储的方式进行的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import torch

In [16]: x = torch.randn(2, 3, 4)

In [17]: x
Out[17]:
tensor([[[ 0.2921, -0.1806, -1.0838, -0.6770],
[-0.7797, 0.2614, -0.5380, 1.8941],
[-0.7261, 0.8209, 0.0286, 0.0997]],

[[ 0.5549, 0.9036, 0.8790, -0.5776],
[ 0.3745, 0.6963, -0.3445, -0.0022],
[-0.5991, 1.4639, -0.5396, -0.1702]]])

In [19]: torch.reshape(x, (-1, 2))
Out[19]:
tensor([[ 0.2921, -0.1806],
[-1.0838, -0.6770],
[-0.7797, 0.2614],
[-0.5380, 1.8941],
[-0.7261, 0.8209],
[ 0.0286, 0.0997],
[ 0.5549, 0.9036],
[ 0.8790, -0.5776],
[ 0.3745, 0.6963],
[-0.3445, -0.0022],
[-0.5991, 1.4639],
[-0.5396, -0.1702]])

permute

阅读全文 »