提交代码贡献

代码贡献流程-使用文档-PaddlePaddle深度学习平台

注意push得用手机热点

网不好,指令:

open ssl: git config –global http.sslVerify “false”

//取消http代理 git config –global –unset http.proxy

//取消https代理 git config –global –unset https.proxy

飞桨平台学习

飞桨框架图

image-20221121190733145

图像分割

什么是图像分割

image-20221121192251608

image-20221121192314507

PaddleSeg

image-20221121192335984

实现方式

更适合新手,直接调参即可

image-20221122105801899

更佳灵活

image-20221122105834856

交互式数据分割EISeg

数据分割工具,现阶段大部分任务是数据驱动的。EISeg是交互式分隔工具,用户只需要画个框框,画个圈啥的,系统自动给我们算几个数据点把我们选中的数据提取出来

image-20221122110049786

image-20221122110152595

工具页面展示

image-20221122110228495

抠图算法Matting

不止要求透明度,还要求分类

image-20221122110313999

image-20221122110349746

摇感

什么是摇感

从天空俯瞰世界!

image-20221122110434983

摇感图像分割

image-20221122110519176

实战

数据

image-20221122110636980

模型

实战环节采用成熟的模型,DeepLab系列

image-20221122110807156

代码

!代表你将在notebook执行shell指令,如果不想看到下面克隆这些提示信息,可以直接用 > (/dev/null)或(2>&1)将输出信息定位到一个空的文件夹里,这个应用了shell 的重定位功能(redirect)

image-20221122111013208

因为notebook会新开一个进程,你直接用!cd那么就是在shell终端进行操作,并不会作用在当前工作目录,因此用%cd(一个魔法指令)会更好。

image-20221122111335333

这里-oq中,o代表这下一次你重复执行指令会覆盖这一次的,q(quiet)代表不输出内容,和前面重定向一个意思; -d代表你解压到那个目录(direct)

image-20221122111557655

这里py是运行脚本,所以也不是直接在notebook运行,而是在shell

image-20221122111724923

yml,简单的标记语言,帮助我们的算法进行一些配置

image-20221122112300267

image-20221122112834905

打开yml

一些参数介绍:

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
29
30
31
32
33
34
35
36
37
38
batch_size: 设置越大模型收敛越快,不一定收敛到一个比较好的点,设置的越小,训练的过程中可能震荡的比较厉害,也不一定收敛的比刚才更差,要结合数据进行调整
- DNN层设置batch_size最好不要太小,有个经验是大于等于8
- batch_size和learning_rate 一般是线性关系,趋势同增同减,关于他的设置,看上文多卡训练的文章

iters:设置迭代次数,也就是多少轮
train_dataset:
- type代表自定义train_dataset这个结构为数据集
- dataset_root来设置数据集路径
- train_path设置更加具体的路径,train.txt的内容下面展示了

- transforms:
- 训练数据时可能会进行一些数据增强和预处理,这样可以缓解模型的过拟合现象,也可以增强模型的效果
- 对于验证集(val_dataset)就没有做数据增强的必要了(我们要得到确定的结果,没必要增加随机因数,只需要设置一个resize,把数据集缩放到跟训练集同样的大小,再归一化就行。
optimizer:
- type: 采用sgd,随机梯度下降法(最朴素的策略)
- momentum: 冲量(震荡)
- weight_decay: 权重衰减系数,可以看做惩罚项,让模型的参数不会变得很大很奇怪,不能太大,不能太小hhhc
lr_scheduler:
- learning_rate: 选择初始学习率
- end_lr: 最终学习率
- power: 这里采用平方的这种学习方法,设置为0.9可能就代表着,每迭代一轮,学习率会降低10%

loss:
- 实际中会用到混合损失
- type: 可以添加多个损失
- type: CrossEntropyloss
- type: xxxx
coef: [1, x] (每个损失在混合损失中的权重系数,(比例))

model:
- type: 可以选择官方文档中支持的模型,直接调用
- backbone: 骨架
- output_stride 为输出类别总数
- mult_grid 是resnet需要的参数
- pretrained 载入已经训练好的模型
- align_corners 网格点是放在角上还是中心, 两种都支持。(pytorch 和 tf是不一样的)


image-20221122113024374

image-20221122114028778

train.txt

image-20221122113331473

可视化方案

image-20221122120704645

image-20221122120747330

image-20221122120858152

图像分类

image-20221122200436014

PaddleClas

image-20221122200811924

image-20221122200846505

image-20221122200956570

image-20221122201232498

为何要构建Baseline

image-20221122201520525

image-20221122202550615

数据处理方式

1、过采样

也就是把样本重复添加进训练集,例如这里最高的类别有400个样本,那么就把剩下三个类别,用已有样本重复投入训练的方式扩容到数据集里,凑成1600个样本

image-20221122202651738

2、数据扩增

就是加大数据集,增强泛化能力

图像增广流程

image-20221122203059591

image-20221122203129138

image-20221122210956951

image-20221122211023748

image-20221122211036060

image-20221122211058592

image-20221122211133231

迁移学习

image-20221122203311284

标签平滑

image-20221122203407364

image-20221122203434372

建议

image-20221122203535971

image-20221122203646288

模型改进

image-20221122211205025

深度、宽度与分辨率

image-20221122211309800

image-20221122211441657

调优方法

image-20221122211629870

防止梯度消失与爆炸

image-20221122211741596

image-20221122211814836

image-20221122211940233

image-20221122212027038

过拟合问题

image-20221122212151064

image-20221122212209224

image-20221122212307243

image-20221122212345379

每次随机的让某些结点失活,让网络模型在训练过程中,更容易发挥一些变化

image-20221122212413145

DropConnect是随机失活掉一些链接

image-20221122212547303

DropBlock是随机失火了一些区域

image-20221122212615190

调参其他方法

image-20221122212659713

image-20221122212814124

image-20221122212838702

开源社区

image-20221122210349558

image-20221122210426973

发现bug,为社区做出贡献。

image-20221122210524806

如何创作好的开源项目

image-20221122214842354

例子一

任务描述

image-20221122215218131

image-20221122215035650

数据集介绍

image-20221122215054876

验收标准

image-20221122215125357

image-20221122215140528

例子二

赛题描述

image-20221122215310687

image-20221122215331859

介绍数据集

image-20221122215431119

验收标准

image-20221122215500095

模型选择思路

image-20221122215524696

例子三

image-20221122215545206

背景

image-20221122215601751

数据集介绍

image-20221122215614553

image-20221122215631290

验收标准

image-20221122215641998

实现思路

image-20221122215650198

例子四

image-20221122215750339

背景

image-20221122215757595

数据集

image-20221122215817440

验收标准

image-20221122215834025

NLP

什么是自然语言处理

image-20221123101114351

nlp有什么用

常见应用场景

image-20221123101229734

image-20221123101328444

image-20221123101502749

自然语言处理的挑战

image-20221123101626266

什么叫做图灵测试呢?

用对话来举例:当A和B同时给人类C发送一段回答,人类C都已经无法分辨这段话到底来自于人还是机器,我们就说计算机通过了图灵测试

翻译的角度:人类C发送了一段中文,计算机A和人类B都返回了一段英文的翻译,人类C已经无法分辨这段文字来自于人类还是计算机,我们就说翻译的场景下,机器通过了图灵测试。

image-20221123101726484

发展历程

image-20221123102116398

课程大纲

image-20221123102426938

image-20221123102540054

前预训练时代的自监督学习

image-20221123103854506

神经网络

image-20221123104008200

image-20221123104026366

image-20221123104040033

image-20221123104230423

自监督词表示学习

one hot没法更好的反应词与词之间的关系,可以用到Embedding这种编码方式

image-20221123104319476

最开始的Embedding层为随机初始化,通过后面Word2Vec去学到了真实的词向量

image-20221123104428627

Embedding就是ont-hot的一种线性映射,那么如何去学习Embedding呢?

image-20221123104559719

Word2Vec能拿到上下文的信息对词做预测。

image-20221123104814231

中间的隐层就是词向量

image-20221123105013847

CBoW,最大化中间词的概率

image-20221123105135458

Skip-gram与CBoW的比较

image-20221123105310367

句子编码神经网络

自回归只拿到上文的信息

image-20221123105500597

image-20221123105617800

image-20221123105750960

重点再次介绍self-Attention

假设只有四个单词

Q的第一行会和K向量分别计算内积,得到四个Score,后对四个Score做Softmax(归一化),就可以得到一个0-1的概率分布

拿到注意力的权重之和,会对输入句子里面的value向量分别做一个加权,融合整个句子序列的特征得到Z向量(更新的单词表示)

transformer中就是采用多头注意力机制,就是把每个注意力的结果不断叠加,这样会形成多个子空间,让模型去关注语言信息模型信息不同的方面的部分,让模型对句子有个多视角的理解。

但self-attention并不会对同一个单词在句子的不同位置有相关的癖好啥的,为了更精准的去表示句子信息,对输入加入一个位置信号,也就是右上角的positionail embedding

image-20221123105834755

残差连接

包含映射(经过relu)和直链接(跳连接)部分

这样的话梯度就多了一个常数项x,很好的缓解了梯度消失的问题

做完残差再做归一化,保证分布的统一,数据的稳定性

image-20221123110357903

自回归预训练学习

GPT就是transformer在大规模语言数据上来学习的语言模型

image-20221123110851617

每个单词只能看到上文的单词,句子表示能力更强?

image-20221123111013668

预训练语言模型

image-20221124144955901

无论是Word2Vec还是序列编码网络,他们所获取的词向量都是与任务无关(只与他需要的几个词有关)

image-20221124145154558

image-20221124145306170

image-20221124145351570

Pre-Training & Fine-tuning

image-20221124151251395

image-20221124151339930

image-20221124151403343

ElMo:语义理解模型

image-20221124151532831

策略

image-20221124151627683

image-20221124151800309

image-20221124152252629

缺点

image-20221124152318385

GPT:Bert之前的工作

image-20221124152411682

image-20221124152601874

image-20221124152708942

image-20221124152817566

Bert: 预训练里程碑式突破

image-20221124152928842

策略分析

image-20221124153027833

image-20221124153139269

image-20221124153307532

image-20221124153346260

缺点

image-20221124153524643

ERNIE

image-20221124153601260

策略分析

image-20221124153718866

image-20221124153814039

image-20221124153833198

ERNIE2.0

image-20221124153913189

持续学习框架

image-20221124153929026

image-20221124154031361

image-20221124154122583

image-20221124154201658

预训练模型优势

image-20221124154532848

文本匹配

image-20221124154711718

难点

image-20221124154807518

基于预训练的文本匹配

image-20221124154834492

文本长用双塔

image-20221124155406235

文本短于512建议单塔(更充分的信息交互)

image-20221124155451567

文本相似度计算

数据集

若title与query相似,label为1,反之为0

image-20221129205112406

每一个token对应一个输出,Segment对应是这是第几个句子,Position就是给位置进行编码,最后把三个Embedding层信息进行相加,即可得到最终输出

[SEP] 句子末尾结束符号, [CLS]句子开始符号

image-20221129204544939

载入Tokenizer

image-20221129205155925

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 将 1 条明文数据的 query、title 拼接起来,根据预训练模型的 tokenizer 将明文转换为 ID 数据
# 返回 input_ids 和 token_type_ids

def convert_example(example, tokenizer, max_seq_length=512, is_test=False):

query, title = example["query"], example["title"]

encoded_inputs = tokenizer(
text=query, text_pair=title, max_seq_len=max_seq_length)

input_ids = encoded_inputs["input_ids"]
token_type_ids = encoded_inputs["token_type_ids"]

if not is_test:
label = np.array([example["label"]], dtype="int64")
return input_ids, token_type_ids, label
# 在预测或者评估阶段,不返回 label 字段
else:
return input_ids, token_type_ids

下面是对第一条句子数据进行转换

image-20221129205415765

image-20221129205440925

image-20221129205507575

input_ids的1就代表CLS(起始符),2可能就代表SEP(句断符)

为何要做偏函数呢?

我们可能要对几万条数据做同样的处理,可能有许多东西都是一样的,我们这里就是将tokenizer和max_seq_length给固定掉,然后对一个batch 一个batch的传数据就行。给这样一个函数起名为trans_func,这只是把函数进行了封装。

数据Padding

PaddleNLP 提供了许多关于 NLP 任务中构建有效的数据 pipeline 的常用 API

API 简介
paddlenlp.data.Stack 堆叠N个具有相同shape的输入数据来构建一个batch
paddlenlp.data.Pad 将长度不同的多个句子padding到统一长度,取N个输入数据中的最大长度
paddlenlp.data.Tuple 将多个batchify函数包装在一起

更多数据处理操作详见: https://paddlenlp.readthedocs.io/zh/latest/data_prepare/data_preprocess.html

用最低维度来举例,Stack就是将同样维度,同样shape(通常先pad,所以是同样维度)的一维列表外加括号组装成二维列表,Pad就是将所有一维列表的长度补齐,Tuple就是将多个函数组装集成的作用

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
from paddlenlp.data import Stack, Pad, Tuple
a = [1, 2, 3, 4]
b = [3, 4, 5, 6]
c = [5, 6, 7, 8]
result = Stack()([a, b, c])
print("Stacked Data: \n", result)
print()

a = [1, 2, 3, 4]
b = [5, 6, 7]
c = [8, 9]
result = Pad(pad_val=0)([a, b, c])
print("Padded Data: \n", result)
print()

data = [
[[1, 2, 3, 4], [1]],
[[5, 6, 7], [0]],
[[8, 9], [1]],
]
batchify_fn = Tuple(Pad(pad_val=0), Stack())
ids, labels = batchify_fn(data)
X = batchify_fn(data)
print("ids: \n", ids)
print()
print("labels: \n", labels)
print()
X
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
Stacked Data: 
[[1 2 3 4]
[3 4 5 6]
[5 6 7 8]]

Padded Data:
[[1 2 3 4]
[5 6 7 0]
[8 9 0 0]]

ids:
[[1 2 3 4]
[5 6 7 0]
[8 9 0 0]]

labels:
[[1]
[0]
[1]]

(array([[1, 2, 3, 4],
[5, 6, 7, 0],
[8, 9, 0, 0]]),
array([[1],
[0],
[1]]))
dataloader

我们处理这么多的数据,就是为了将其载入dataloader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 为了后续方便使用,我们使用python偏函数(partial)给 convert_example 赋予一些默认参数
from functools import partial

# 训练集和验证集的样本转换函数
trans_func = partial(
convert_example,
tokenizer=tokenizer,
max_seq_length=512)

# 我们的训练数据会返回 input_ids, token_type_ids, labels 3 个字段
# 因此针对这 3 个字段需要分别定义 3 个组 batch 操作
batchify_fn = lambda samples, fn=Tuple(
Pad(axis=0, pad_val=tokenizer.pad_token_id), # input_ids
Pad(axis=0, pad_val=tokenizer.pad_token_type_id), # token_type_ids
Stack(dtype="int64") # label
): [data for data in fn(samples)]
1
2
3
4
5
6
7
8
9
10
11
# 定义分布式 Sampler: 自动对训练数据进行切分,支持多卡并行训练
batch_sampler = paddle.io.DistributedBatchSampler(train_ds, batch_size=32, shuffle=True)

# 基于 train_ds 定义 train_data_loader
# 因为我们使用了分布式的 DistributedBatchSampler, train_data_loader 会自动对训练数据进行切分。
# 注意观察,dataset调用trans_func,返回ids和label,
train_data_loader = paddle.io.DataLoader(
dataset=train_ds.map(trans_func),
batch_sampler=batch_sampler,
collate_fn=batchify_fn,
return_list=True)

词法分析应用

概念

image-20221129220534940

image-20221129220754229

用户使用时,先进行分词,与网页关键词进行匹配

image-20221129220815359

准确体现在:以词为基本单位,往往会更佳精准匹配到想要的内容;

召回体现在:以句子匹配,很多是没有结果的,即便有的网页和输入结果很像,但因为我们输入的有误差,因此影响召回的问题,所以我们用词进行搜索,就是准确与召回的一个均衡。

应用场景

image-20221129221416651

image-20221129221455430

发展路线

适用于搜索量较大的

image-20221129221622960

基于字符串匹配问题,引入统计语言模型

image-20221129221815730

得到有效改善,但是仍然无法识别新词

image-20221129222024801

image-20221129222229544

image-20221129222326695

RNN实现序列标注

image-20221129222352531

image-20221129222525970

image-20221129222533997

image-20221129223207199

image-20221129223219041

预训练模型对没有见过的词又很好的作用

image-20221129223230789

效果评估

通常以词为预测力度,召回率就是人工标注的词组预测的与所有词组的概率之比,可以看出,虽然只有一个label错了,但是预测率远远小于 8 / 9,这种方法通常是更佳严苛的。

image-20221129223348839

LAC

image-20221129223809369

image-20221129223843780

序列标注展示

image-20221129224800105

智能问答

什么是问答系统?

信息检索的高级信息,能用准确简洁的自然语言回答用户用自然语言的问题。

image-20221130105650840

为了解决人们日益增长的知识文化需要而提出

image-20221130105806706

问答系统的应用场景

image-20221130105826913

image-20221130110022622

问答类型

image-20221130110109082

image-20221130110151995

19年随着预训练模型的提出,稠密向量成为主流

image-20221130112519964

对稠密向量的优化,相当于将别的样本的Answer作为这个样本的负例子,与原本answer放在一起,做一个softmax多分类。

image-20221130112916758

正例和强负例一般是1:1,按照经验弱负例是越多越好的。

image-20221130113154376

image-20221130113321344

image-20221130110203486

机器阅读理解

image-20221130110310149

image-20221130110442099

数据集介绍

image-20221130110533618

image-20221130110600168

技术发展路线

image-20221130110636711

image-20221130110705135

任务定义

image-20221130110826117

相关模型

image-20221130110937791

注意力机制简单来说就是获取文本交互信息的一种手段,关注于最重要的信息。

查询向量:Query

Valuex:已经编码好的语言表示

Keyx:问题的向量与Value做内积之后做一个归一化,代表每个词的权重,最后根据Value来对权重进行加权求和,就得到了经过attention之后的值(K、Q、V)

image-20221130111109605

image-20221130111854698

image-20221130112755935

存在的问题

image-20221130112029340

总结

image-20221130113358882

结构化数据问答

image-20221130121833518

表格问答

image-20221130121905505

image-20221130122003028

image-20221130122154053

Text-to-SQL

image-20221130122436417

术语介绍

image-20221130122646798

评估方法

使用中主要看更关注与答案的准确还是更关注于SQL语句的准确率

image-20221130123039762

相关数据集介绍

image-20221130123246199

学习方式

弱监督适用于比较简单的数据集,目前主要都是用有监督的方法

image-20221130123406231

任务本质

image-20221130124005183

数据库字段所使用的函数,是基于生成的,但是为了保证训练集中没有出现在测试集的字段都能学习,一般也会保留Copy选项,将输入字段中关键部分提取出来拷贝到输出字段。

image-20221130124235213

任务挑战

image-20221130124703274